{
  "version": 3,
  "sources": ["../src/state/data/browser-fs-access/supported.js", "../src/state/data/browser-fs-access/legacy/file-open.js", "../src/state/data/browser-fs-access/fs-access/file-open.js", "../src/state/data/browser-fs-access/file-open.js", "../src/state/data/browser-fs-access/legacy/directory-open.js", "../src/state/data/browser-fs-access/fs-access/directory-open.js", "../src/state/data/browser-fs-access/directory-open.js", "../src/state/data/browser-fs-access/legacy/file-save.js", "../src/state/data/browser-fs-access/fs-access/file-save.js", "../src/state/data/browser-fs-access/file-save.js", "../src/state/data/browser-fs-access/index.js", "../src/Tldraw.tsx", "../src/styles/stitches.config.ts", "../src/types.ts", "../src/state/TldrawApp.ts", "../src/state/data/migrate.ts", "../src/state/data/filesystem.ts", "../src/constants.ts", "../src/state/data/index.ts", "../src/state/TLDR.ts", "../src/state/shapes/RectangleUtil/RectangleUtil.tsx", "../src/state/shapes/TDShapeUtil.tsx", "../src/state/shapes/shared/shape-styles.ts", "../src/state/shapes/shared/getTextAlign.ts", "../src/state/shapes/shared/getTextSvgElement.ts", "../src/state/shapes/shared/getTextSize.ts", "../src/state/shapes/shared/getBoundsRectangle.ts", "../src/state/shapes/shared/transformRectangle.ts", "../src/state/shapes/shared/transformSingleRectangle.ts", "../src/state/shapes/shared/TextAreaUtils.ts", "../src/state/shapes/shared/TextLabel.tsx", "../src/components/stopPropagation.ts", "../src/state/shapes/RectangleUtil/rectangleHelpers.ts", "../src/state/shapes/RectangleUtil/components/DrawRectangle.tsx", "../src/state/shapes/RectangleUtil/components/DashedRectangle.tsx", "../src/state/shapes/RectangleUtil/components/BindingIndicator.tsx", "../src/state/shapes/TriangleUtil/TriangleUtil.tsx", "../src/state/shapes/TriangleUtil/triangleHelpers.ts", "../src/state/shapes/shared/PolygonUtils.ts", "../src/state/shapes/TriangleUtil/components/DrawTriangle.tsx", "../src/state/shapes/TriangleUtil/components/DashedTriangle.tsx", "../src/state/shapes/TriangleUtil/components/TriangleBindingIndicator.tsx", "../src/state/shapes/EllipseUtil/EllipseUtil.tsx", "../src/state/shapes/EllipseUtil/ellipseHelpers.ts", "../src/state/shapes/EllipseUtil/components/DrawEllipse.tsx", "../src/state/shapes/EllipseUtil/components/DashedEllipse.tsx", "../src/state/shapes/ArrowUtil/ArrowUtil.tsx", "../src/state/shapes/ArrowUtil/arrowHelpers.ts", "../src/state/shapes/ArrowUtil/components/StraightArrow.tsx", "../src/state/shapes/ArrowUtil/components/ArrowHead.tsx", "../src/state/shapes/ArrowUtil/components/CurvedArrow.tsx.tsx", "../src/state/shapes/shared/LabelMask.tsx", "../src/state/shapes/GroupUtil/GroupUtil.tsx", "../src/state/shapes/StickyUtil/StickyUtil.tsx", "../src/state/shapes/TextUtil/TextUtil.tsx", "../src/state/shapes/DrawUtil/DrawUtil.tsx", "../src/state/shapes/DrawUtil/drawHelpers.ts", "../src/state/shapes/ImageUtil/ImageUtil.tsx", "../src/state/shapes/VideoUtil/VideoUtil.tsx", "../src/state/shapes/index.ts", "../src/state/StateManager/copy.ts", "../src/state/commands/alignShapes/alignShapes.ts", "../src/state/commands/changePage/changePage.ts", "../src/state/commands/createPage/createPage.ts", "../src/state/commands/shared/getIncrementedName.ts", "../src/state/commands/createShapes/createShapes.ts", "../src/state/commands/deletePage/deletePage.ts", "../src/state/commands/shared/removeShapesFromPage.ts", "../src/state/commands/deleteShapes/deleteShapes.ts", "../src/state/commands/distributeShapes/distributeShapes.ts", "../src/state/commands/duplicatePage/duplicatePage.ts", "../src/state/commands/duplicateShapes/duplicateShapes.ts", "../src/state/commands/flipShapes/flipShapes.ts", "../src/state/commands/groupShapes/groupShapes.ts", "../src/state/commands/moveShapesToPage/moveShapesToPage.ts", "../src/state/commands/movePage/movePage.ts", "../src/state/commands/reorderShapes/reorderShapes.ts", "../src/state/commands/renamePage/renamePage.ts", "../src/state/commands/resetBounds/resetBounds.ts", "../src/state/commands/rotateShapes/rotateShapes.ts", "../src/state/commands/stretchShapes/stretchShapes.ts", "../src/state/commands/styleShapes/styleShapes.ts", "../src/state/commands/toggleShapesDecoration/toggleShapesDecoration.ts", "../src/state/commands/toggleShapesProp/toggleShapesProp.ts", "../src/state/commands/translateShapes/translateShapes.ts", "../src/state/commands/ungroupShapes/ungroupShapes.ts", "../src/state/commands/updateShapes/updateShapes.ts", "../src/state/commands/setShapesProps/setShapesProps.ts", "../src/state/commands/insertContent/insertContent.ts", "../src/state/sessions/ArrowSession/ArrowSession.ts", "../src/state/sessions/BaseSession.ts", "../src/state/sessions/BrushSession/BrushSession.ts", "../src/state/sessions/DrawSession/DrawSession.ts", "../src/state/sessions/HandleSession/HandleSession.ts", "../src/state/sessions/RotateSession/RotateSession.ts", "../src/state/sessions/TransformSession/TransformSession.ts", "../src/state/sessions/TransformSingleSession/TransformSingleSession.ts", "../src/state/sessions/TranslateSession/TranslateSession.ts", "../src/state/sessions/EraseSession/EraseSession.ts", "../src/state/sessions/GridSession/GridSession.ts", "../src/state/sessions/EditSession/EditSession.ts", "../src/state/sessions/index.ts", "../src/state/tools/SelectTool/SelectTool.ts", "../src/state/tools/BaseTool.ts", "../src/state/tools/EraseTool/EraseTool.ts", "../src/state/tools/TextTool/TextTool.ts", "../src/state/tools/DrawTool/DrawTool.ts", "../src/state/tools/EllipseTool/EllipseTool.ts", "../src/state/tools/RectangleTool/RectangleTool.ts", "../src/state/tools/TriangleTool/TriangleTool.ts", "../src/state/tools/LineTool/LineTool.ts", "../src/state/tools/ArrowTool/ArrowTool.ts", "../src/state/tools/StickyTool/StickyTool.ts", "../src/state/StateManager/StateManager.ts", "../src/state/IdbClipboard.ts", "../src/state/tools/index.ts", "../src/hooks/useKeyboardShortcuts.tsx", "../src/hooks/useTldrawApp.tsx", "../src/hooks/useStylesheet.ts", "../src/hooks/useFileSystemHandlers.ts", "../src/hooks/useFileSystem.ts", "../src/hooks/useTranslation.ts", "../src/translations/translations.ts", "../src/components/ToolsPanel/ToolsPanel.tsx", "../src/components/breakpoints.tsx", "../src/components/ToolsPanel/StatusBar.tsx", "../src/components/ToolsPanel/BackToContent.tsx", "../src/components/Primitives/RowButton/RowButton.tsx", "../src/components/Primitives/Kbd/Kbd.tsx", "../src/components/Primitives/SmallIcon/SmallIcon.tsx", "../src/components/Primitives/MenuContent/MenuContent.ts", "../src/components/ToolsPanel/PrimaryTools.tsx", "../src/components/Primitives/ToolButton/ToolButton.tsx", "../src/components/Primitives/Tooltip/Tooltip.tsx", "../src/components/Primitives/Panel/Panel.tsx", "../src/components/ToolsPanel/ShapesMenu.tsx", "../src/components/Primitives/icons/CircleIcon.tsx", "../src/components/Primitives/icons/DashDashedIcon.tsx", "../src/components/Primitives/icons/DashDottedIcon.tsx", "../src/components/Primitives/icons/DashDrawIcon.tsx", "../src/components/Primitives/icons/DashSolidIcon.tsx", "../src/components/Primitives/icons/TrashIcon.tsx", "../src/components/Primitives/icons/UndoIcon.tsx", "../src/components/Primitives/icons/SizeSmallIcon.tsx", "../src/components/Primitives/icons/SizeMediumIcon.tsx", "../src/components/Primitives/icons/SizeLargeIcon.tsx", "../src/components/Primitives/icons/EraserIcon.tsx", "../src/components/Primitives/icons/DiscordIcon.tsx", "../src/components/Primitives/icons/LineIcon.tsx", "../src/components/ToolsPanel/ActionButton.tsx", "../src/components/Primitives/DropdownMenu/DMItem.tsx", "../src/components/Primitives/DropdownMenu/DMCheckboxItem.tsx", "../src/components/preventEvent.ts", "../src/components/Primitives/DropdownMenu/DMContent.tsx", "../src/components/Primitives/DropdownMenu/DMDivider.tsx", "../src/components/Primitives/DropdownMenu/DMRadioItem.tsx", "../src/components/Primitives/DropdownMenu/DMSubMenu.tsx", "../src/components/Primitives/DropdownMenu/DMTriggerIcon.tsx", "../src/components/Primitives/Divider/Divider.tsx", "../src/components/ToolsPanel/DeleteButton.tsx", "../src/components/ToolsPanel/HelpPanel.tsx", "../src/components/TopPanel/LanguageMenu/LanguageMenu.tsx", "../src/components/ToolsPanel/keyboardShortcutDialog.tsx", "../src/components/Primitives/IconButton/IconButton.tsx", "../src/components/TopPanel/Menu/Menu.tsx", "../src/components/TopPanel/PreferencesMenu/PreferencesMenu.tsx", "../src/components/TopPanel/PageMenu/PageMenu.tsx", "../src/components/TopPanel/PageOptionsDialog/PageOptionsDialog.tsx", "../src/components/Primitives/TextField/TextField.tsx", "../src/components/TopPanel/ZoomMenu/ZoomMenu.tsx", "../src/components/TopPanel/StyleMenu/StyleMenu.tsx", "../src/components/TopPanel/MultiplayerMenu/MultiplayerMenu.tsx", "../src/components/Primitives/icons/MultiplayerIcon2.tsx", "../src/components/TopPanel/TopPanel.tsx", "../src/components/ContextMenu/ContextMenu.tsx", "../src/components/FocusButton/FocusButton.tsx", "../src/components/Loading/Loading.tsx", "../src/components/ErrorFallback/ErrorFallback.tsx"],
  "sourcesContent": ["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * Returns whether the File System Access API is supported and usable in the\n * current context (for example cross-origin iframes).\n * @returns {boolean} Returns `true` if the File System Access API is supported and usable, else returns `false`.\n */\nconst supported = (() => {\n  // When running in an SSR environment return `false`.\n  if (typeof self === 'undefined') {\n    return false\n  }\n  // ToDo: Remove this check once Permissions Policy integration\n  // has happened, tracked in\n  // https://github.com/WICG/file-system-access/issues/245.\n  if ('top' in self && self !== top) {\n    try {\n      // This will succeed on same-origin iframes,\n      // but fail on cross-origin iframes.\n      top.location + ''\n    } catch {\n      return false\n    }\n  } else if ('showOpenFilePicker' in self) {\n    return 'showOpenFilePicker'\n  }\n  return false\n})()\n\nexport default supported\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * Opens a file from disk using the legacy `<input type=\"file\">` method.\n * @type { typeof import(\"../../index\").fileOpen }\n */\nexport default async (options = [{}]) => {\n  if (!Array.isArray(options)) {\n    options = [options];\n  }\n  return new Promise((resolve, reject) => {\n    const input = document.createElement('input');\n    input.type = 'file';\n    const accept = [\n      ...options.map((option) => option.mimeTypes || []).join(),\n      options.map((option) => option.extensions || []).join(),\n    ].join();\n    input.multiple = options[0].multiple || false;\n    // Empty string allows everything.\n    input.accept = accept || '';\n    const _reject = () => cleanupListenersAndMaybeReject(reject);\n    const _resolve = (value) => {\n      if (typeof cleanupListenersAndMaybeReject === 'function') {\n        cleanupListenersAndMaybeReject();\n      }\n      resolve(value);\n    };\n    // ToDo: Remove this workaround once\n    // https://github.com/whatwg/html/issues/6376 is specified and supported.\n    const cleanupListenersAndMaybeReject =\n      options[0].legacySetup &&\n      options[0].legacySetup(_resolve, _reject, input);\n    input.addEventListener('change', () => {\n      _resolve(input.multiple ? Array.from(input.files) : input.files[0]);\n    });\n\n    input.click();\n  });\n};\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\nconst getFileWithHandle = async (handle) => {\n  const file = await handle.getFile();\n  file.handle = handle;\n  return file;\n};\n\n/**\n * Opens a file from disk using the File System Access API.\n * @type { typeof import(\"../../index\").fileOpen }\n */\nexport default async (options = [{}]) => {\n  if (!Array.isArray(options)) {\n    options = [options];\n  }\n  const types = [];\n  options.forEach((option, i) => {\n    types[i] = {\n      description: option.description || '',\n      accept: {},\n    };\n    if (option.mimeTypes) {\n      option.mimeTypes.map((mimeType) => {\n        types[i].accept[mimeType] = option.extensions || [];\n      });\n    } else {\n      types[i].accept['*/*'] = option.extensions || [];\n    }\n  });\n  const handleOrHandles = await window.showOpenFilePicker({\n    id: options[0].id,\n    startIn: options[0].startIn,\n    types,\n    multiple: options[0].multiple || false,\n    excludeAcceptAllOption: options[0].excludeAcceptAllOption || false,\n  });\n  const files = await Promise.all(handleOrHandles.map(getFileWithHandle));\n  if (options[0].multiple) {\n    return files;\n  }\n  return files[0];\n};\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\nimport supported from './supported.js'\n\nconst implementation = !supported\n  ? import('./legacy/file-open.js')\n  : import('./fs-access/file-open.js')\n\n/**\n * For opening files, dynamically either loads the File System Access API module\n * or the legacy method.\n */\nexport async function fileOpen(...args) {\n  return (await implementation).default(...args)\n}\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * Opens a directory from disk using the legacy\n * `<input type=\"file\" webkitdirectory>` method.\n * @type { typeof import(\"../../index\").directoryOpen }\n */\nexport default async (options = [{}]) => {\n  if (!Array.isArray(options)) {\n    options = [options];\n  }\n  options[0].recursive = options[0].recursive || false;\n  return new Promise((resolve, reject) => {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.webkitdirectory = true;\n\n    const _reject = () => cleanupListenersAndMaybeReject(reject);\n    const _resolve = (value) => {\n      if (typeof cleanupListenersAndMaybeReject === 'function') {\n        cleanupListenersAndMaybeReject();\n      }\n      resolve(value);\n    };\n    // ToDo: Remove this workaround once\n    // https://github.com/whatwg/html/issues/6376 is specified and supported.\n    const cleanupListenersAndMaybeReject =\n      options[0].legacySetup &&\n      options[0].legacySetup(_resolve, _reject, input);\n\n    input.addEventListener('change', () => {\n      let files = Array.from(input.files);\n      if (!options[0].recursive) {\n        files = files.filter((file) => {\n          return file.webkitRelativePath.split('/').length === 2;\n        });\n      } else if (options[0].recursive && options[0].skipDirectory) {\n        files = files.filter((file) => {\n          const directoriesName = file.webkitRelativePath.split('/');\n          return directoriesName.every(\n            (directoryName) =>\n              !options[0].skipDirectory({\n                name: directoryName,\n                kind: 'directory',\n              })\n          );\n        });\n      }\n\n      _resolve(files);\n    });\n\n    input.click();\n  });\n};\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\nconst getFiles = async (dirHandle, recursive, path = dirHandle.name, skipDirectory) => {\n  const dirs = []\n  const files = []\n  for (const entry of dirHandle.values()) {\n    const nestedPath = `${path}/${entry.name}`\n    if (entry.kind === 'file') {\n      files.push(\n        await entry.getFile().then((file) => {\n          file.directoryHandle = dirHandle\n          return Object.defineProperty(file, 'webkitRelativePath', {\n            configurable: true,\n            enumerable: true,\n            get: () => nestedPath,\n          })\n        })\n      )\n    } else if (\n      entry.kind === 'directory' &&\n      recursive &&\n      (!skipDirectory || !skipDirectory(entry))\n    ) {\n      dirs.push(await getFiles(entry, recursive, nestedPath, skipDirectory))\n    }\n  }\n  return [...(await Promise.all(dirs)).flat(), ...(await Promise.all(files))]\n}\n\n/**\n * Opens a directory from disk using the File System Access API.\n * @type { typeof import(\"../../index\").directoryOpen }\n */\nexport default async (options = {}) => {\n  options.recursive = options.recursive || false\n  const handle = await window.showDirectoryPicker({\n    id: options.id,\n    startIn: options.startIn,\n  })\n  return getFiles(handle, options.recursive, undefined, options.skipDirectory)\n}\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\nimport supported from './supported.js'\n\nconst implementation = !supported\n  ? import('./legacy/directory-open.js')\n  : import('./fs-access/directory-open.js')\n\n/**\n * For opening directories, dynamically either loads the File System Access API\n * module or the legacy method.\n */\nexport async function directoryOpen(...args) {\n  return (await implementation).default(...args)\n}\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * Saves a file to disk using the legacy `<a download>` method.\n * @type { typeof import(\"../../index\").fileSave }\n */\nexport default async (blobOrResponse, options = {}) => {\n  if (Array.isArray(options)) {\n    options = options[0];\n  }\n  const a = document.createElement('a');\n  let data = blobOrResponse;\n  // Handle the case where input is a `ReadableStream`.\n  if ('body' in blobOrResponse) {\n    data = await streamToBlob(\n      blobOrResponse.body,\n      blobOrResponse.headers.get('content-type')\n    );\n  }\n  a.download = options.fileName || 'Untitled';\n  a.href = URL.createObjectURL(data);\n\n  const _reject = () => cleanupListenersAndMaybeReject(reject);\n  const _resolve = () => {\n    if (typeof cleanupListenersAndMaybeReject === 'function') {\n      cleanupListenersAndMaybeReject();\n    }\n  };\n  // ToDo: Remove this workaround once\n  // https://github.com/whatwg/html/issues/6376 is specified and supported.\n  const cleanupListenersAndMaybeReject =\n    options.legacySetup && options.legacySetup(_resolve, _reject, a);\n\n  a.addEventListener('click', () => {\n    // `setTimeout()` due to\n    // https://github.com/LLK/scratch-gui/issues/1783#issuecomment-426286393\n    setTimeout(() => URL.revokeObjectURL(a.href), 30 * 1000);\n    _resolve(null);\n  });\n  a.click();\n  return null;\n};\n\n/**\n * Converts a passed `ReadableStream` to a `Blob`.\n * @param {ReadableStream} stream\n * @param {string} type\n * @returns {Promise<Blob>}\n */\nasync function streamToBlob(stream, type) {\n  const reader = stream.getReader();\n  const pumpedStream = new ReadableStream({\n    start(controller) {\n      return pump();\n      /**\n       * Recursively pumps data chunks out of the `ReadableStream`.\n       * @type { () => Promise<void> }\n       */\n      async function pump() {\n        return reader.read().then(({ done, value }) => {\n          if (done) {\n            controller.close();\n            return;\n          }\n          controller.enqueue(value);\n          return pump();\n        });\n      }\n    },\n  });\n\n  const res = new Response(pumpedStream);\n  reader.releaseLock();\n  return new Blob([await res.blob()], { type });\n}\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * Saves a file to disk using the File System Access API.\n * @type { typeof import(\"../../index\").fileSave }\n */\nexport default async (\n  blobOrResponse,\n  options = [{}],\n  existingHandle = null,\n  throwIfExistingHandleNotGood = false\n) => {\n  if (!Array.isArray(options)) {\n    options = [options];\n  }\n  options[0].fileName = options[0].fileName || 'Untitled';\n  const types = [];\n  options.forEach((option, i) => {\n    types[i] = {\n      description: option.description || '',\n      accept: {},\n    };\n    if (option.mimeTypes) {\n      if (i === 0) {\n        if (blobOrResponse.type) {\n          option.mimeTypes.push(blobOrResponse.type);\n        } else if (\n          blobOrResponse.headers &&\n          blobOrResponse.headers.get('content-type')\n        ) {\n          option.mimeTypes.push(blobOrResponse.headers.get('content-type'));\n        }\n      }\n      option.mimeTypes.map((mimeType) => {\n        types[i].accept[mimeType] = option.extensions || [];\n      });\n    } else if (blobOrResponse.type) {\n      types[i].accept[blobOrResponse.type] = option.extensions || [];\n    }\n  });\n  if (existingHandle) {\n    try {\n      // Check if the file still exists.\n      await existingHandle.getFile();\n    } catch (err) {\n      existingHandle = null;\n      if (throwIfExistingHandleNotGood) {\n        throw err;\n      }\n    }\n  }\n  const handle =\n    existingHandle ||\n    (await window.showSaveFilePicker({\n      suggestedName: options[0].fileName,\n      id: options[0].id,\n      startIn: options[0].startIn,\n      types,\n      excludeAcceptAllOption: options[0].excludeAcceptAllOption || false,\n    }));\n  const writable = await handle.createWritable();\n  // Use streaming on the `Blob` if the browser supports it.\n  if ('stream' in blobOrResponse) {\n    const stream = blobOrResponse.stream();\n    await stream.pipeTo(writable);\n    return handle;\n    // Handle passed `ReadableStream`.\n  } else if ('body' in blobOrResponse) {\n    await blobOrResponse.body.pipeTo(writable);\n    return handle;\n  }\n  // Default case of `Blob` passed and `Blob.stream()` not supported.\n  await writable.write(blob);\n  await writable.close();\n  return handle;\n};\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\nimport supported from './supported.js'\n\nconst implementation = !supported\n  ? import('./legacy/file-save.js')\n  : import('./fs-access/file-save.js')\n\n/**\n * For saving files, dynamically either loads the File System Access API module\n * or the legacy method.\n */\nexport async function fileSave(...args) {\n  return (await implementation).default(...args)\n}\n", "/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license \u00A9 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n\n/**\n * @module browser-fs-access\n */\nexport { fileOpen } from './file-open.js'\nexport { directoryOpen } from './directory-open.js'\nexport { fileSave } from './file-save.js'\nexport { default as supported } from './supported.js'\n", "import * as React from 'react'\nimport { Renderer } from '@tldraw/core'\nimport { IntlProvider } from 'react-intl'\nimport { styled, dark } from '~styles'\nimport { TDDocument, TDStatus } from '~types'\nimport { TldrawApp, TDCallbacks } from '~state'\nimport {\n  TldrawContext,\n  useStylesheet,\n  useTranslation,\n  useKeyboardShortcuts,\n  useTldrawApp,\n} from '~hooks'\nimport { shapeUtils } from '~state/shapes'\nimport { ToolsPanel } from '~components/ToolsPanel'\nimport { TopPanel } from '~components/TopPanel'\nimport { ContextMenu } from '~components/ContextMenu'\nimport { FocusButton } from '~components/FocusButton'\nimport { TLDR } from '~state/TLDR'\nimport { GRID_SIZE } from '~constants'\nimport { Loading } from '~components/Loading'\nimport { ErrorBoundary as _Errorboundary } from 'react-error-boundary'\nimport { ErrorFallback } from '~components/ErrorFallback'\n\nconst ErrorBoundary = _Errorboundary as any\n\nexport interface TldrawProps extends TDCallbacks {\n  /**\n   * (optional) If provided, the component will load / persist state under this key.\n   */\n  id?: string\n\n  /**\n   * (optional) The document to load or update from.\n   */\n  document?: TDDocument\n\n  /**\n   * (optional) The current page id.\n   */\n  currentPageId?: string\n\n  /**\n   * (optional) Whether the editor should immediately receive focus. Defaults to true.\n   */\n  autofocus?: boolean\n\n  /**\n   * (optional) Whether to show the menu UI.\n   */\n  showMenu?: boolean\n\n  /**\n   * (optional) Whether to show the multiplayer menu.\n   */\n  showMultiplayerMenu?: boolean\n  /**\n   * (optional) Whether to show the pages UI.\n   */\n  showPages?: boolean\n\n  /**\n   * (optional) Whether to show the styles UI.\n   */\n  showStyles?: boolean\n\n  /**\n   * (optional) Whether to show the zoom UI.\n   */\n  showZoom?: boolean\n\n  /**\n   * (optional) Whether to show the tools UI.\n   */\n  showTools?: boolean\n\n  /**\n   * (optional) Whether to show the UI.\n   */\n  showUI?: boolean\n\n  /**\n   * (optional) Whether to the document should be read only.\n   */\n  readOnly?: boolean\n\n  /**\n   * (optional) Whether to to show the app's dark mode UI.\n   */\n  darkMode?: boolean\n\n  /**\n   * (optional) If provided, image/video componnets will be disabled.\n   *\n   * Warning: Keeping this enabled for multiplayer applications without provifing a storage\n   * bucket based solution will cause massive base64 string to be written to the liveblocks room.\n   */\n  disableAssets?: boolean\n}\n\nexport function Tldraw({\n  id,\n  document,\n  currentPageId,\n  autofocus = true,\n  showMenu = true,\n  showMultiplayerMenu = true,\n  showPages = true,\n  showTools = true,\n  showZoom = true,\n  showStyles = true,\n  showUI = true,\n  readOnly = false,\n  disableAssets = false,\n  darkMode = false,\n  onMount,\n  onChange,\n  onChangePresence,\n  onNewProject,\n  onSaveProject,\n  onSaveProjectAs,\n  onOpenProject,\n  onOpenMedia,\n  onUndo,\n  onRedo,\n  onPersist,\n  onPatch,\n  onCommand,\n  onChangePage,\n  onAssetCreate,\n  onAssetDelete,\n  onAssetUpload,\n  onSessionStart,\n  onSessionEnd,\n  onExport,\n}: TldrawProps) {\n  const [sId, setSId] = React.useState(id)\n\n  // Create a new app when the component mounts.\n  const [app, setApp] = React.useState(() => {\n    const app = new TldrawApp(id, {\n      onMount,\n      onChange,\n      onChangePresence,\n      onNewProject,\n      onSaveProject,\n      onSaveProjectAs,\n      onOpenProject,\n      onOpenMedia,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\n      onAssetUpload,\n      onSessionStart,\n      onSessionEnd,\n    })\n    return app\n  })\n\n  // Create a new app if the `id` prop changes.\n  React.useLayoutEffect(() => {\n    if (id === sId) return\n    const newApp = new TldrawApp(id, {\n      onMount,\n      onChange,\n      onChangePresence,\n      onNewProject,\n      onSaveProject,\n      onSaveProjectAs,\n      onOpenProject,\n      onOpenMedia,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\n      onAssetUpload,\n      onExport,\n      onSessionStart,\n      onSessionEnd,\n    })\n\n    setSId(id)\n\n    setApp(newApp)\n  }, [sId, id])\n\n  // Update the document if the `document` prop changes but the ids,\n  // are the same, or else load a new document if the ids are different.\n  React.useEffect(() => {\n    if (!document) return\n\n    if (document.id === app.document.id) {\n      app.updateDocument(document)\n    } else {\n      app.loadDocument(document)\n    }\n  }, [document, app])\n\n  // Disable assets when the `disableAssets` prop changes.\n  React.useEffect(() => {\n    app.setDisableAssets(disableAssets)\n  }, [app, disableAssets])\n\n  // Change the page when the `currentPageId` prop changes.\n  React.useEffect(() => {\n    if (!currentPageId) return\n    app.changePage(currentPageId)\n  }, [currentPageId, app])\n\n  // Toggle the app's readOnly mode when the `readOnly` prop changes.\n  React.useEffect(() => {\n    app.readOnly = readOnly\n    if (!readOnly) {\n      app.selectNone()\n      app.cancelSession()\n      app.setEditingId()\n    }\n  }, [app, readOnly])\n\n  // Toggle the app's darkMode when the `darkMode` prop changes.\n  React.useEffect(() => {\n    if (darkMode !== app.settings.isDarkMode) {\n      app.toggleDarkMode()\n    }\n  }, [app, darkMode])\n\n  // Update the app's callbacks when any callback changes.\n  React.useEffect(() => {\n    app.callbacks = {\n      onMount,\n      onChange,\n      onChangePresence,\n      onNewProject,\n      onSaveProject,\n      onSaveProjectAs,\n      onOpenProject,\n      onOpenMedia,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\n      onAssetUpload,\n      onExport,\n      onSessionStart,\n      onSessionEnd,\n    }\n  }, [\n    onMount,\n    onChange,\n    onChangePresence,\n    onNewProject,\n    onSaveProject,\n    onSaveProjectAs,\n    onOpenProject,\n    onOpenMedia,\n    onUndo,\n    onRedo,\n    onPersist,\n    onPatch,\n    onCommand,\n    onChangePage,\n    onAssetDelete,\n    onAssetCreate,\n    onAssetUpload,\n    onExport,\n    onSessionStart,\n    onSessionEnd,\n  ])\n\n  React.useLayoutEffect(() => {\n    if (typeof window === 'undefined') return\n    if (!window.document?.fonts) return\n\n    function refreshBoundingBoxes() {\n      app.refreshBoundingBoxes()\n    }\n    window.document.fonts.addEventListener('loadingdone', refreshBoundingBoxes)\n    return () => {\n      window.document.fonts.removeEventListener('loadingdone', refreshBoundingBoxes)\n    }\n  }, [app])\n\n  // Use the `key` to ensure that new selector hooks are made when the id changes\n  return (\n    <TldrawContext.Provider value={app}>\n      <InnerTldraw\n        key={sId || 'Tldraw'}\n        id={sId}\n        autofocus={autofocus}\n        showPages={showPages}\n        showMenu={showMenu}\n        showMultiplayerMenu={showMultiplayerMenu}\n        showStyles={showStyles}\n        showZoom={showZoom}\n        showTools={showTools}\n        showUI={showUI}\n        readOnly={readOnly}\n      />\n    </TldrawContext.Provider>\n  )\n}\n\ninterface InnerTldrawProps {\n  id?: string\n  autofocus: boolean\n  readOnly: boolean\n  showPages: boolean\n  showMenu: boolean\n  showMultiplayerMenu: boolean\n  showZoom: boolean\n  showStyles: boolean\n  showUI: boolean\n  showTools: boolean\n}\n\nconst InnerTldraw = React.memo(function InnerTldraw({\n  id,\n  autofocus,\n  showPages,\n  showMenu,\n  showMultiplayerMenu,\n  showZoom,\n  showStyles,\n  showTools,\n  readOnly,\n  showUI,\n}: InnerTldrawProps) {\n  const app = useTldrawApp()\n\n  const rWrapper = React.useRef<HTMLDivElement>(null)\n\n  const state = app.useStore()\n\n  const { document, settings, appState, room } = state\n\n  const isSelecting = state.appState.activeTool === 'select'\n\n  const page = document.pages[appState.currentPageId]\n  const pageState = document.pageStates[page.id]\n  const assets = document.assets\n  const { selectedIds } = pageState\n\n  const isHideBoundsShape =\n    selectedIds.length === 1 &&\n    page.shapes[selectedIds[0]] &&\n    TLDR.getShapeUtil(page.shapes[selectedIds[0]].type).hideBounds\n\n  const isHideResizeHandlesShape =\n    selectedIds.length === 1 &&\n    page.shapes[selectedIds[0]] &&\n    TLDR.getShapeUtil(page.shapes[selectedIds[0]].type).hideResizeHandles\n\n  // Custom rendering meta, with dark mode for shapes\n  const meta = React.useMemo(() => {\n    return { isDarkMode: settings.isDarkMode }\n  }, [settings.isDarkMode])\n\n  const showDashedBrush = settings.isCadSelectMode\n    ? !appState.selectByContain\n    : appState.selectByContain\n\n  // Custom theme, based on darkmode\n  const theme = React.useMemo(() => {\n    const { selectByContain } = appState\n    const { isDarkMode, isCadSelectMode } = settings\n\n    if (isDarkMode) {\n      const brushBase = isCadSelectMode\n        ? selectByContain\n          ? '69, 155, 255'\n          : '105, 209, 73'\n        : '180, 180, 180'\n      return {\n        brushFill: `rgba(${brushBase}, ${isCadSelectMode ? 0.08 : 0.05})`,\n        brushStroke: `rgba(${brushBase}, ${isCadSelectMode ? 0.5 : 0.25})`,\n        brushDashStroke: `rgba(${brushBase}, .6)`,\n        selected: 'rgba(38, 150, 255, 1.000)',\n        selectFill: 'rgba(38, 150, 255, 0.05)',\n        background: '#212529',\n        foreground: '#49555f',\n      }\n    }\n\n    const brushBase = isCadSelectMode ? (selectByContain ? '0, 89, 242' : '51, 163, 23') : '0,0,0'\n\n    return {\n      brushFill: `rgba(${brushBase}, ${isCadSelectMode ? 0.08 : 0.05})`,\n      brushStroke: `rgba(${brushBase}, ${isCadSelectMode ? 0.4 : 0.25})`,\n      brushDashStroke: `rgba(${brushBase}, .6)`,\n    }\n  }, [settings.isDarkMode, settings.isCadSelectMode, appState.selectByContain])\n\n  const isInSession = app.session !== undefined\n\n  // Hide bounds when not using the select tool, or when the only selected shape has handles\n  const hideBounds =\n    (isInSession && app.session?.constructor.name !== 'BrushSession') ||\n    !isSelecting ||\n    isHideBoundsShape ||\n    !!pageState.editingId\n\n  // Hide bounds when not using the select tool, or when in session\n  const hideHandles = isInSession || !isSelecting\n\n  // Hide indicators when not using the select tool, or when in session\n  const hideIndicators =\n    (isInSession && state.appState.status !== TDStatus.Brushing) || !isSelecting\n\n  const hideCloneHandles = isInSession || !isSelecting || pageState.camera.zoom < 0.2\n\n  const translation = useTranslation(settings.language)\n\n  // Put the theme on the body. This means that components with\n  // multiple editors cannot have different themes.\n  React.useLayoutEffect(() => {\n    if (settings.isDarkMode) {\n      window.document.body.classList.add(dark)\n    } else {\n      window.document.body.classList.remove(dark)\n    }\n  }, [settings.isDarkMode])\n\n  return (\n    <IntlProvider locale={translation.locale} messages={translation.messages}>\n      <StyledLayout ref={rWrapper} tabIndex={-0}>\n        <Loading />\n        <OneOff focusableRef={rWrapper} autofocus={autofocus} />\n        <ContextMenu>\n          <ErrorBoundary FallbackComponent={ErrorFallback}>\n            <Renderer\n              id={id}\n              containerRef={rWrapper}\n              shapeUtils={shapeUtils}\n              page={page}\n              pageState={pageState}\n              assets={assets}\n              snapLines={appState.snapLines}\n              eraseLine={appState.eraseLine}\n              grid={GRID_SIZE}\n              users={room?.users}\n              userId={room?.userId}\n              theme={theme}\n              meta={meta}\n              hideBounds={hideBounds}\n              hideHandles={hideHandles}\n              hideResizeHandles={isHideResizeHandlesShape}\n              hideIndicators={hideIndicators}\n              hideBindingHandles={!settings.showBindingHandles}\n              hideCloneHandles={hideCloneHandles}\n              hideRotateHandles={!settings.showRotateHandles}\n              hideGrid={!settings.showGrid}\n              showDashedBrush={showDashedBrush}\n              performanceMode={app.session?.performanceMode}\n              onPinchStart={app.onPinchStart}\n              onPinchEnd={app.onPinchEnd}\n              onPinch={app.onPinch}\n              onPan={app.onPan}\n              onZoom={app.onZoom}\n              onPointerDown={app.onPointerDown}\n              onPointerMove={app.onPointerMove}\n              onPointerUp={app.onPointerUp}\n              onPointCanvas={app.onPointCanvas}\n              onDoubleClickCanvas={app.onDoubleClickCanvas}\n              onRightPointCanvas={app.onRightPointCanvas}\n              onDragCanvas={app.onDragCanvas}\n              onReleaseCanvas={app.onReleaseCanvas}\n              onPointShape={app.onPointShape}\n              onDoubleClickShape={app.onDoubleClickShape}\n              onRightPointShape={app.onRightPointShape}\n              onDragShape={app.onDragShape}\n              onHoverShape={app.onHoverShape}\n              onUnhoverShape={app.onUnhoverShape}\n              onReleaseShape={app.onReleaseShape}\n              onPointBounds={app.onPointBounds}\n              onDoubleClickBounds={app.onDoubleClickBounds}\n              onRightPointBounds={app.onRightPointBounds}\n              onDragBounds={app.onDragBounds}\n              onHoverBounds={app.onHoverBounds}\n              onUnhoverBounds={app.onUnhoverBounds}\n              onReleaseBounds={app.onReleaseBounds}\n              onPointBoundsHandle={app.onPointBoundsHandle}\n              onDoubleClickBoundsHandle={app.onDoubleClickBoundsHandle}\n              onRightPointBoundsHandle={app.onRightPointBoundsHandle}\n              onDragBoundsHandle={app.onDragBoundsHandle}\n              onHoverBoundsHandle={app.onHoverBoundsHandle}\n              onUnhoverBoundsHandle={app.onUnhoverBoundsHandle}\n              onReleaseBoundsHandle={app.onReleaseBoundsHandle}\n              onPointHandle={app.onPointHandle}\n              onDoubleClickHandle={app.onDoubleClickHandle}\n              onRightPointHandle={app.onRightPointHandle}\n              onDragHandle={app.onDragHandle}\n              onHoverHandle={app.onHoverHandle}\n              onUnhoverHandle={app.onUnhoverHandle}\n              onReleaseHandle={app.onReleaseHandle}\n              onError={app.onError}\n              onRenderCountChange={app.onRenderCountChange}\n              onShapeChange={app.onShapeChange}\n              onShapeBlur={app.onShapeBlur}\n              onShapeClone={app.onShapeClone}\n              onBoundsChange={app.updateBounds}\n              onKeyDown={app.onKeyDown}\n              onKeyUp={app.onKeyUp}\n              onDragOver={app.onDragOver}\n              onDrop={app.onDrop}\n            />\n          </ErrorBoundary>\n        </ContextMenu>\n        {showUI && (\n          <StyledUI>\n            {settings.isFocusMode ? (\n              <FocusButton onSelect={app.toggleFocusMode} />\n            ) : (\n              <>\n                <TopPanel\n                  readOnly={readOnly}\n                  showPages={showPages}\n                  showMenu={showMenu}\n                  showMultiplayerMenu={showMultiplayerMenu}\n                  showStyles={showStyles}\n                  showZoom={showZoom}\n                />\n                <StyledSpacer />\n                {showTools && !readOnly && <ToolsPanel />}\n              </>\n            )}\n          </StyledUI>\n        )}\n      </StyledLayout>\n    </IntlProvider>\n  )\n})\n\nconst OneOff = React.memo(function OneOff({\n  focusableRef,\n  autofocus,\n}: {\n  autofocus?: boolean\n  focusableRef: React.RefObject<HTMLDivElement>\n}) {\n  useKeyboardShortcuts(focusableRef)\n  useStylesheet()\n\n  React.useEffect(() => {\n    if (autofocus) {\n      focusableRef.current?.focus()\n    }\n  }, [autofocus])\n\n  return null\n})\n\nconst StyledLayout = styled('div', {\n  position: 'absolute',\n  height: '100%',\n  width: '100%',\n  minHeight: 0,\n  minWidth: 0,\n  maxHeight: '100%',\n  maxWidth: '100%',\n  overflow: 'hidden',\n  boxSizing: 'border-box',\n  outline: 'none',\n\n  '& .tl-container': {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    height: '100%',\n    width: '100%',\n    zIndex: 1,\n  },\n\n  '& input, textarea, button, select, label, button': {\n    webkitTouchCallout: 'none',\n    webkitUserSelect: 'none',\n    '-webkit-tap-highlight-color': 'transparent',\n    'tap-highlight-color': 'transparent',\n  },\n})\n\nconst StyledUI = styled('div', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  height: '100%',\n  width: '100%',\n  padding: '8px 8px 0 8px',\n  display: 'flex',\n  alignItems: 'flex-start',\n  justifyContent: 'flex-start',\n  pointerEvents: 'none',\n  zIndex: 2,\n  '& > *': {\n    pointerEvents: 'all',\n  },\n})\n\nconst StyledSpacer = styled('div', {\n  flexGrow: 2,\n})\n", "import { createStitches, defaultThemeMap } from '@stitches/react'\n\nconst { styled, createTheme } = createStitches({\n  themeMap: {\n    ...defaultThemeMap,\n  },\n  theme: {\n    colors: {\n      bounds: 'rgba(65, 132, 244, 1.000)',\n      boundsBg: 'rgba(65, 132, 244, 0.05)',\n      hover: '#ececec',\n      overlay: 'rgba(0, 0, 0, 0.15)',\n      overlayContrast: 'rgba(255, 255, 255, 0.15)',\n      panel: '#fefefe',\n      panelContrast: '#ffffff',\n      selected: 'rgba(66, 133, 244, 1.000)',\n      selectedContrast: '#fefefe',\n      text: '#333333',\n      tooltip: '#1d1d1d',\n      tooltipContrast: '#ffffff',\n      warn: 'rgba(255, 100, 100, 1)',\n      canvas: 'rgb(248, 249, 250)',\n    },\n    shadows: {\n      2: '0px 1px 1px rgba(0, 0, 0, 0.14)',\n      3: '0px 2px 3px rgba(0, 0, 0, 0.14)',\n      4: '0px 4px 5px -1px rgba(0, 0, 0, 0.14)',\n      8: '0px 12px 17px rgba(0, 0, 0, 0.14)',\n      12: '0px 12px 17px rgba(0, 0, 0, 0.14)',\n      24: '0px 24px 38px rgba(0, 0, 0, 0.14)',\n      key: '1px 1px rgba(0,0,0,1)',\n      panel: `0px 0px 16px -1px rgba(0, 0, 0, 0.05), \n        0px 0px 16px -8px rgba(0, 0, 0, 0.05), \n        0px 0px 16px -12px rgba(0, 0, 0, 0.12),\n        0px 0px 2px 0px rgba(0, 0, 0, 0.08)`,\n    },\n    space: {\n      0: '2px',\n      1: '3px',\n      2: '4px',\n      3: '8px',\n      4: '12px',\n      5: '16px',\n      6: '32px',\n      7: '48px',\n    },\n    fontSizes: {\n      0: '10px',\n      1: '12px',\n      2: '13px',\n      3: '16px',\n      4: '18px',\n    },\n    fonts: {\n      ui: '\"Recursive\", system-ui, sans-serif',\n      body: '\"Recursive\", system-ui, sans-serif',\n      mono: '\"Recursive Mono\", monospace',\n    },\n    fontWeights: {},\n    lineHeights: {},\n    letterSpacings: {},\n    sizes: {},\n    borderWidths: {\n      0: '$1',\n    },\n    borderStyles: {},\n    radii: {\n      0: '2px',\n      1: '4px',\n      2: '8px',\n      3: '12px',\n      4: '16px',\n    },\n    zIndices: {},\n    transitions: {},\n  },\n  media: {\n    micro: '(max-width: 370px)',\n    sm: '(min-width: 640px)',\n    md: '(min-width: 768px)',\n    lg: '(min-width: 1024px)',\n  },\n  utils: {\n    zStrokeWidth: () => (value: number | number[]) => {\n      if (Array.isArray(value)) {\n        return {\n          strokeWidth: `calc(${value[0]}px / var(--camera-zoom))`,\n        }\n      }\n\n      return {\n        strokeWidth: `calc(${value}px / var(--camera-zoom))`,\n      }\n    },\n  },\n})\n\nexport const dark = createTheme({\n  colors: {\n    bounds: 'rgba(38, 150, 255, 1.000)',\n    boundsBg: 'rgba(38, 150, 255, 0.05)',\n    hover: '#444A50',\n    overlay: 'rgba(0, 0, 0, 0.15)',\n    overlayContrast: 'rgba(255, 255, 255, 0.15)',\n    panel: '#363D44',\n    panelContrast: '#49555f',\n    selected: 'rgba(38, 150, 255, 1.000)',\n    selectedContrast: '#fefefe',\n    text: '#f8f9fa',\n    tooltip: '#1d1d1d',\n    tooltipContrast: '#ffffff',\n    canvas: '#212529',\n  },\n  shadows: {\n    2: '0px 1px 1px rgba(0, 0, 0, 0.24)',\n    3: '0px 2px 3px rgba(0, 0, 0, 0.24)',\n    4: '0px 4px 5px -1px rgba(0, 0, 0, 0.24)',\n    8: '0px 12px 17px rgba(0, 0, 0, 0.24)',\n    12: '0px 12px 17px rgba(0, 0, 0, 0.24)',\n    24: '0px 24px 38px rgba(0, 0, 0, 0.24)',\n    panel: `0px 0px 16px -1px rgba(0, 0, 0, 0.05), \n      0px 0px 16px -8px rgba(0, 0, 0, 0.09), \n      0px 0px 16px -12px rgba(0, 0, 0, 0.2)`,\n  },\n})\n\nexport { styled }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n  TLPage,\n  TLUser,\n  TLPageState,\n  TLBinding,\n  TLBoundsCorner,\n  TLBoundsEdge,\n  TLShape,\n  TLHandle,\n  TLSnapLine,\n  TLPinchEventHandler,\n  TLKeyboardEventHandler,\n  TLPointerEventHandler,\n  TLWheelEventHandler,\n  TLCanvasEventHandler,\n  TLBoundsEventHandler,\n  TLBoundsHandleEventHandler,\n  TLShapeBlurHandler,\n  TLShapeCloneHandler,\n  TLAsset,\n} from '@tldraw/core'\nimport { TDLanguage } from '~translations'\n\n/* -------------------------------------------------- */\n/*                         App                        */\n/* -------------------------------------------------- */\n\n// A base class for all classes that handle events from the Renderer,\n// including TDApp and all Tools.\nexport class TDEventHandler {\n  onPinchStart?: TLPinchEventHandler\n  onPinchEnd?: TLPinchEventHandler\n  onPinch?: TLPinchEventHandler\n  onKeyDown?: TLKeyboardEventHandler\n  onKeyUp?: TLKeyboardEventHandler\n  onPointerMove?: TLPointerEventHandler\n  onPointerUp?: TLPointerEventHandler\n  onPan?: TLWheelEventHandler\n  onZoom?: TLWheelEventHandler\n  onPointerDown?: TLPointerEventHandler\n  onPointCanvas?: TLCanvasEventHandler\n  onDoubleClickCanvas?: TLCanvasEventHandler\n  onRightPointCanvas?: TLCanvasEventHandler\n  onDragCanvas?: TLCanvasEventHandler\n  onReleaseCanvas?: TLCanvasEventHandler\n  onPointShape?: TLPointerEventHandler\n  onDoubleClickShape?: TLPointerEventHandler\n  onRightPointShape?: TLPointerEventHandler\n  onDragShape?: TLPointerEventHandler\n  onHoverShape?: TLPointerEventHandler\n  onUnhoverShape?: TLPointerEventHandler\n  onReleaseShape?: TLPointerEventHandler\n  onPointBounds?: TLBoundsEventHandler\n  onDoubleClickBounds?: TLBoundsEventHandler\n  onRightPointBounds?: TLBoundsEventHandler\n  onDragBounds?: TLBoundsEventHandler\n  onHoverBounds?: TLBoundsEventHandler\n  onUnhoverBounds?: TLBoundsEventHandler\n  onReleaseBounds?: TLBoundsEventHandler\n  onPointBoundsHandle?: TLBoundsHandleEventHandler\n  onDoubleClickBoundsHandle?: TLBoundsHandleEventHandler\n  onRightPointBoundsHandle?: TLBoundsHandleEventHandler\n  onDragBoundsHandle?: TLBoundsHandleEventHandler\n  onHoverBoundsHandle?: TLBoundsHandleEventHandler\n  onUnhoverBoundsHandle?: TLBoundsHandleEventHandler\n  onReleaseBoundsHandle?: TLBoundsHandleEventHandler\n  onPointHandle?: TLPointerEventHandler\n  onDoubleClickHandle?: TLPointerEventHandler\n  onRightPointHandle?: TLPointerEventHandler\n  onDragHandle?: TLPointerEventHandler\n  onHoverHandle?: TLPointerEventHandler\n  onUnhoverHandle?: TLPointerEventHandler\n  onReleaseHandle?: TLPointerEventHandler\n  onShapeBlur?: TLShapeBlurHandler\n  onShapeClone?: TLShapeCloneHandler\n}\n\nexport type TDDockPosition = 'bottom' | 'left' | 'right' | 'top'\n\n// The shape of the TldrawApp's React (zustand) store\nexport interface TDSnapshot {\n  settings: {\n    isCadSelectMode: boolean\n    isDarkMode: boolean\n    isDebugMode: boolean\n    isPenMode: boolean\n    isReadonlyMode: boolean\n    isZoomSnap: boolean\n    keepStyleMenuOpen: boolean\n    nudgeDistanceSmall: number\n    nudgeDistanceLarge: number\n    isFocusMode: boolean\n    isSnapping: boolean\n    showRotateHandles: boolean\n    showBindingHandles: boolean\n    showCloneHandles: boolean\n    showGrid: boolean\n    language: TDLanguage\n    dockPosition: TDDockPosition\n    exportBackground: TDExportBackground\n  }\n  appState: {\n    currentStyle: ShapeStyles\n    currentPageId: string\n    hoveredId?: string\n    activeTool: TDToolType\n    isToolLocked: boolean\n    isEmptyCanvas: boolean\n    isMenuOpen: boolean\n    status: string\n    snapLines: TLSnapLine[]\n    eraseLine: number[][]\n    isLoading: boolean\n    disableAssets: boolean\n    selectByContain?: boolean\n  }\n  document: TDDocument\n  room?: {\n    id: string\n    userId: string\n    users: Record<string, TDUser>\n  }\n}\n\nexport type TldrawPatch = Patch<TDSnapshot>\n\nexport type TldrawCommand = Command<TDSnapshot>\n\n// The shape of the files stored in JSON\nexport interface TDFile {\n  name: string\n  fileHandle: FileSystemHandle | null\n  document: TDDocument\n  assets: Record<string, unknown>\n}\n\n// The shape of the Tldraw document\nexport interface TDDocument {\n  id: string\n  name: string\n  version: number\n  pages: Record<string, TDPage>\n  pageStates: Record<string, TLPageState>\n  assets: TDAssets\n}\n\n// The shape of a single page in the Tldraw document\nexport type TDPage = TLPage<TDShape, TDBinding>\n\n// A partial of a TDPage, used for commands / patches\nexport type PagePartial = {\n  shapes: Patch<TDPage['shapes']>\n  bindings: Patch<TDPage['bindings']>\n}\n\n// The meta information passed to TDShapeUtil components\nexport interface TDMeta {\n  isDarkMode: boolean\n}\n\n// The type of info given to shapes when transforming\nexport interface TransformInfo<T extends TLShape> {\n  type: TLBoundsEdge | TLBoundsCorner\n  initialShape: T\n  scaleX: number\n  scaleY: number\n  transformOrigin: number[]\n}\n\n// The status of a TDUser\nexport enum TDUserStatus {\n  Idle = 'idle',\n  Connecting = 'connecting',\n  Connected = 'connected',\n  Disconnected = 'disconnected',\n}\n\n// A TDUser, for multiplayer rooms\nexport interface TDUser extends TLUser<TDShape> {\n  activeShapes: TDShape[]\n  status: TDUserStatus\n  session?: boolean\n}\n\nexport type Theme = 'dark' | 'light'\n\nexport enum SessionType {\n  Transform = 'transform',\n  Translate = 'translate',\n  TransformSingle = 'transformSingle',\n  Brush = 'brush',\n  Arrow = 'arrow',\n  Draw = 'draw',\n  Erase = 'erase',\n  Rotate = 'rotate',\n  Handle = 'handle',\n  Grid = 'grid',\n  Edit = 'edit',\n}\n\nexport enum TDStatus {\n  Idle = 'idle',\n  PointingHandle = 'pointingHandle',\n  PointingBounds = 'pointingBounds',\n  PointingBoundsHandle = 'pointingBoundsHandle',\n  TranslatingLabel = 'translatingLabel',\n  TranslatingHandle = 'translatingHandle',\n  Translating = 'translating',\n  Transforming = 'transforming',\n  Rotating = 'rotating',\n  Pinching = 'pinching',\n  Brushing = 'brushing',\n  Creating = 'creating',\n  EditingText = 'editing-text',\n}\n\nexport type TDToolType =\n  | 'select'\n  | 'erase'\n  | TDShapeType.Text\n  | TDShapeType.Draw\n  | TDShapeType.Ellipse\n  | TDShapeType.Rectangle\n  | TDShapeType.Triangle\n  | TDShapeType.Line\n  | TDShapeType.Arrow\n  | TDShapeType.Sticky\n\nexport type Easing =\n  | 'linear'\n  | 'easeInQuad'\n  | 'easeOutQuad'\n  | 'easeInOutQuad'\n  | 'easeInCubic'\n  | 'easeOutCubic'\n  | 'easeInOutCubic'\n  | 'easeInQuart'\n  | 'easeOutQuart'\n  | 'easeInOutQuart'\n  | 'easeInQuint'\n  | 'easeOutQuint'\n  | 'easeInOutQuint'\n  | 'easeInSine'\n  | 'easeOutSine'\n  | 'easeInOutSine'\n  | 'easeInExpo'\n  | 'easeOutExpo'\n  | 'easeInOutExpo'\n\nexport enum MoveType {\n  Backward = 'backward',\n  Forward = 'forward',\n  ToFront = 'toFront',\n  ToBack = 'toBack',\n}\n\nexport enum AlignType {\n  Top = 'top',\n  CenterVertical = 'centerVertical',\n  Bottom = 'bottom',\n  Left = 'left',\n  CenterHorizontal = 'centerHorizontal',\n  Right = 'right',\n}\n\nexport enum StretchType {\n  Horizontal = 'horizontal',\n  Vertical = 'vertical',\n}\n\nexport enum DistributeType {\n  Horizontal = 'horizontal',\n  Vertical = 'vertical',\n}\n\nexport enum FlipType {\n  Horizontal = 'horizontal',\n  Vertical = 'vertical',\n}\n\n/* -------------------------------------------------- */\n/*                       Shapes                       */\n/* -------------------------------------------------- */\n\nexport enum TDShapeType {\n  Sticky = 'sticky',\n  Ellipse = 'ellipse',\n  Rectangle = 'rectangle',\n  Triangle = 'triangle',\n  Draw = 'draw',\n  Arrow = 'arrow',\n  Line = 'line',\n  Text = 'text',\n  Group = 'group',\n  Image = 'image',\n  Video = 'video',\n}\n\nexport enum Decoration {\n  Arrow = 'arrow',\n}\n\nexport interface TDBaseShape extends TLShape {\n  style: ShapeStyles\n  type: TDShapeType\n  label?: string\n  handles?: Record<string, TDHandle>\n}\n\nexport interface DrawShape extends TDBaseShape {\n  type: TDShapeType.Draw\n  points: number[][]\n  isComplete: boolean\n}\n\n// The extended handle (used for arrows)\nexport interface TDHandle extends TLHandle {\n  canBind?: boolean\n  bindingId?: string\n}\n\nexport interface RectangleShape extends TDBaseShape {\n  type: TDShapeType.Rectangle\n  size: number[]\n  label?: string\n  labelPoint?: number[]\n}\n\nexport interface EllipseShape extends TDBaseShape {\n  type: TDShapeType.Ellipse\n  radius: number[]\n  label?: string\n  labelPoint?: number[]\n}\n\nexport interface TriangleShape extends TDBaseShape {\n  type: TDShapeType.Triangle\n  size: number[]\n  label?: string\n  labelPoint?: number[]\n}\n\n// The shape created with the arrow tool\nexport interface ArrowShape extends TDBaseShape {\n  type: TDShapeType.Arrow\n  bend: number\n  handles: {\n    start: TDHandle\n    bend: TDHandle\n    end: TDHandle\n  }\n  decorations?: {\n    start?: Decoration\n    end?: Decoration\n    middle?: Decoration\n  }\n  label?: string\n  labelPoint?: number[]\n}\n\nexport interface ArrowBinding extends TLBinding {\n  handleId: keyof ArrowShape['handles']\n  distance: number\n  point: number[]\n}\n\nexport type TDBinding = ArrowBinding\n\nexport interface ImageShape extends TDBaseShape {\n  type: TDShapeType.Image\n  size: number[]\n  assetId: string\n}\n\nexport interface VideoShape extends TDBaseShape {\n  type: TDShapeType.Video\n  size: number[]\n  assetId: string\n  isPlaying: boolean\n  currentTime: number\n}\n\n// The shape created by the text tool\nexport interface TextShape extends TDBaseShape {\n  type: TDShapeType.Text\n  text: string\n}\n\n// The shape created by the sticky tool\nexport interface StickyShape extends TDBaseShape {\n  type: TDShapeType.Sticky\n  size: number[]\n  text: string\n}\n\n// The shape created when multiple shapes are grouped\nexport interface GroupShape extends TDBaseShape {\n  type: TDShapeType.Group\n  size: number[]\n  children: string[]\n}\n\n// A union of all shapes\nexport type TDShape =\n  | RectangleShape\n  | EllipseShape\n  | TriangleShape\n  | DrawShape\n  | ArrowShape\n  | TextShape\n  | GroupShape\n  | StickyShape\n  | ImageShape\n  | VideoShape\n\n/* ------------------ Shape Styles ------------------ */\n\nexport enum ColorStyle {\n  White = 'white',\n  LightGray = 'lightGray',\n  Gray = 'gray',\n  Black = 'black',\n  Green = 'green',\n  Cyan = 'cyan',\n  Blue = 'blue',\n  Indigo = 'indigo',\n  Violet = 'violet',\n  Red = 'red',\n  Orange = 'orange',\n  Yellow = 'yellow',\n}\n\nexport enum SizeStyle {\n  Small = 'small',\n  Medium = 'medium',\n  Large = 'large',\n}\n\nexport enum DashStyle {\n  Draw = 'draw',\n  Solid = 'solid',\n  Dashed = 'dashed',\n  Dotted = 'dotted',\n}\n\nexport enum FontSize {\n  Small = 'small',\n  Medium = 'medium',\n  Large = 'large',\n  ExtraLarge = 'extraLarge',\n}\n\nexport enum AlignStyle {\n  Start = 'start',\n  Middle = 'middle',\n  End = 'end',\n  Justify = 'justify',\n}\n\nexport enum FontStyle {\n  Script = 'script',\n  Sans = 'sans',\n  Serif = 'erif',\n  Mono = 'mono',\n}\n\nexport type ShapeStyles = {\n  color: ColorStyle\n  size: SizeStyle\n  dash: DashStyle\n  font?: FontStyle\n  textAlign?: AlignStyle\n  isFilled?: boolean\n  scale?: number\n}\n\nexport enum TDAssetType {\n  Image = 'image',\n  Video = 'video',\n}\n\nexport interface TDImageAsset extends TLAsset {\n  type: TDAssetType.Image\n  fileName: string\n  src: string\n  size: number[]\n}\n\nexport interface TDVideoAsset extends TLAsset {\n  type: TDAssetType.Video\n  fileName: string\n  src: string\n  size: number[]\n}\n\nexport type TDAsset = TDImageAsset | TDVideoAsset\n\nexport type TDAssets = Record<string, TDAsset>\n\n/* -------------------------------------------------- */\n/*                    Export                          */\n/* -------------------------------------------------- */\n\nexport enum TDExportType {\n  PNG = 'png',\n  JPG = 'jpeg',\n  WEBP = 'webp',\n  SVG = 'svg',\n  JSON = 'json',\n}\n\nexport interface TDExport {\n  name: string\n  type: string\n  blob: Blob\n}\n\nexport enum TDExportBackground {\n  Transparent = 'transparent',\n  Auto = 'auto',\n  Light = 'light',\n  Dark = 'dark'\n}\n\n/* -------------------------------------------------- */\n/*                    Type Helpers                    */\n/* -------------------------------------------------- */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ParametersExceptFirst<F> = F extends (arg0: any, ...rest: infer R) => any ? R : never\n\nexport type ExceptFirst<T extends unknown[]> = T extends [any, ...infer U] ? U : never\n\nexport type ExceptFirstTwo<T extends unknown[]> = T extends [any, any, ...infer U] ? U : never\n\nexport type PropsOfType<U> = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [K in keyof TDShape]: TDShape[K] extends any ? (TDShape[K] extends U ? K : never) : never\n}[keyof TDShape]\n\nexport type Difference<A, B, C = A> = A extends B ? never : C\n\nexport type Intersection<A, B, C = A> = A extends B ? C : never\n\nexport type FilteredKeys<T, U> = {\n  [P in keyof T]: T[P] extends U ? P : never\n}[keyof T]\n\nexport type RequiredKeys<T> = {\n  [K in keyof T]-?: Difference<Record<string, unknown>, Pick<T, K>, K>\n}[keyof T]\n\nexport type MembersWithRequiredKey<T, U> = {\n  [P in keyof T]: Intersection<U, RequiredKeys<T[P]>, T[P]>\n}[keyof T]\n\nexport type MappedByType<U extends string, T extends { type: U }> = {\n  [P in T['type']]: T extends any ? (P extends T['type'] ? T : never) : never\n}\n\nexport type ShapesWithProp<U> = MembersWithRequiredKey<MappedByType<TDShapeType, TDShape>, U>\n\nexport type Patch<T> = Partial<{ [P in keyof T]: Patch<T[P]> }>\n\nexport interface Command<T extends { [key: string]: any }> {\n  id?: string\n  before: Patch<T>\n  after: Patch<T>\n}\n\nexport interface FileWithHandle extends File {\n  handle?: FileSystemHandle\n}\n\nexport interface FileWithDirectoryHandle extends File {\n  directoryHandle?: FileSystemHandle\n}\n\n// The following typings implement the relevant parts of the File System Access\n// API. This can be removed once the specification reaches the Candidate phase\n// and is implemented as part of microsoft/TSJS-lib-generator.\n\nexport interface FileSystemHandlePermissionDescriptor {\n  mode?: 'read' | 'readwrite'\n}\n\nexport interface FileSystemHandle {\n  readonly kind: 'file' | 'directory'\n  readonly name: string\n\n  isSameEntry: (other: FileSystemHandle) => Promise<boolean>\n\n  queryPermission: (descriptor?: FileSystemHandlePermissionDescriptor) => Promise<PermissionState>\n  requestPermission: (descriptor?: FileSystemHandlePermissionDescriptor) => Promise<PermissionState>\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Vec } from '@tldraw/vec'\nimport {\n  TLBoundsEventHandler,\n  TLBoundsHandleEventHandler,\n  TLKeyboardEventHandler,\n  TLShapeCloneHandler,\n  TLCanvasEventHandler,\n  TLPageState,\n  TLPinchEventHandler,\n  TLPointerEventHandler,\n  TLWheelEventHandler,\n  Utils,\n  TLBounds,\n  TLDropEventHandler,\n} from '@tldraw/core'\nimport {\n  FlipType,\n  TDDocument,\n  MoveType,\n  AlignType,\n  StretchType,\n  DistributeType,\n  ShapeStyles,\n  TDShape,\n  TDShapeType,\n  TDSnapshot,\n  TDStatus,\n  TDPage,\n  TDBinding,\n  GroupShape,\n  TldrawCommand,\n  TDUser,\n  SessionType,\n  TDToolType,\n  TDAssetType,\n  TDAsset,\n  TDAssets,\n  TDExport,\n  ArrowShape,\n  TDExportType,\n  TldrawPatch,\n  TDExportBackground,\n  AlignStyle,\n} from '~types'\nimport {\n  migrate,\n  FileSystemHandle,\n  loadFileHandle,\n  openFromFileSystem,\n  saveToFileSystem,\n  openAssetsFromFileSystem,\n  fileToBase64,\n  fileToText,\n  getImageSizeFromSrc,\n  getVideoSizeFromSrc,\n} from './data'\nimport { TLDR } from './TLDR'\nimport { shapeUtils } from '~state/shapes'\nimport { defaultStyle } from '~state/shapes/shared/shape-styles'\nimport * as Commands from './commands'\nimport { SessionArgsOfType, getSession, TldrawSession } from './sessions'\nimport {\n  USER_COLORS,\n  FIT_TO_SCREEN_PADDING,\n  GRID_SIZE,\n  IMAGE_EXTENSIONS,\n  VIDEO_EXTENSIONS,\n  SVG_EXPORT_PADDING,\n} from '~constants'\nimport type { BaseTool } from './tools/BaseTool'\nimport { SelectTool } from './tools/SelectTool'\nimport { EraseTool } from './tools/EraseTool'\nimport { TextTool } from './tools/TextTool'\nimport { DrawTool } from './tools/DrawTool'\nimport { EllipseTool } from './tools/EllipseTool'\nimport { RectangleTool } from './tools/RectangleTool'\nimport { TriangleTool } from './tools/TriangleTool'\nimport { LineTool } from './tools/LineTool'\nimport { ArrowTool } from './tools/ArrowTool'\nimport { StickyTool } from './tools/StickyTool'\nimport { StateManager } from './StateManager'\nimport { clearPrevSize } from './shapes/shared/getTextSize'\nimport { getClipboard, setClipboard } from './IdbClipboard'\nimport { deepCopy } from './StateManager/copy'\nimport { getTranslation } from '~translations'\nimport { TextUtil } from './shapes/TextUtil'\n\nconst uuid = Utils.uniqueId()\n\nexport interface TDCallbacks {\n  /**\n   * (optional) A callback to run when the component mounts.\n   */\n  onMount?: (app: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the component's state changes.\n   */\n  onChange?: (app: TldrawApp, reason?: string) => void\n  /**\n   * (optional) A callback to run when the user creates a new project through the menu or through a keyboard shortcut.\n   */\n  onNewProject?: (app: TldrawApp, e?: KeyboardEvent) => void\n  /**\n   * (optional) A callback to run when the user saves a project through the menu or through a keyboard shortcut.\n   */\n  onSaveProject?: (app: TldrawApp, e?: KeyboardEvent) => void\n  /**\n   * (optional) A callback to run when the user saves a project as a new project through the menu or through a keyboard shortcut.\n   */\n  onSaveProjectAs?: (app: TldrawApp, e?: KeyboardEvent) => void\n  /**\n   * (optional) A callback to run when the user opens new project through the menu or through a keyboard shortcut.\n   */\n  onOpenProject?: (app: TldrawApp, e?: KeyboardEvent) => void\n  /**\n   * (optional) A callback to run when the opens a file to upload.\n   */\n  onOpenMedia?: (app: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the state is patched.\n   */\n  onPatch?: (app: TldrawApp, patch: TldrawPatch, reason?: string) => void\n  /**\n   * (optional) A callback to run when the state is changed with a command.\n   */\n  onCommand?: (app: TldrawApp, command: TldrawCommand, reason?: string) => void\n  /**\n   * (optional) A callback to run when the state is persisted.\n   */\n  onPersist?: (app: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user undos.\n   */\n  onUndo?: (app: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user redos.\n   */\n  onRedo?: (app: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user changes the current page's shapes.\n   */\n  onChangePage?: (\n    app: TldrawApp,\n    shapes: Record<string, TDShape | undefined>,\n    bindings: Record<string, TDBinding | undefined>,\n    assets: Record<string, TDAsset | undefined>,\n    addToHistory: boolean\n  ) => void\n  /**\n   * (optional) A callback to run when the user creates a new project.\n   */\n  onChangePresence?: (app: TldrawApp, user: TDUser) => void\n  /**\n   * (optional) A callback to run when an asset will be deleted.\n   */\n  onAssetDelete?: (app: TldrawApp, assetId: string) => void\n  /**\n   * (optional) A callback to run when an asset will be created. Should return the value for the image/video's `src` property.\n   */\n  onAssetCreate?: (app: TldrawApp, file: File, id: string) => Promise<string | false>\n  /**\n   * (optional) A callback to run when an asset will be uploaded. Should return the value for the image/video's `src` property.\n   */\n  onAssetUpload?: (app: TldrawApp, file: File, id: string) => Promise<string | false>\n  /**\n   * (optional) A callback to run when the user exports their page or selection.\n   */\n  onExport?: (app: TldrawApp, info: TDExport) => Promise<void>\n  /**\n   * (optional) A callback to run when a session begins.\n   */\n  onSessionStart?: (app: TldrawApp, id: string) => void\n  /**\n   * (optional) A callback to run when a session ends.\n   */\n  onSessionEnd?: (app: TldrawApp, id: string) => void\n}\n\nexport class TldrawApp extends StateManager<TDSnapshot> {\n  callbacks: TDCallbacks = {}\n\n  tools = {\n    select: new SelectTool(this),\n    erase: new EraseTool(this),\n    [TDShapeType.Text]: new TextTool(this),\n    [TDShapeType.Draw]: new DrawTool(this),\n    [TDShapeType.Ellipse]: new EllipseTool(this),\n    [TDShapeType.Rectangle]: new RectangleTool(this),\n    [TDShapeType.Triangle]: new TriangleTool(this),\n    [TDShapeType.Line]: new LineTool(this),\n    [TDShapeType.Arrow]: new ArrowTool(this),\n    [TDShapeType.Sticky]: new StickyTool(this),\n  }\n\n  currentTool: BaseTool = this.tools.select\n\n  session?: TldrawSession\n\n  readOnly = false\n\n  isDirty = false\n\n  isCreating = false\n\n  originPoint = [0, 0]\n\n  currentPoint = [0, 0]\n\n  previousPoint = [0, 0]\n\n  shiftKey = false\n\n  altKey = false\n\n  metaKey = false\n\n  ctrlKey = false\n\n  spaceKey = false\n\n  isPointing = false\n\n  isForcePanning = false\n\n  editingStartTime = -1\n\n  fileSystemHandle: FileSystemHandle | null = null\n\n  viewport = Utils.getBoundsFromPoints([\n    [0, 0],\n    [100, 100],\n  ])\n\n  rendererBounds = Utils.getBoundsFromPoints([\n    [0, 0],\n    [100, 100],\n  ])\n\n  selectHistory = {\n    stack: [[]] as string[][],\n    pointer: 0,\n  }\n\n  clipboard?: {\n    shapes: TDShape[]\n    bindings: TDBinding[]\n    assets: TDAsset[]\n  }\n\n  rotationInfo = {\n    selectedIds: [] as string[],\n    center: [0, 0],\n  }\n\n  constructor(id?: string, callbacks = {} as TDCallbacks) {\n    super(TldrawApp.defaultState, id, TldrawApp.version, (prev, next, prevVersion) => {\n      return migrate(\n        {\n          ...next,\n          document: { ...next.document, ...prev.document, version: prevVersion },\n        },\n        TldrawApp.version\n      )\n    })\n\n    this.callbacks = callbacks\n  }\n\n  /* -------------------- Internal -------------------- */\n\n  protected migrate = (state: TDSnapshot): TDSnapshot => {\n    return migrate(state, TldrawApp.version)\n  }\n\n  protected onReady = () => {\n    this.loadDocument(this.document)\n\n    loadFileHandle().then((fileHandle) => {\n      this.fileSystemHandle = fileHandle\n    })\n\n    try {\n      this.patchState({\n        ...migrate(this.state, TldrawApp.version),\n        appState: {\n          status: TDStatus.Idle,\n        },\n      })\n    } catch (e) {\n      console.error('The data appears to be corrupted. Resetting!', e)\n      localStorage.setItem(this.document.id + '_corrupted', JSON.stringify(this.document))\n\n      this.patchState({\n        ...TldrawApp.defaultState,\n        appState: {\n          ...TldrawApp.defaultState.appState,\n          status: TDStatus.Idle,\n        },\n      })\n    }\n\n    this.callbacks.onMount?.(this)\n  }\n\n  /**\n   * Cleanup the state after each state change.\n   * @param state The new state\n   * @param prev The previous state\n   * @protected\n   * @returns The final state\n   */\n  protected cleanup = (state: TDSnapshot, prev: TDSnapshot): TDSnapshot => {\n    const next: TDSnapshot = { ...state }\n\n    // Remove deleted shapes and bindings (in Commands, these will be set to undefined)\n    if (next.document !== prev.document) {\n      Object.entries(next.document.pages).forEach(([pageId, page]) => {\n        if (page === undefined) {\n          // If page is undefined, delete the page and pagestate\n          delete next.document.pages[pageId]\n          delete next.document.pageStates[pageId]\n          return\n        }\n\n        const prevPage = prev.document.pages[pageId]\n\n        const changedShapes: Record<string, TDShape | undefined> = {}\n\n        if (!prevPage || page.shapes !== prevPage.shapes || page.bindings !== prevPage.bindings) {\n          page.shapes = { ...page.shapes }\n          page.bindings = { ...page.bindings }\n\n          const groupsToUpdate = new Set<GroupShape>()\n\n          // If shape is undefined, delete the shape\n          Object.entries(page.shapes).forEach(([id, shape]) => {\n            let parentId: string\n\n            if (!shape) {\n              parentId = prevPage?.shapes[id]?.parentId\n              delete page.shapes[id]\n            } else {\n              parentId = shape.parentId\n            }\n\n            if (page.id === next.appState.currentPageId) {\n              if (prevPage?.shapes[id] !== shape) {\n                changedShapes[id] = shape\n              }\n            }\n\n            // If the shape is the child of a group, then update the group\n            // (unless the group is being deleted too)\n            if (parentId && parentId !== pageId) {\n              const group = page.shapes[parentId]\n              if (group !== undefined) {\n                groupsToUpdate.add(page.shapes[parentId] as GroupShape)\n              }\n            }\n          })\n\n          // If binding is undefined, delete the binding\n          Object.keys(page.bindings).forEach((id) => {\n            if (!page.bindings[id]) {\n              delete page.bindings[id]\n            }\n          })\n\n          next.document.pages[pageId] = page\n\n          // Get bindings related to the changed shapes\n          const bindingsToUpdate = TLDR.getRelatedBindings(next, Object.keys(changedShapes), pageId)\n\n          const visitedShapes = new Set<ArrowShape>()\n\n          // Update all of the bindings we've just collected\n          bindingsToUpdate.forEach((binding) => {\n            if (!page.bindings[binding.id]) {\n              return\n            }\n\n            const toShape = page.shapes[binding.toId]\n            const fromShape = page.shapes[binding.fromId] as ArrowShape\n\n            if (!(toShape && fromShape)) {\n              delete next.document.pages[pageId].bindings[binding.id]\n              return\n            }\n\n            if (visitedShapes.has(fromShape)) {\n              return\n            }\n\n            // We only need to update the binding's \"from\" shape (an arrow)\n            const fromDelta = TLDR.updateArrowBindings(page, fromShape)\n            visitedShapes.add(fromShape)\n\n            if (fromDelta) {\n              const nextShape = {\n                ...fromShape,\n                ...fromDelta,\n              } as ArrowShape\n              page.shapes[fromShape.id] = nextShape\n            }\n          })\n\n          groupsToUpdate.forEach((group) => {\n            if (!group) throw Error('no group!')\n            const children = group.children.filter((id) => page.shapes[id] !== undefined)\n\n            const commonBounds = Utils.getCommonBounds(\n              children\n                .map((id) => page.shapes[id])\n                .filter(Boolean)\n                .map((shape) => TLDR.getRotatedBounds(shape))\n            )\n\n            page.shapes[group.id] = {\n              ...group,\n              point: [commonBounds.minX, commonBounds.minY],\n              size: [commonBounds.width, commonBounds.height],\n              children,\n            }\n          })\n        }\n\n        // Clean up page state, preventing hovers on deleted shapes\n\n        const nextPageState: TLPageState = {\n          ...next.document.pageStates[pageId],\n        }\n\n        if (!nextPageState.brush) {\n          delete nextPageState.brush\n        }\n\n        if (nextPageState.hoveredId && !page.shapes[nextPageState.hoveredId]) {\n          delete nextPageState.hoveredId\n        }\n\n        if (nextPageState.bindingId && !page.bindings[nextPageState.bindingId]) {\n          TLDR.warn(`Could not find the binding of ${pageId}`)\n          delete nextPageState.bindingId\n        }\n\n        if (nextPageState.editingId && !page.shapes[nextPageState.editingId]) {\n          TLDR.warn('Could not find the editing shape!')\n          delete nextPageState.editingId\n        }\n\n        next.document.pageStates[pageId] = nextPageState\n      })\n    }\n\n    Object.keys(next.document.assets ?? {}).forEach((id) => {\n      if (!next.document.assets?.[id]) {\n        delete next.document.assets?.[id]\n      }\n    })\n\n    const currentPageId = next.appState.currentPageId\n\n    const currentPageState = next.document.pageStates[currentPageId]\n\n    if (next.room && next.room !== prev.room) {\n      const room = { ...next.room, users: { ...next.room.users } }\n\n      // Remove any exited users\n      if (prev.room) {\n        Object.values(prev.room.users)\n          .filter(Boolean)\n          .forEach((user) => {\n            if (room.users[user.id] === undefined) {\n              delete room.users[user.id]\n            }\n          })\n      }\n\n      next.room = room\n    }\n\n    if (next.room) {\n      next.room.users[next.room.userId] = {\n        ...next.room.users[next.room.userId],\n        point: this.currentPoint,\n        selectedIds: currentPageState.selectedIds,\n      }\n    }\n\n    // Temporary block on editing pages while in readonly mode.\n    // This is a broad solution but not a very good one: the UX\n    // for interacting with a readOnly document will be more nuanced.\n    if (this.readOnly) {\n      next.document.pages = prev.document.pages\n    }\n\n    return next\n  }\n\n  private broadcastPatch = (patch: TldrawPatch, addToHistory: boolean) => {\n    const changedShapes: Record<string, TDShape | undefined> = {}\n    const changedBindings: Record<string, TDBinding | undefined> = {}\n    const changedAssets: Record<string, TDAsset | undefined> = {}\n\n    const shapes = patch?.document?.pages?.[this.currentPageId]?.shapes\n    const bindings = patch?.document?.pages?.[this.currentPageId]?.bindings\n    const assets = patch?.document?.assets\n\n    if (shapes) {\n      Object.keys(shapes).forEach((id) => {\n        changedShapes[id!] = this.getShape(id, this.currentPageId)\n      })\n    }\n\n    if (bindings) {\n      Object.keys(bindings).forEach((id) => {\n        changedBindings[id] = this.getBinding(id, this.currentPageId)\n      })\n    }\n\n    if (assets) {\n      Object.keys(assets).forEach((id) => {\n        changedAssets[id] = this.document.assets[id]\n      })\n    }\n\n    this.callbacks.onChangePage?.(this, changedShapes, changedBindings, changedAssets, addToHistory)\n  }\n\n  onPatch = (state: TDSnapshot, patch: TldrawPatch, id?: string) => {\n    if (\n      (this.callbacks.onChangePage && patch?.document?.pages?.[this.currentPageId]) ||\n      patch?.document?.assets\n    ) {\n      if (\n        patch?.document?.assets ||\n        (this.session &&\n          this.session.type !== SessionType.Brush &&\n          this.session.type !== SessionType.Erase &&\n          this.session.type !== SessionType.Draw)\n      ) {\n        this.broadcastPatch(patch, false)\n      }\n    }\n\n    this.callbacks.onPatch?.(this, patch, id)\n  }\n\n  onCommand = (state: TDSnapshot, command: TldrawCommand, id?: string) => {\n    this.clearSelectHistory()\n    this.isDirty = true\n    this.callbacks.onCommand?.(this, command, id)\n  }\n\n  onReplace = () => {\n    this.clearSelectHistory()\n    this.isDirty = false\n  }\n\n  onUndo = () => {\n    this.rotationInfo.selectedIds = [...this.selectedIds]\n    this.callbacks.onUndo?.(this)\n  }\n\n  onRedo = () => {\n    this.rotationInfo.selectedIds = [...this.selectedIds]\n    this.callbacks.onRedo?.(this)\n  }\n\n  onPersist = (state: TDSnapshot, patch: TldrawPatch) => {\n    // If we are part of a room, send our changes to the server\n\n    this.callbacks.onPersist?.(this)\n    this.broadcastPatch(patch, true)\n  }\n\n  private prevSelectedIds = this.selectedIds\n\n  /**\n   * Clear the selection history after each new command, undo or redo.\n   * @param state\n   * @param id\n   */\n  protected onStateDidChange = (_state: TDSnapshot, id?: string): void => {\n    this.callbacks.onChange?.(this, id)\n\n    if (this.room && this.selectedIds !== this.prevSelectedIds) {\n      this.callbacks.onChangePresence?.(this, {\n        ...this.room.users[this.room.userId],\n        selectedIds: this.selectedIds,\n        session: !!this.session,\n      })\n      this.prevSelectedIds = this.selectedIds\n    }\n  }\n\n  /* ----------- Managing Multiplayer State ----------- */\n\n  private justSent = false\n\n  getReservedContent = (coreReservedIds: string[], pageId = this.currentPageId) => {\n    const { bindings } = this.document.pages[pageId]\n\n    // We want to know which shapes we need to\n    const reservedShapes: Record<string, TDShape> = {}\n    const reservedBindings: Record<string, TDBinding> = {}\n\n    // Quick lookup maps for bindings\n    const bindingsArr = Object.values(bindings)\n    const boundTos = new Map(bindingsArr.map((binding) => [binding.toId, binding]))\n    const boundFroms = new Map(bindingsArr.map((binding) => [binding.fromId, binding]))\n    const bindingMaps = [boundTos, boundFroms]\n\n    // Unique set of shape ids that are going to be reserved\n    const reservedShapeIds: string[] = []\n\n    if (this.session) coreReservedIds.forEach((id) => reservedShapeIds.push(id))\n    if (this.pageState.editingId) reservedShapeIds.push(this.pageState.editingId)\n\n    const strongReservedShapeIds = new Set(reservedShapeIds)\n\n    // Which shape ids have we already visited?\n    const visited = new Set<string>()\n\n    // Time to visit every reserved shape and every related shape and binding.\n    while (reservedShapeIds.length > 0) {\n      const id = reservedShapeIds.pop()\n      if (!id) break\n      if (visited.has(id)) continue\n\n      // Add to set so that we don't process this id a second time\n      visited.add(id)\n\n      // Get the shape and reserve it\n      const shape = this.getShape(id)\n      reservedShapes[id] = shape\n\n      if (shape.parentId !== pageId) reservedShapeIds.push(shape.parentId)\n\n      // If the shape has children, add the shape's children to the list of ids to process\n      if (shape.children) reservedShapeIds.push(...shape.children)\n\n      // If there are binding for this shape, reserve the bindings and\n      // add its related shapes to the list of ids to process\n      bindingMaps\n        .map((map) => map.get(shape.id)!)\n        .filter(Boolean)\n        .forEach((binding) => {\n          reservedBindings[binding.id] = binding\n          reservedShapeIds.push(binding.toId, binding.fromId)\n        })\n    }\n\n    return { reservedShapes, reservedBindings, strongReservedShapeIds }\n  }\n\n  /**\n   * Manually patch in page content.\n   */\n  public replacePageContent = (\n    shapes: Record<string, TDShape>,\n    bindings: Record<string, TDBinding>,\n    assets: Record<string, TDAsset>,\n    pageId = this.currentPageId\n  ): this => {\n    if (this.justSent) {\n      // The incoming update was caused by an update that the client sent, noop.\n      this.justSent = false\n      return this\n    }\n\n    const page = this.document.pages[this.currentPageId]\n\n    Object.values(shapes).forEach((shape) => {\n      if (shape.parentId !== pageId && !(page.shapes[shape.parentId] || shapes[shape.parentId])) {\n        console.warn('Added a shape without a parent on the page')\n        shape.parentId = pageId\n      }\n    })\n\n    this.useStore.setState((current) => {\n      const { hoveredId, editingId, bindingId, selectedIds } = current.document.pageStates[pageId]\n\n      const coreReservedIds = [...selectedIds]\n\n      const editingShape = editingId && current.document.pages[this.currentPageId].shapes[editingId]\n      if (editingShape) coreReservedIds.push(editingShape.id)\n\n      const { reservedShapes, reservedBindings, strongReservedShapeIds } = this.getReservedContent(\n        coreReservedIds,\n        this.currentPageId\n      )\n\n      // Merge in certain changes to reserved shapes\n      Object.values(reservedShapes)\n        // Don't merge updates to shapes with text (Text or Sticky)\n        .filter((reservedShape) => !('text' in reservedShape))\n        .forEach((reservedShape) => {\n          const incomingShape = shapes[reservedShape.id]\n          if (!incomingShape) return\n\n          // If the shape isn't \"strongly reserved\", then use the incoming shape;\n          // note that this is only if the incoming shape exists! If the shape was\n          // deleted in the incoming shapes, then we'll keep out reserved shape.\n          // This logic would need more work for arrows, because the incoming shape\n          // include a binding change that we'll need to resolve with our reserved bindings.\n          if (\n            !(\n              reservedShape.type === TDShapeType.Arrow ||\n              strongReservedShapeIds.has(reservedShape.id)\n            )\n          ) {\n            shapes[reservedShape.id] = incomingShape\n            return\n          }\n\n          // Only allow certain merges.\n\n          // Allow decorations (of an arrow) to be changed\n          if ('decorations' in incomingShape && 'decorations' in reservedShape) {\n            shapes[reservedShape.id] = { ...reservedShape, decorations: incomingShape.decorations }\n          }\n\n          // Allow the shape's style to be changed\n          reservedShape.style = incomingShape.style\n        })\n\n      // Use the incoming shapes / bindings as comparisons for what\n      // will have changed. This is important because we want to restore\n      // related shapes that may not have changed on our side, but which\n      // were deleted on the server.\n\n      const nextShapes = {\n        ...shapes,\n        ...reservedShapes,\n      }\n\n      if (editingShape) {\n        nextShapes[editingShape.id] = editingShape\n      }\n\n      const nextBindings = {\n        ...bindings,\n        ...reservedBindings,\n      }\n      const nextAssets = {\n        ...assets,\n      }\n\n      const next: TDSnapshot = {\n        ...current,\n        document: {\n          ...current.document,\n          pages: {\n            [pageId]: {\n              ...current.document.pages[pageId],\n              shapes: nextShapes,\n              bindings: nextBindings,\n            },\n          },\n          assets: nextAssets,\n          pageStates: {\n            ...current.document.pageStates,\n            [pageId]: {\n              ...current.document.pageStates[pageId],\n              selectedIds: selectedIds.filter((id) => nextShapes[id] !== undefined),\n              hoveredId: hoveredId\n                ? nextShapes[hoveredId] === undefined\n                  ? undefined\n                  : hoveredId\n                : undefined,\n              editingId: editingId,\n              bindingId: bindingId\n                ? nextBindings[bindingId] === undefined\n                  ? undefined\n                  : bindingId\n                : undefined,\n            },\n          },\n        },\n      }\n      const page = next.document.pages[pageId]\n\n      // Get bindings related to the changed shapes\n      const bindingsToUpdate = TLDR.getRelatedBindings(next, Object.keys(nextShapes), pageId)\n\n      const visitedShapes = new Set<ArrowShape>()\n\n      // Update all of the bindings we've just collected\n      bindingsToUpdate.forEach((binding) => {\n        if (!page.bindings[binding.id]) {\n          return\n        }\n\n        const fromShape = page.shapes[binding.fromId] as ArrowShape\n\n        if (visitedShapes.has(fromShape)) {\n          return\n        }\n\n        // We only need to update the binding's \"from\" shape (an arrow)\n        const fromDelta = TLDR.updateArrowBindings(page, fromShape)\n        visitedShapes.add(fromShape)\n\n        if (fromDelta) {\n          const nextShape = {\n            ...fromShape,\n            ...fromDelta,\n          } as TDShape\n\n          page.shapes[fromShape.id] = nextShape\n        }\n      })\n\n      Object.values(nextShapes).forEach((shape) => {\n        if (shape.type !== TDShapeType.Group) return\n\n        const children = shape.children.filter((id) => page.shapes[id] !== undefined)\n\n        const commonBounds = Utils.getCommonBounds(\n          children\n            .map((id) => page.shapes[id])\n            .filter(Boolean)\n            .map((shape) => TLDR.getRotatedBounds(shape))\n        )\n\n        page.shapes[shape.id] = {\n          ...shape,\n          point: [commonBounds.minX, commonBounds.minY],\n          size: [commonBounds.width, commonBounds.height],\n          children,\n        }\n      })\n\n      this.state.document = next.document\n\n      return next\n    }, true)\n\n    return this\n  }\n\n  /**\n   * Set the current status.\n   * @param status The new status to set.\n   * @private\n   * @returns\n   */\n  setStatus(status: string) {\n    return this.patchState(\n      {\n        appState: { status },\n      },\n      `set_status:${status}`\n    )\n  }\n\n  /**\n   * Update the bounding box when the renderer's bounds change.\n   * @param bounds\n   */\n  updateBounds = (bounds: TLBounds) => {\n    this.rendererBounds = bounds\n    const { point, zoom } = this.camera\n    this.updateViewport(point, zoom)\n\n    if (!this.readOnly && this.session) {\n      this.session.update()\n    }\n  }\n\n  updateViewport = (point: number[], zoom: number) => {\n    const { width, height } = this.rendererBounds\n    const [minX, minY] = Vec.sub(Vec.div([0, 0], zoom), point)\n    const [maxX, maxY] = Vec.sub(Vec.div([width, height], zoom), point)\n\n    this.viewport = {\n      minX,\n      minY,\n      maxX,\n      maxY,\n      height: maxX - minX,\n      width: maxY - minY,\n    }\n  }\n\n  /**\n   * Set or clear the editing id\n   * @param id [string]\n   */\n  setEditingId = (id?: string, isCreating = false) => {\n    if (this.readOnly) return\n\n    if (id) {\n      // Start a new editing session\n      this.startSession(SessionType.Edit, id, isCreating)\n    } else {\n      // If we're clearing the editing id and we don't have one, bail\n      if (!this.pageState.editingId) return\n\n      // If we're clearing the editing id and we do have one, complete the session\n      this.completeSession()\n    }\n\n    this.editingStartTime = performance.now()\n\n    this.patchState(\n      {\n        document: {\n          pageStates: {\n            [this.currentPageId]: {\n              editingId: id,\n            },\n          },\n        },\n      },\n      `set_editing_id`\n    )\n  }\n\n  /**\n   * Set or clear the hovered id\n   * @param id [string]\n   */\n  setHoveredId = (id?: string) => {\n    this.patchState(\n      {\n        document: {\n          pageStates: {\n            [this.currentPageId]: {\n              hoveredId: id,\n            },\n          },\n        },\n      },\n      `set_hovered_id`\n    )\n  }\n\n  /* -------------------------------------------------- */\n  /*                    Settings & UI                   */\n  /* -------------------------------------------------- */\n\n  /**\n   * Set a setting.\n   */\n  setSetting = <T extends keyof TDSnapshot['settings'], V extends TDSnapshot['settings'][T]>(\n    name: T,\n    value: V | ((value: V) => V)\n  ): this => {\n    if (this.session) return this\n\n    const patch = {\n      settings: {\n        [name]: typeof value === 'function' ? value(this.settings[name] as V) : value,\n      },\n    }\n\n    this.patchState(patch, `settings:${name}`)\n\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggle pen mode.\n   */\n  toggleFocusMode = (): this => {\n    if (this.session) return this\n    const patch = {\n      settings: {\n        isFocusMode: !this.settings.isFocusMode,\n      },\n    }\n\n    this.patchState(patch, `settings:toggled_focus_mode`)\n\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggle pen mode.\n   */\n  togglePenMode = (): this => {\n    if (this.session) return this\n    const patch = {\n      settings: {\n        isPenMode: !this.settings.isPenMode,\n      },\n    }\n    this.patchState(patch, `settings:toggled_pen_mode`)\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggle dark mode.\n   */\n  toggleDarkMode = (): this => {\n    if (this.session) return this\n    const patch = { settings: { isDarkMode: !this.settings.isDarkMode } }\n    this.patchState(patch, `settings:toggled_dark_mode`)\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggle zoom snap.\n   */\n  toggleZoomSnap = () => {\n    if (this.session) return this\n    const patch = { settings: { isZoomSnap: !this.settings.isZoomSnap } }\n    this.patchState(patch, `settings:toggled_zoom_snap`)\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggle debug mode.\n   */\n  toggleDebugMode = () => {\n    if (this.session) return this\n    const patch = { settings: { isDebugMode: !this.settings.isDebugMode } }\n    this.patchState(patch, `settings:toggled_debug`)\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggles the state if menu is opened\n   */\n  setMenuOpen = (isOpen: boolean): this => {\n    const patch = { appState: { isMenuOpen: isOpen } }\n    this.patchState(patch, 'ui:toggled_menu_opened')\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Toggles the state if something is loading\n   */\n  setIsLoading = (isLoading: boolean): this => {\n    const patch = { appState: { isLoading } }\n    this.patchState(patch, 'ui:toggled_is_loading')\n    this.persist(patch)\n    return this\n  }\n\n  setDisableAssets = (disableAssets: boolean): this => {\n    this.patchState({ appState: { disableAssets } }, 'ui:toggled_disable_images')\n    return this\n  }\n\n  get isMenuOpen(): boolean {\n    return this.appState.isMenuOpen\n  }\n\n  get isLoading(): boolean {\n    return this.appState.isLoading\n  }\n\n  get disableAssets(): boolean {\n    return this.appState.disableAssets\n  }\n\n  /**\n   * Toggle grids.\n   */\n  toggleGrid = (): this => {\n    if (this.session) return this\n    const patch = { settings: { showGrid: !this.settings.showGrid } }\n    this.patchState(patch, 'settings:toggled_grid')\n    this.persist(patch)\n    return this\n  }\n\n  /**\n   * Select a tool.\n   * @param tool The tool to select, or \"select\".\n   */\n  selectTool = (type: TDToolType): this => {\n    if (this.readOnly || this.session) return this\n\n    this.isPointing = false // reset pointer state, in case something weird happened\n\n    const tool = this.tools[type]\n\n    if (tool === this.currentTool) {\n      this.patchState({\n        appState: {\n          isToolLocked: false,\n        },\n      })\n      return this\n    }\n\n    this.currentTool.onExit()\n    tool.previous = this.currentTool.type\n    this.currentTool = tool\n    this.currentTool.onEnter()\n\n    return this.patchState(\n      {\n        appState: {\n          activeTool: type,\n          isToolLocked: false,\n        },\n      },\n      `selected_tool:${type}`\n    )\n  }\n\n  /**\n   * Toggle the tool lock option.\n   */\n  toggleToolLock = (): this => {\n    if (this.session) return this\n    return this.patchState(\n      {\n        appState: {\n          isToolLocked: !this.appState.isToolLocked,\n        },\n      },\n      `toggled_tool_lock`\n    )\n  }\n\n  /* -------------------------------------------------- */\n  /*                      Document                      */\n  /* -------------------------------------------------- */\n\n  /**\n   * Reset the document to a blank state.\n   */\n  resetDocument = (): this => {\n    if (this.session) return this\n    this.session = undefined\n    this.currentTool = this.tools.select\n\n    const doc = TldrawApp.defaultDocument\n\n    // Set the default page name to the localized version of \"Page\"\n    doc.pages['page'].name = 'Page 1'\n\n    this.resetHistory().clearSelectHistory().loadDocument(TldrawApp.defaultDocument).persist({})\n\n    return this\n  }\n\n  /**\n   *\n   * @param document\n   */\n  updateUsers = (users: TDUser[], isOwnUpdate = false) => {\n    this.patchState(\n      {\n        room: {\n          users: Object.fromEntries(users.map((user) => [user.id, user])),\n        },\n      },\n      isOwnUpdate ? 'room:self:update' : 'room:user:update'\n    )\n  }\n\n  removeUser = (userId: string) => {\n    this.patchState({\n      room: {\n        users: {\n          [userId]: undefined,\n        },\n      },\n    })\n  }\n\n  /**\n   * Merge a new document patch into the current document.\n   * @param document\n   */\n  mergeDocument = (document: TDDocument): this => {\n    // If it's a new document, do a full change.\n    if (this.document.id !== document.id) {\n      this.replaceState({\n        ...migrate(\n          {\n            ...this.state,\n            document,\n          },\n          TldrawApp.version\n        ),\n        appState: {\n          ...this.appState,\n          currentPageId: Object.keys(document.pages)[0],\n        },\n      })\n      return this\n    }\n\n    // Have we deleted any pages? If so, drop everything and change\n    // to the first page. This is an edge case.\n    const currentPageStates = { ...this.document.pageStates }\n\n    // Update the app state's current page id if needed\n    const nextAppState = {\n      ...this.appState,\n      currentPageId: document.pages[this.currentPageId]\n        ? this.currentPageId\n        : Object.keys(document.pages)[0],\n      pages: Object.values(document.pages).map((page, i) => ({\n        id: page.id,\n        name: page.name,\n        childIndex: page.childIndex || i,\n      })),\n    }\n\n    // Reset the history (for now)\n    this.resetHistory()\n\n    Object.keys(this.document.pages).forEach((pageId) => {\n      if (!document.pages[pageId]) {\n        if (pageId === this.appState.currentPageId) {\n          this.cancelSession()\n          this.selectNone()\n        }\n\n        currentPageStates[pageId] = undefined as unknown as TLPageState\n      }\n    })\n\n    // Don't allow the selected ids to be deleted during a session\u2014if\n    // they've been removed, put them back in the client's document.\n    if (this.session) {\n      this.selectedIds\n        .filter((id) => !document.pages[this.currentPageId].shapes[id])\n        .forEach((id) => (document.pages[this.currentPageId].shapes[id] = this.page.shapes[id]))\n    }\n\n    // For other pages, remove any selected ids that were deleted.\n    Object.entries(currentPageStates).forEach(([pageId, pageState]) => {\n      pageState.selectedIds = pageState.selectedIds.filter(\n        (id) => !!document.pages[pageId].shapes[id]\n      )\n    })\n\n    // If the user is currently creating a shape (ie drawing), then put that\n    // shape back onto the page for the client.\n    const { editingId } = this.pageState\n\n    if (editingId) {\n      document.pages[this.currentPageId].shapes[editingId] = this.page.shapes[editingId]\n      currentPageStates[this.currentPageId].selectedIds = [editingId]\n    }\n\n    return this.replaceState(\n      {\n        ...migrate(\n          { ...this.state, document: { ...document, pageStates: currentPageStates } },\n          TldrawApp.version\n        ),\n        appState: nextAppState,\n      },\n      'merge'\n    )\n  }\n\n  /**\n   * Update the current document.\n   * @param document\n   */\n  updateDocument = (document: TDDocument, reason = 'updated_document'): this => {\n    const prevState = this.state\n\n    let nextState = { ...prevState, document: { ...prevState.document } }\n\n    if (!document.pages[this.currentPageId]) {\n      nextState.appState = {\n        ...prevState.appState,\n        currentPageId: Object.keys(document.pages)[0],\n      }\n    }\n\n    let i = 1\n\n    for (const nextPage of Object.values(document.pages)) {\n      if (nextPage !== prevState.document.pages[nextPage.id]) {\n        nextState.document.pages[nextPage.id] = nextPage\n\n        if (!nextPage.name) {\n          nextState.document.pages[nextPage.id].name = `Page ${i + 1}`\n          i++\n        }\n      }\n    }\n\n    for (const nextPageState of Object.values(document.pageStates)) {\n      if (nextPageState !== prevState.document.pageStates[nextPageState.id]) {\n        nextState.document.pageStates[nextPageState.id] = nextPageState\n\n        const nextPage = document.pages[nextPageState.id]\n        const keysToCheck = ['bindingId', 'editingId', 'hoveredId', 'pointedId'] as const\n\n        for (const key of keysToCheck) {\n          if (!nextPage.shapes[key]) {\n            nextPageState[key] = undefined\n          }\n        }\n\n        nextPageState.selectedIds = nextPageState.selectedIds.filter(\n          (id) => !!document.pages[nextPage.id].shapes[id]\n        )\n      }\n    }\n\n    return this.replaceState(\n      migrate(nextState, nextState.document.version || 0),\n      `${reason}:${document.id}`\n    )\n  }\n\n  /**\n   * Load a fresh room into the state.\n   * @param roomId\n   */\n  loadRoom = (roomId: string): this => {\n    this.patchState({\n      room: {\n        id: roomId,\n        userId: uuid,\n        users: {\n          [uuid]: {\n            id: uuid,\n            color: USER_COLORS[Math.floor(Math.random() * USER_COLORS.length)],\n            point: [100, 100],\n            selectedIds: [],\n            activeShapes: [],\n          },\n        },\n      },\n    })\n    return this\n  }\n\n  /**\n   * Load a new document.\n   * @param document The document to load\n   */\n  loadDocument = (document: TDDocument): this => {\n    this.selectNone()\n    this.resetHistory()\n    this.clearSelectHistory()\n    this.session = undefined\n\n    const state = {\n      ...TldrawApp.defaultState,\n      settings: {\n        ...this.state.settings,\n      },\n      document,\n      appState: {\n        ...TldrawApp.defaultState.appState,\n        ...this.state.appState,\n        currentPageId: Object.keys(document.pages)[0],\n        disableAssets: this.disableAssets,\n      },\n    }\n\n    this.replaceState(migrate(state, TldrawApp.version), 'loaded_document')\n    const { point, zoom } = this.camera\n    this.updateViewport(point, zoom)\n    return this\n  }\n\n  // Should we move this to the app layer? onSave, onSaveAs, etc?\n\n  /**\n   * Create a new project.\n   */\n  newProject = () => {\n    if (!this.isLocal) return\n    this.fileSystemHandle = null\n    this.resetDocument()\n  }\n\n  /**\n   * Save the current project.\n   */\n  saveProject = async () => {\n    if (this.readOnly) return\n    try {\n      const fileHandle = await saveToFileSystem(\n        migrate(this.state, TldrawApp.version).document,\n        this.fileSystemHandle\n      )\n      this.fileSystemHandle = fileHandle\n      this.persist({})\n      this.isDirty = false\n    } catch (e: any) {\n      // Likely cancelled\n      console.error(e.message)\n    }\n    return this\n  }\n\n  /**\n   * Save the current project as a new file.\n   */\n  saveProjectAs = async () => {\n    try {\n      const fileHandle = await saveToFileSystem(this.document, null)\n      this.fileSystemHandle = fileHandle\n      this.persist({})\n      this.isDirty = false\n    } catch (e: any) {\n      // Likely cancelled\n      console.error(e.message)\n    }\n    return this\n  }\n\n  /**\n   * Load a project from the filesystem.\n   * @todo\n   */\n  openProject = async () => {\n    if (!this.isLocal) return\n\n    try {\n      const result = await openFromFileSystem()\n      if (!result) {\n        throw Error()\n      }\n\n      const { fileHandle, document } = result\n      this.loadDocument(document)\n      this.fileSystemHandle = fileHandle\n      this.zoomToFit()\n      this.persist({})\n    } catch (e) {\n      console.error(e)\n    } finally {\n      this.persist({})\n    }\n  }\n\n  /**\n   * Upload media from file\n   */\n  openAsset = async () => {\n    if (!this.disableAssets)\n      try {\n        const file = await openAssetsFromFileSystem()\n        if (Array.isArray(file)) {\n          this.addMediaFromFiles(file, this.centerPoint)\n        } else {\n          if (!file) return\n          this.addMediaFromFiles([file])\n        }\n      } catch (e) {\n        console.error(e)\n      } finally {\n        this.persist({})\n      }\n  }\n\n  /**\n   * Sign out of the current account.\n   * Should move to the www layer.\n   * @todo\n   */\n  signOut = () => {\n    // todo\n  }\n  /* -------------------- Getters --------------------- */\n\n  /**\n   * Get the current app state.\n   */\n  getAppState = (): TDSnapshot['appState'] => {\n    return this.appState\n  }\n\n  /**\n   * Get a page.\n   * @param pageId (optional) The page's id.\n   */\n  getPage = (pageId = this.currentPageId): TDPage => {\n    return TLDR.getPage(this.state, pageId || this.currentPageId)\n  }\n\n  /**\n   * Get the shapes (as an array) from a given page.\n   * @param pageId (optional) The page's id.\n   */\n  getShapes = (pageId = this.currentPageId): TDShape[] => {\n    return TLDR.getShapes(this.state, pageId || this.currentPageId)\n  }\n\n  /**\n   * Get the bindings from a given page.\n   * @param pageId (optional) The page's id.\n   */\n  getBindings = (pageId = this.currentPageId): TDBinding[] => {\n    return TLDR.getBindings(this.state, pageId || this.currentPageId)\n  }\n\n  /**\n   * Get a shape from a given page.\n   * @param id The shape's id.\n   * @param pageId (optional) The page's id.\n   */\n  getShape = <T extends TDShape = TDShape>(id: string, pageId = this.currentPageId): T => {\n    return TLDR.getShape<T>(this.state, id, pageId)\n  }\n\n  /**\n   * Get the bounds of a shape on a given page.\n   * @param id The shape's id.\n   * @param pageId (optional) The page's id.\n   */\n  getShapeBounds = (id: string, pageId = this.currentPageId): TLBounds => {\n    return TLDR.getBounds(this.getShape(id, pageId))\n  }\n\n  /**\n   * Get a binding from a given page.\n   * @param id The binding's id.\n   * @param pageId (optional) The page's id.\n   */\n  getBinding = (id: string, pageId = this.currentPageId): TDBinding => {\n    return TLDR.getBinding(this.state, id, pageId)\n  }\n\n  /**\n   * Get the page state for a given page.\n   * @param pageId (optional) The page's id.\n   */\n  getPageState = (pageId = this.currentPageId): TLPageState => {\n    return TLDR.getPageState(this.state, pageId || this.currentPageId)\n  }\n\n  /**\n   * Turn a screen point into a point on the page.\n   * @param point The screen point\n   * @param pageId (optional) The page to use\n   */\n  getPagePoint = (point: number[], pageId = this.currentPageId): number[] => {\n    const { camera } = this.getPageState(pageId)\n    return Vec.sub(Vec.div(point, camera.zoom), camera.point)\n  }\n\n  /**\n   * Get the current undo/redo stack.\n   */\n  get history() {\n    return this.stack.slice(0, this.pointer + 1)\n  }\n\n  /**\n   * Replace the current history stack.\n   */\n  set history(commands: TldrawCommand[]) {\n    this.replaceHistory(commands)\n  }\n\n  /**\n   * The current document.\n   */\n  get document(): TDDocument {\n    return this.state.document\n  }\n\n  /**\n   * The current app state.\n   */\n  get settings(): TDSnapshot['settings'] {\n    return this.state.settings\n  }\n\n  /**\n   * The current app state.\n   */\n  get appState(): TDSnapshot['appState'] {\n    return this.state.appState\n  }\n\n  /**\n   * The current page id.\n   */\n  get currentPageId(): string {\n    return this.state.appState.currentPageId\n  }\n\n  /**\n   * The current page.\n   */\n  get page(): TDPage {\n    return this.state.document.pages[this.currentPageId]\n  }\n\n  /**\n   * The current page's shapes (as an array).\n   */\n  get shapes(): TDShape[] {\n    return Object.values(this.page.shapes)\n  }\n\n  /**\n   * The current page's bindings.\n   */\n  get bindings(): TDBinding[] {\n    return Object.values(this.page.bindings)\n  }\n\n  /**\n   * The document's assets (as an array).\n   */\n  get assets(): TDAsset[] {\n    return Object.values(this.document.assets)\n  }\n\n  /**\n   * The current page's state.\n   */\n  get pageState(): TLPageState {\n    return this.state.document.pageStates[this.currentPageId]\n  }\n\n  get camera(): {\n    point: number[]\n    zoom: number\n  } {\n    return this.pageState.camera\n  }\n\n  get zoom(): number {\n    return this.pageState.camera.zoom\n  }\n\n  /**\n   * The page's current selected ids.\n   */\n  get selectedIds(): string[] {\n    return this.pageState.selectedIds\n  }\n\n  /* -------------------------------------------------- */\n  /*                        Pages                       */\n  /* -------------------------------------------------- */\n\n  /**\n   * Create a new page.\n   * @param pageId (optional) The new page's id.\n   */\n  createPage = (id?: string, name?: string): this => {\n    if (this.readOnly) return this\n    const { width, height } = this.rendererBounds\n    return this.setState(Commands.createPage(this, [-width / 2, -height / 2], id, name))\n  }\n\n  /**\n   * Change the current page.\n   * @param pageId The new current page's id.\n   */\n  changePage = (pageId: string): this => {\n    return this.setState(Commands.changePage(this, pageId))\n  }\n\n  /**\n   * Move a page above another.\n   * @param pageId The page to move.\n   * @param index The page above which to move.\n   */\n  movePage = (pageId: string, index: number): this => {\n    if (this.readOnly) return this\n\n    return this.setState(Commands.movePage(this, pageId, index))\n  }\n\n  /**\n   * Rename a page.\n   * @param pageId The id of the page to rename.\n   * @param name The page's new name\n   */\n  renamePage = (pageId: string, name: string): this => {\n    if (this.readOnly) return this\n    return this.setState(Commands.renamePage(this, pageId, name))\n  }\n\n  /**\n   * Duplicate a page.\n   * @param pageId The id of the page to duplicate.\n   */\n  duplicatePage = (pageId: string): this => {\n    if (this.readOnly) return this\n    return this.setState(Commands.duplicatePage(this, pageId))\n  }\n\n  /**\n   * Delete a page.\n   * @param pageId The id of the page to delete.\n   */\n  deletePage = (pageId?: string): this => {\n    if (this.readOnly) return this\n    if (Object.values(this.document.pages).length <= 1) return this\n    return this.setState(Commands.deletePage(this, pageId ? pageId : this.currentPageId))\n  }\n\n  /* -------------------------------------------------- */\n  /*                      Clipboard                     */\n  /* -------------------------------------------------- */\n\n  /**\n   * Cut (copy and delete) one or more shapes to the clipboard.\n   * @param ids The ids of the shapes to cut.\n   */\n  cut = (ids = this.selectedIds, e?: ClipboardEvent): this => {\n    e?.preventDefault()\n\n    this.copy(ids, e)\n\n    if (!this.readOnly) {\n      this.delete(ids)\n    }\n\n    return this\n  }\n\n  /**\n   * Copy one or more shapes to the clipboard.\n   * @param ids The ids of the shapes to copy.\n   */\n  copy = (ids = this.selectedIds, e?: ClipboardEvent): this => {\n    // Allow when in readOnly mode\n\n    e?.preventDefault()\n\n    this.clipboard = this.getContent(ids)\n\n    const jsonString = JSON.stringify({\n      type: 'tldr/clipboard',\n      ...this.clipboard,\n    })\n\n    const tldrawString = `<tldraw>${jsonString}</tldraw>`\n\n    setClipboard(tldrawString)\n\n    if (e) {\n      e.clipboardData?.setData('text/html', tldrawString)\n    }\n\n    if (navigator.clipboard && window.ClipboardItem) {\n      navigator.clipboard.write([\n        new ClipboardItem({\n          'text/html': new Blob([tldrawString], { type: 'text/html' }),\n        }),\n      ])\n    }\n\n    return this\n  }\n\n  /**\n   * Paste shapes (or text) from clipboard to a certain point.\n   * @param point\n   */\n  paste = async (point?: number[], e?: ClipboardEvent) => {\n    if (this.readOnly) return\n\n    const shapesToCreate: TDShape[] = []\n\n    const filesToPaste: File[] = []\n\n    let clipboardData: any\n\n    const getSvgFromText = async (text: string) => {\n      const div = document.createElement('div')\n      div.innerHTML = text\n      const svg = div.firstChild as SVGSVGElement\n\n      svg.style.setProperty('background-color', 'transparent')\n\n      console.log(text)\n\n      const imageBlob = await TLDR.getImageForSvg(svg, TDExportType.SVG, {\n        scale: 1,\n        quality: 1,\n      })\n\n      if (imageBlob) {\n        const file = new File([imageBlob], 'image.svg')\n        filesToPaste.push(file)\n      } else {\n        getShapeFromText(text)\n      }\n    }\n\n    const getShapeFromText = (text: string) => {\n      const pagePoint = this.getPagePoint(point ?? this.centerPoint, this.currentPageId)\n\n      const isMultiline = text.includes('\\n')\n\n      shapesToCreate.push(\n        TLDR.getShapeUtil(TDShapeType.Text).getShape({\n          id: Utils.uniqueId(),\n          type: TDShapeType.Text,\n          parentId: this.appState.currentPageId,\n          text: TLDR.normalizeText(text.trim()),\n          point: pagePoint,\n          style: {\n            ...this.appState.currentStyle,\n            textAlign: isMultiline ? AlignStyle.Start : this.appState.currentStyle.textAlign,\n          },\n        })\n      )\n    }\n\n    const getShapeFromHtml = (html: string) => {\n      try {\n        const maybeJson = html.match(/<tldraw>(.*)<\\/tldraw>/)?.[1]\n\n        if (!maybeJson) return\n\n        const json: {\n          type: string\n          shapes: (TDShape & { text: string })[]\n          bindings: TDBinding[]\n          assets: TDAsset[]\n        } = JSON.parse(maybeJson)\n        if (json.type === 'tldr/clipboard') {\n          clipboardData = json\n          return\n        } else {\n          throw Error('Not tldraw data!')\n        }\n      } catch (e) {\n        getShapeFromText(html)\n      }\n    }\n\n    if (e !== undefined) {\n      const items = Array.from(e.clipboardData?.items ?? [])\n\n      await Promise.all(\n        items.map(async (item) => {\n          const { type, kind } = item\n\n          switch (kind) {\n            case 'string': {\n              const str: string = await new Promise((resolve) => item.getAsString(resolve))\n\n              switch (type) {\n                case 'text/html': {\n                  if (str.match(/<tldraw>(.*)<\\/tldraw>/)?.[1]) {\n                    getShapeFromHtml(str)\n                    return\n                  }\n                  break\n                }\n                case 'text/plain': {\n                  if (str.startsWith('<svg')) {\n                    getSvgFromText(str)\n                  } else {\n                    getShapeFromText(str)\n                  }\n                  // return\n                  break\n                }\n              }\n\n              break\n            }\n            case 'file': {\n              const file = item.getAsFile()\n              if (file) filesToPaste.push(file)\n              break\n            }\n          }\n        })\n      )\n    }\n\n    if (clipboardData) {\n      this.insertContent(clipboardData, { point, select: true })\n      return this\n    }\n\n    if (filesToPaste.length) {\n      this.addMediaFromFiles(filesToPaste, point)\n      return this\n    }\n\n    if (shapesToCreate.length) {\n      const pagePoint = this.getPagePoint(point ?? this.centerPoint, this.currentPageId)\n\n      const currentPoint = Vec.add(pagePoint, [0, 0])\n\n      shapesToCreate.forEach((shape, i) => {\n        const bounds = TLDR.getBounds(shape)\n\n        if (i === 0) {\n          // For the first shape, offset the current point so\n          // that the first shape's center is at the page point\n          currentPoint[0] -= bounds.width / 2\n          currentPoint[1] -= bounds.height / 2\n        }\n\n        // Set the shape's point the current point\n        shape.point = [...currentPoint]\n\n        // Then bump the page current point by this shape's width\n        currentPoint[0] += bounds.width\n      })\n\n      this.createShapes(...shapesToCreate)\n      return this\n    }\n\n    if (this.clipboard) {\n      // try to get clipboard data from the scene itself\n      this.insertContent(this.clipboard)\n    } else {\n      // last chance to get the clipboard data, is it in storage?\n      getClipboard().then((text) => {\n        if (text) getShapeFromHtml(text)\n      })\n    }\n\n    return this\n  }\n\n  getSvg = async (\n    ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes),\n    opts = {} as Partial<{ includeFonts: boolean }>\n  ): Promise<SVGElement | undefined> => {\n    if (ids.length === 0) return\n\n    // Embed our custom fonts\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n    const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n    const style = document.createElementNS('http://www.w3.org/2000/svg', 'style')\n\n    if (typeof window !== 'undefined') {\n      window.focus() // weird but necessary\n    }\n\n    if (opts.includeFonts) {\n      try {\n        const { fonts } = await fetch(TldrawApp.assetSrc, { mode: 'no-cors' }).then((d) => d.json())\n\n        style.textContent = `\n          @font-face {\n            font-family: 'Caveat Brush';\n            src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.caveat}) format('woff');\n            font-weight: 500;\n            font-style: normal;\n          }\n          @font-face {\n            font-family: 'Source Code Pro';\n            src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.source_code_pro}) format('woff');\n            font-weight: 500;\n            font-style: normal;\n          }\n          @font-face {\n            font-family: 'Source Sans Pro';\n            src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.source_sans_pro}) format('woff');\n            font-weight: 500;\n            font-style: normal;\n          }\n          @font-face {\n            font-family: 'Crimson Pro';\n            src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.crimson_pro}) format('woff');\n            font-weight: 500;\n            font-style: normal;\n          }\n          `\n      } catch (e) {\n        TLDR.warn('Could not find tldraw-assets.json file.')\n      }\n    } else {\n      style.textContent = `@import url('https://fonts.googleapis.com/css2?family=Caveat+Brush&family=Source+Code+Pro&family=Source+Sans+Pro&family=Crimson+Pro&display=block');`\n    }\n\n    defs.append(style)\n    svg.append(defs)\n\n    // Get the shapes in order\n    const shapes = ids\n      .map((id) => this.getShape(id, this.currentPageId))\n      .sort((a, b) => a.childIndex - b.childIndex)\n\n    // Find their common bounding box. Shapes will be positioned relative to this box\n    const commonBounds = Utils.getCommonBounds(shapes.map(TLDR.getRotatedBounds))\n\n    // A quick routine to get an SVG element for each shape\n    const getSvgElementForShape = (shape: TDShape) => {\n      const util = TLDR.getShapeUtil(shape)\n      const bounds = util.getBounds(shape)\n      const elm = util.getSvgElement(shape, this.settings.isDarkMode)\n\n      if (!elm) return\n\n      // If the element is an image, set the asset src as the xlinkhref\n      if (shape.type === TDShapeType.Image) {\n        elm.setAttribute('xlink:href', this.document.assets[shape.assetId].src)\n      } else if (shape.type === TDShapeType.Video) {\n        elm.setAttribute('xlink:href', this.serializeVideo(shape.id))\n      }\n\n      // Put the element in the correct position relative to the common bounds\n      elm.setAttribute(\n        'transform',\n        `translate(${(SVG_EXPORT_PADDING + shape.point[0] - commonBounds.minX).toFixed(2)}, ${(\n          SVG_EXPORT_PADDING +\n          shape.point[1] -\n          commonBounds.minY\n        ).toFixed(2)}) rotate(${(((shape.rotation || 0) * 180) / Math.PI).toFixed(2)}, ${(\n          bounds.width / 2\n        ).toFixed(2)}, ${(bounds.height / 2).toFixed(2)})`\n      )\n\n      return elm\n    }\n\n    // Assemble the final SVG by iterating through each shape and its children\n    shapes.forEach((shape) => {\n      // The shape is a group! Just add the children.\n      if (shape.children?.length) {\n        // Create a group <g> elm for shape\n        const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n        // Get the shape's children as elms and add them to the group\n        shape.children.forEach((childId) => {\n          const shape = this.getShape(childId, this.currentPageId)\n          const elm = getSvgElementForShape(shape)\n\n          if (elm) {\n            g.append(elm)\n          }\n        })\n\n        // Add the group elm to the SVG\n        svg.append(g)\n\n        return\n      }\n\n      // Just add the shape's element to the\n      const elm = getSvgElementForShape(shape)\n\n      if (elm) {\n        svg.append(elm)\n      }\n    })\n\n    // Resize the elm to the bounding box\n    svg.setAttribute(\n      'viewBox',\n      [\n        0,\n        0,\n        commonBounds.width + SVG_EXPORT_PADDING * 2,\n        commonBounds.height + SVG_EXPORT_PADDING * 2,\n      ].join(' ')\n    )\n\n    // Clean up the SVG by removing any hidden elements\n    svg.setAttribute('width', commonBounds.width.toString())\n    svg.setAttribute('height', commonBounds.height.toString())\n\n    // Set export background\n    const exportBackground: TDExportBackground = this.settings.exportBackground\n    const darkBackground = '#212529'\n    const lightBackground = 'rgb(248, 249, 250)'\n\n    switch (exportBackground) {\n      case TDExportBackground.Auto: {\n        svg.style.setProperty(\n          'background-color',\n          this.settings.isDarkMode ? darkBackground : lightBackground\n        )\n        break\n      }\n      case TDExportBackground.Dark: {\n        svg.style.setProperty('background-color', darkBackground)\n        break\n      }\n      case TDExportBackground.Light: {\n        svg.style.setProperty('background-color', lightBackground)\n        break\n      }\n      case TDExportBackground.Transparent:\n      default: {\n        svg.style.setProperty('background-color', 'transparent')\n        break\n      }\n    }\n\n    svg\n      .querySelectorAll('.tl-fill-hitarea, .tl-stroke-hitarea, .tl-binding-indicator')\n      .forEach((elm) => elm.remove())\n\n    return svg\n  }\n\n  /**\n   * Copy one or more shapes as SVG.\n   * @param ids The ids of the shapes to copy.\n   * @param pageId The page from which to copy the shapes.\n   * @returns A string containing the JSON.\n   */\n  copySvg = async (\n    ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes)\n  ) => {\n    if (ids.length === 0) return\n\n    const svg = await this.getSvg(ids)\n\n    if (!svg) return\n\n    const svgString = TLDR.getSvgString(svg, 1)\n\n    this.clipboard = this.getContent(ids)\n\n    const tldrawString = JSON.stringify({\n      type: 'tldr/clipboard',\n      ...this.clipboard,\n    })\n\n    if (navigator.clipboard && window.ClipboardItem) {\n      navigator.clipboard.write([\n        new ClipboardItem({\n          'text/html': new Blob([tldrawString], { type: 'text/html' }),\n          'text/plain': new Blob([svgString], { type: 'text/plain' }),\n        }),\n      ])\n    }\n\n    return svgString\n  }\n\n  /**\n   * Get the shapes and bindings for the current selection, if any, or else the current page.\n   *\n   * @param ids The ids of the shapes to get content for.\n   */\n  getContent = (ids?: string[]) => {\n    const page = this.getPage(this.currentPageId)\n\n    // If ids is explicitly empty ([]) return\n    if (ids && ids.length === 0) return\n\n    // If ids was not provided, use the selected ids\n    if (!ids) ids = this.selectedIds\n\n    // If there are no selected ids, use all the page's shape ids\n    if (ids.length === 0) ids = Object.keys(page.shapes)\n\n    // If the page was empty, return\n    if (ids.length === 0) return\n\n    const shapes = ids\n      .map((id) => page.shapes[id])\n      .flatMap((shape) => [shape, ...(shape.children ?? []).map((childId) => page.shapes[childId])])\n      .map(deepCopy)\n\n    const idsSet = new Set(shapes.map((s) => s.id))\n\n    shapes.forEach((shape) => {\n      if (shape.parentId === this.currentPageId) {\n        shape.parentId = 'currentPageId'\n      }\n    })\n\n    // If a binding's from and to are included, then include the binding;\n    // but if only one shape is included, discard the binding\n    const bindings = Object.values(page.bindings)\n      .filter((binding) => {\n        if (idsSet.has(binding.fromId) || idsSet.has(binding.toId)) {\n          return true\n        }\n\n        if (idsSet.has(binding.fromId)) {\n          const shape = shapes.find((s) => s.id === binding.fromId)\n          const handles = shape!.handles\n          if (handles) {\n            Object.values(handles).forEach((handle) => {\n              if (handle!.bindingId === binding.id) {\n                handle!.bindingId = undefined\n              }\n            })\n          }\n        }\n\n        if (idsSet.has(binding.toId)) {\n          const shape = shapes.find((s) => s.id === binding.toId)\n          const handles = shape!.handles\n          if (handles) {\n            Object.values(handles).forEach((handle) => {\n              if (handle!.bindingId === binding.id) {\n                handle!.bindingId = undefined\n              }\n            })\n          }\n        }\n\n        return false\n      })\n      .map(deepCopy)\n\n    const assets = [\n      ...new Set(\n        shapes\n          .map((shape) => {\n            if (!shape.assetId) return\n            return this.document.assets[shape.assetId]\n          })\n          .filter(Boolean)\n          .map(deepCopy)\n      ),\n    ] as TDAsset[]\n\n    return { shapes, bindings, assets }\n  }\n\n  /**\n   * Copy one or more shapes as JSON.\n   * @param ids The ids of the shapes to copy.\n   * @param pageId The page from which to copy the shapes.\n   * @returns A string containing the JSON.\n   */\n  copyJson = (ids = this.selectedIds) => {\n    const content = this.getContent(ids)\n\n    if (content) {\n      TLDR.copyStringToClipboard(JSON.stringify(content))\n    }\n\n    return this\n  }\n\n  /**\n   * Export one or more shapes as JSON.\n   * @param ids The ids of the shapes to copy from the current page.\n   * @returns A string containing the JSON.\n   */\n  exportJson = (ids = this.selectedIds) => {\n    const content = this.getContent(ids)\n\n    if (content) {\n      const blob = new Blob([JSON.stringify(content)], { type: 'application/json' })\n      const url = URL.createObjectURL(blob)\n      const link = document.createElement('a')\n      link.href = url\n      link.download = `export.json`\n      link.click()\n    }\n\n    return this\n  }\n\n  /**\n   * Insert content.\n   *\n   * @param content The content to insert.\n   * @param content.shapes An array of TDShape objects.\n   * @param content.bindings (optional) An array of TDBinding objects.\n   * @param content.assets (optional) An array of TDAsset objects.\n   * @param opts (optional) An options object\n   * @param opts.point (optional) A point at which to paste the content.\n   * @param opts.select (optional) When true, the inserted shapes will be selected. Defaults to false.\n   * @param opts.overwrite (optional) When true, the inserted shapes and bindings will overwrite any existing shapes and bindings. Defaults to false.\n   */\n  insertContent = (\n    content: { shapes: TDShape[]; bindings?: TDBinding[]; assets?: TDAsset[] },\n    opts = {} as { point?: number[]; select?: boolean; overwrite?: boolean }\n  ) => {\n    return this.setState(Commands.insertContent(this, content, opts), 'insert_content')\n  }\n\n  /**\n   * Get an image of the selected shapes.\n   *\n   * @param format The format to export the image as.\n   * @param opts (optional) An object containing options for the image.\n   * @param opts.ids (optional) The ids of the shapes (on the current page) to get an image for.\n   * @param opts.scale (optional) The id of the page from which to get an image.\n   * @param opts.quality (optional) The quality (between 0 and 1) for the image if lossy format.\n   */\n  getImage = async (\n    format: Exclude<TDExportType, TDExportType.JSON> = TDExportType.PNG,\n    opts = {} as Partial<{\n      ids: string[]\n      scale: number\n      quality: number\n      transparentBackground: boolean\n    }>\n  ): Promise<Blob | undefined> => {\n    const { ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes) } =\n      opts\n\n    const svg = await this.getSvg(ids, {\n      includeFonts: format !== TDExportType.SVG,\n    })\n\n    if (!svg) return\n\n    if (format === TDExportType.SVG) {\n      const svgString = TLDR.getSvgString(svg, 1)\n      const blob = new Blob([svgString], { type: 'image/svg+xml' })\n      return blob\n    }\n\n    const imageBlob = await TLDR.getImageForSvg(svg, format, opts)\n\n    if (!imageBlob) return\n\n    return imageBlob\n  }\n\n  /**\n   * Copy an image of the selected shapes.\n   *\n   * @param format The format to export the image as.\n   * @param opts (optional) An object containing options for the image.\n   * @param opts.ids (optional) The ids of the shapes (on the current page) to get an image for.\n   * @param opts.scale (optional) The id of the page from which to get an image.\n   * @param opts.quality (optional) The quality (between 0 and 1) for the image if lossy format.\n   */\n  copyImage = async (\n    format: TDExportType.PNG | TDExportType.SVG = TDExportType.PNG,\n    opts = {} as Partial<{\n      ids: string[]\n      scale: number\n      quality: number\n      transparentBackground: boolean\n    }>\n  ) => {\n    if (format === TDExportType.SVG) {\n      this.copySvg(opts.ids)\n      return\n    }\n\n    if (!(navigator.clipboard && window.ClipboardItem)) {\n      console.warn('Sorry, your browser does not support copying images.')\n      return\n    }\n\n    const blob = await this.getImage(format, opts)\n\n    if (!blob) return\n\n    navigator.clipboard.write([\n      new ClipboardItem({\n        [blob.type]: blob,\n      }),\n    ])\n  }\n\n  exportImage = async (\n    format: Exclude<TDExportType, TDExportType.JSON> = TDExportType.PNG,\n    opts = {} as Partial<{\n      ids: string[]\n      pageId: string\n      scale: number\n      quality: number\n    }>\n  ) => {\n    const { pageId = this.currentPageId } = opts\n\n    const blob = await this.getImage(format, opts)\n\n    if (!blob) return\n\n    const name = this.document.pages[pageId].name ?? 'export'\n\n    if (this.callbacks.onExport) {\n      this.callbacks.onExport(this, {\n        name,\n        type: format,\n        blob,\n      })\n    } else {\n      const url = URL.createObjectURL(blob)\n      const link = document.createElement('a')\n      link.href = url\n      link.download = `${name}.${format}`\n      link.click()\n    }\n  }\n\n  /* -------------------------------------------------- */\n  /*                       Camera                       */\n  /* -------------------------------------------------- */\n\n  /**\n   * Set the camera to a specific point and zoom.\n   * @param point The camera point (top left of the viewport).\n   * @param zoom The zoom level.\n   * @param reason Why did the camera change?\n   */\n  setCamera = (point: number[], zoom: number, reason: string): this => {\n    this.updateViewport(point, zoom)\n    this.patchState(\n      {\n        document: {\n          pageStates: {\n            [this.currentPageId]: { camera: { point, zoom } },\n          },\n        },\n      },\n      reason\n    )\n    return this\n  }\n\n  /**\n   * Reset the camera to the default position\n   */\n  resetCamera = (): this => {\n    return this.setCamera(this.centerPoint, 1, `reset_camera`)\n  }\n\n  /**\n   * Pan the camera\n   * @param delta\n   */\n  pan = (delta: number[]): this => {\n    const { camera } = this.pageState\n    return this.setCamera(Vec.toFixed(Vec.sub(camera.point, delta)), camera.zoom, `panned`)\n  }\n\n  /**\n   * Pinch to a new zoom level, possibly together with a pan.\n   * @param point The current point under the cursor.\n   * @param delta The movement delta.\n   * @param zoomDelta The zoom detal\n   */\n  pinchZoom = (point: number[], delta: number[], zoom: number): this => {\n    const { camera } = this.pageState\n    const nextPoint = Vec.sub(camera.point, Vec.div(delta, camera.zoom))\n    const nextZoom = zoom\n    const p0 = Vec.sub(Vec.div(point, camera.zoom), nextPoint)\n    const p1 = Vec.sub(Vec.div(point, nextZoom), nextPoint)\n    return this.setCamera(\n      Vec.toFixed(Vec.add(nextPoint, Vec.sub(p1, p0))),\n      nextZoom,\n      `pinch_zoomed`\n    )\n  }\n\n  /**\n   * Zoom to a new zoom level, keeping the point under the cursor in the same position\n   * @param next The new zoom level.\n   * @param center The point to zoom towards (defaults to screen center).\n   */\n  zoomTo = (next: number, center = this.centerPoint): this => {\n    const { zoom, point } = this.camera\n    const p0 = Vec.sub(Vec.div(center, zoom), point)\n    const p1 = Vec.sub(Vec.div(center, next), point)\n    return this.setCamera(Vec.toFixed(Vec.add(point, Vec.sub(p1, p0))), next, `zoomed_camera`)\n  }\n\n  /**\n   * Zoom out by 25%\n   */\n  zoomIn = (): this => {\n    const i = Math.round((this.camera.zoom * 100) / 25)\n    const nextZoom = TLDR.getCameraZoom((i + 1) * 0.25)\n    return this.zoomTo(nextZoom)\n  }\n\n  /**\n   * Zoom in by 25%.\n   */\n  zoomOut = (): this => {\n    const i = Math.round((this.camera.zoom * 100) / 25)\n    const nextZoom = TLDR.getCameraZoom((i - 1) * 0.25)\n    return this.zoomTo(nextZoom)\n  }\n\n  /**\n   * Zoom to fit the page's shapes.\n   */\n  zoomToFit = (): this => {\n    const {\n      shapes,\n      pageState: { camera },\n    } = this\n    if (shapes.length === 0) return this\n    const { rendererBounds } = this\n    const commonBounds = Utils.getCommonBounds(shapes.map(TLDR.getBounds))\n    let zoom = TLDR.getCameraZoom(\n      Math.min(\n        (rendererBounds.width - FIT_TO_SCREEN_PADDING) / commonBounds.width,\n        (rendererBounds.height - FIT_TO_SCREEN_PADDING) / commonBounds.height\n      )\n    )\n    zoom = camera.zoom === zoom || camera.zoom < 1 ? Math.min(1, zoom) : zoom\n    const mx = (rendererBounds.width - commonBounds.width * zoom) / 2 / zoom\n    const my = (rendererBounds.height - commonBounds.height * zoom) / 2 / zoom\n    return this.setCamera(\n      Vec.toFixed(Vec.sub([mx, my], [commonBounds.minX, commonBounds.minY])),\n      zoom,\n      `zoomed_to_fit`\n    )\n  }\n\n  /**\n   * Zoom to the selected shapes.\n   */\n  zoomToSelection = (): this => {\n    if (this.selectedIds.length === 0) return this\n\n    const { rendererBounds } = this\n    const selectedBounds = TLDR.getSelectedBounds(this.state)\n\n    let zoom = TLDR.getCameraZoom(\n      Math.min(\n        (rendererBounds.width - FIT_TO_SCREEN_PADDING) / selectedBounds.width,\n        (rendererBounds.height - FIT_TO_SCREEN_PADDING) / selectedBounds.height\n      )\n    )\n\n    zoom = this.camera.zoom === zoom || this.camera.zoom < 1 ? Math.min(1, zoom) : zoom\n\n    const mx = (rendererBounds.width - selectedBounds.width * zoom) / 2 / zoom\n    const my = (rendererBounds.height - selectedBounds.height * zoom) / 2 / zoom\n\n    return this.setCamera(\n      Vec.toFixed(Vec.sub([mx, my], [selectedBounds.minX, selectedBounds.minY])),\n      zoom,\n      `zoomed_to_selection`\n    )\n  }\n\n  /**\n   * Zoom back to content when the canvas is empty.\n   */\n  zoomToContent = (): this => {\n    const shapes = this.shapes\n    const pageState = this.pageState\n\n    if (shapes.length === 0) return this\n\n    const { rendererBounds } = this\n    const { zoom } = pageState.camera\n    const commonBounds = Utils.getCommonBounds(shapes.map(TLDR.getBounds))\n\n    const mx = (rendererBounds.width - commonBounds.width * zoom) / 2 / zoom\n    const my = (rendererBounds.height - commonBounds.height * zoom) / 2 / zoom\n\n    return this.setCamera(\n      Vec.toFixed(Vec.sub([mx, my], [commonBounds.minX, commonBounds.minY])),\n      this.camera.zoom,\n      `zoomed_to_content`\n    )\n  }\n\n  /**\n   * Zoom the camera to 100%.\n   */\n  resetZoom = (): this => {\n    return this.zoomTo(1)\n  }\n\n  /**\n   * Zoom the camera by a certain delta.\n   * @param delta The zoom delta.\n   * @param center The point to zoom toward.\n   */\n  zoomBy = Utils.throttle((delta: number, center?: number[]): this => {\n    const { zoom } = this.camera\n    const nextZoom = TLDR.getCameraZoom(zoom - delta * zoom)\n    return this.zoomTo(nextZoom, center)\n  }, 16)\n\n  /* -------------------------------------------------- */\n  /*                      Selection                     */\n  /* -------------------------------------------------- */\n\n  /**\n   * Clear the selection history (undo/redo stack for selection).\n   */\n  private clearSelectHistory = (): this => {\n    this.selectHistory.pointer = 0\n    this.selectHistory.stack = [this.selectedIds]\n    return this\n  }\n\n  /**\n   * Adds a selection to the selection history (undo/redo stack for selection).\n   */\n  private addToSelectHistory = (ids: string[]): this => {\n    if (this.selectHistory.pointer < this.selectHistory.stack.length) {\n      this.selectHistory.stack = this.selectHistory.stack.slice(0, this.selectHistory.pointer + 1)\n    }\n    this.selectHistory.pointer++\n    this.selectHistory.stack.push(ids)\n    return this\n  }\n\n  /**\n   * Set the current selection.\n   * @param ids The ids to select\n   * @param push Whether to add the ids to the current selection instead.\n   */\n  private setSelectedIds = (ids: string[], push = false): this => {\n    const nextIds = push ? [...this.pageState.selectedIds, ...ids] : [...ids]\n\n    return this.patchState(\n      {\n        appState: {\n          activeTool: 'select',\n        },\n        document: {\n          pageStates: {\n            [this.currentPageId]: {\n              selectedIds: nextIds,\n            },\n          },\n        },\n      },\n      `selected`\n    )\n  }\n\n  /**\n   * Undo the most recent selection.\n   */\n  undoSelect = (): this => {\n    if (this.selectHistory.pointer > 0) {\n      this.selectHistory.pointer--\n      this.setSelectedIds(this.selectHistory.stack[this.selectHistory.pointer])\n    }\n    return this\n  }\n\n  /**\n   * Redo the previous selection.\n   */\n  redoSelect = (): this => {\n    if (this.selectHistory.pointer < this.selectHistory.stack.length - 1) {\n      this.selectHistory.pointer++\n      this.setSelectedIds(this.selectHistory.stack[this.selectHistory.pointer])\n    }\n    return this\n  }\n\n  /**\n   * Select one or more shapes.\n   * @param ids The shape ids to select.\n   */\n  select = (...ids: string[]): this => {\n    ids.forEach((id) => {\n      if (!this.page.shapes[id]) {\n        throw Error(`That shape does not exist on page ${this.currentPageId}`)\n      }\n    })\n    this.setSelectedIds(ids)\n    this.addToSelectHistory(ids)\n    return this\n  }\n\n  /**\n   * Select all shapes on the page.\n   */\n  selectAll = (pageId = this.currentPageId): this => {\n    if (this.session) return this\n\n    // Select only shapes that are the direct child of the page\n    this.setSelectedIds(\n      Object.values(this.document.pages[pageId].shapes)\n        .filter((shape) => shape.parentId === pageId)\n        .map((shape) => shape.id)\n    )\n\n    this.addToSelectHistory(this.selectedIds)\n\n    this.selectTool('select')\n\n    return this\n  }\n\n  /**\n   * Deselect any selected shapes.\n   */\n  selectNone = (): this => {\n    this.setSelectedIds([])\n    this.addToSelectHistory(this.selectedIds)\n    return this\n  }\n\n  /* -------------------------------------------------- */\n  /*                      Sessions                 p      */\n  /* -------------------------------------------------- */\n\n  /**\n   * Start a new session.\n   * @param type The session type\n   * @param args arguments of the session's start method.\n   */\n  startSession = <T extends SessionType>(type: T, ...args: SessionArgsOfType<T>): this => {\n    if (this.readOnly && type !== SessionType.Brush) return this\n\n    if (this.session) {\n      TLDR.warn(`Already in a session! (${this.session.constructor.name})`)\n      this.cancelSession()\n    }\n\n    const Session = getSession(type) as any\n    this.session = new Session(this, ...args)\n\n    const result = this.session!.start()\n\n    if (result) {\n      this.patchState(result, `session:start_${this.session!.constructor.name}`)\n    }\n\n    this.callbacks.onSessionStart?.(this, this.session!.constructor.name)\n\n    return this\n    // return this.setStatus(this.session.status)\n  }\n\n  /**\n   * updateSession.\n   * @param args The arguments of the current session's update method.\n   */\n  updateSession = (): this => {\n    const { session } = this\n    if (!session) return this\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const patch = session.update()\n    if (!patch) return this\n    return this.patchState(patch, `session:${session?.constructor.name}`)\n  }\n\n  /**\n   * Cancel the current session.\n   * @param args The arguments of the current session's cancel method.\n   */\n  cancelSession = (): this => {\n    const { session } = this\n    if (!session) return this\n    this.session = undefined\n\n    const result = session.cancel()\n\n    if (result) {\n      this.patchState(result, `session:cancel:${session.constructor.name}`)\n    }\n\n    this.setEditingId()\n\n    this.callbacks.onSessionEnd?.(this, session.constructor.name)\n\n    return this\n  }\n\n  /**\n   * Complete the current session.\n   * @param args The arguments of the current session's complete method.\n   */\n  completeSession = (): this => {\n    const { session } = this\n\n    if (!session) return this\n\n    this.session = undefined\n    const result = session.complete()\n\n    if (result === undefined) {\n      this.isCreating = false\n\n      this.patchState(\n        {\n          appState: {\n            status: TDStatus.Idle,\n          },\n          document: {\n            pageStates: {\n              [this.currentPageId]: {\n                editingId: undefined,\n                bindingId: undefined,\n                hoveredId: undefined,\n              },\n            },\n          },\n        },\n        `session:complete:${session.constructor.name}`\n      )\n    } else if ('after' in result) {\n      // Session ended with a command\n\n      if (this.isCreating) {\n        // We're currently creating a shape. Override the command's\n        // before state so that when we undo the command, we remove\n        // the shape we just created.\n        result.before = {\n          appState: {\n            ...result.before.appState,\n            status: TDStatus.Idle,\n          },\n          document: {\n            pages: {\n              [this.currentPageId]: {\n                shapes: Object.fromEntries(this.selectedIds.map((id) => [id, undefined])),\n              },\n            },\n            pageStates: {\n              [this.currentPageId]: {\n                selectedIds: [],\n                editingId: null,\n                bindingId: null,\n                hoveredId: null,\n              },\n            },\n          },\n        }\n\n        if (this.appState.isToolLocked) {\n          const pageState = result.after?.document?.pageStates?.[this.currentPageId] || {}\n          pageState.selectedIds = []\n        }\n\n        this.isCreating = false\n      }\n\n      result.after.appState = {\n        ...result.after.appState,\n        status: TDStatus.Idle,\n      }\n\n      result.after.document = {\n        ...result.after.document,\n        pageStates: {\n          ...result.after.document?.pageStates,\n          [this.currentPageId]: {\n            ...(result.after.document?.pageStates || {})[this.currentPageId],\n            editingId: null,\n          },\n        },\n      }\n\n      this.setState(result, `session:complete:${session.constructor.name}`)\n    } else {\n      this.patchState(\n        {\n          ...result,\n          appState: {\n            ...result.appState,\n            status: TDStatus.Idle,\n          },\n          document: {\n            ...result.document,\n            pageStates: {\n              [this.currentPageId]: {\n                ...result.document?.pageStates?.[this.currentPageId],\n                editingId: null,\n              },\n            },\n          },\n        },\n        `session:complete:${session.constructor.name}`\n      )\n    }\n\n    this.callbacks.onSessionEnd?.(this, session.constructor.name)\n\n    return this\n  }\n\n  /* -------------------------------------------------- */\n  /*                   Shape Functions                  */\n  /* -------------------------------------------------- */\n\n  /**\n   * Manually create shapes on the page.\n   * @param shapes An array of shape partials, containing the initial props for the shapes.\n   * @command\n   */\n  createShapes = (...shapes: ({ id: string; type: TDShapeType } & Partial<TDShape>)[]): this => {\n    if (shapes.length === 0) return this\n\n    return this.create(\n      shapes.map((shape) => {\n        return TLDR.getShapeUtil(shape.type).create({\n          parentId: this.currentPageId,\n          ...shape,\n        })\n      })\n    )\n  }\n\n  /**\n   * Manually update a set of shapes.\n   * @param shapes An array of shape partials, containing the changes to be made to each shape.\n   * @command\n   */\n  updateShapes = (...shapes: ({ id: string } & Partial<TDShape>)[]): this => {\n    const pageShapes = this.document.pages[this.currentPageId].shapes\n    const shapesToUpdate = shapes.filter((shape) => pageShapes[shape.id])\n    if (shapesToUpdate.length === 0) return this\n    return this.setState(\n      Commands.updateShapes(this, shapesToUpdate, this.currentPageId),\n      'updated_shapes'\n    )\n  }\n\n  createTextShapeAtPoint(point: number[], id?: string, patch?: boolean): this {\n    const {\n      shapes,\n      appState: { currentPageId, currentStyle },\n    } = this\n\n    const childIndex =\n      shapes.length === 0\n        ? 1\n        : shapes\n            .filter((shape) => shape.parentId === currentPageId)\n            .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n\n    const Text = shapeUtils[TDShapeType.Text]\n\n    const newShape = Text.create({\n      id: id || Utils.uniqueId(),\n      parentId: currentPageId,\n      childIndex,\n      point,\n      style: { ...currentStyle },\n    })\n\n    const bounds = Text.getBounds(newShape)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n\n    if (patch) {\n      this.patchCreate([TLDR.getShapeUtil(newShape.type).create(newShape)])\n    } else {\n      this.createShapes(newShape)\n    }\n\n    this.setEditingId(newShape.id, true)\n\n    return this\n  }\n\n  getImageOrVideoShapeAtPoint(\n    id: string,\n    type: TDShapeType.Image | TDShapeType.Video,\n    point: number[],\n    size: number[],\n    assetId: string\n  ) {\n    const {\n      shapes,\n      appState: { currentPageId, currentStyle },\n    } = this\n\n    const childIndex =\n      shapes.length === 0\n        ? 1\n        : shapes\n            .filter((shape) => shape.parentId === currentPageId)\n            .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n\n    const Shape = shapeUtils[type]\n\n    // Ensure that the pasted shape fits inside of the current viewport\n\n    if (size[0] > this.viewport.width) {\n      const r = size[1] / size[0]\n      size[0] = this.viewport.width - (FIT_TO_SCREEN_PADDING / this.camera.zoom) * 2\n      size[1] = size[0] * r\n      if (size[1] < 32 || size[1] < 32) {\n        size[1] = 32\n        size[0] = size[1] / r\n      }\n    } else if (size[1] > this.viewport.height) {\n      const r = size[0] / size[1]\n      size[1] = this.viewport.height - (FIT_TO_SCREEN_PADDING / this.camera.zoom) * 2\n      size[0] = size[1] * r\n      if (size[1] < 32 || size[1] < 32) {\n        size[0] = 32\n        size[1] = size[0] / r\n      }\n    }\n\n    const newShape = Shape.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point,\n      size,\n      style: { ...currentStyle },\n      assetId,\n    })\n\n    return newShape\n  }\n\n  /**\n   * Create one or more shapes.\n   * @param shapes An array of shapes.\n   * @command\n   */\n  create = (shapes: TDShape[] = [], bindings: TDBinding[] = []): this => {\n    if (shapes.length === 0) return this\n    return this.setState(Commands.createShapes(this, shapes, bindings))\n  }\n\n  /**\n   * Patch in a new set of shapes\n   * @param shapes\n   * @param bindings\n   */\n  patchCreate = (shapes: TDShape[] = [], bindings: TDBinding[] = []): this => {\n    if (shapes.length === 0) return this\n    return this.patchState(Commands.createShapes(this, shapes, bindings).after)\n  }\n\n  /**\n   * Delete one or more shapes.\n   * @param ids The ids of the shapes to delete.\n   * @command\n   */\n  delete = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    const drawCommand = Commands.deleteShapes(this, ids)\n\n    if (\n      this.callbacks.onAssetDelete &&\n      drawCommand.before.document?.assets &&\n      drawCommand.after.document?.assets\n    ) {\n      const beforeAssetIds = Object.keys(drawCommand.before.document.assets).filter(\n        (k) => !!drawCommand.before.document!.assets![k]\n      )\n      const afterAssetIds = Object.keys(drawCommand.after.document.assets).filter(\n        (k) => !!drawCommand.after.document!.assets![k]\n      )\n\n      const intersection = beforeAssetIds.filter((x) => !afterAssetIds.includes(x))\n      intersection.forEach((id) => this.callbacks.onAssetDelete!(this, id))\n    }\n\n    return this.setState(drawCommand)\n  }\n\n  /**\n   * Delete all shapes on the page.\n   */\n  deleteAll = (): this => {\n    this.selectAll()\n    this.delete()\n    return this\n  }\n\n  /**\n   * Change the style for one or more shapes.\n   * @param style A style partial to apply to the shapes.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  style = (style: Partial<ShapeStyles>, ids = this.selectedIds): this => {\n    return this.setState(Commands.styleShapes(this, ids, style))\n  }\n\n  /**\n   * Align one or more shapes.\n   * @param direction Whether to align horizontally or vertically.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  align = (type: AlignType, ids = this.selectedIds): this => {\n    if (ids.length < 2) return this\n    return this.setState(Commands.alignShapes(this, ids, type))\n  }\n\n  /**\n   * Distribute one or more shapes.\n   * @param direction Whether to distribute horizontally or vertically..\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  distribute = (direction: DistributeType, ids = this.selectedIds): this => {\n    if (ids.length < 3) return this\n    return this.setState(Commands.distributeShapes(this, ids, direction))\n  }\n\n  /**\n   * Stretch one or more shapes to their common bounds.\n   * @param direction Whether to stretch horizontally or vertically.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  stretch = (direction: StretchType, ids = this.selectedIds): this => {\n    if (ids.length < 2) return this\n    return this.setState(Commands.stretchShapes(this, ids, direction))\n  }\n\n  /**\n   * Flip one or more shapes horizontally.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  flipHorizontal = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.flipShapes(this, ids, FlipType.Horizontal))\n  }\n\n  /**\n   * Flip one or more shapes vertically.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  flipVertical = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.flipShapes(this, ids, FlipType.Vertical))\n  }\n\n  /**\n   * Move one or more shapes to a new page. Will also break or move bindings.\n   * @param toPageId The id of the page to move the shapes to.\n   * @param fromPageId The id of the page to move the shapes from (defaults to current page).\n   * @param ids The ids of the shapes to move (defaults to selection).\n   */\n  moveToPage = (\n    toPageId: string,\n    fromPageId = this.currentPageId,\n    ids = this.selectedIds\n  ): this => {\n    if (ids.length === 0) return this\n    const { rendererBounds } = this\n    this.setState(Commands.moveShapesToPage(this, ids, rendererBounds, fromPageId, toPageId))\n    return this\n  }\n\n  /**\n   * Move one or more shapes to the back of the page.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  moveToBack = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.reorderShapes(this, ids, MoveType.ToBack))\n  }\n\n  /**\n   * Move one or more shapes backward on of the page.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  moveBackward = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.reorderShapes(this, ids, MoveType.Backward))\n  }\n\n  /**\n   * Move one or more shapes forward on the page.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  moveForward = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.reorderShapes(this, ids, MoveType.Forward))\n  }\n\n  /**\n   * Move one or more shapes to the front of the page.\n   * @param ids The ids of the shapes to change (defaults to selection).\n   */\n  moveToFront = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.reorderShapes(this, ids, MoveType.ToFront))\n  }\n\n  /**\n   * Nudge one or more shapes in a direction.\n   * @param delta The direction to nudge the shapes.\n   * @param isMajor Whether this is a major (i.e. shift) nudge.\n   * @param ids The ids to change (defaults to selection).\n   */\n  nudge = (delta: number[], isMajor = false, ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    const size = isMajor\n      ? this.settings.showGrid\n        ? this.currentGrid * 4\n        : 10\n      : this.settings.showGrid\n      ? this.currentGrid\n      : 1\n\n    return this.setState(Commands.translateShapes(this, ids, Vec.mul(delta, size)))\n  }\n\n  /**\n   * Duplicate one or more shapes.\n   * @param ids The ids to duplicate (defaults to selection).\n   */\n  duplicate = (ids = this.selectedIds, point?: number[]): this => {\n    if (this.readOnly) return this\n    if (ids.length === 0) return this\n    return this.setState(Commands.duplicateShapes(this, ids, point))\n  }\n\n  /**\n   * Reset the bounds for one or more shapes. Usually when the\n   * bounding box of a shape is double-clicked. Different shapes may\n   * handle this differently.\n   * @param ids The ids to change (defaults to selection).\n   */\n  resetBounds = (ids = this.selectedIds): this => {\n    const command = Commands.resetBounds(this, ids, this.currentPageId)\n    return this.setState(Commands.resetBounds(this, ids, this.currentPageId), command.id)\n  }\n\n  /**\n   * Toggle the hidden property of one or more shapes.\n   * @param ids The ids to change (defaults to selection).\n   */\n  toggleHidden = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.toggleShapeProp(this, ids, 'isHidden'))\n  }\n\n  /**\n   * Toggle the locked property of one or more shapes.\n   * @param ids The ids to change (defaults to selection).\n   */\n  toggleLocked = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.toggleShapeProp(this, ids, 'isLocked'))\n  }\n\n  /**\n   * Toggle the fixed-aspect-ratio property of one or more shapes.\n   * @param ids The ids to change (defaults to selection).\n   */\n  toggleAspectRatioLocked = (ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    return this.setState(Commands.toggleShapeProp(this, ids, 'isAspectRatioLocked'))\n  }\n\n  /**\n   * Toggle the decoration at a handle of one or more shapes.\n   * @param handleId The handle to toggle.\n   * @param ids The ids of the shapes to toggle the decoration on.\n   */\n  toggleDecoration = (handleId: string, ids = this.selectedIds): this => {\n    if (ids.length === 0 || !(handleId === 'start' || handleId === 'end')) return this\n    return this.setState(Commands.toggleShapesDecoration(this, ids, handleId))\n  }\n\n  /**\n   * Set the props of one or more shapes\n   * @param props The props to set on the shapes.\n   * @param ids The ids of the shapes to set props on.\n   */\n  setShapeProps = <T extends TDShape>(props: Partial<T>, ids = this.selectedIds) => {\n    return this.setState(Commands.setShapesProps(this, ids, props))\n  }\n\n  /**\n   * Rotate one or more shapes by a delta.\n   * @param delta The delta in radians.\n   * @param ids The ids to rotate (defaults to selection).\n   */\n  rotate = (delta = Math.PI * -0.5, ids = this.selectedIds): this => {\n    if (ids.length === 0) return this\n    const change = Commands.rotateShapes(this, ids, delta)\n    if (!change) return this\n    return this.setState(change)\n  }\n\n  /**\n   * Group the selected shapes.\n   * @param ids The ids to group (defaults to selection).\n   * @param groupId The new group's id.\n   */\n  group = (\n    ids = this.selectedIds,\n    groupId = Utils.uniqueId(),\n    pageId = this.currentPageId\n  ): this => {\n    if (this.readOnly) return this\n\n    if (ids.length === 1 && this.getShape(ids[0], pageId).type === TDShapeType.Group) {\n      return this.ungroup(ids, pageId)\n    }\n\n    if (ids.length < 2) return this\n\n    const command = Commands.groupShapes(this, ids, groupId, pageId)\n    if (!command) return this\n    return this.setState(command)\n  }\n\n  /**\n   * Ungroup the selected groups.\n   * @todo\n   */\n  ungroup = (ids = this.selectedIds, pageId = this.currentPageId): this => {\n    if (this.readOnly) return this\n\n    const groups = ids\n      .map((id) => this.getShape(id, pageId))\n      .filter((shape) => shape.type === TDShapeType.Group)\n\n    if (groups.length === 0) return this\n\n    const command = Commands.ungroupShapes(this, ids, groups as GroupShape[], pageId)\n\n    if (!command) {\n      return this\n    }\n\n    return this.setState(command)\n  }\n\n  /**\n   * Cancel the current session.\n   */\n  cancel = (): this => {\n    this.currentTool.onCancel?.()\n\n    return this\n  }\n\n  addMediaFromFiles = async (files: File[], point = this.centerPoint) => {\n    this.setIsLoading(true)\n\n    // Rather than creating each shape individually (which will produce undo / redo entries\n    // for each shape), create an array of all the shapes that we'll need to create. We'll\n    // iterate through these at the bottom of the function to set their points, then create\n    // them through a single call to `createShapes`.\n\n    const shapesToCreate: TDShape[] = []\n\n    const pagePoint = this.getPagePoint(point)\n\n    for (const file of files) {\n      const id = Utils.uniqueId()\n      const extension = file.name.match(/\\.[0-9a-z]+$/i)\n\n      if (!extension) throw Error('No extension')\n\n      const isImage = IMAGE_EXTENSIONS.includes(extension[0].toLowerCase())\n      const isVideo = VIDEO_EXTENSIONS.includes(extension[0].toLowerCase())\n\n      if (!(isImage || isVideo)) throw Error('Wrong extension')\n\n      const shapeType = isImage ? TDShapeType.Image : TDShapeType.Video\n      const assetType = isImage ? TDAssetType.Image : TDAssetType.Video\n\n      let src: string | ArrayBuffer | null\n\n      try {\n        if (this.callbacks.onAssetCreate) {\n          const result = await this.callbacks.onAssetCreate(this, file, id)\n\n          if (!result) throw Error('Asset creation callback returned false')\n\n          src = result\n        } else {\n          src = await fileToBase64(file)\n        }\n\n        if (typeof src === 'string') {\n          let size = [0, 0]\n\n          if (isImage) {\n            // attempt to get actual svg size from viewBox attribute as\n            if (extension[0] == '.svg') {\n              let viewBox: string[]\n              const svgString = await fileToText(file)\n              const viewBoxAttribute = this.getViewboxFromSVG(svgString)\n\n              if (viewBoxAttribute) {\n                viewBox = viewBoxAttribute.split(' ')\n                size[0] = parseFloat(viewBox[2])\n                size[1] = parseFloat(viewBox[3])\n              }\n            }\n            if (Vec.isEqual(size, [0, 0])) {\n              size = await getImageSizeFromSrc(src)\n            }\n          } else {\n            size = await getVideoSizeFromSrc(src)\n          }\n\n          const match = Object.values(this.document.assets).find(\n            (asset) => asset.type === assetType && asset.src === src\n          )\n\n          let assetId: string\n\n          if (!match) {\n            assetId = Utils.uniqueId()\n\n            const asset = {\n              id: assetId,\n              type: assetType,\n              name: file.name,\n              src,\n              size,\n            }\n\n            this.patchState({\n              document: {\n                assets: {\n                  [assetId]: asset,\n                },\n              },\n            })\n          } else {\n            assetId = match.id\n          }\n\n          shapesToCreate.push(this.getImageOrVideoShapeAtPoint(id, shapeType, point, size, assetId))\n        }\n      } catch (error) {\n        // Even if one shape errors, keep going (we might have had other shapes that didn't error)\n        console.warn(error)\n      }\n    }\n\n    if (shapesToCreate.length) {\n      const currentPoint = Vec.add(pagePoint, [0, 0])\n\n      shapesToCreate.forEach((shape, i) => {\n        const bounds = TLDR.getBounds(shape)\n\n        if (i === 0) {\n          // For the first shape, offset the current point so\n          // that the first shape's center is at the page point\n          currentPoint[0] -= bounds.width / 2\n          currentPoint[1] -= bounds.height / 2\n        }\n\n        // Set the shape's point the current point\n        shape.point = [...currentPoint]\n\n        // Then bump the page current point by this shape's width\n        currentPoint[0] += bounds.width\n      })\n\n      const commonBounds = Utils.getCommonBounds(shapesToCreate.map(TLDR.getBounds))\n\n      this.createShapes(...shapesToCreate)\n\n      // Are the common bounds too big for the viewport?\n      if (!Utils.boundsContain(this.viewport, commonBounds)) {\n        this.zoomToSelection()\n        if (this.zoom > 1) {\n          this.resetZoom()\n        }\n      }\n    }\n\n    this.setIsLoading(false)\n    return this\n  }\n\n  private getViewboxFromSVG = (svgStr: string | ArrayBuffer | null) => {\n    const viewBoxRegex = /.*?viewBox=[\"'](-?[\\d.]+[, ]+-?[\\d.]+[, ][\\d.]+[, ][\\d.]+)[\"']/\n\n    if (typeof svgStr === 'string') {\n      const matches = svgStr.match(viewBoxRegex)\n      return matches && matches.length >= 2 ? matches[1] : null\n    }\n\n    console.warn('could not get viewbox from svg string')\n\n    this.setIsLoading(false)\n\n    return null\n  }\n\n  /* -------------------------------------------------- */\n  /*                   Event Handlers                   */\n  /* -------------------------------------------------- */\n\n  /* ----------------- Keyboard Events ---------------- */\n\n  onKeyDown: TLKeyboardEventHandler = (key, info, e) => {\n    switch (e.key) {\n      case '/': {\n        if (this.status === 'idle' && !this.pageState.editingId) {\n          const { shiftKey, metaKey, altKey, ctrlKey, spaceKey } = this\n\n          this.onPointerDown(\n            {\n              target: 'canvas',\n              pointerId: 0,\n              origin: info.point,\n              point: info.point,\n              delta: [0, 0],\n              pressure: 0.5,\n              shiftKey,\n              ctrlKey,\n              metaKey,\n              altKey,\n              spaceKey,\n            },\n            {\n              shiftKey,\n              altKey,\n              ctrlKey,\n              pointerId: 0,\n              clientX: info.point[0],\n              clientY: info.point[1],\n            } as unknown as React.PointerEvent<HTMLDivElement>\n          )\n        }\n        break\n      }\n      case 'Escape': {\n        this.cancel()\n        break\n      }\n      case 'Meta': {\n        this.metaKey = true\n        break\n      }\n      case 'Alt': {\n        this.altKey = true\n        break\n      }\n      case 'Control': {\n        this.ctrlKey = true\n        break\n      }\n      case ' ': {\n        this.isForcePanning = true\n        this.spaceKey = true\n        break\n      }\n    }\n\n    this.currentTool.onKeyDown?.(key, info, e)\n\n    return this\n  }\n\n  onKeyUp: TLKeyboardEventHandler = (key, info, e) => {\n    if (!info) return\n\n    switch (e.key) {\n      case '/': {\n        const { currentPoint, shiftKey, metaKey, altKey, ctrlKey, spaceKey } = this\n\n        this.onPointerUp(\n          {\n            target: 'canvas',\n            pointerId: 0,\n            origin: currentPoint,\n            point: currentPoint,\n            delta: [0, 0],\n            pressure: 0.5,\n            shiftKey,\n            ctrlKey,\n            metaKey,\n            altKey,\n            spaceKey,\n          },\n          {\n            shiftKey,\n            altKey,\n            ctrlKey,\n            pointerId: 0,\n            clientX: currentPoint[0],\n            clientY: currentPoint[1],\n          } as unknown as React.PointerEvent<HTMLDivElement>\n        )\n        break\n      }\n      case 'Meta': {\n        this.metaKey = false\n        break\n      }\n      case 'Alt': {\n        this.altKey = false\n        break\n      }\n      case 'Control': {\n        this.ctrlKey = false\n        break\n      }\n      case ' ': {\n        this.isForcePanning = false\n        this.spaceKey = false\n        break\n      }\n    }\n\n    this.currentTool.onKeyUp?.(key, info, e)\n  }\n\n  /** Force bounding boxes to reset when the document loads. */\n  refreshBoundingBoxes = () => {\n    // force a change to every text shape\n    const force = this.shapes.map((shape) => {\n      return [\n        shape.id,\n        {\n          point: [...shape.point],\n          ...('label' in shape && { label: '' }),\n        },\n      ]\n    })\n\n    const restore = this.shapes.map((shape) => {\n      return [\n        shape.id,\n        {\n          point: [...shape.point],\n          ...('label' in shape && { label: shape.label }),\n        },\n      ]\n    })\n\n    clearPrevSize()\n\n    this.patchState({\n      document: {\n        pages: {\n          [this.currentPageId]: {\n            shapes: Object.fromEntries(force),\n          },\n        },\n      },\n    })\n    this.patchState({\n      document: {\n        pages: {\n          [this.currentPageId]: {\n            shapes: Object.fromEntries(restore),\n          },\n        },\n      },\n    })\n  }\n\n  /* ------------- Renderer Event Handlers ------------ */\n\n  onDragOver: TLDropEventHandler = (e) => {\n    e.preventDefault()\n  }\n\n  onDrop: TLDropEventHandler = async (e) => {\n    e.preventDefault()\n    if (this.disableAssets) return this\n    if (e.dataTransfer.files?.length) {\n      this.addMediaFromFiles(Object.values(e.dataTransfer.files), [e.clientX, e.clientY])\n    }\n    return this\n  }\n\n  onPinchStart: TLPinchEventHandler = (info, e) => {\n    this.currentTool.onPinchStart?.(info, e)\n  }\n\n  onPinchEnd: TLPinchEventHandler = (info, e) => this.currentTool.onPinchEnd?.(info, e)\n\n  onPinch: TLPinchEventHandler = (info, e) => this.currentTool.onPinch?.(info, e)\n\n  onPan: TLWheelEventHandler = (info, e) => {\n    if (this.appState.status === 'pinching') return\n    // TODO: Pan and pinchzoom are firing at the same time. Considering turning one of them off!\n\n    const delta = Vec.div(info.delta, this.camera.zoom)\n    const prev = this.camera.point\n    const next = Vec.sub(prev, delta)\n\n    if (Vec.isEqual(next, prev)) return\n\n    this.pan(delta)\n\n    // When panning, we also want to call onPointerMove, except when \"force panning\" via spacebar / middle wheel button (it's called elsewhere in that case)\n    if (!this.isForcePanning) this.onPointerMove(info, e as unknown as React.PointerEvent)\n  }\n\n  onZoom: TLWheelEventHandler = (info, e) => {\n    if (this.state.appState.status !== TDStatus.Idle) return\n    const delta = info.delta[2] / 50\n    this.zoomBy(delta, info.point)\n    this.onPointerMove(info, e as unknown as React.PointerEvent)\n  }\n\n  /* ----------------- Pointer Events ----------------- */\n\n  updateInputs: TLPointerEventHandler = (info) => {\n    this.currentPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.shiftKey = info.shiftKey\n    this.altKey = info.altKey\n    this.ctrlKey = info.ctrlKey\n    this.metaKey = info.metaKey\n  }\n\n  onPointerMove: TLPointerEventHandler = (info, e) => {\n    this.previousPoint = this.currentPoint\n    this.updateInputs(info, e)\n    if (this.isForcePanning && this.isPointing) {\n      this.onPan?.({ ...info, delta: Vec.neg(info.delta) }, e as unknown as WheelEvent)\n      return\n    }\n\n    // Several events (e.g. pan) can trigger the same \"pointer move\" behavior\n    this.currentTool.onPointerMove?.(info, e)\n\n    // Move this to an emitted event\n    if (this.state.room) {\n      const { users, userId } = this.state.room\n\n      this.callbacks.onChangePresence?.(this, {\n        ...users[userId],\n        point: this.getPagePoint(info.point),\n        session: !!this.session,\n      })\n    }\n  }\n\n  onPointerDown: TLPointerEventHandler = (info, e) => {\n    if (e.buttons === 4) {\n      this.isForcePanning = true\n    } else if (this.isPointing) {\n      return\n    }\n    this.isPointing = true\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    if (this.isForcePanning) return\n    this.currentTool.onPointerDown?.(info, e)\n  }\n\n  onPointerUp: TLPointerEventHandler = (info, e) => {\n    this.isPointing = false\n    if (!this.shiftKey) this.isForcePanning = false\n    this.updateInputs(info, e)\n    this.currentTool.onPointerUp?.(info, e)\n  }\n\n  // Canvas (background)\n  onPointCanvas: TLCanvasEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onPointCanvas?.(info, e)\n  }\n\n  onDoubleClickCanvas: TLCanvasEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDoubleClickCanvas?.(info, e)\n  }\n\n  onRightPointCanvas: TLCanvasEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onRightPointCanvas?.(info, e)\n  }\n\n  onDragCanvas: TLCanvasEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDragCanvas?.(info, e)\n  }\n\n  onReleaseCanvas: TLCanvasEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onReleaseCanvas?.(info, e)\n  }\n\n  // Shape\n  onPointShape: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onPointShape?.(info, e)\n  }\n\n  onReleaseShape: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onReleaseShape?.(info, e)\n  }\n\n  onDoubleClickShape: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onDoubleClickShape?.(info, e)\n  }\n\n  onRightPointShape: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onRightPointShape?.(info, e)\n  }\n\n  onDragShape: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDragShape?.(info, e)\n  }\n\n  onHoverShape: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onHoverShape?.(info, e)\n  }\n\n  onUnhoverShape: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onUnhoverShape?.(info, e)\n  }\n\n  // Bounds (bounding box background)\n  onPointBounds: TLBoundsEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onPointBounds?.(info, e)\n  }\n\n  onDoubleClickBounds: TLBoundsEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onDoubleClickBounds?.(info, e)\n  }\n\n  onRightPointBounds: TLBoundsEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onRightPointBounds?.(info, e)\n  }\n\n  onDragBounds: TLBoundsEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDragBounds?.(info, e)\n  }\n\n  onHoverBounds: TLBoundsEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onHoverBounds?.(info, e)\n  }\n\n  onUnhoverBounds: TLBoundsEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onUnhoverBounds?.(info, e)\n  }\n\n  onReleaseBounds: TLBoundsEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onReleaseBounds?.(info, e)\n  }\n\n  // Bounds handles (corners, edges)\n  onPointBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onPointBoundsHandle?.(info, e)\n  }\n\n  onDoubleClickBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onDoubleClickBoundsHandle?.(info, e)\n\n    // hack time to reset the size / clipping of an image\n    if (this.selectedIds.length !== 1) return\n\n    const shape = this.getShape(this.selectedIds[0])\n\n    if (shape.type === TDShapeType.Image || shape.type === TDShapeType.Video) {\n      const asset = this.document.assets[shape.assetId]\n      const util = TLDR.getShapeUtil(shape)\n      const centerA = util.getCenter(shape)\n      const centerB = util.getCenter({ ...shape, size: asset.size })\n      const delta = Vec.sub(centerB, centerA)\n\n      this.updateShapes({\n        id: shape.id,\n        point: Vec.sub(shape.point, delta),\n        size: asset.size,\n      })\n    }\n  }\n\n  onRightPointBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onRightPointBoundsHandle?.(info, e)\n  }\n\n  onDragBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDragBoundsHandle?.(info, e)\n  }\n\n  onHoverBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onHoverBoundsHandle?.(info, e)\n  }\n\n  onUnhoverBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onUnhoverBoundsHandle?.(info, e)\n  }\n\n  onReleaseBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onReleaseBoundsHandle?.(info, e)\n  }\n\n  // Handles (ie the handles of a selected arrow)\n  onPointHandle: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onPointHandle?.(info, e)\n  }\n\n  onDoubleClickHandle: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onDoubleClickHandle?.(info, e)\n  }\n\n  onRightPointHandle: TLPointerEventHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onRightPointHandle?.(info, e)\n  }\n\n  onDragHandle: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onDragHandle?.(info, e)\n  }\n\n  onHoverHandle: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onHoverHandle?.(info, e)\n  }\n\n  onUnhoverHandle: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onUnhoverHandle?.(info, e)\n  }\n\n  onReleaseHandle: TLPointerEventHandler = (info, e) => {\n    this.updateInputs(info, e)\n    this.currentTool.onReleaseHandle?.(info, e)\n  }\n\n  onShapeChange = (shape: { id: string } & Partial<TDShape>) => {\n    const pageShapes = this.document.pages[this.currentPageId].shapes\n    const shapeToUpdate = { ...(pageShapes[shape.id] as any), ...shape }\n    const patch = Commands.updateShapes(this, [shapeToUpdate], this.currentPageId).after\n    return this.patchState(patch, 'patched_shapes')\n    // this.updateShapes(shape)\n  }\n\n  onShapeBlur = () => {\n    // This prevents an auto-blur event from Safari\n    if (performance.now() - this.editingStartTime < 50) return\n\n    const { editingId } = this.pageState\n    const { isToolLocked } = this.getAppState()\n\n    if (editingId) {\n      // If we're editing text, then delete the text if it's empty\n      const shape = this.getShape(editingId)\n      this.setEditingId()\n      if (shape.type === TDShapeType.Text) {\n        if (shape.text.trim().length <= 0) {\n          this.patchState(Commands.deleteShapes(this, [editingId]).after, 'delete_empty_text')\n        } else if (!isToolLocked) {\n          this.select(editingId)\n        }\n      }\n    }\n\n    this.currentTool.onShapeBlur?.()\n  }\n\n  onShapeClone: TLShapeCloneHandler = (info, e) => {\n    this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n    this.updateInputs(info, e)\n    this.currentTool.onShapeClone?.(info, e)\n  }\n\n  onRenderCountChange = (ids: string[]) => {\n    const appState = this.getAppState()\n    if (appState.isEmptyCanvas && ids.length > 0) {\n      this.patchState(\n        {\n          appState: {\n            isEmptyCanvas: false,\n          },\n        },\n        'empty_canvas:false'\n      )\n    } else if (!appState.isEmptyCanvas && ids.length <= 0) {\n      this.patchState(\n        {\n          appState: {\n            isEmptyCanvas: true,\n          },\n        },\n        'empty_canvas:true'\n      )\n    }\n  }\n\n  onError = () => {\n    // TODO\n  }\n\n  isSelected(id: string) {\n    return this.selectedIds.includes(id)\n  }\n\n  /* ----------------- Export ----------------- */\n\n  /**\n   * Get a snapshot of a video at current frame as base64 encoded image\n   * @param id ID of video shape\n   * @returns base64 encoded frame\n   * @throws Error if video shape with given ID does not exist\n   */\n  serializeVideo(id: string): string {\n    const video = document.getElementById(id + '_video') as HTMLVideoElement\n    if (video) {\n      const canvas = document.createElement('canvas')\n      canvas.width = video.videoWidth\n      canvas.height = video.videoHeight\n      canvas.getContext('2d')!.drawImage(video, 0, 0)\n      return canvas.toDataURL('image/png')\n    } else throw new Error('Video with id ' + id + ' not found')\n  }\n\n  /**\n   * Get a snapshot of a image (e.g. a GIF) as base64 encoded image\n   * @param id ID of image shape\n   * @returns base64 encoded frame\n   * @throws Error if image shape with given ID does not exist\n   */\n  serializeImage(id: string): string {\n    const image = document.getElementById(id + '_image') as HTMLImageElement\n    if (image) {\n      const canvas = document.createElement('canvas')\n      canvas.width = image.width\n      canvas.height = image.height\n      canvas.getContext('2d')!.drawImage(image, 0, 0)\n      return canvas.toDataURL('image/png')\n    } else throw new Error('Image with id ' + id + ' not found')\n  }\n\n  patchAssets(assets: TDAssets) {\n    this.document.assets = {\n      ...this.document.assets,\n      ...assets,\n    }\n  }\n\n  get room() {\n    return this.state.room\n  }\n\n  get isLocal() {\n    return this.state.room === undefined || this.state.room.id === 'local'\n  }\n\n  get status() {\n    return this.appState.status\n  }\n\n  get currentUser() {\n    if (!this.state.room) return\n    return this.state.room.users[this.state.room.userId]\n  }\n\n  // The center of the component (in screen space)\n  get centerPoint() {\n    const { width, height } = this.rendererBounds\n    return Vec.toFixed([width / 2, height / 2])\n  }\n\n  get currentGrid() {\n    const { zoom } = this.camera\n    if (zoom < 0.15) {\n      return GRID_SIZE * 16\n    } else if (zoom < 1) {\n      return GRID_SIZE * 4\n    } else {\n      return GRID_SIZE * 1\n    }\n  }\n\n  getShapeUtil = TLDR.getShapeUtil\n\n  static version = 15.5\n\n  static defaultDocument: TDDocument = {\n    id: 'doc',\n    name: 'New Document',\n    version: TldrawApp.version,\n    pages: {\n      page: {\n        id: 'page',\n        name: 'Page 1',\n        childIndex: 1,\n        shapes: {},\n        bindings: {},\n      },\n    },\n    pageStates: {\n      page: {\n        id: 'page',\n        selectedIds: [],\n        camera: {\n          point: [0, 0],\n          zoom: 1,\n        },\n      },\n    },\n    assets: {},\n  }\n\n  static defaultState: TDSnapshot = {\n    settings: {\n      isCadSelectMode: false,\n      isPenMode: false,\n      isDarkMode: false,\n      isZoomSnap: false,\n      isFocusMode: false,\n      isSnapping: false,\n      isDebugMode: false,\n      isReadonlyMode: false,\n      keepStyleMenuOpen: false,\n      nudgeDistanceLarge: 16,\n      nudgeDistanceSmall: 1,\n      showRotateHandles: true,\n      showBindingHandles: true,\n      showCloneHandles: false,\n      showGrid: false,\n      language: 'en',\n      dockPosition: 'bottom',\n      exportBackground: TDExportBackground.Transparent,\n    },\n    appState: {\n      status: TDStatus.Idle,\n      activeTool: 'select',\n      hoveredId: undefined,\n      currentPageId: 'page',\n      currentStyle: defaultStyle,\n      isToolLocked: false,\n      isMenuOpen: false,\n      isEmptyCanvas: false,\n      eraseLine: [],\n      snapLines: [],\n      isLoading: false,\n      disableAssets: false,\n    },\n    document: TldrawApp.defaultDocument,\n  }\n\n  static assetSrc = 'tldraw-assets.json'\n}\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport {\n  Decoration,\n  FontStyle,\n  TDDocument,\n  TDExportBackground,\n  TDShapeType,\n  TDSnapshot,\n  TextShape,\n} from '~types'\n\nexport function migrate(state: TDSnapshot, newVersion: number): TDSnapshot {\n  const { document, settings } = state\n  const { version = 0 } = document\n\n  if (!('assets' in document)) {\n    document.assets = {}\n  }\n\n  // Remove unused assets when loading a document\n  const assetIdsInUse = new Set<string>()\n\n  Object.values(document.pages).forEach((page) =>\n    Object.values(page.shapes).forEach((shape) => {\n      const { parentId, children, assetId } = shape\n\n      if (assetId) {\n        assetIdsInUse.add(assetId)\n      }\n\n      // Fix missing parent bug\n      if (parentId !== page.id && !page.shapes[parentId]) {\n        console.warn('Encountered a shape with a missing parent!')\n        shape.parentId = page.id\n      }\n\n      if (shape.type === TDShapeType.Group && children) {\n        children.forEach((childId) => {\n          if (!page.shapes[childId]) {\n            console.warn('Encountered a parent with a missing child!', shape.id, childId)\n            children?.splice(children.indexOf(childId), 1)\n          }\n        })\n\n        // TODO: Remove the shape if it has no children\n      }\n    })\n  )\n\n  Object.keys(document.assets).forEach((assetId) => {\n    if (!assetIdsInUse.has(assetId)) {\n      delete document.assets[assetId]\n    }\n  })\n\n  if (version === newVersion) return state\n\n  if (version < 14) {\n    Object.values(document.pages).forEach((page) => {\n      Object.values(page.shapes)\n        .filter((shape) => shape.type === TDShapeType.Text)\n        .forEach((shape) => (shape as TextShape).style.font === FontStyle.Script)\n    })\n  }\n\n  // Lowercase styles, move binding meta to binding\n  if (version <= 13) {\n    Object.values(document.pages).forEach((page) => {\n      Object.values(page.bindings).forEach((binding) => {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        Object.assign(binding, (binding as any).meta)\n      })\n\n      Object.values(page.shapes).forEach((shape) => {\n        Object.entries(shape.style).forEach(([id, style]) => {\n          if (typeof style === 'string') {\n            // @ts-ignore\n            shape.style[id] = style.toLowerCase()\n          }\n        })\n\n        if (shape.type === TDShapeType.Arrow) {\n          if (shape.decorations) {\n            Object.entries(shape.decorations).forEach(([id, decoration]) => {\n              if ((decoration as unknown) === 'Arrow') {\n                shape.decorations = {\n                  ...shape.decorations,\n                  [id]: Decoration.Arrow,\n                }\n              }\n            })\n          }\n        }\n      })\n    })\n  }\n\n  // Add document name and file system handle\n  if (version <= 13.1) {\n    document.name = 'New Document'\n  }\n\n  if (version < 15) {\n    document.assets = {}\n  }\n\n  Object.values(document.pages).forEach((page) => {\n    Object.values(page.shapes).forEach((shape) => {\n      if (version < 15.2) {\n        if (shape.type === TDShapeType.Image || shape.type === TDShapeType.Video) {\n          shape.style.isFilled = true\n        }\n      }\n\n      if (version < 15.3) {\n        if (\n          shape.type === TDShapeType.Rectangle ||\n          shape.type === TDShapeType.Triangle ||\n          shape.type === TDShapeType.Ellipse ||\n          shape.type === TDShapeType.Arrow\n        ) {\n          shape.label = (shape as any).text || ''\n          shape.labelPoint = [0.5, 0.5]\n        }\n      }\n    })\n  })\n\n  if (version < 15.4) {\n    settings.dockPosition = 'bottom'\n  }\n\n  if (version < 15.5) {\n    settings.exportBackground = TDExportBackground.Transparent\n  }\n\n  // Cleanup\n  Object.values(document.pageStates).forEach((pageState) => {\n    pageState.selectedIds = pageState.selectedIds.filter((id) => {\n      return document.pages[pageState.id].shapes[id] !== undefined\n    })\n    pageState.bindingId = undefined\n    pageState.editingId = undefined\n    pageState.hoveredId = undefined\n    pageState.pointedId = undefined\n  })\n\n  document.version = newVersion\n\n  return state\n}\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport type { TDDocument, TDFile } from '~types'\nimport type { FileSystemHandle } from './browser-fs-access'\nimport { get as getFromIdb, set as setToIdb } from 'idb-keyval'\nimport { IMAGE_EXTENSIONS, VIDEO_EXTENSIONS } from '~constants'\n\nconst options = { mode: 'readwrite' as const }\n\nconst checkPermissions = async (handle: FileSystemHandle) => {\n  return (\n    (await handle.queryPermission(options)) === 'granted' ||\n    (await handle.requestPermission(options)) === 'granted'\n  )\n}\n\nexport async function loadFileHandle() {\n  if (typeof Window === 'undefined' || !('_location' in Window)) return\n  const fileHandle = await getFromIdb(`Tldraw_file_handle_${window.location.origin}`)\n  if (!fileHandle) return null\n  return fileHandle\n}\n\nexport async function saveFileHandle(fileHandle: FileSystemHandle | null) {\n  return setToIdb(`Tldraw_file_handle_${window.location.origin}`, fileHandle)\n}\n\nexport async function saveToFileSystem(document: TDDocument, fileHandle: FileSystemHandle | null) {\n  // Create the saved file data\n  const file: TDFile = {\n    name: document.name || 'New Document',\n    fileHandle: fileHandle ?? null,\n    document,\n    assets: {},\n  }\n\n  // Serialize to JSON\n  const json = JSON.stringify(file, null, 2)\n\n  // Create blob\n  const blob = new Blob([json], {\n    type: 'application/vnd.Tldraw+json',\n  })\n\n  if (fileHandle) {\n    const hasPermissions = await checkPermissions(fileHandle)\n    if (!hasPermissions) return null\n  }\n\n  // Save to file system\n  // @ts-ignore\n  const browserFS = await import('./browser-fs-access')\n  const fileSave = browserFS.fileSave\n  const newFileHandle = await fileSave(\n    blob,\n    {\n      fileName: `${file.name}.tldr`,\n      description: 'Tldraw File',\n      extensions: [`.tldr`],\n    },\n    fileHandle\n  )\n\n  await saveFileHandle(newFileHandle)\n\n  // Return true\n  return newFileHandle\n}\n\nexport async function openFromFileSystem(): Promise<null | {\n  fileHandle: FileSystemHandle | null\n  document: TDDocument\n}> {\n  // Get the blob\n  // @ts-ignore\n  const browserFS = await import('./browser-fs-access')\n  const fileOpen = browserFS.fileOpen\n  const blob = await fileOpen({\n    description: 'Tldraw File',\n    extensions: [`.tldr`],\n    multiple: false,\n  })\n\n  if (!blob) return null\n\n  // Get JSON from blob\n  const json: string = await new Promise((resolve) => {\n    const reader = new FileReader()\n    reader.onloadend = () => {\n      if (reader.readyState === FileReader.DONE) {\n        resolve(reader.result as string)\n      }\n    }\n    reader.readAsText(blob, 'utf8')\n  })\n\n  // Parse\n  const file: TDFile = JSON.parse(json)\n\n  const fileHandle = blob.handle ?? null\n\n  await saveFileHandle(fileHandle)\n\n  return {\n    fileHandle,\n    document: file.document,\n  }\n}\n\nexport async function openAssetsFromFileSystem() {\n  // @ts-ignore\n  const browserFS = await import('./browser-fs-access')\n  const fileOpen = browserFS.fileOpen\n  return fileOpen({\n    description: 'Image or Video',\n    extensions: [...IMAGE_EXTENSIONS, ...VIDEO_EXTENSIONS],\n    multiple: true,\n  })\n}\n\nexport function fileToBase64(file: Blob): Promise<string | ArrayBuffer | null> {\n  return new Promise((resolve, reject) => {\n    if (file) {\n      const reader = new FileReader()\n      reader.readAsDataURL(file)\n      reader.onload = () => resolve(reader.result)\n      reader.onerror = (error) => reject(error)\n      reader.onabort = (error) => reject(error)\n    }\n  })\n}\n\nexport function fileToText(file: Blob): Promise<string | ArrayBuffer | null> {\n  return new Promise((resolve, reject) => {\n    if (file) {\n      const reader = new FileReader()\n      reader.readAsText(file)\n      reader.onload = () => resolve(reader.result)\n      reader.onerror = (error) => reject(error)\n      reader.onabort = (error) => reject(error)\n    }\n  })\n}\n\nexport function getImageSizeFromSrc(src: string): Promise<number[]> {\n  return new Promise((resolve, reject) => {\n    const img = new Image()\n    img.onload = () => resolve([img.width, img.height])\n    img.onerror = () => reject(new Error('Could not get image size'))\n    img.src = src\n  })\n}\n\nexport function getVideoSizeFromSrc(src: string): Promise<number[]> {\n  return new Promise((resolve, reject) => {\n    const video = document.createElement('video')\n    video.onloadedmetadata = () => resolve([video.videoWidth, video.videoHeight])\n    video.onerror = () => reject(new Error('Could not get video size'))\n    video.src = src\n  })\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const LETTER_SPACING = '-0.03em'\nexport const LINE_HEIGHT = 1\nexport const GRID_SIZE = 8\nexport const SVG_EXPORT_PADDING = 16\nexport const BINDING_DISTANCE = 16\nexport const CLONING_DISTANCE = 32\nexport const FIT_TO_SCREEN_PADDING = 128\nexport const SNAP_DISTANCE = 5\nexport const EMPTY_ARRAY = [] as any[]\nexport const SLOW_SPEED = 10\nexport const VERY_SLOW_SPEED = 2.5\nexport const GHOSTED_OPACITY = 0.3\nexport const DEAD_ZONE = 3\nexport const LABEL_POINT = [0.5, 0.5]\nimport type { Easing } from '~types'\n\nexport const PI2 = Math.PI * 2\n\nexport const EASINGS: Record<Easing, (t: number) => number> = {\n  linear: (t) => t,\n  easeInQuad: (t) => t * t,\n  easeOutQuad: (t) => t * (2 - t),\n  easeInOutQuad: (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n  easeInCubic: (t) => t * t * t,\n  easeOutCubic: (t) => --t * t * t + 1,\n  easeInOutCubic: (t) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n  easeInQuart: (t) => t * t * t * t,\n  easeOutQuart: (t) => 1 - --t * t * t * t,\n  easeInOutQuart: (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),\n  easeInQuint: (t) => t * t * t * t * t,\n  easeOutQuint: (t) => 1 + --t * t * t * t * t,\n  easeInOutQuint: (t) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),\n  easeInSine: (t) => 1 - Math.cos((t * Math.PI) / 2),\n  easeOutSine: (t) => Math.sin((t * Math.PI) / 2),\n  easeInOutSine: (t) => -(Math.cos(Math.PI * t) - 1) / 2,\n  easeInExpo: (t) => (t <= 0 ? 0 : Math.pow(2, 10 * t - 10)),\n  easeOutExpo: (t) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n  easeInOutExpo: (t) =>\n    t <= 0\n      ? 0\n      : t >= 1\n      ? 1\n      : t < 0.5\n      ? Math.pow(2, 20 * t - 10) / 2\n      : (2 - Math.pow(2, -20 * t + 10)) / 2,\n}\n\nexport const EASING_STRINGS: Record<Easing, string> = {\n  linear: `(t) => t`,\n  easeInQuad: `(t) => t * t`,\n  easeOutQuad: `(t) => t * (2 - t)`,\n  easeInOutQuad: `(t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t)`,\n  easeInCubic: `(t) => t * t * t`,\n  easeOutCubic: `(t) => --t * t * t + 1`,\n  easeInOutCubic: `(t) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1`,\n  easeInQuart: `(t) => t * t * t * t`,\n  easeOutQuart: `(t) => 1 - --t * t * t * t`,\n  easeInOutQuart: `(t) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t`,\n  easeInQuint: `(t) => t * t * t * t * t`,\n  easeOutQuint: `(t) => 1 + --t * t * t * t * t`,\n  easeInOutQuint: `(t) => t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t`,\n  easeInSine: `(t) => 1 - Math.cos((t * Math.PI) / 2)`,\n  easeOutSine: `(t) => Math.sin((t * Math.PI) / 2)`,\n  easeInOutSine: `(t) => -(Math.cos(Math.PI * t) - 1) / 2`,\n  easeInExpo: `(t) => (t <= 0 ? 0 : Math.pow(2, 10 * t - 10))`,\n  easeOutExpo: `(t) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t))`,\n  easeInOutExpo: `(t) => t <= 0 ? 0 : t >= 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2`,\n}\n\nexport const USER_COLORS = [\n  '#EC5E41',\n  '#F2555A',\n  '#F04F88',\n  '#E34BA9',\n  '#BD54C6',\n  '#9D5BD2',\n  '#7B66DC',\n  '#02B1CC',\n  '#11B3A3',\n  '#39B178',\n  '#55B467',\n  '#FF802B',\n]\n\nexport const isSafari =\n  typeof Window === 'undefined' ? false : /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n\nexport const IMAGE_EXTENSIONS = ['.png', '.svg', '.jpg', '.jpeg', '.gif']\n\nexport const VIDEO_EXTENSIONS = isSafari ? [] : ['.mp4', '.webm']\n", "export * from './migrate'\nexport * from './filesystem'\nexport * from './browser-fs-access'\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { TLBounds, TLTransformInfo, Utils, TLPageState } from '@tldraw/core'\nimport {\n  TDSnapshot,\n  ShapesWithProp,\n  TDShape,\n  TDBinding,\n  TDPage,\n  TldrawCommand,\n  TldrawPatch,\n  TDShapeType,\n  ArrowShape,\n  TDHandle,\n  TDExportType,\n} from '~types'\nimport { Vec } from '@tldraw/vec'\nimport type { TDShapeUtil } from './shapes/TDShapeUtil'\nimport { getShapeUtil } from './shapes'\nimport { deepCopy } from './StateManager/copy'\nimport { intersectRayBounds, intersectRayEllipse, intersectRayLineSegment } from '@tldraw/intersect'\nimport { getTrianglePoints } from './shapes/TriangleUtil/triangleHelpers'\nimport { BINDING_DISTANCE } from '~constants'\n\nconst isDev = process.env.NODE_ENV === 'development'\nexport class TLDR {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  static getShapeUtil<T extends TDShape>(type: T['type']): TDShapeUtil<T>\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  static getShapeUtil<T extends TDShape>(shape: T): TDShapeUtil<T>\n  static getShapeUtil<T extends TDShape>(shape: T | T['type']) {\n    return getShapeUtil<T>(shape)\n  }\n\n  static getSelectedShapes(data: TDSnapshot, pageId: string) {\n    const page = TLDR.getPage(data, pageId)\n    const selectedIds = TLDR.getSelectedIds(data, pageId)\n    return selectedIds.map((id) => page.shapes[id])\n  }\n\n  static screenToWorld(data: TDSnapshot, point: number[]) {\n    const camera = TLDR.getPageState(data, data.appState.currentPageId).camera\n    return Vec.sub(Vec.div(point, camera.zoom), camera.point)\n  }\n\n  static getCameraZoom(zoom: number) {\n    return Utils.clamp(zoom, 0.1, 5)\n  }\n\n  static getPage(data: TDSnapshot, pageId: string): TDPage {\n    return data.document.pages[pageId]\n  }\n\n  static getPageState(data: TDSnapshot, pageId: string): TLPageState {\n    return data.document.pageStates[pageId]\n  }\n\n  static getSelectedIds(data: TDSnapshot, pageId: string): string[] {\n    return TLDR.getPageState(data, pageId).selectedIds\n  }\n\n  static getShapes(data: TDSnapshot, pageId: string): TDShape[] {\n    return Object.values(TLDR.getPage(data, pageId).shapes)\n  }\n\n  static getCamera(data: TDSnapshot, pageId: string): TLPageState['camera'] {\n    return TLDR.getPageState(data, pageId).camera\n  }\n\n  static getShape<T extends TDShape = TDShape>(\n    data: TDSnapshot,\n    shapeId: string,\n    pageId: string\n  ): T {\n    return TLDR.getPage(data, pageId).shapes[shapeId] as T\n  }\n\n  static getCenter<T extends TDShape>(shape: T) {\n    return TLDR.getShapeUtil(shape).getCenter(shape)\n  }\n\n  static getBounds<T extends TDShape>(shape: T) {\n    return TLDR.getShapeUtil(shape).getBounds(shape)\n  }\n\n  static getRotatedBounds<T extends TDShape>(shape: T) {\n    return TLDR.getShapeUtil(shape).getRotatedBounds(shape)\n  }\n\n  static getSelectedBounds(data: TDSnapshot): TLBounds {\n    return Utils.getCommonBounds(\n      TLDR.getSelectedShapes(data, data.appState.currentPageId).map((shape) =>\n        TLDR.getShapeUtil(shape).getBounds(shape)\n      )\n    )\n  }\n\n  static getParentId(data: TDSnapshot, id: string, pageId: string) {\n    return TLDR.getShape(data, id, pageId).parentId\n  }\n\n  // static getPointedId(data: TDSnapshot, id: string, pageId: string): string {\n  //   const page = TLDR.getPage(data, pageId)\n  //   const pageState = TLDR.getPageState(data, data.appState.currentPageId)\n  //   const shape = TLDR.getShape(data, id, pageId)\n  //   if (!shape) return id\n\n  //   return shape.parentId === pageState.currentParentId || shape.parentId === page.id\n  //     ? id\n  //     : TLDR.getPointedId(data, shape.parentId, pageId)\n  // }\n\n  // static getDrilledPointedId(data: TDSnapshot, id: string, pageId: string): string {\n  //   const shape = TLDR.getShape(data, id, pageId)\n  //   const { currentPageId } = data.appState\n  //   const { currentParentId, pointedId } = TLDR.getPageState(data, data.appState.currentPageId)\n\n  //   return shape.parentId === currentPageId ||\n  //     shape.parentId === pointedId ||\n  //     shape.parentId === currentParentId\n  //     ? id\n  //     : TLDR.getDrilledPointedId(data, shape.parentId, pageId)\n  // }\n\n  // static getTopParentId(data: TDSnapshot, id: string, pageId: string): string {\n  //   const page = TLDR.getPage(data, pageId)\n  //   const pageState = TLDR.getPageState(data, pageId)\n  //   const shape = TLDR.getShape(data, id, pageId)\n\n  //   if (shape.parentId === shape.id) {\n  //     throw Error(`Shape has the same id as its parent! ${shape.id}`)\n  //   }\n\n  //   return shape.parentId === page.id || shape.parentId === pageState.currentParentId\n  //     ? id\n  //     : TLDR.getTopParentId(data, shape.parentId, pageId)\n  // }\n\n  // Get an array of a shape id and its descendant shapes' ids\n  static getDocumentBranch(data: TDSnapshot, id: string, pageId: string): string[] {\n    const shape = TLDR.getShape(data, id, pageId)\n\n    if (shape.children === undefined) return [id]\n\n    return [\n      id,\n      ...shape.children.flatMap((childId) => TLDR.getDocumentBranch(data, childId, pageId)),\n    ]\n  }\n\n  // Get a deep array of unproxied shapes and their descendants\n  static getSelectedBranchSnapshot<K>(\n    data: TDSnapshot,\n    pageId: string,\n    fn: (shape: TDShape) => K\n  ): ({ id: string } & K)[]\n  static getSelectedBranchSnapshot(data: TDSnapshot, pageId: string): TDShape[]\n  static getSelectedBranchSnapshot<K>(\n    data: TDSnapshot,\n    pageId: string,\n    fn?: (shape: TDShape) => K\n  ): (TDShape | K)[] {\n    const page = TLDR.getPage(data, pageId)\n\n    const copies = TLDR.getSelectedIds(data, pageId)\n      .flatMap((id) => TLDR.getDocumentBranch(data, id, pageId).map((id) => page.shapes[id]))\n      .filter((shape) => !shape.isLocked)\n      .map(Utils.deepClone)\n\n    if (fn !== undefined) {\n      return copies.map((shape) => ({ id: shape.id, ...fn(shape) }))\n    }\n\n    return copies\n  }\n\n  // Get a shallow array of unproxied shapes\n  static getSelectedShapeSnapshot(data: TDSnapshot, pageId: string): TDShape[]\n  static getSelectedShapeSnapshot<K>(\n    data: TDSnapshot,\n    pageId: string,\n    fn?: (shape: TDShape) => K\n  ): ({ id: string } & K)[]\n  static getSelectedShapeSnapshot<K>(\n    data: TDSnapshot,\n    pageId: string,\n    fn?: (shape: TDShape) => K\n  ): (TDShape | K)[] {\n    const copies = TLDR.getSelectedShapes(data, pageId)\n      .filter((shape) => !shape.isLocked)\n      .map(Utils.deepClone)\n\n    if (fn !== undefined) {\n      return copies.map((shape) => ({ id: shape.id, ...fn(shape) }))\n    }\n\n    return copies\n  }\n\n  // For a given array of shape ids, an array of all other shapes that may be affected by a mutation to it.\n  // Use this to decide which shapes to clone as before / after for a command.\n  static getAllEffectedShapeIds(data: TDSnapshot, ids: string[], pageId: string): string[] {\n    const page = TLDR.getPage(data, pageId)\n\n    const visited = new Set(ids)\n\n    ids.forEach((id) => {\n      const shape = page.shapes[id]\n\n      // Add descendant shapes\n      function collectDescendants(shape: TDShape): void {\n        if (shape.children === undefined) return\n        shape.children\n          .filter((childId) => !visited.has(childId))\n          .forEach((childId) => {\n            visited.add(childId)\n            collectDescendants(page.shapes[childId])\n          })\n      }\n\n      collectDescendants(shape)\n\n      // Add asecendant shapes\n      function collectAscendants(shape: TDShape): void {\n        const parentId = shape.parentId\n        if (parentId === page.id) return\n        if (visited.has(parentId)) return\n        visited.add(parentId)\n        collectAscendants(page.shapes[parentId])\n      }\n\n      collectAscendants(shape)\n\n      // Add bindings that are to or from any of the visited shapes (this does not have to be recursive)\n      visited.forEach((id) => {\n        Object.values(page.bindings)\n          .filter((binding) => binding.fromId === id || binding.toId === id)\n          .forEach((binding) => visited.add(binding.fromId === id ? binding.toId : binding.fromId))\n      })\n    })\n\n    // Return the unique array of visited shapes\n    return Array.from(visited.values())\n  }\n\n  static getLinkedShapeIds(\n    data: TDSnapshot,\n    pageId: string,\n    direction: 'center' | 'left' | 'right',\n    includeArrows = true\n  ) {\n    const selectedIds = TLDR.getSelectedIds(data, pageId)\n\n    const page = TLDR.getPage(data, pageId)\n\n    const linkedIds = new Set<string>(selectedIds)\n\n    const checkedIds = new Set<string>()\n\n    const idsToCheck = [...selectedIds]\n\n    const arrows = new Set(\n      Object.values(page.shapes).filter((shape) => {\n        return (\n          shape.type === TDShapeType.Arrow &&\n          (shape.handles.start.bindingId || shape.handles?.end.bindingId)\n        )\n      }) as ArrowShape[]\n    )\n\n    while (idsToCheck.length) {\n      const id = idsToCheck.pop()\n\n      if (!(id && arrows.size)) break\n\n      if (checkedIds.has(id)) continue\n\n      checkedIds.add(id)\n\n      arrows.forEach((arrow) => {\n        const {\n          handles: {\n            start: { bindingId: startBindingId },\n            end: { bindingId: endBindingId },\n          },\n        } = arrow\n\n        const startBinding = startBindingId ? page.bindings[startBindingId] : null\n        const endBinding = endBindingId ? page.bindings[endBindingId] : null\n\n        let hit = false\n\n        if (startBinding && startBinding.toId === id) {\n          if (direction === 'center') {\n            hit = true\n          } else if (arrow.decorations?.start && endBinding) {\n            // The arrow is pointing to this shape at its start\n            hit = direction === 'left'\n          } else {\n            // The arrow is pointing away from this shape\n            hit = direction === 'right'\n          }\n\n          if (hit) {\n            // This arrow is bound to this shape\n            if (includeArrows) linkedIds.add(arrow.id)\n            linkedIds.add(id)\n\n            if (endBinding) {\n              linkedIds.add(endBinding.toId)\n              idsToCheck.push(endBinding.toId)\n            }\n          }\n        } else if (endBinding && endBinding.toId === id) {\n          // This arrow is bound to this shape at its end\n          if (direction === 'center') {\n            hit = true\n          } else if (arrow.decorations?.end && startBinding) {\n            // The arrow is pointing to this shape\n            hit = direction === 'left'\n          } else {\n            // The arrow is pointing away from this shape\n            hit = direction === 'right'\n          }\n\n          if (hit) {\n            if (includeArrows) linkedIds.add(arrow.id)\n            linkedIds.add(id)\n\n            if (startBinding) {\n              linkedIds.add(startBinding.toId)\n              idsToCheck.push(startBinding.toId)\n            }\n          }\n        }\n\n        if (\n          (!startBinding || linkedIds.has(startBinding.toId)) &&\n          (!endBinding || linkedIds.has(endBinding.toId))\n        ) {\n          arrows.delete(arrow)\n        }\n      })\n    }\n\n    return Array.from(linkedIds.values())\n  }\n\n  static getChildIndexAbove(data: TDSnapshot, id: string, pageId: string): number {\n    const page = data.document.pages[pageId]\n    const shape = page.shapes[id]\n\n    let siblings: TDShape[]\n\n    if (shape.parentId === page.id) {\n      siblings = Object.values(page.shapes)\n        .filter((shape) => shape.parentId === page.id)\n        .sort((a, b) => a.childIndex - b.childIndex)\n    } else {\n      const parent = page.shapes[shape.parentId]\n      if (!parent.children) throw Error('No children in parent!')\n      siblings = parent.children\n        .map((childId) => page.shapes[childId])\n        .sort((a, b) => a.childIndex - b.childIndex)\n    }\n\n    const index = siblings.indexOf(shape)\n\n    const nextSibling = siblings[index + 1]\n\n    if (!nextSibling) return shape.childIndex + 1\n\n    return nextSibling.childIndex\n  }\n\n  /* -------------------------------------------------- */\n  /*                      Mutations                     */\n  /* -------------------------------------------------- */\n\n  static getBeforeShape<T extends TDShape>(shape: T, change: Partial<T>): Partial<T> {\n    return Object.fromEntries(\n      Object.keys(change).map((k) => [k, shape[k as keyof T]])\n    ) as Partial<T>\n  }\n\n  static mutateShapes<T extends TDShape>(\n    data: TDSnapshot,\n    ids: string[],\n    fn: (shape: T, i: number) => Partial<T> | void,\n    pageId: string\n  ): {\n    before: Record<string, Partial<T>>\n    after: Record<string, Partial<T>>\n    data: TDSnapshot\n  } {\n    const beforeShapes: Record<string, Partial<T>> = {}\n    const afterShapes: Record<string, Partial<T>> = {}\n\n    ids.forEach((id, i) => {\n      const shape = TLDR.getShape<T>(data, id, pageId)\n      if (shape.isLocked) return\n\n      const change = fn(shape, i)\n      if (change) {\n        beforeShapes[id] = TLDR.getBeforeShape(shape, change)\n        afterShapes[id] = change\n      }\n    })\n\n    const dataWithMutations = Utils.deepMerge(data, {\n      document: {\n        pages: {\n          [data.appState.currentPageId]: {\n            shapes: afterShapes,\n          },\n        },\n      },\n    })\n\n    return {\n      before: beforeShapes,\n      after: afterShapes,\n      data: dataWithMutations,\n    }\n  }\n\n  static createShapes(data: TDSnapshot, shapes: TDShape[], pageId: string): TldrawCommand {\n    const before: TldrawPatch = {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: {\n              ...Object.fromEntries(\n                shapes.flatMap((shape) => {\n                  const results: [string, Partial<TDShape> | undefined][] = [[shape.id, undefined]]\n\n                  // If the shape is a child of another shape, also save that shape\n                  if (shape.parentId !== pageId) {\n                    const parent = TLDR.getShape(data, shape.parentId, pageId)\n                    if (!parent.children) throw Error('No children in parent!')\n                    results.push([parent.id, { children: parent.children }])\n                  }\n\n                  return results\n                })\n              ),\n            },\n          },\n        },\n      },\n    }\n\n    const after: TldrawPatch = {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: {\n              shapes: {\n                ...Object.fromEntries(\n                  shapes.flatMap((shape) => {\n                    const results: [string, Partial<TDShape> | undefined][] = [[shape.id, shape]]\n\n                    // If the shape is a child of a different shape, update its parent\n                    if (shape.parentId !== pageId) {\n                      const parent = TLDR.getShape(data, shape.parentId, pageId)\n                      if (!parent.children) throw Error('No children in parent!')\n                      results.push([parent.id, { children: [...parent.children, shape.id] }])\n                    }\n\n                    return results\n                  })\n                ),\n              },\n            },\n          },\n        },\n      },\n    }\n\n    return {\n      before,\n      after,\n    }\n  }\n\n  static deleteShapes(\n    data: TDSnapshot,\n    shapes: TDShape[] | string[],\n    pageId?: string\n  ): TldrawCommand {\n    pageId = pageId ? pageId : data.appState.currentPageId\n\n    const page = TLDR.getPage(data, pageId)\n\n    const shapeIds =\n      typeof shapes[0] === 'string'\n        ? (shapes as string[])\n        : (shapes as TDShape[]).map((shape) => shape.id)\n\n    const before: TldrawPatch = {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: {\n              // These are the shapes that we're going to delete\n              ...Object.fromEntries(\n                shapeIds.flatMap((id) => {\n                  const shape = page.shapes[id]\n                  const results: [string, Partial<TDShape> | undefined][] = [[shape.id, shape]]\n\n                  // If the shape is a child of another shape, also add that shape\n                  if (shape.parentId !== pageId) {\n                    const parent = page.shapes[shape.parentId]\n                    if (!parent.children) throw Error('No children in parent!')\n                    results.push([parent.id, { children: parent.children }])\n                  }\n\n                  return results\n                })\n              ),\n            },\n            bindings: {\n              // These are the bindings that we're going to delete\n              ...Object.fromEntries(\n                Object.values(page.bindings)\n                  .filter((binding) => {\n                    return shapeIds.includes(binding.fromId) || shapeIds.includes(binding.toId)\n                  })\n                  .map((binding) => {\n                    return [binding.id, binding]\n                  })\n              ),\n            },\n          },\n        },\n      },\n    }\n\n    const after: TldrawPatch = {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: {\n              ...Object.fromEntries(\n                shapeIds.flatMap((id) => {\n                  const shape = page.shapes[id]\n                  const results: [string, Partial<TDShape> | undefined][] = [[shape.id, undefined]]\n\n                  // If the shape is a child of a different shape, update its parent\n                  if (shape.parentId !== page.id) {\n                    const parent = page.shapes[shape.parentId]\n\n                    if (!parent.children) throw Error('No children in parent!')\n\n                    results.push([\n                      parent.id,\n                      { children: parent.children.filter((id) => id !== shape.id) },\n                    ])\n                  }\n\n                  return results\n                })\n              ),\n            },\n          },\n        },\n      },\n    }\n\n    return {\n      before,\n      after,\n    }\n  }\n\n  static onSessionComplete<T extends TDShape>(shape: T) {\n    const delta = TLDR.getShapeUtil(shape).onSessionComplete?.(shape)\n    if (!delta) return shape\n    return { ...shape, ...delta }\n  }\n\n  static onChildrenChange<T extends TDShape>(data: TDSnapshot, shape: T, pageId: string) {\n    if (!shape.children) return\n\n    const delta = TLDR.getShapeUtil(shape).onChildrenChange?.(\n      shape,\n      shape.children.map((id) => TLDR.getShape(data, id, pageId))\n    )\n\n    if (!delta) return shape\n\n    return { ...shape, ...delta }\n  }\n\n  static updateArrowBindings(page: TDPage, arrowShape: ArrowShape) {\n    const result = {\n      start: deepCopy(arrowShape.handles.start),\n      end: deepCopy(arrowShape.handles.end),\n    }\n    type HandleInfo = {\n      handle: TDHandle\n      point: number[] // in page space\n    } & (\n      | {\n          isBound: false\n        }\n      | {\n          isBound: true\n          hasDecoration: boolean\n          binding: TDBinding\n          util: TDShapeUtil<TDShape, any>\n          target: TDShape\n          bounds: TLBounds\n          expandedBounds: TLBounds\n          intersectBounds: TLBounds\n          center: number[]\n        }\n    )\n    let start: HandleInfo = {\n      isBound: false,\n      handle: arrowShape.handles.start,\n      point: Vec.add(arrowShape.handles.start.point, arrowShape.point),\n    }\n    let end: HandleInfo = {\n      isBound: false,\n      handle: arrowShape.handles.end,\n      point: Vec.add(arrowShape.handles.end.point, arrowShape.point),\n    }\n    if (arrowShape.handles.start.bindingId) {\n      const hasDecoration = arrowShape.decorations?.start !== undefined\n      const handle = arrowShape.handles.start\n      const binding = page.bindings[arrowShape.handles.start.bindingId]\n      if (!binding) throw Error(\"Could not find a binding to match the start handle's bindingId\")\n      const target = page.shapes[binding.toId]\n      const util = TLDR.getShapeUtil(target)\n      const bounds = util.getBounds(target)\n      const expandedBounds = util.getExpandedBounds(target)\n      const intersectBounds = hasDecoration ? Utils.expandBounds(bounds, binding.distance) : bounds\n      const { minX, minY, width, height } = expandedBounds\n      const anchorPoint = Vec.add(\n        [minX, minY],\n        Vec.mulV([width, height], Vec.rotWith(binding.point, [0.5, 0.5], target.rotation || 0))\n      )\n      start = {\n        isBound: true,\n        hasDecoration,\n        binding,\n        handle,\n        point: anchorPoint,\n        util,\n        target,\n        bounds,\n        expandedBounds,\n        intersectBounds,\n        center: util.getCenter(target),\n      }\n    }\n    if (arrowShape.handles.end.bindingId) {\n      const hasDecoration = arrowShape.decorations?.end !== undefined\n      const handle = arrowShape.handles.end\n      const binding = page.bindings[arrowShape.handles.end.bindingId]\n      if (!binding) throw Error(\"Could not find a binding to match the end handle's bindingId\")\n      const target = page.shapes[binding.toId]\n      const util = TLDR.getShapeUtil(target)\n      const bounds = util.getBounds(target)\n      const expandedBounds = util.getExpandedBounds(target)\n      const intersectBounds = hasDecoration ? Utils.expandBounds(bounds, binding.distance) : bounds\n      const { minX, minY, width, height } = expandedBounds\n      const anchorPoint = Vec.add(\n        [minX, minY],\n        Vec.mulV([width, height], Vec.rotWith(binding.point, [0.5, 0.5], target.rotation || 0))\n      )\n      end = {\n        isBound: true,\n        hasDecoration,\n        binding,\n        handle,\n        point: anchorPoint,\n        util,\n        target,\n        bounds,\n        expandedBounds,\n        intersectBounds,\n        center: util.getCenter(target),\n      }\n    }\n\n    for (const ID of ['end', 'start'] as const) {\n      const A = ID === 'start' ? start : end\n      const B = ID === 'start' ? end : start\n      if (A.isBound) {\n        if (!A.binding.distance) {\n          // If the binding distance is zero, then the arrow is bound to a specific point\n          // in the target shape. The resulting handle should be exactly at that point.\n          result[ID].point = Vec.sub(A.point, arrowShape.point)\n        } else {\n          // We'll need to figure out the handle's true point based on some intersections\n          // between the opposite handle point and this handle point. This is different\n          // for each type of shape.\n          const direction = Vec.uni(Vec.sub(A.point, B.point))\n          switch (A.target.type) {\n            case TDShapeType.Ellipse: {\n              const hits = intersectRayEllipse(\n                B.point,\n                direction,\n                A.center,\n                A.target.radius[0] + (A.hasDecoration ? A.binding.distance : 0),\n                A.target.radius[1] + (A.hasDecoration ? A.binding.distance : 0),\n                A.target.rotation || 0\n              ).points.sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n              if (hits[0] !== undefined) {\n                result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n              }\n              break\n            }\n            case TDShapeType.Triangle: {\n              const targetPoint = A.target.point\n              const points = getTrianglePoints(\n                A.target.size,\n                A.hasDecoration ? BINDING_DISTANCE : 0,\n                A.target.rotation\n              ).map((pt) => Vec.add(pt, targetPoint))\n              const hits = Utils.pointsToLineSegments(points, true)\n                .map(([p0, p1]) => intersectRayLineSegment(B.point, direction, p0, p1))\n                .filter((intersection) => intersection.didIntersect)\n                .flatMap((intersection) => intersection.points)\n                .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n              if (hits[0] !== undefined) {\n                result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n              }\n              break\n            }\n            default: {\n              const hits = intersectRayBounds(\n                B.point,\n                direction,\n                A.intersectBounds,\n                A.target.rotation\n              )\n                .filter((int) => int.didIntersect)\n                .map((int) => int.points[0])\n                .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n              if (!hits[0]) continue\n              let bHit: number[] | undefined = undefined\n              if (B.isBound) {\n                const bHits = intersectRayBounds(\n                  B.point,\n                  direction,\n                  B.intersectBounds,\n                  B.target.rotation\n                )\n                  .filter((int) => int.didIntersect)\n                  .map((int) => int.points[0])\n                  .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n                bHit = bHits[0]\n              }\n              if (\n                B.isBound &&\n                (hits.length < 2 ||\n                  (bHit &&\n                    hits[0] &&\n                    Math.ceil(Vec.dist(hits[0], bHit)) < BINDING_DISTANCE * 2.5) ||\n                  Utils.boundsContain(A.expandedBounds, B.expandedBounds) ||\n                  Utils.boundsCollide(A.expandedBounds, B.expandedBounds))\n              ) {\n                // If the other handle is bound, and if we need to fallback to the short arrow method...\n                const shortArrowDirection = Vec.uni(Vec.sub(B.point, A.point))\n                const shortArrowHits = intersectRayBounds(\n                  A.point,\n                  shortArrowDirection,\n                  A.bounds,\n                  A.target.rotation\n                )\n                  .filter((int) => int.didIntersect)\n                  .map((int) => int.points[0])\n                if (!shortArrowHits[0]) continue\n                result[ID].point = Vec.toFixed(Vec.sub(shortArrowHits[0], arrowShape.point))\n                result[ID === 'start' ? 'end' : 'start'].point = Vec.toFixed(\n                  Vec.add(\n                    Vec.sub(shortArrowHits[0], arrowShape.point),\n                    Vec.mul(\n                      shortArrowDirection,\n                      Math.min(\n                        Vec.dist(shortArrowHits[0], B.point),\n                        BINDING_DISTANCE *\n                          2.5 *\n                          (Utils.boundsContain(B.bounds, A.intersectBounds) ? -1 : 1)\n                      )\n                    )\n                  )\n                )\n              } else if (\n                !B.isBound &&\n                ((hits[0] && Vec.dist(hits[0], B.point) < BINDING_DISTANCE * 2.5) ||\n                  Utils.pointInBounds(B.point, A.intersectBounds))\n              ) {\n                // Short arrow time!\n                const shortArrowDirection = Vec.uni(Vec.sub(A.center, B.point))\n                return TLDR.getShapeUtil<ArrowShape>(arrowShape).onHandleChange?.(arrowShape, {\n                  [ID]: {\n                    ...arrowShape.handles[ID],\n                    point: Vec.toFixed(\n                      Vec.add(\n                        Vec.sub(B.point, arrowShape.point),\n                        Vec.mul(shortArrowDirection, BINDING_DISTANCE * 2.5)\n                      )\n                    ),\n                  },\n                })\n              } else if (hits[0]) {\n                result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return TLDR.getShapeUtil<ArrowShape>(arrowShape).onHandleChange?.(arrowShape, result)\n  }\n\n  static transform<T extends TDShape>(shape: T, bounds: TLBounds, info: TLTransformInfo<T>) {\n    const delta = TLDR.getShapeUtil(shape).transform(shape, bounds, info)\n    if (!delta) return shape\n    return { ...shape, ...delta }\n  }\n\n  static transformSingle<T extends TDShape>(shape: T, bounds: TLBounds, info: TLTransformInfo<T>) {\n    const delta = TLDR.getShapeUtil(shape).transformSingle(shape, bounds, info)\n    if (!delta) return shape\n    return { ...shape, ...delta }\n  }\n\n  /**\n   * Rotate a shape around an origin point.\n   * @param shape a shape.\n   * @param center the shape's center in page space.\n   * @param origin the page point to rotate around.\n   * @param rotation the amount to rotate the shape.\n   */\n  static getRotatedShapeMutation<T extends TDShape>(\n    shape: T, // in page space\n    center: number[], // in page space\n    origin: number[], // in page space (probably the center of common bounds)\n    delta: number // The shape's rotation delta\n  ): Partial<T> | void {\n    // The shape's center relative to the shape's point\n    const relativeCenter = Vec.sub(center, shape.point)\n\n    // Rotate the center around the origin\n    const rotatedCenter = Vec.rotWith(center, origin, delta)\n\n    // Get the top left point relative to the rotated center\n    const nextPoint = Vec.toFixed(Vec.sub(rotatedCenter, relativeCenter))\n\n    // If the shape has handles, we need to rotate the handles instead\n    // of rotating the shape. Shapes with handles should never be rotated,\n    // because that makes a lot of other things incredible difficult.\n    if (shape.handles !== undefined) {\n      const change = this.getShapeUtil(shape).onHandleChange?.(\n        // Base the change on a shape with the next point\n        { ...shape, point: nextPoint },\n        Object.fromEntries(\n          Object.entries(shape.handles).map(([handleId, handle]) => {\n            // Rotate each handle's point around the shape's center\n            // (in relative shape space, as the handle's point will be).\n            const point = Vec.toFixed(Vec.rotWith(handle.point, relativeCenter, delta))\n            return [handleId, { ...handle, point }]\n          })\n        ) as T['handles']\n      )\n\n      return change\n    }\n\n    // If the shape has no handles, move the shape to the new point\n    // and set the rotation.\n\n    // Clamp the next rotation between 0 and PI2\n    const nextRotation = Utils.clampRadians((shape.rotation || 0) + delta)\n\n    return {\n      point: nextPoint,\n      rotation: nextRotation,\n    } as Partial<T>\n  }\n\n  /* -------------------------------------------------- */\n  /*                       Parents                      */\n  /* -------------------------------------------------- */\n\n  static updateParents(data: TDSnapshot, pageId: string, changedShapeIds: string[]): void {\n    const page = TLDR.getPage(data, pageId)\n\n    if (changedShapeIds.length === 0) return\n\n    const { shapes } = TLDR.getPage(data, pageId)\n\n    const parentToUpdateIds = Array.from(\n      new Set(changedShapeIds.map((id) => shapes[id].parentId).values())\n    ).filter((id) => id !== page.id)\n\n    for (const parentId of parentToUpdateIds) {\n      const parent = shapes[parentId]\n\n      if (!parent.children) {\n        throw Error('A shape is parented to a shape without a children array.')\n      }\n\n      TLDR.onChildrenChange(data, parent, pageId)\n    }\n\n    TLDR.updateParents(data, pageId, parentToUpdateIds)\n  }\n\n  /* -------------------------------------------------- */\n  /*                      Bindings                      */\n  /* -------------------------------------------------- */\n\n  static getBinding(data: TDSnapshot, id: string, pageId: string): TDBinding {\n    return TLDR.getPage(data, pageId).bindings[id]\n  }\n\n  static getBindings(data: TDSnapshot, pageId: string): TDBinding[] {\n    const page = TLDR.getPage(data, pageId)\n    return Object.values(page.bindings)\n  }\n\n  static getBindableShapeIds(data: TDSnapshot) {\n    return TLDR.getShapes(data, data.appState.currentPageId)\n      .filter((shape) => TLDR.getShapeUtil(shape).canBind)\n      .sort((a, b) => b.childIndex - a.childIndex)\n      .map((shape) => shape.id)\n  }\n\n  static getBindingsWithShapeIds(data: TDSnapshot, ids: string[], pageId: string): TDBinding[] {\n    return Array.from(\n      new Set(\n        TLDR.getBindings(data, pageId).filter((binding) => {\n          return ids.includes(binding.toId) || ids.includes(binding.fromId)\n        })\n      ).values()\n    )\n  }\n\n  static getRelatedBindings(data: TDSnapshot, ids: string[], pageId: string): TDBinding[] {\n    const changedShapeIds = new Set(ids)\n\n    const page = TLDR.getPage(data, pageId)\n\n    // Find all bindings that we need to update\n    const bindingsArr = Object.values(page.bindings)\n\n    // Start with bindings that are directly bound to our changed shapes\n    const bindingsToUpdate = new Set(\n      bindingsArr.filter(\n        (binding) => changedShapeIds.has(binding.toId) || changedShapeIds.has(binding.fromId)\n      )\n    )\n\n    // Next, look for other bindings that effect the same shapes\n    let prevSize = bindingsToUpdate.size\n    let delta = -1\n\n    while (delta !== 0) {\n      bindingsToUpdate.forEach((binding) => {\n        const fromId = binding.fromId\n\n        for (const otherBinding of bindingsArr) {\n          if (otherBinding.fromId === fromId) {\n            bindingsToUpdate.add(otherBinding)\n          }\n\n          if (otherBinding.toId === fromId) {\n            bindingsToUpdate.add(otherBinding)\n          }\n        }\n      })\n\n      // Continue until we stop finding new bindings to update\n      delta = bindingsToUpdate.size - prevSize\n\n      prevSize = bindingsToUpdate.size\n    }\n\n    return Array.from(bindingsToUpdate.values())\n  }\n\n  static copyStringToClipboard = (string: string) => {\n    try {\n      if (navigator.clipboard) {\n        navigator.clipboard.write([\n          new ClipboardItem({\n            'text/plain': new Blob([string], { type: 'text/plain' }),\n          }),\n        ])\n      }\n    } catch (e) {\n      const textarea = document.createElement('textarea')\n      textarea.setAttribute('position', 'fixed')\n      textarea.setAttribute('top', '0')\n      textarea.setAttribute('readonly', 'true')\n      textarea.setAttribute('contenteditable', 'true')\n      textarea.style.position = 'fixed'\n      textarea.value = string\n      document.body.appendChild(textarea)\n      textarea.focus()\n      textarea.select()\n\n      try {\n        const range = document.createRange()\n        range.selectNodeContents(textarea)\n        const sel = window.getSelection()\n        if (sel) {\n          sel.removeAllRanges()\n          sel.addRange(range)\n          textarea.setSelectionRange(0, textarea.value.length)\n        }\n        document.execCommand('copy')\n      } catch (err) {\n        null // Could not copy to clipboard\n      } finally {\n        document.body.removeChild(textarea)\n      }\n    }\n  }\n\n  /* -------------------------------------------------- */\n  /*                       Groups                       */\n  /* -------------------------------------------------- */\n\n  static flattenShape = (data: TDSnapshot, shape: TDShape): TDShape[] => {\n    return [\n      shape,\n      ...(shape.children ?? [])\n        .map((childId) => TLDR.getShape(data, childId, data.appState.currentPageId))\n        .sort((a, b) => a.childIndex - b.childIndex)\n        .flatMap((shape) => TLDR.flattenShape(data, shape)),\n    ]\n  }\n\n  static flattenPage = (data: TDSnapshot, pageId: string): TDShape[] => {\n    return Object.values(data.document.pages[pageId].shapes)\n      .sort((a, b) => a.childIndex - b.childIndex)\n      .reduce<TDShape[]>((acc, shape) => [...acc, ...TLDR.flattenShape(data, shape)], [])\n  }\n\n  static getTopChildIndex = (data: TDSnapshot, pageId: string): number => {\n    const shapes = TLDR.getShapes(data, pageId)\n    return shapes.length === 0\n      ? 1\n      : shapes\n          .filter((shape) => shape.parentId === pageId)\n          .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n  }\n\n  /* -------------------------------------------------- */\n  /*                        Text                        */\n  /* -------------------------------------------------- */\n\n  static fixNewLines = /\\r?\\n|\\r/g\n\n  static normalizeText(text: string) {\n    return text\n      .replace(TLDR.fixNewLines, '\\n')\n      .split('\\n')\n      .map((x) => x || ' ')\n      .join('\\n')\n  }\n\n  /* -------------------------------------------------- */\n  /*                     Assertions                     */\n  /* -------------------------------------------------- */\n\n  static assertShapeHasProperty<P extends keyof TDShape>(\n    shape: TDShape,\n    prop: P\n  ): asserts shape is ShapesWithProp<P> {\n    if (shape[prop] === undefined) {\n      throw new Error()\n    }\n  }\n\n  static warn(e: any) {\n    if (isDev) {\n      console.warn(e)\n    }\n  }\n  static error(e: any) {\n    if (isDev) {\n      console.error(e)\n    }\n  }\n\n  /* -------------------------------------------------- */\n  /*                       Export                       */\n  /* -------------------------------------------------- */\n\n  static getSvgString(svg: SVGElement, scale = 1) {\n    const clone = svg.cloneNode(true) as SVGGraphicsElement\n\n    svg.setAttribute('width', +svg.getAttribute('width')! * scale + '')\n    svg.setAttribute('height', +svg.getAttribute('height')! * scale + '')\n\n    return new XMLSerializer()\n      .serializeToString(clone)\n      .replaceAll('&#10;      ', '')\n      .replaceAll(/((\\s|\")[0-9]*\\.[0-9]{2})([0-9]*)(\\b|\"|\\))/g, '$1')\n  }\n\n  static getSvgAsDataUrl(svg: SVGElement, scale = 1) {\n    const svgString = TLDR.getSvgString(svg, scale)\n\n    const base64SVG = window.btoa(unescape(svgString))\n\n    return `data:image/svg+xml;base64,${base64SVG}`\n  }\n\n  static async getImageForSvg(\n    svg: SVGElement,\n    type: Exclude<TDExportType, TDExportType.JSON> = TDExportType.PNG,\n    opts = {} as Partial<{\n      scale: number\n      quality: number\n    }>\n  ) {\n    const { scale = 2, quality = 1 } = opts\n\n    const svgString = TLDR.getSvgString(svg, scale)\n\n    const width = +svg.getAttribute('width')!\n    const height = +svg.getAttribute('height')!\n\n    if (!svgString) return\n\n    const canvas = await new Promise<HTMLCanvasElement>((resolve) => {\n      const image = new Image()\n\n      image.crossOrigin = 'anonymous'\n\n      const base64SVG = window.btoa(unescape(encodeURIComponent(svgString)))\n\n      const dataUrl = `data:image/svg+xml;base64,${base64SVG}`\n\n      image.onload = () => {\n        const canvas = document.createElement('canvas') as HTMLCanvasElement\n        const context = canvas.getContext('2d')!\n\n        canvas.width = width\n        canvas.height = height\n\n        context.drawImage(image, 0, 0, width, height)\n\n        URL.revokeObjectURL(dataUrl)\n\n        resolve(canvas)\n      }\n\n      image.onerror = () => {\n        console.warn('Could not convert that SVG to an image.')\n      }\n\n      image.src = dataUrl\n    })\n\n    const blob = await new Promise<Blob>((resolve) =>\n      canvas.toBlob((blob) => resolve(blob!), 'image/' + type, quality)\n    )\n\n    return blob\n  }\n}\n", "import * as React from 'react'\nimport { Utils, SVGContainer } from '@tldraw/core'\nimport { RectangleShape, DashStyle, TDShapeType, TDMeta } from '~types'\nimport { GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  defaultStyle,\n  getShapeStyle,\n  getBoundsRectangle,\n  transformRectangle,\n  getFontStyle,\n  transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { TextLabel } from '../shared/TextLabel'\nimport { getRectangleIndicatorPathTDSnapshot } from './rectangleHelpers'\nimport { DrawRectangle } from './components/DrawRectangle'\nimport { DashedRectangle } from './components/DashedRectangle'\nimport { BindingIndicator } from './components/BindingIndicator'\nimport { styled } from '~styles'\n\ntype T = RectangleShape\ntype E = HTMLDivElement\n\nexport class RectangleUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Rectangle as const\n\n  canBind = true\n\n  canClone = true\n\n  canEdit = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Rectangle,\n        name: 'Rectangle',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [1, 1],\n        rotation: 0,\n        style: defaultStyle,\n        label: '',\n        labelPoint: [0.5, 0.5],\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    (\n      {\n        shape,\n        isEditing,\n        isBinding,\n        isSelected,\n        isGhost,\n        meta,\n        bounds,\n        events,\n        onShapeBlur,\n        onShapeChange,\n      },\n      ref\n    ) => {\n      const { id, size, style, label = '', labelPoint = LABEL_POINT } = shape\n      const font = getFontStyle(style)\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const Component = style.dash === DashStyle.Draw ? DrawRectangle : DashedRectangle\n      const handleLabelChange = React.useCallback(\n        (label: string) => onShapeChange?.({ id, label }),\n        [onShapeChange]\n      )\n      return (\n        <FullWrapper ref={ref} {...events}>\n          <TextLabel\n            isEditing={isEditing}\n            onChange={handleLabelChange}\n            onBlur={onShapeBlur}\n            font={font}\n            text={label}\n            color={styles.stroke}\n            offsetX={(labelPoint[0] - 0.5) * bounds.width}\n            offsetY={(labelPoint[1] - 0.5) * bounds.height}\n          />\n          <SVGContainer id={shape.id + '_svg'} opacity={isGhost ? GHOSTED_OPACITY : 1}>\n            {isBinding && <BindingIndicator strokeWidth={styles.strokeWidth} size={size} />}\n            <Component\n              id={id}\n              style={style}\n              size={size}\n              isSelected={isSelected}\n              isDarkMode={meta.isDarkMode}\n            />\n          </SVGContainer>\n        </FullWrapper>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const { id, style, size } = shape\n\n    const styles = getShapeStyle(style, false)\n    const sw = styles.strokeWidth\n\n    if (style.dash === DashStyle.Draw) {\n      return <path d={getRectangleIndicatorPathTDSnapshot(id, style, size)} />\n    }\n\n    return (\n      <rect\n        x={sw}\n        y={sw}\n        rx={1}\n        ry={1}\n        width={Math.max(1, size[0] - sw * 2)}\n        height={Math.max(1, size[1] - sw * 2)}\n      />\n    )\n  })\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style || next.label !== prev.label\n  }\n\n  transform = transformRectangle\n\n  transformSingle = transformSingleRectangle\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Utils, TLShapeUtil } from '@tldraw/core'\nimport type { TLPointerInfo, TLBounds } from '@tldraw/core'\nimport {\n  intersectLineSegmentBounds,\n  intersectLineSegmentPolyline,\n  intersectRayBounds,\n} from '@tldraw/intersect'\nimport { Vec } from '@tldraw/vec'\nimport type { ShapesWithProp, TDBinding, TDMeta, TDShape, TransformInfo } from '~types'\nimport * as React from 'react'\nimport { BINDING_DISTANCE } from '~constants'\nimport { getTextSvgElement } from './shared/getTextSvgElement'\nimport { getTextLabelSize } from './shared/getTextSize'\nimport { getFontStyle, getShapeStyle } from './shared'\n\nexport abstract class TDShapeUtil<T extends TDShape, E extends Element = any> extends TLShapeUtil<\n  T,\n  E,\n  TDMeta\n> {\n  abstract type: T['type']\n\n  canBind = false\n\n  canEdit = false\n\n  canClone = false\n\n  isAspectRatioLocked = false\n\n  hideResizeHandles = false\n\n  bindingDistance = BINDING_DISTANCE\n\n  abstract getShape: (props: Partial<T>) => T\n\n  hitTestPoint = (shape: T, point: number[]): boolean => {\n    return Utils.pointInBounds(point, this.getRotatedBounds(shape))\n  }\n\n  hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n    const box = Utils.getBoundsFromPoints([A, B])\n    const bounds = this.getBounds(shape)\n\n    return Utils.boundsContain(bounds, box) || shape.rotation\n      ? intersectLineSegmentPolyline(A, B, Utils.getRotatedCorners(this.getBounds(shape)))\n          .didIntersect\n      : intersectLineSegmentBounds(A, B, this.getBounds(shape)).length > 0\n  }\n\n  create = (props: { id: string } & Partial<T>) => {\n    this.refMap.set(props.id, React.createRef())\n    return this.getShape(props)\n  }\n\n  getCenter = (shape: T) => {\n    return Utils.getBoundsCenter(this.getBounds(shape))\n  }\n\n  getExpandedBounds = (shape: T) => {\n    return Utils.expandBounds(this.getBounds(shape), this.bindingDistance)\n  }\n\n  getBindingPoint = <K extends TDShape>(\n    shape: T,\n    fromShape: K,\n    point: number[],\n    origin: number[],\n    direction: number[],\n    bindAnywhere: boolean\n  ) => {\n    // Algorithm time! We need to find the binding point (a normalized point inside of the shape, or around the shape, where the arrow will point to) and the distance from the binding shape to the anchor.\n\n    const bounds = this.getBounds(shape)\n    const expandedBounds = this.getExpandedBounds(shape)\n\n    // The point must be inside of the expanded bounding box\n    if (!Utils.pointInBounds(point, expandedBounds)) return\n\n    const intersections = intersectRayBounds(origin, direction, expandedBounds)\n      .filter((int) => int.didIntersect)\n      .map((int) => int.points[0])\n\n    if (!intersections.length) return\n\n    // The center of the shape\n    const center = this.getCenter(shape)\n\n    // Find furthest intersection between ray from origin through point and expanded bounds. TODO: What if the shape has a curve? In that case, should we intersect the circle-from-three-points instead?\n    const intersection = intersections.sort((a, b) => Vec.dist(b, origin) - Vec.dist(a, origin))[0]\n\n    // The point between the handle and the intersection\n    const middlePoint = Vec.med(point, intersection)\n\n    // The anchor is the point in the shape where the arrow will be pointing\n    let anchor: number[]\n\n    // The distance is the distance from the anchor to the handle\n    let distance: number\n\n    if (bindAnywhere) {\n      // If the user is indicating that they want to bind inside of the shape, we just use the handle's point\n      anchor = Vec.dist(point, center) < BINDING_DISTANCE / 2 ? center : point\n      distance = 0\n    } else {\n      if (Vec.distanceToLineSegment(point, middlePoint, center) < BINDING_DISTANCE / 2) {\n        // If the line segment would pass near to the center, snap the anchor the center point\n        anchor = center\n      } else {\n        // Otherwise, the anchor is the middle point between the handle and the intersection\n        anchor = middlePoint\n      }\n\n      if (Utils.pointInBounds(point, bounds)) {\n        // If the point is inside of the shape, use the shape's binding distance\n\n        distance = this.bindingDistance\n      } else {\n        // Otherwise, use the actual distance from the handle point to nearest edge\n        distance = Math.max(\n          this.bindingDistance,\n          Utils.getBoundsSides(bounds)\n            .map((side) => Vec.distanceToLineSegment(side[1][0], side[1][1], point))\n            .sort((a, b) => a - b)[0]\n        )\n      }\n    }\n\n    // The binding point is a normalized point indicating the position of the anchor.\n    // An anchor at the middle of the shape would be (0.5, 0.5). When the shape's bounds\n    // changes, we will re-recalculate the actual anchor point by multiplying the\n    // normalized point by the shape's new bounds.\n    const bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n      expandedBounds.width,\n      expandedBounds.height,\n    ])\n\n    return {\n      point: Vec.clampV(bindingPoint, 0, 1),\n      distance,\n    }\n  }\n\n  mutate = (shape: T, props: Partial<T>): Partial<T> => {\n    return props\n  }\n\n  transform = (shape: T, bounds: TLBounds, info: TransformInfo<T>): Partial<T> => {\n    return { ...shape, point: [bounds.minX, bounds.minY] }\n  }\n\n  transformSingle = (shape: T, bounds: TLBounds, info: TransformInfo<T>): Partial<T> | void => {\n    return this.transform(shape, bounds, info)\n  }\n\n  updateChildren?: <K extends TDShape>(shape: T, children: K[]) => Partial<K>[] | void\n\n  onChildrenChange?: (shape: T, children: TDShape[]) => Partial<T> | void\n\n  onHandleChange?: (shape: T, handles: Partial<T['handles']>) => Partial<T> | void\n\n  onRightPointHandle?: (\n    shape: T,\n    handles: Partial<T['handles']>,\n    info: Partial<TLPointerInfo>\n  ) => Partial<T> | void\n\n  onDoubleClickHandle?: (\n    shape: T,\n    handles: Partial<T['handles']>,\n    info: Partial<TLPointerInfo>\n  ) => Partial<T> | void\n\n  onDoubleClickBoundsHandle?: (shape: T) => Partial<T> | void\n\n  onSessionComplete?: (shape: T) => Partial<T> | void\n\n  getSvgElement = (shape: T, isDarkMode: boolean): SVGElement | void => {\n    const elm = document.getElementById(shape.id + '_svg')?.cloneNode(true) as SVGElement\n    if (!elm) return // possibly in test mode\n    if ('label' in shape && (shape as any).label) {\n      const s = shape as TDShape & { label: string }\n      const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n      const bounds = this.getBounds(shape)\n      const labelElm = getTextSvgElement(s['label'], shape.style, bounds)\n      labelElm.setAttribute('fill', getShapeStyle(shape.style, isDarkMode).stroke)\n      const font = getFontStyle(shape.style)\n      const size = getTextLabelSize(s['label'], font)\n      labelElm.setAttribute('transform-origin', 'top left')\n      labelElm.setAttribute(\n        'transform',\n        `translate(${bounds.width / 2}, ${(bounds.height - size[1]) / 2})`\n      )\n      g.setAttribute('text-align', 'center')\n      g.setAttribute('text-anchor', 'middle')\n      g.appendChild(elm)\n      g.appendChild(labelElm)\n      return g\n    }\n    return elm\n  }\n}\n", "import { Utils } from '@tldraw/core'\nimport { Theme, ColorStyle, DashStyle, ShapeStyles, SizeStyle, FontStyle, AlignStyle } from '~types'\n\nconst canvasLight = '#fafafa'\n\nconst canvasDark = '#343d45'\n\nconst colors = {\n  [ColorStyle.White]: '#f0f1f3',\n  [ColorStyle.LightGray]: '#c6cbd1',\n  [ColorStyle.Gray]: '#788492',\n  [ColorStyle.Black]: '#1d1d1d',\n  [ColorStyle.Green]: '#36b24d',\n  [ColorStyle.Cyan]: '#0e98ad',\n  [ColorStyle.Blue]: '#1c7ed6',\n  [ColorStyle.Indigo]: '#4263eb',\n  [ColorStyle.Violet]: '#7746f1',\n  [ColorStyle.Red]: '#ff2133',\n  [ColorStyle.Orange]: '#ff9433',\n  [ColorStyle.Yellow]: '#ffc936',\n}\n\nexport const stickyFills: Record<Theme, Record<ColorStyle, string>> = {\n  light: {\n    ...(Object.fromEntries(\n      Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasLight, 0.45)])\n    ) as Record<ColorStyle, string>),\n    [ColorStyle.White]: '#ffffff',\n    [ColorStyle.Black]: '#3d3d3d',\n  },\n  dark: {\n    ...(Object.fromEntries(\n      Object.entries(colors).map(([k, v]) => [\n        k,\n        Utils.lerpColor(Utils.lerpColor(v, '#999999', 0.3), canvasDark, 0.4),\n      ])\n    ) as Record<ColorStyle, string>),\n    [ColorStyle.White]: '#1d1d1d',\n    [ColorStyle.Black]: '#bbbbbb',\n  },\n}\n\nexport const strokes: Record<Theme, Record<ColorStyle, string>> = {\n  light: {\n    ...colors,\n    [ColorStyle.White]: '#1d1d1d',\n  },\n  dark: {\n    ...(Object.fromEntries(\n      Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasDark, 0.1)])\n    ) as Record<ColorStyle, string>),\n    [ColorStyle.White]: '#cecece',\n    [ColorStyle.Black]: '#cecece',\n  },\n}\n\nexport const fills: Record<Theme, Record<ColorStyle, string>> = {\n  light: {\n    ...(Object.fromEntries(\n      Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasLight, 0.82)])\n    ) as Record<ColorStyle, string>),\n    [ColorStyle.White]: '#fefefe',\n  },\n  dark: {\n    ...(Object.fromEntries(\n      Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasDark, 0.82)])\n    ) as Record<ColorStyle, string>),\n    [ColorStyle.White]: 'rgb(30,33,37)',\n    [ColorStyle.Black]: '#1e1e1f',\n  },\n}\n\nconst strokeWidths = {\n  [SizeStyle.Small]: 2,\n  [SizeStyle.Medium]: 3.5,\n  [SizeStyle.Large]: 5,\n}\n\nconst fontSizes = {\n  [SizeStyle.Small]: 28,\n  [SizeStyle.Medium]: 48,\n  [SizeStyle.Large]: 96,\n  auto: 'auto',\n}\n\nconst fontFaces = {\n  [FontStyle.Script]: '\"Caveat Brush\"',\n  [FontStyle.Sans]: '\"Source Sans Pro\"',\n  [FontStyle.Serif]: '\"Crimson Pro\"',\n  [FontStyle.Mono]: '\"Source Code Pro\"',\n}\n\nconst fontSizeModifiers = {\n  [FontStyle.Script]: 1,\n  [FontStyle.Sans]: 1,\n  [FontStyle.Serif]: 1,\n  [FontStyle.Mono]: 1,\n}\n\nconst stickyFontSizes = {\n  [SizeStyle.Small]: 24,\n  [SizeStyle.Medium]: 36,\n  [SizeStyle.Large]: 48,\n  auto: 'auto',\n}\n\nexport function getStrokeWidth(size: SizeStyle): number {\n  return strokeWidths[size]\n}\n\nexport function getFontSize(size: SizeStyle, fontStyle: FontStyle = FontStyle.Script): number {\n  return fontSizes[size] * fontSizeModifiers[fontStyle]\n}\n\nexport function getFontFace(font: FontStyle = FontStyle.Script): string {\n  return fontFaces[font]\n}\n\nexport function getStickyFontSize(size: SizeStyle): number {\n  return stickyFontSizes[size]\n}\n\nexport function getFontStyle(style: ShapeStyles): string {\n  const fontSize = getFontSize(style.size, style.font)\n  const fontFace = getFontFace(style.font)\n  const { scale = 1 } = style\n\n  return `${fontSize * scale}px/1 ${fontFace}`\n}\n\nexport function getStickyFontStyle(style: ShapeStyles): string {\n  const fontSize = getStickyFontSize(style.size)\n  const fontFace = getFontFace(style.font)\n  const { scale = 1 } = style\n\n  return `${fontSize * scale}px/1 ${fontFace}`\n}\n\nexport function getStickyShapeStyle(style: ShapeStyles, isDarkMode = false) {\n  const { color } = style\n\n  const theme: Theme = isDarkMode ? 'dark' : 'light'\n  const adjustedColor =\n    color === ColorStyle.White || color === ColorStyle.Black ? ColorStyle.Yellow : color\n\n  return {\n    fill: stickyFills[theme][adjustedColor],\n    stroke: strokes[theme][adjustedColor],\n    color: isDarkMode ? '#1d1d1d' : '#0d0d0d',\n  }\n}\n\nexport function getShapeStyle(\n  style: ShapeStyles,\n  isDarkMode?: boolean\n): {\n  stroke: string\n  fill: string\n  strokeWidth: number\n} {\n  const { color, size, isFilled } = style\n\n  const strokeWidth = getStrokeWidth(size)\n\n  const theme: Theme = isDarkMode ? 'dark' : 'light'\n\n  return {\n    stroke: strokes[theme][color],\n    fill: isFilled ? fills[theme][color] : 'none',\n    strokeWidth,\n  }\n}\n\nexport const defaultStyle: ShapeStyles = {\n  color: ColorStyle.Black,\n  size: SizeStyle.Small,\n  isFilled: false,\n  dash: DashStyle.Draw,\n  scale: 1,\n}\n\nexport const defaultTextStyle: ShapeStyles = {\n  ...defaultStyle,\n  font: FontStyle.Script,\n  textAlign: AlignStyle.Middle,\n}\n", "import { AlignStyle } from '~types'\n\nconst ALIGN_VALUES = {\n  [AlignStyle.Start]: 'left',\n  [AlignStyle.Middle]: 'center',\n  [AlignStyle.End]: 'right',\n  [AlignStyle.Justify]: 'justify',\n} as const\n\nexport function getTextAlign(alignStyle: AlignStyle = AlignStyle.Start) {\n  return ALIGN_VALUES[alignStyle]\n}\n", "import type { TLBounds } from '@tldraw/core'\nimport { AlignStyle, ShapeStyles } from '~types'\nimport { getFontFace, getFontSize } from './shape-styles'\nimport { getTextAlign } from './getTextAlign'\nimport { LINE_HEIGHT } from '~constants'\n\nexport function getTextSvgElement(text: string, style: ShapeStyles, bounds: TLBounds) {\n  const fontSize = getFontSize(style.size, style.font)\n  const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n  const scale = style.scale ?? 1\n\n  const textLines = text.split('\\n').map((line, i) => {\n    const textElm = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n    textElm.textContent = line\n    textElm.setAttribute('y', fontSize * (0.5 + i * LINE_HEIGHT) + '')\n    textElm.setAttribute('letter-spacing', fontSize * -0.03 + '')\n    textElm.setAttribute('font-size', fontSize + 'px')\n    textElm.setAttribute('font-family', getFontFace(style.font).slice(1, -1))\n    textElm.setAttribute('text-align', getTextAlign(style.textAlign))\n    textElm.setAttribute('text-align', getTextAlign(style.textAlign))\n    textElm.setAttribute('alignment-baseline', 'central')\n    if (style.scale !== 1) {\n      textElm.setAttribute('transform', `scale(${style.scale})`)\n    }\n    g.appendChild(textElm)\n\n    return textElm\n  })\n\n  switch (style.textAlign) {\n    case AlignStyle.Middle: {\n      g.setAttribute('text-align', 'center')\n      g.setAttribute('text-anchor', 'middle')\n      textLines.forEach((textElm) => {\n        textElm.setAttribute('x', bounds.width / 2 / scale + '')\n      })\n      break\n    }\n    case AlignStyle.End: {\n      g.setAttribute('text-align', 'right')\n      g.setAttribute('text-anchor', 'end')\n      textLines.forEach((textElm) => textElm.setAttribute('x', bounds.width / scale + ''))\n      break\n    }\n    case AlignStyle.Start: {\n      g.setAttribute('text-align', 'left')\n      g.setAttribute('text-anchor', 'start')\n    }\n  }\n\n  return g\n}\n", "import { LETTER_SPACING } from '~constants'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet melm: any\n\nfunction getMeasurementDiv() {\n  // A div used for measurement\n  document.getElementById('__textLabelMeasure')?.remove()\n\n  const pre = document.createElement('pre')\n  pre.id = '__textLabelMeasure'\n\n  Object.assign(pre.style, {\n    whiteSpace: 'pre',\n    width: 'auto',\n    border: '1px solid transparent',\n    padding: '4px',\n    margin: '0px',\n    letterSpacing: LETTER_SPACING,\n    opacity: '0',\n    position: 'absolute',\n    top: '-500px',\n    left: '0px',\n    zIndex: '9999',\n    pointerEvents: 'none',\n    userSelect: 'none',\n    alignmentBaseline: 'mathematical',\n    dominantBaseline: 'mathematical',\n  })\n\n  pre.tabIndex = -1\n\n  document.body.appendChild(pre)\n  return pre\n}\n\nif (typeof window !== 'undefined') {\n  melm = getMeasurementDiv()\n}\n\nlet prevText = ''\nlet prevFont = ''\nlet prevSize = [0, 0]\n\nexport function clearPrevSize() {\n  prevText = ''\n}\n\nexport function getTextLabelSize(text: string, font: string) {\n  if (!text) {\n    return [16, 32]\n  }\n\n  if (!melm) {\n    // We're in SSR\n    return [10, 10]\n  }\n\n  if (!melm.parent) document.body.appendChild(melm)\n\n  if (text === prevText && font === prevFont) {\n    return prevSize\n  }\n\n  prevText = text\n  prevFont = font\n\n  melm.textContent = text\n  melm.style.font = font\n\n  // In tests, offsetWidth and offsetHeight will be 0\n  const width = melm.offsetWidth || 1\n  const height = melm.offsetHeight || 1\n\n  prevSize = [width, height]\n  return prevSize\n}\n", "import { TLBounds, TLShape, Utils } from '@tldraw/core'\n\n/**\n * Find the bounds of a rectangular shape.\n * @param shape\n * @param boundsCache\n */\nexport function getBoundsRectangle<T extends TLShape & { size: number[] }>(\n  shape: T,\n  boundsCache: WeakMap<T, TLBounds>\n) {\n  const bounds = Utils.getFromCache(boundsCache, shape, () => {\n    const [width, height] = shape.size\n    return {\n      minX: 0,\n      maxX: width,\n      minY: 0,\n      maxY: height,\n      width,\n      height,\n    }\n  })\n\n  return Utils.translateBounds(bounds, shape.point)\n}\n", "import type { TLBounds, TLShape, TLTransformInfo } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\n\n/**\n * Transform a rectangular shape.\n * @param shape\n * @param bounds\n * @param param2\n */\nexport function transformRectangle<T extends TLShape & { size: number[] }>(\n  shape: T,\n  bounds: TLBounds,\n  { initialShape, transformOrigin, scaleX, scaleY }: TLTransformInfo<T>\n) {\n  if (shape.rotation || initialShape.isAspectRatioLocked) {\n    const size = Vec.toFixed(\n      Vec.mul(initialShape.size, Math.min(Math.abs(scaleX), Math.abs(scaleY)))\n    )\n    const point = Vec.toFixed([\n      bounds.minX +\n        (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]),\n      bounds.minY +\n        (bounds.height - shape.size[1]) *\n          (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]),\n    ])\n    const rotation =\n      (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0)\n        ? initialShape.rotation\n          ? -initialShape.rotation\n          : 0\n        : initialShape.rotation\n    return {\n      size,\n      point,\n      rotation,\n    }\n  } else {\n    return {\n      point: Vec.toFixed([bounds.minX, bounds.minY]),\n      size: Vec.toFixed([bounds.width, bounds.height]),\n    }\n  }\n}\n", "import type { TLBounds, TLShape } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\n\n/**\n * Transform a single rectangular shape.\n * @param shape\n * @param bounds\n */\nexport function transformSingleRectangle<T extends TLShape & { size: number[] }>(\n  shape: T,\n  bounds: TLBounds\n) {\n  return {\n    size: Vec.toFixed([bounds.width, bounds.height]),\n    point: Vec.toFixed([bounds.minX, bounds.minY]),\n  }\n}\n", "// Adapted (mostly copied) the work of https://github.com/fregante\n// Copyright (c) Federico Brigante <opensource@bfred.it> (bfred.it)\n\ntype ReplacerCallback = (substring: string, ...args: unknown[]) => string\n\nconst INDENT = '  '\n\nexport class TextAreaUtils {\n  static insertTextFirefox(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n    // Found on https://www.everythingfrontend.com/posts/insert-text-into-textarea-at-cursor-position.html \uD83C\uDF88\n    field.setRangeText(\n      text,\n      field.selectionStart || 0,\n      field.selectionEnd || 0,\n      'end' // Without this, the cursor is either at the beginning or `text` remains selected\n    )\n\n    field.dispatchEvent(\n      new InputEvent('input', {\n        data: text,\n        inputType: 'insertText',\n        isComposing: false, // TODO: fix @types/jsdom, this shouldn't be required\n      })\n    )\n  }\n\n  /** Inserts `text` at the cursor\u2019s position, replacing any selection, with **undo** support and by firing the `input` event. */\n  static insert(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n    const document = field.ownerDocument\n    const initialFocus = document.activeElement\n    if (initialFocus !== field) {\n      field.focus()\n    }\n\n    if (!document.execCommand('insertText', false, text)) {\n      TextAreaUtils.insertTextFirefox(field, text)\n    }\n\n    if (initialFocus === document.body) {\n      field.blur()\n    } else if (initialFocus instanceof HTMLElement && initialFocus !== field) {\n      initialFocus.focus()\n    }\n  }\n\n  /** Replaces the entire content, equivalent to `field.value = text` but with **undo** support and by firing the `input` event. */\n  static set(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n    field.select()\n    TextAreaUtils.insert(field, text)\n  }\n\n  /** Get the selected text in a field or an empty string if nothing is selected. */\n  static getSelection(field: HTMLTextAreaElement | HTMLInputElement): string {\n    const { selectionStart, selectionEnd } = field\n    return field.value.slice(\n      selectionStart ? selectionStart : undefined,\n      selectionEnd ? selectionEnd : undefined\n    )\n  }\n\n  /** Adds the `wrappingText` before and after field\u2019s selection (or cursor). If `endWrappingText` is provided, it will be used instead of `wrappingText` at on the right. */\n  static wrapSelection(\n    field: HTMLTextAreaElement | HTMLInputElement,\n    wrap: string,\n    wrapEnd?: string\n  ): void {\n    const { selectionStart, selectionEnd } = field\n    const selection = TextAreaUtils.getSelection(field)\n    TextAreaUtils.insert(field, wrap + selection + (wrapEnd ?? wrap))\n\n    // Restore the selection around the previously-selected text\n    field.selectionStart = (selectionStart || 0) + wrap.length\n    field.selectionEnd = (selectionEnd || 0) + wrap.length\n  }\n\n  /** Finds and replaces strings and regex in the field\u2019s value, like `field.value = field.value.replace()` but better */\n  static replace(\n    field: HTMLTextAreaElement | HTMLInputElement,\n    searchValue: string | RegExp,\n    replacer: string | ReplacerCallback\n  ): void {\n    /** Remembers how much each match offset should be adjusted */\n    let drift = 0\n\n    field.value.replace(searchValue, (...args): string => {\n      // Select current match to replace it later\n      const matchStart = drift + (args[args.length - 2] as number)\n      const matchLength = args[0].length\n      field.selectionStart = matchStart\n      field.selectionEnd = matchStart + matchLength\n\n      const replacement = typeof replacer === 'string' ? replacer : replacer(...args)\n      TextAreaUtils.insert(field, replacement)\n\n      // Select replacement. Without this, the cursor would be after the replacement\n      field.selectionStart = matchStart\n      drift += replacement.length - matchLength\n      return replacement\n    })\n  }\n\n  static findLineEnd(value: string, currentEnd: number): number {\n    // Go to the beginning of the last line\n    const lastLineStart = value.lastIndexOf('\\n', currentEnd - 1) + 1\n\n    // There's nothing to unindent after the last cursor, so leave it as is\n    if (value.charAt(lastLineStart) !== '\\t') {\n      return currentEnd\n    }\n\n    return lastLineStart + 1 // Include the first character, which will be a tab\n  }\n\n  static indent(element: HTMLTextAreaElement): void {\n    const { selectionStart, selectionEnd, value } = element\n    const selectedContrast = value.slice(selectionStart, selectionEnd)\n    // The first line should be indented, even if it starts with `\\n`\n    // The last line should only be indented if includes any character after `\\n`\n    const lineBreakCount = /\\n/g.exec(selectedContrast)?.length\n\n    if (lineBreakCount && lineBreakCount > 0) {\n      // Select full first line to replace everything at once\n      const firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\n      const newSelection = element.value.slice(firstLineStart, selectionEnd - 1)\n      const indentedText = newSelection.replace(\n        /^|\\n/g, // Match all line starts\n        `$&${INDENT}`\n      )\n      const replacementsCount = indentedText.length - newSelection.length\n\n      // Replace newSelection with indentedText\n      element.setSelectionRange(firstLineStart, selectionEnd - 1)\n      TextAreaUtils.insert(element, indentedText)\n\n      // Restore selection position, including the indentation\n      element.setSelectionRange(selectionStart + 1, selectionEnd + replacementsCount)\n    } else {\n      TextAreaUtils.insert(element, INDENT)\n    }\n  }\n\n  // The first line should always be unindented\n  // The last line should only be unindented if the selection includes any characters after `\\n`\n  static unindent(element: HTMLTextAreaElement): void {\n    const { selectionStart, selectionEnd, value } = element\n\n    // Select the whole first line because it might contain \\t\n    const firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n    const minimumSelectionEnd = TextAreaUtils.findLineEnd(value, selectionEnd)\n\n    const newSelection = element.value.slice(firstLineStart, minimumSelectionEnd)\n    const indentedText = newSelection.replace(/(^|\\n)(\\t| {1,2})/g, '$1')\n    const replacementsCount = newSelection.length - indentedText.length\n\n    // Replace newSelection with indentedText\n    element.setSelectionRange(firstLineStart, minimumSelectionEnd)\n    TextAreaUtils.insert(element, indentedText)\n\n    // Restore selection position, including the indentation\n    const firstLineIndentation = /\\t| {1,2}/.exec(value.slice(firstLineStart, selectionStart))\n\n    const difference = firstLineIndentation ? firstLineIndentation[0].length : 0\n\n    const newSelectionStart = selectionStart - difference\n    element.setSelectionRange(\n      selectionStart - difference,\n      Math.max(newSelectionStart, selectionEnd - replacementsCount)\n    )\n  }\n}\n", "import * as React from 'react'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { TLDR } from '~state/TLDR'\nimport { styled } from '~styles'\nimport { getTextLabelSize } from './getTextSize'\nimport { TextAreaUtils } from './TextAreaUtils'\n\nexport interface TextLabelProps {\n  font: string\n  text: string\n  color: string\n  onBlur?: () => void\n  onChange: (text: string) => void\n  offsetY?: number\n  offsetX?: number\n  scale?: number\n  isEditing?: boolean\n}\n\nexport const TextLabel = React.memo(function TextLabel({\n  font,\n  text,\n  color,\n  offsetX = 0,\n  offsetY = 0,\n  scale = 1,\n  isEditing = false,\n  onBlur,\n  onChange,\n}: TextLabelProps) {\n  const rInput = React.useRef<HTMLTextAreaElement>(null)\n  const rIsMounted = React.useRef(false)\n\n  const handleChange = React.useCallback(\n    (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n      onChange(TLDR.normalizeText(e.currentTarget.value))\n    },\n    [onChange]\n  )\n  const handleKeyDown = React.useCallback(\n    (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n      if (e.key === 'Escape') {\n        e.preventDefault()\n        e.stopPropagation()\n        onBlur?.()\n        return\n      }\n\n      if (e.key === 'Tab' && text.length === 0) {\n        e.preventDefault()\n        return\n      }\n\n      if (!(e.key === 'Meta' || e.metaKey)) {\n        e.stopPropagation()\n      } else if (e.key === 'z' && e.metaKey) {\n        if (e.shiftKey) {\n          document.execCommand('redo', false)\n        } else {\n          document.execCommand('undo', false)\n        }\n        e.stopPropagation()\n        e.preventDefault()\n        return\n      }\n\n      if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n        e.preventDefault()\n      }\n\n      if (e.key === 'Tab') {\n        e.preventDefault()\n        if (e.shiftKey) {\n          TextAreaUtils.unindent(e.currentTarget)\n        } else {\n          TextAreaUtils.indent(e.currentTarget)\n        }\n\n        onChange?.(TLDR.normalizeText(e.currentTarget.value))\n      }\n    },\n    [onChange]\n  )\n\n  const handleBlur = React.useCallback(\n    (e: React.FocusEvent<HTMLTextAreaElement>) => {\n      e.currentTarget.setSelectionRange(0, 0)\n      onBlur?.()\n    },\n    [onBlur]\n  )\n\n  const handleFocus = React.useCallback(\n    (e: React.FocusEvent<HTMLTextAreaElement>) => {\n      if (!isEditing) return\n      if (!rIsMounted.current) return\n\n      if (document.activeElement === e.currentTarget) {\n        e.currentTarget.select()\n      }\n    },\n    [isEditing]\n  )\n\n  const handlePointerDown = React.useCallback(\n    (e: React.PointerEvent<HTMLTextAreaElement | HTMLDivElement>) => {\n      if (isEditing) {\n        e.stopPropagation()\n      }\n    },\n    [isEditing]\n  )\n\n  React.useEffect(() => {\n    if (isEditing) {\n      requestAnimationFrame(() => {\n        rIsMounted.current = true\n        const elm = rInput.current\n        if (elm) {\n          elm.focus()\n          elm.select()\n        }\n      })\n    } else {\n      onBlur?.()\n    }\n  }, [isEditing, onBlur])\n\n  const rInnerWrapper = React.useRef<HTMLDivElement>(null)\n\n  React.useLayoutEffect(() => {\n    const elm = rInnerWrapper.current\n    if (!elm) return\n    const size = getTextLabelSize(text, font)\n    elm.style.transform = `scale(${scale}, ${scale}) translate(${offsetX}px, ${offsetY}px)`\n    elm.style.width = size[0] + 1 + 'px'\n    elm.style.height = size[1] + 1 + 'px'\n  }, [text, font, offsetY, offsetX, scale])\n\n  return (\n    <TextWrapper>\n      <InnerWrapper\n        ref={rInnerWrapper}\n        hasText={!!text}\n        isEditing={isEditing}\n        style={{\n          font,\n          color,\n        }}\n      >\n        {isEditing ? (\n          <TextArea\n            ref={rInput}\n            style={{\n              font,\n              color,\n            }}\n            name=\"text\"\n            tabIndex={-1}\n            autoComplete=\"false\"\n            autoCapitalize=\"false\"\n            autoCorrect=\"false\"\n            autoSave=\"false\"\n            autoFocus\n            placeholder=\"\"\n            spellCheck=\"true\"\n            wrap=\"off\"\n            dir=\"auto\"\n            datatype=\"wysiwyg\"\n            defaultValue={text}\n            color={color}\n            onFocus={handleFocus}\n            onChange={handleChange}\n            onKeyDown={handleKeyDown}\n            onBlur={handleBlur}\n            onPointerDown={handlePointerDown}\n            onContextMenu={stopPropagation}\n            onCopy={stopPropagation}\n            onPaste={stopPropagation}\n            onCut={stopPropagation}\n          />\n        ) : (\n          text\n        )}\n        &#8203;\n      </InnerWrapper>\n    </TextWrapper>\n  )\n})\n\nconst TextWrapper = styled('div', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  pointerEvents: 'none',\n  userSelect: 'none',\n  variants: {\n    isGhost: {\n      false: { opacity: 1 },\n      true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n    },\n  },\n})\n\nconst commonTextWrapping = {\n  whiteSpace: 'pre-wrap',\n  overflowWrap: 'break-word',\n}\n\nconst InnerWrapper = styled('div', {\n  position: 'absolute',\n  padding: '4px',\n  zIndex: 1,\n  minHeight: 1,\n  minWidth: 1,\n  lineHeight: 1,\n  letterSpacing: LETTER_SPACING,\n  outline: 0,\n  fontWeight: '500',\n  textAlign: 'center',\n  backfaceVisibility: 'hidden',\n  userSelect: 'none',\n  WebkitUserSelect: 'none',\n  WebkitTouchCallout: 'none',\n  variants: {\n    hasText: {\n      false: {\n        pointerEvents: 'none',\n      },\n      true: {\n        pointerEvents: 'all',\n      },\n    },\n    isEditing: {\n      false: {\n        userSelect: 'none',\n      },\n      true: {\n        background: '$boundsBg',\n        userSelect: 'text',\n        WebkitUserSelect: 'text',\n      },\n    },\n  },\n  ...commonTextWrapping,\n})\n\nconst TextArea = styled('textarea', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  zIndex: 1,\n  width: '100%',\n  height: '100%',\n  border: 'none',\n  padding: '4px',\n  resize: 'none',\n  textAlign: 'inherit',\n  minHeight: 'inherit',\n  minWidth: 'inherit',\n  lineHeight: 'inherit',\n  letterSpacing: 'inherit',\n  outline: 0,\n  fontWeight: 'inherit',\n  overflow: 'hidden',\n  backfaceVisibility: 'hidden',\n  display: 'inline-block',\n  pointerEvents: 'all',\n  background: '$boundsBg',\n  userSelect: 'text',\n  WebkitUserSelect: 'text',\n  fontSmooth: 'always',\n  WebkitFontSmoothing: 'subpixel-antialiased',\n  MozOsxFontSmoothing: 'auto',\n  ...commonTextWrapping,\n  '&:focus': {\n    outline: 'none',\n    border: 'none',\n  },\n})\n", "import type React from 'react'\n\nexport const stopPropagation = (e: KeyboardEvent | React.SyntheticEvent<any, Event>) =>\n  e.stopPropagation()\n", "import { Utils } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport getStroke, { getStrokePoints } from 'perfect-freehand'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '../shared'\n\nfunction getRectangleDrawPoints(id: string, style: ShapeStyles, size: number[]) {\n  const styles = getShapeStyle(style)\n\n  const getRandom = Utils.rng(id)\n\n  const sw = styles.strokeWidth\n\n  // Dimensions\n  const w = Math.max(0, size[0])\n  const h = Math.max(0, size[1])\n\n  // Random corner offsets\n  const offsets = Array.from(Array(4)).map(() => {\n    return [getRandom() * sw * 0.75, getRandom() * sw * 0.75]\n  })\n\n  // Corners\n  const tl = Vec.add([sw / 2, sw / 2], offsets[0])\n  const tr = Vec.add([w - sw / 2, sw / 2], offsets[1])\n  const br = Vec.add([w - sw / 2, h - sw / 2], offsets[2])\n  const bl = Vec.add([sw / 2, h - sw / 2], offsets[3])\n\n  // Which side to start drawing first\n  const rm = Math.round(Math.abs(getRandom() * 2 * 4))\n\n  // Corner radii\n  const rx = Math.min(w / 4, sw * 2)\n  const ry = Math.min(h / 4, sw * 2)\n\n  // Number of points per side\n  const px = Math.max(8, Math.floor(w / 16))\n  const py = Math.max(8, Math.floor(h / 16))\n\n  // Inset each line by the corner radii and let the freehand algo\n  // interpolate points for the corners.\n  const lines = Utils.rotateArray(\n    [\n      Vec.pointsBetween(Vec.add(tl, [rx, 0]), Vec.sub(tr, [rx, 0]), px),\n      Vec.pointsBetween(Vec.add(tr, [0, ry]), Vec.sub(br, [0, ry]), py),\n      Vec.pointsBetween(Vec.sub(br, [rx, 0]), Vec.add(bl, [rx, 0]), px),\n      Vec.pointsBetween(Vec.sub(bl, [0, ry]), Vec.add(tl, [0, ry]), py),\n    ],\n    rm\n  )\n\n  // For the final points, include the first half of the first line again,\n  // so that the line wraps around and avoids ending on a sharp corner.\n  // This has a bit of finesse and magic\u2014if you change the points between\n  // function, then you'll likely need to change this one too.\n\n  const points = [...lines.flat(), ...lines[0]].slice(\n    5,\n    Math.floor((rm % 2 === 0 ? px : py) / -2) + 3\n  )\n\n  return {\n    points,\n  }\n}\n\nfunction getDrawStrokeInfo(id: string, style: ShapeStyles, size: number[]) {\n  const { points } = getRectangleDrawPoints(id, style, size)\n  const { strokeWidth } = getShapeStyle(style)\n  const options = {\n    size: strokeWidth,\n    thinning: 0.65,\n    streamline: 0.3,\n    smoothing: 1,\n    simulatePressure: false,\n    last: true,\n  }\n  return { points, options }\n}\n\nexport function getRectanglePath(id: string, style: ShapeStyles, size: number[]) {\n  const { points, options } = getDrawStrokeInfo(id, style, size)\n  const stroke = getStroke(points, options)\n  return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getRectangleIndicatorPathTDSnapshot(\n  id: string,\n  style: ShapeStyles,\n  size: number[]\n) {\n  const { points, options } = getDrawStrokeInfo(id, style, size)\n  const strokePoints = getStrokePoints(points, options)\n  return Utils.getSvgPathFromStroke(\n    strokePoints.map((pt) => pt.point.slice(0, 2)),\n    false\n  )\n}\n", "import * as React from 'react'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getRectangleIndicatorPathTDSnapshot, getRectanglePath } from '../rectangleHelpers'\n\ninterface RectangleSvgProps {\n  id: string\n  style: ShapeStyles\n  isSelected: boolean\n  isDarkMode: boolean\n  size: number[]\n}\n\nexport const DrawRectangle = React.memo(function DrawRectangle({\n  id,\n  style,\n  size,\n  isSelected,\n  isDarkMode,\n}: RectangleSvgProps) {\n  const { isFilled } = style\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n  const pathTDSnapshot = getRectanglePath(id, style, size)\n  const innerPath = getRectangleIndicatorPathTDSnapshot(id, style, size)\n\n  return (\n    <>\n      <path\n        className={style.isFilled || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        d={innerPath}\n      />\n      {isFilled && <path d={innerPath} fill={fill} pointerEvents=\"none\" />}\n      <path\n        d={pathTDSnapshot}\n        fill={stroke}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        pointerEvents=\"none\"\n      />\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { Utils } from '@tldraw/core'\nimport { BINDING_DISTANCE } from '~constants'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '~state/shapes/shared'\n\ninterface RectangleSvgProps {\n  id: string\n  style: ShapeStyles\n  isSelected: boolean\n  size: number[]\n  isDarkMode: boolean\n}\n\nexport const DashedRectangle = React.memo(function DashedRectangle({\n  id,\n  style,\n  size,\n  isSelected,\n  isDarkMode,\n}: RectangleSvgProps) {\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n\n  const sw = 1 + strokeWidth * 1.618\n\n  const w = Math.max(0, size[0] - sw / 2)\n  const h = Math.max(0, size[1] - sw / 2)\n\n  const strokes: [number[], number[], number][] = [\n    [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n    [[w, sw / 2], [w, h], h - sw / 2],\n    [[w, h], [sw / 2, h], w - sw / 2],\n    [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n  ]\n\n  const paths = strokes.map(([start, end, length], i) => {\n    const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n      length,\n      strokeWidth * 1.618,\n      style.dash\n    )\n\n    return (\n      <line\n        key={id + '_' + i}\n        x1={start[0]}\n        y1={start[1]}\n        x2={end[0]}\n        y2={end[1]}\n        strokeDasharray={strokeDasharray}\n        strokeDashoffset={strokeDashoffset}\n      />\n    )\n  })\n\n  return (\n    <>\n      <rect\n        className={isSelected || style.isFilled ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        x={sw / 2}\n        y={sw / 2}\n        width={w}\n        height={h}\n        strokeWidth={BINDING_DISTANCE}\n      />\n      {style.isFilled && (\n        <rect x={sw / 2} y={sw / 2} width={w} height={h} fill={fill} pointerEvents=\"none\" />\n      )}\n      <g pointerEvents=\"none\" stroke={stroke} strokeWidth={sw} strokeLinecap=\"round\">\n        {paths}\n      </g>\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { BINDING_DISTANCE } from '~constants'\n\ninterface BindingIndicatorProps {\n  strokeWidth: number\n  size: number[]\n}\nexport function BindingIndicator({ strokeWidth, size }: BindingIndicatorProps) {\n  return (\n    <rect\n      className=\"tl-binding-indicator\"\n      x={strokeWidth}\n      y={strokeWidth}\n      width={Math.max(0, size[0] - strokeWidth / 2)}\n      height={Math.max(0, size[1] - strokeWidth / 2)}\n      strokeWidth={BINDING_DISTANCE * 2}\n    />\n  )\n}\n", "import * as React from 'react'\nimport { Utils, SVGContainer, TLBounds } from '@tldraw/core'\nimport { TriangleShape, TDShapeType, TDMeta, TDShape, DashStyle } from '~types'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  defaultStyle,\n  getBoundsRectangle,\n  transformRectangle,\n  transformSingleRectangle,\n  getFontStyle,\n} from '~state/shapes/shared'\nimport {\n  intersectBoundsPolygon,\n  intersectLineSegmentPolyline,\n  intersectRayLineSegment,\n} from '@tldraw/intersect'\nimport Vec from '@tldraw/vec'\nimport { BINDING_DISTANCE, GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { getTriangleCentroid, getTrianglePoints } from './triangleHelpers'\nimport { styled } from '~styles'\nimport { DrawTriangle } from './components/DrawTriangle'\nimport { DashedTriangle } from './components/DashedTriangle'\nimport { TextLabel, getShapeStyle } from '../shared'\nimport { TriangleBindingIndicator } from './components/TriangleBindingIndicator'\n\ntype T = TriangleShape\ntype E = HTMLDivElement\n\nexport class TriangleUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Triangle as const\n\n  canBind = true\n\n  canClone = true\n\n  canEdit = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Triangle,\n        name: 'Triangle',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [1, 1],\n        rotation: 0,\n        style: defaultStyle,\n        label: '',\n        labelPoint: [0.5, 0.5],\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    (\n      {\n        shape,\n        bounds,\n        isBinding,\n        isEditing,\n        isSelected,\n        isGhost,\n        meta,\n        events,\n        onShapeChange,\n        onShapeBlur,\n      },\n      ref\n    ) => {\n      const { id, label = '', size, style, labelPoint = LABEL_POINT } = shape\n      const font = getFontStyle(style)\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const Component = style.dash === DashStyle.Draw ? DrawTriangle : DashedTriangle\n      const handleLabelChange = React.useCallback(\n        (label: string) => onShapeChange?.({ id, label }),\n        [onShapeChange]\n      )\n      const offsetY = React.useMemo(() => {\n        const center = Vec.div(size, 2)\n        const centroid = getTriangleCentroid(size)\n        return (centroid[1] - center[1]) * 0.72\n      }, [size])\n      return (\n        <FullWrapper ref={ref} {...events}>\n          <TextLabel\n            font={font}\n            text={label}\n            color={styles.stroke}\n            offsetX={(labelPoint[0] - 0.5) * bounds.width}\n            offsetY={offsetY + (labelPoint[1] - 0.5) * bounds.height}\n            isEditing={isEditing}\n            onChange={handleLabelChange}\n            onBlur={onShapeBlur}\n          />\n          <SVGContainer id={shape.id + '_svg'} opacity={isGhost ? GHOSTED_OPACITY : 1}>\n            {isBinding && <TriangleBindingIndicator size={size} />}\n            <Component\n              id={id}\n              style={style}\n              size={size}\n              isSelected={isSelected}\n              isDarkMode={meta.isDarkMode}\n            />\n          </SVGContainer>\n        </FullWrapper>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const { size } = shape\n    return <polygon points={getTrianglePoints(size).join()} />\n  })\n\n  private getPoints(shape: T) {\n    const {\n      rotation = 0,\n      point: [x, y],\n      size: [w, h],\n    } = shape\n    return [\n      [x + w / 2, y],\n      [x, y + h],\n      [x + w, y + h],\n    ].map((pt) => Vec.rotWith(pt, this.getCenter(shape), rotation))\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style || next.label !== prev.label\n  }\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  getExpandedBounds = (shape: T) => {\n    return Utils.getBoundsFromPoints(\n      getTrianglePoints(shape.size, this.bindingDistance).map((pt) => Vec.add(pt, shape.point))\n    )\n  }\n\n  hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n    return intersectLineSegmentPolyline(A, B, this.getPoints(shape)).didIntersect\n  }\n\n  hitTestBounds = (shape: T, bounds: TLBounds): boolean => {\n    return (\n      Utils.boundsContained(this.getBounds(shape), bounds) ||\n      intersectBoundsPolygon(bounds, this.getPoints(shape)).length > 0\n    )\n  }\n\n  getBindingPoint = <K extends TDShape>(\n    shape: T,\n    fromShape: K,\n    point: number[],\n    origin: number[],\n    direction: number[],\n    bindAnywhere: boolean\n  ) => {\n    // Algorithm time! We need to find the binding point (a normalized point inside of the shape, or around the shape, where the arrow will point to) and the distance from the binding shape to the anchor.\n\n    const expandedBounds = this.getExpandedBounds(shape)\n\n    if (!Utils.pointInBounds(point, expandedBounds)) return\n\n    const points = getTrianglePoints(shape.size).map((pt) => Vec.add(pt, shape.point))\n\n    const expandedPoints = getTrianglePoints(shape.size, this.bindingDistance).map((pt) =>\n      Vec.add(pt, shape.point)\n    )\n\n    const closestDistanceToEdge = Utils.pointsToLineSegments(points, true)\n      .map(([a, b]) => Vec.distanceToLineSegment(a, b, point))\n      .sort((a, b) => a - b)[0]\n\n    if (\n      !(Utils.pointInPolygon(point, expandedPoints) || closestDistanceToEdge < this.bindingDistance)\n    )\n      return\n\n    const intersections = Utils.pointsToLineSegments(expandedPoints.concat([expandedPoints[0]]))\n      .map((segment) => intersectRayLineSegment(origin, direction, segment[0], segment[1]))\n      .filter((intersection) => intersection.didIntersect)\n      .flatMap((intersection) => intersection.points)\n\n    if (!intersections.length) return\n\n    // The center of the triangle\n    const center = Vec.add(getTriangleCentroid(shape.size), shape.point)\n\n    // Find furthest intersection between ray from origin through point and expanded bounds. TODO: What if the shape has a curve? In that case, should we intersect the circle-from-three-points instead?\n    const intersection = intersections.sort((a, b) => Vec.dist(b, origin) - Vec.dist(a, origin))[0]\n\n    // The point between the handle and the intersection\n    const middlePoint = Vec.med(point, intersection)\n\n    let anchor: number[]\n    let distance: number\n\n    if (bindAnywhere) {\n      anchor = Vec.dist(point, center) < BINDING_DISTANCE / 2 ? center : point\n      distance = 0\n    } else {\n      if (Vec.distanceToLineSegment(point, middlePoint, center) < BINDING_DISTANCE / 2) {\n        anchor = center\n      } else {\n        anchor = middlePoint\n      }\n\n      if (Utils.pointInPolygon(point, points)) {\n        distance = this.bindingDistance\n      } else {\n        distance = Math.max(this.bindingDistance, closestDistanceToEdge)\n      }\n    }\n\n    const bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n      expandedBounds.width,\n      expandedBounds.height,\n    ])\n\n    return {\n      point: Vec.clampV(bindingPoint, 0, 1),\n      distance,\n    }\n  }\n\n  transform = transformRectangle\n\n  transformSingle = transformSingleRectangle\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import { Utils } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport getStroke, { getStrokePoints } from 'perfect-freehand'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '../shared'\nimport { getOffsetPolygon } from '../shared/PolygonUtils'\n\nexport function getTrianglePoints(size: number[], offset = 0, rotation = 0) {\n  const [w, h] = size\n  let points = [\n    [w / 2, 0],\n    [w, h],\n    [0, h],\n  ]\n  if (offset) points = getOffsetPolygon(points, offset)\n  if (rotation) points = points.map((pt) => Vec.rotWith(pt, [w / 2, h / 2], rotation))\n\n  return points\n}\n\nexport function getTriangleCentroid(size: number[]) {\n  const [w, h] = size\n  const points = [\n    [w / 2, 0],\n    [w, h],\n    [0, h],\n  ]\n  return [\n    (points[0][0] + points[1][0] + points[2][0]) / 3,\n    (points[0][1] + points[1][1] + points[2][1]) / 3,\n  ]\n}\n\nfunction getTriangleDrawPoints(id: string, size: number[], strokeWidth: number) {\n  const [w, h] = size\n  const getRandom = Utils.rng(id)\n  // Random corner offsets\n  const offsets = Array.from(Array(3)).map(() => {\n    return [getRandom() * strokeWidth * 0.75, getRandom() * strokeWidth * 0.75]\n  })\n  // Corners\n  const corners = [\n    Vec.add([w / 2, 0], offsets[0]),\n    Vec.add([w, h], offsets[1]),\n    Vec.add([0, h], offsets[2]),\n  ]\n  // Which side to start drawing first\n  const rm = Math.round(Math.abs(getRandom() * 2 * 3))\n  // Number of points per side\n  // Inset each line by the corner radii and let the freehand algo\n  // interpolate points for the corners.\n  const lines = Utils.rotateArray(\n    [\n      Vec.pointsBetween(corners[0], corners[1], 32),\n      Vec.pointsBetween(corners[1], corners[2], 32),\n      Vec.pointsBetween(corners[2], corners[0], 32),\n    ],\n    rm\n  )\n  // For the final points, include the first half of the first line again,\n  // so that the line wraps around and avoids ending on a sharp corner.\n  // This has a bit of finesse and magic\u2014if you change the points between\n  // function, then you'll likely need to change this one too.\n  const points = [...lines.flat(), ...lines[0]]\n  return {\n    points,\n  }\n}\n\nfunction getDrawStrokeInfo(id: string, size: number[], style: ShapeStyles) {\n  const { strokeWidth } = getShapeStyle(style)\n  const { points } = getTriangleDrawPoints(id, size, strokeWidth)\n  const options = {\n    size: strokeWidth,\n    thinning: 0.65,\n    streamline: 0.3,\n    smoothing: 1,\n    simulatePressure: false,\n    last: true,\n  }\n  return { points, options }\n}\n\nexport function getTrianglePath(id: string, size: number[], style: ShapeStyles) {\n  const { points, options } = getDrawStrokeInfo(id, size, style)\n  const stroke = getStroke(points, options)\n  return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getTriangleIndicatorPathTDSnapshot(id: string, size: number[], style: ShapeStyles) {\n  const { points, options } = getDrawStrokeInfo(id, size, style)\n  const strokePoints = getStrokePoints(points, options)\n  return Utils.getSvgPathFromStroke(\n    strokePoints.map((pt) => pt.point.slice(0, 2)),\n    false\n  )\n}\n", "import { intersectLineLine } from '@tldraw/intersect'\nimport Vec from '@tldraw/vec'\n\nconst PI2 = Math.PI * 2\n\ntype Vert = number[]\ntype Edge = Vert[]\ntype Polygon = Vert[]\n\nexport class PolygonUtils {\n  static inwardEdgeNormal(edge: Edge) {\n    // Assuming that polygon vertices are in clockwise order\n    const delta = Vec.sub(edge[1], edge[0])\n    const len = Vec.len2(delta)\n    return [-delta[0] / len, delta[1] / len]\n  }\n\n  static outwardEdgeNormal(edge: Edge) {\n    return Vec.neg(PolygonUtils.inwardEdgeNormal(edge))\n  }\n\n  // If the slope of line v1,v2 greater than the slope of v1,p then p is on the left side of v1,v2 and the return value is > 0.\n  // If p is colinear with v1,v2 then return 0, otherwise return a value < 0.\n\n  static leftSide = Vec.isLeft\n\n  static isReflexVertex(polygon: Polygon, index: number) {\n    const len = polygon.length\n    // Assuming that polygon vertices are in clockwise order\n    const v0 = polygon[(index + len - 1) % len]\n    const v1 = polygon[index]\n    const v2 = polygon[(index + 1) % len]\n    if (PolygonUtils.leftSide(v0, v2, v1) < 0) return true\n    return false\n  }\n\n  static getEdges(vertices: Vert[]) {\n    return vertices.map((vert, i) => [vert, vertices[(i + 1) % vertices.length]])\n  }\n\n  // based on http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/, A => \"line a\", B => \"line b\"\n  static edgesIntersection([A1, A2]: number[][], [B1, B2]: number[][]) {\n    const den = (B2[1] - B1[1]) * (A2[0] - A1[0]) - (B2[0] - B1[0]) * (A2[1] - A1[1])\n\n    if (den == 0) return null // lines are parallel or conincident\n\n    const ua = ((B2[0] - B1[0]) * (A1[1] - B1[1]) - (B2[1] - B1[1]) * (A1[0] - B1[0])) / den\n\n    const ub = ((A2[0] - A1[0]) * (A1[1] - B1[1]) - (A2[1] - A1[1]) * (A1[0] - B1[0])) / den\n\n    if (ua < 0 || ub < 0 || ua > 1 || ub > 1) return null\n\n    return [A1[0] + ua * (A2[0] - A1[0]), A1[1] + ua * (A2[1] - A1[1])]\n  }\n\n  static appendArc(\n    polygon: number[][],\n    center: number[],\n    radius: number,\n    startVertex: number[],\n    endVertex: number[],\n    isPaddingBoundary = false\n  ) {\n    const vertices = [...polygon]\n    let startAngle = Math.atan2(startVertex[1] - center[1], startVertex[0] - center[0])\n    let endAngle = Math.atan2(endVertex[1] - center[1], endVertex[0] - center[0])\n    if (startAngle < 0) startAngle += PI2\n    if (endAngle < 0) endAngle += PI2\n    const arcSegmentCount = 5 // An odd number so that one arc vertex will be eactly arcRadius from center.\n    const angle = startAngle > endAngle ? startAngle - endAngle : startAngle + PI2 - endAngle\n    const angle5 = (isPaddingBoundary ? -angle : PI2 - angle) / arcSegmentCount\n\n    vertices.push(startVertex)\n    for (let i = 1; i < arcSegmentCount; ++i) {\n      const angle = startAngle + angle5 * i\n      vertices.push([center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius])\n    }\n    vertices.push(endVertex)\n\n    return vertices\n  }\n\n  static createOffsetEdge(edge: Edge, offset: number[]) {\n    return edge.map((vert) => Vec.add(vert, offset))\n  }\n\n  static getOffsetPolygon(polygon: Polygon, offset = 0) {\n    const edges = PolygonUtils.getEdges(polygon)\n\n    const offsetEdges = edges.map((edge) =>\n      PolygonUtils.createOffsetEdge(edge, Vec.mul(PolygonUtils.outwardEdgeNormal(edge), offset))\n    )\n\n    const vertices = []\n\n    for (let i = 0; i < offsetEdges.length; i++) {\n      const thisEdge = offsetEdges[i]\n      const prevEdge = offsetEdges[(i + offsetEdges.length - 1) % offsetEdges.length]\n      const vertex = PolygonUtils.edgesIntersection(prevEdge, thisEdge)\n      if (vertex) vertices.push(vertex)\n      else {\n        PolygonUtils.appendArc(vertices, edges[i][0], offset, prevEdge[1], thisEdge[0], false)\n      }\n    }\n\n    // var marginPolygon = PolygonUtils.createPolygon(vertices)\n    // marginPolygon.offsetEdges = offsetEdges\n    return vertices\n  }\n\n  static createPaddingPolygon(polygon: number[][][], shapePadding = 0) {\n    const offsetEdges = polygon.map((edge) =>\n      PolygonUtils.createOffsetEdge(edge, PolygonUtils.inwardEdgeNormal(edge))\n    )\n\n    const vertices = []\n    for (let i = 0; i < offsetEdges.length; i++) {\n      const thisEdge = offsetEdges[i]\n      const prevEdge = offsetEdges[(i + offsetEdges.length - 1) % offsetEdges.length]\n      const vertex = PolygonUtils.edgesIntersection(prevEdge, thisEdge)\n      if (vertex) vertices.push(vertex)\n      else {\n        PolygonUtils.appendArc(\n          vertices,\n          polygon[i][0],\n          shapePadding,\n          prevEdge[1],\n          thisEdge[0],\n          true\n        )\n      }\n    }\n\n    return vertices\n  }\n}\n\nexport function getOffsetPolygon(points: number[][], offset: number) {\n  if (points.length < 3) throw Error('Polygon must have at least 3 points')\n  const len = points.length\n  return points\n    .map((point, i) => [point, points[(i + 1) % len]])\n    .map(([A, B]) => {\n      const offsetVector = Vec.mul(Vec.per(Vec.uni(Vec.sub(B, A))), offset)\n      return [Vec.add(A, offsetVector), Vec.add(B, offsetVector)]\n    })\n    .map((edge, i, edges) => {\n      const intersection = intersectLineLine(edge, edges[(i + 1) % edges.length])\n      if (intersection === undefined) throw Error('Expected an intersection')\n      return intersection\n    })\n}\n", "import * as React from 'react'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getTriangleIndicatorPathTDSnapshot, getTrianglePath } from '../triangleHelpers'\n\ninterface TriangleSvgProps {\n  id: string\n  size: number[]\n  style: ShapeStyles\n  isSelected: boolean\n  isDarkMode: boolean\n}\n\nexport const DrawTriangle = React.memo(function DrawTriangle({\n  id,\n  size,\n  style,\n  isSelected,\n  isDarkMode,\n}: TriangleSvgProps) {\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n  const pathTDSnapshot = getTrianglePath(id, size, style)\n  const indicatorPath = getTriangleIndicatorPathTDSnapshot(id, size, style)\n  return (\n    <>\n      <path\n        className={style.isFilled || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        d={indicatorPath}\n      />\n      {style.isFilled && <path d={indicatorPath} fill={fill} pointerEvents=\"none\" />}\n      <path\n        d={pathTDSnapshot}\n        fill={stroke}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        pointerEvents=\"none\"\n      />\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { Utils } from '@tldraw/core'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport { getTrianglePoints } from '../triangleHelpers'\nimport Vec from '@tldraw/vec'\n\ninterface TriangleSvgProps {\n  id: string\n  size: number[]\n  style: ShapeStyles\n  isSelected: boolean\n  isDarkMode: boolean\n}\n\nexport const DashedTriangle = React.memo(function DashedTriangle({\n  id,\n  size,\n  style,\n  isSelected,\n  isDarkMode,\n}: TriangleSvgProps) {\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n  const sw = 1 + strokeWidth * 1.618\n  const points = getTrianglePoints(size)\n  const sides = Utils.pointsToLineSegments(points, true)\n  const paths = sides.map(([start, end], i) => {\n    const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n      Vec.dist(start, end),\n      strokeWidth * 1.618,\n      style.dash\n    )\n\n    return (\n      <line\n        key={id + '_' + i}\n        x1={start[0]}\n        y1={start[1]}\n        x2={end[0]}\n        y2={end[1]}\n        stroke={stroke}\n        strokeWidth={sw}\n        strokeLinecap=\"round\"\n        strokeDasharray={strokeDasharray}\n        strokeDashoffset={strokeDashoffset}\n      />\n    )\n  })\n\n  const bgPath = points.join()\n\n  return (\n    <>\n      <polygon\n        className={style.isFilled || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        points={bgPath}\n      />\n      {style.isFilled && <polygon fill={fill} points={bgPath} pointerEvents=\"none\" />}\n      <g pointerEvents=\"stroke\">{paths}</g>\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { BINDING_DISTANCE } from '~constants'\nimport { getTrianglePoints } from '../triangleHelpers'\n\ninterface TriangleBindingIndicatorProps {\n  size: number[]\n}\n\nexport function TriangleBindingIndicator({ size }: TriangleBindingIndicatorProps) {\n  const trianglePoints = getTrianglePoints(size).join()\n  return (\n    <polygon\n      className=\"tl-binding-indicator\"\n      points={trianglePoints}\n      strokeWidth={BINDING_DISTANCE * 2}\n    />\n  )\n}\n", "import * as React from 'react'\nimport { Utils, SVGContainer, TLBounds } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { defaultStyle, getShapeStyle, getFontStyle } from '~state/shapes/shared'\nimport { EllipseShape, DashStyle, TDShapeType, TDShape, TransformInfo, TDMeta } from '~types'\nimport { GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  intersectEllipseBounds,\n  intersectLineSegmentEllipse,\n  intersectRayEllipse,\n} from '@tldraw/intersect'\nimport { getEllipseIndicatorPath } from './ellipseHelpers'\nimport { DrawEllipse } from './components/DrawEllipse'\nimport { DashedEllipse } from './components/DashedEllipse'\nimport { TextLabel } from '../shared/TextLabel'\nimport { styled } from '~styles'\n\ntype T = EllipseShape\ntype E = HTMLDivElement\ntype M = TDMeta\n\nexport class EllipseUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Ellipse as const\n\n  canBind = true\n\n  canClone = true\n\n  canEdit = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Ellipse,\n        name: 'Ellipse',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        radius: [1, 1],\n        rotation: 0,\n        style: defaultStyle,\n        label: '',\n        labelPoint: [0.5, 0.5],\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    (\n      {\n        shape,\n        isGhost,\n        isSelected,\n        isBinding,\n        isEditing,\n        meta,\n        bounds,\n        events,\n        onShapeChange,\n        onShapeBlur,\n      },\n      ref\n    ) => {\n      const { id, radius, style, label = '', labelPoint = LABEL_POINT } = shape\n      const font = getFontStyle(shape.style)\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const strokeWidth = styles.strokeWidth\n      const sw = 1 + strokeWidth * 1.618\n      const rx = Math.max(0, radius[0] - sw / 2)\n      const ry = Math.max(0, radius[1] - sw / 2)\n      const Component = style.dash === DashStyle.Draw ? DrawEllipse : DashedEllipse\n      const handleLabelChange = React.useCallback(\n        (label: string) => onShapeChange?.({ id, label }),\n        [onShapeChange]\n      )\n      return (\n        <FullWrapper ref={ref} {...events}>\n          <TextLabel\n            isEditing={isEditing}\n            onChange={handleLabelChange}\n            onBlur={onShapeBlur}\n            font={font}\n            text={label}\n            color={styles.stroke}\n            offsetX={(labelPoint[0] - 0.5) * bounds.width}\n            offsetY={(labelPoint[1] - 0.5) * bounds.height}\n          />\n          <SVGContainer id={shape.id + '_svg'} opacity={isGhost ? GHOSTED_OPACITY : 1}>\n            {isBinding && (\n              <ellipse\n                className=\"tl-binding-indicator\"\n                cx={radius[0]}\n                cy={radius[1]}\n                rx={rx}\n                ry={ry}\n                strokeWidth={this.bindingDistance}\n              />\n            )}\n            <Component\n              id={id}\n              radius={radius}\n              style={style}\n              isSelected={isSelected}\n              isDarkMode={meta.isDarkMode}\n            />\n          </SVGContainer>\n        </FullWrapper>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T, M>(({ shape }) => {\n    const { id, radius, style } = shape\n    const styles = getShapeStyle(style)\n    const strokeWidth = styles.strokeWidth\n    const sw = 1 + strokeWidth * 1.618\n    const rx = Math.max(0, radius[0] - sw / 2)\n    const ry = Math.max(0, radius[1] - sw / 2)\n    return style.dash === DashStyle.Draw ? (\n      <path d={getEllipseIndicatorPath(id, radius, style)} />\n    ) : (\n      <ellipse cx={radius[0]} cy={radius[1]} rx={rx} ry={ry} />\n    )\n  })\n\n  hitTestPoint = (shape: T, point: number[]): boolean => {\n    return (\n      Utils.pointInBounds(point, this.getRotatedBounds(shape)) &&\n      Utils.pointInEllipse(\n        point,\n        this.getCenter(shape),\n        shape.radius[0],\n        shape.radius[1],\n        shape.rotation || 0\n      )\n    )\n  }\n\n  hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n    return intersectLineSegmentEllipse(\n      A,\n      B,\n      this.getCenter(shape),\n      shape.radius[0],\n      shape.radius[1],\n      shape.rotation || 0\n    ).didIntersect\n  }\n\n  getBounds = (shape: T) => {\n    return Utils.getFromCache(this.boundsCache, shape, () => {\n      return Utils.getRotatedEllipseBounds(\n        shape.point[0],\n        shape.point[1],\n        shape.radius[0],\n        shape.radius[1],\n        0\n      )\n    })\n  }\n\n  getRotatedBounds = (shape: T): TLBounds => {\n    return Utils.getRotatedEllipseBounds(\n      shape.point[0],\n      shape.point[1],\n      shape.radius[0],\n      shape.radius[1],\n      shape.rotation\n    )\n  }\n\n  hitTestBounds = (shape: T, bounds: TLBounds): boolean => {\n    const shapeBounds = this.getBounds(shape)\n\n    return (\n      Utils.boundsContained(shapeBounds, bounds) ||\n      intersectEllipseBounds(\n        this.getCenter(shape),\n        shape.radius[0],\n        shape.radius[1],\n        shape.rotation || 0,\n        bounds\n      ).length > 0\n    )\n  }\n\n  shouldRender = (prev: T, next: T): boolean => {\n    return next.radius !== prev.radius || next.style !== prev.style || next.label !== prev.label\n  }\n\n  getCenter = (shape: T): number[] => {\n    return Vec.add(shape.point, shape.radius)\n  }\n\n  getBindingPoint = <K extends TDShape>(\n    shape: T,\n    fromShape: K,\n    point: number[],\n    origin: number[],\n    direction: number[],\n    bindAnywhere: boolean\n  ) => {\n    {\n      const expandedBounds = this.getExpandedBounds(shape)\n      const center = this.getCenter(shape)\n      let bindingPoint: number[]\n      let distance: number\n      if (\n        !Utils.pointInEllipse(\n          point,\n          center,\n          shape.radius[0] + this.bindingDistance,\n          shape.radius[1] + this.bindingDistance\n        )\n      ) {\n        return\n      }\n      if (bindAnywhere) {\n        if (Vec.dist(point, this.getCenter(shape)) < 12) {\n          bindingPoint = [0.5, 0.5]\n        } else {\n          bindingPoint = Vec.divV(Vec.sub(point, [expandedBounds.minX, expandedBounds.minY]), [\n            expandedBounds.width,\n            expandedBounds.height,\n          ])\n        }\n        distance = 0\n      } else {\n        let intersection = intersectRayEllipse(\n          origin,\n          direction,\n          center,\n          shape.radius[0],\n          shape.radius[1],\n          shape.rotation || 0\n        ).points.sort((a, b) => Vec.dist(a, origin) - Vec.dist(b, origin))[0]\n        if (!intersection) {\n          intersection = intersectLineSegmentEllipse(\n            point,\n            center,\n            center,\n            shape.radius[0],\n            shape.radius[1],\n            shape.rotation || 0\n          ).points.sort((a, b) => Vec.dist(a, point) - Vec.dist(b, point))[0]\n        }\n        if (!intersection) {\n          return undefined\n        }\n        // The anchor is a point between the handle and the intersection\n        const anchor = Vec.med(point, intersection)\n        if (Vec.distanceToLineSegment(point, anchor, this.getCenter(shape)) < 12) {\n          // If we're close to the center, snap to the center\n          bindingPoint = [0.5, 0.5]\n        } else {\n          // Or else calculate a normalized point\n          bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n            expandedBounds.width,\n            expandedBounds.height,\n          ])\n        }\n        if (\n          Utils.pointInEllipse(point, center, shape.radius[0], shape.radius[1], shape.rotation || 0)\n        ) {\n          // Pad the arrow out by 16 points\n          distance = this.bindingDistance / 2\n        } else {\n          // Find the distance between the point and the ellipse\n          const innerIntersection = intersectLineSegmentEllipse(\n            point,\n            center,\n            center,\n            shape.radius[0],\n            shape.radius[1],\n            shape.rotation || 0\n          ).points[0]\n          if (!innerIntersection) return undefined\n          distance = Math.max(this.bindingDistance / 2, Vec.dist(point, innerIntersection))\n        }\n      }\n      return {\n        point: bindingPoint,\n        distance,\n      }\n    }\n  }\n\n  transform = (\n    shape: T,\n    bounds: TLBounds,\n    { scaleX, scaleY, initialShape }: TransformInfo<T>\n  ): Partial<T> => {\n    const { rotation = 0 } = initialShape\n    return {\n      point: [bounds.minX, bounds.minY],\n      radius: [bounds.width / 2, bounds.height / 2],\n      rotation:\n        (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0)\n          ? -(rotation || 0)\n          : rotation || 0,\n    }\n  }\n\n  transformSingle = (shape: T, bounds: TLBounds): Partial<T> => {\n    return {\n      point: Vec.toFixed([bounds.minX, bounds.minY]),\n      radius: Vec.div([bounds.width, bounds.height], 2),\n    }\n  }\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import { Utils } from '@tldraw/core'\nimport { getStrokeOutlinePoints, getStrokePoints } from 'perfect-freehand'\nimport { EASINGS } from '~constants'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '../shared/shape-styles'\n\nexport function getEllipseStrokePoints(id: string, radius: number[], style: ShapeStyles) {\n  const { strokeWidth } = getShapeStyle(style)\n  const getRandom = Utils.rng(id)\n  const rx = radius[0] + getRandom() * strokeWidth * 2\n  const ry = radius[1] + getRandom() * strokeWidth * 2\n  const perimeter = Utils.perimeterOfEllipse(rx, ry)\n  const points: number[][] = []\n  const start = Math.PI + Math.PI * getRandom()\n  const extra = Math.abs(getRandom())\n  const count = Math.max(16, perimeter / 10)\n  for (let i = 0; i < count; i++) {\n    const t = EASINGS.easeInOutSine(i / (count + 1))\n    const rads = start * 2 + Math.PI * (2 + extra) * t\n    const c = Math.cos(rads)\n    const s = Math.sin(rads)\n    points.push([rx * c + radius[0], ry * s + radius[1], t + 0.5 + getRandom() / 2])\n  }\n  return getStrokePoints(points, {\n    size: 1 + strokeWidth * 2,\n    thinning: 0.618,\n    end: { taper: perimeter / 8 },\n    start: { taper: perimeter / 12 },\n    streamline: 0,\n    simulatePressure: true,\n  })\n}\n\nexport function getEllipsePath(id: string, radius: number[], style: ShapeStyles) {\n  const { strokeWidth } = getShapeStyle(style)\n  const getRandom = Utils.rng(id)\n  const rx = radius[0] + getRandom() * strokeWidth * 2\n  const ry = radius[1] + getRandom() * strokeWidth * 2\n  const perimeter = Utils.perimeterOfEllipse(rx, ry)\n  return Utils.getSvgPathFromStroke(\n    getStrokeOutlinePoints(getEllipseStrokePoints(id, radius, style), {\n      size: 2 + strokeWidth * 2,\n      thinning: 0.618,\n      end: { taper: perimeter / 8 },\n      start: { taper: perimeter / 12 },\n      streamline: 0,\n      simulatePressure: true,\n    })\n  )\n}\n\nexport function getEllipseIndicatorPath(id: string, radius: number[], style: ShapeStyles) {\n  return Utils.getSvgPathFromStroke(\n    getEllipseStrokePoints(id, radius, style).map((pt) => pt.point.slice(0, 2)),\n    false\n  )\n}\n", "import * as React from 'react'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getEllipseIndicatorPath, getEllipsePath } from '../ellipseHelpers'\n\ninterface EllipseSvgProps {\n  id: string\n  radius: number[]\n  style: ShapeStyles\n  isSelected: boolean\n  isDarkMode: boolean\n}\n\nexport const DrawEllipse = React.memo(function DrawEllipse({\n  id,\n  radius,\n  style,\n  isSelected,\n  isDarkMode,\n}: EllipseSvgProps) {\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n  const innerPath = getEllipsePath(id, radius, style)\n\n  return (\n    <>\n      <ellipse\n        className={style.isFilled || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        cx={radius[0]}\n        cy={radius[1]}\n        rx={radius[0]}\n        ry={radius[1]}\n      />\n      {style.isFilled && (\n        <path\n          d={getEllipseIndicatorPath(id, radius, style)}\n          stroke=\"none\"\n          fill={fill}\n          pointerEvents=\"none\"\n        />\n      )}\n      <path\n        d={innerPath}\n        fill={stroke}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        pointerEvents=\"none\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { Utils } from '@tldraw/core'\nimport type { ShapeStyles } from '~types'\nimport { getShapeStyle } from '~state/shapes/shared'\n\ninterface EllipseSvgProps {\n  radius: number[]\n  style: ShapeStyles\n  isSelected: boolean\n  isDarkMode: boolean\n}\n\nexport const DashedEllipse = React.memo(function DashedEllipse({\n  radius,\n  style,\n  isSelected,\n  isDarkMode,\n}: EllipseSvgProps) {\n  const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n  const sw = 1 + strokeWidth * 1.618\n  const rx = Math.max(0, radius[0] - sw / 2)\n  const ry = Math.max(0, radius[1] - sw / 2)\n  const perimeter = Utils.perimeterOfEllipse(rx, ry)\n  const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n    perimeter < 64 ? perimeter * 2 : perimeter,\n    strokeWidth * 1.618,\n    style.dash,\n    4\n  )\n\n  return (\n    <>\n      <ellipse\n        className={style.isFilled || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n        cx={radius[0]}\n        cy={radius[1]}\n        rx={radius[0]}\n        ry={radius[1]}\n      />\n      <ellipse\n        cx={radius[0]}\n        cy={radius[1]}\n        rx={rx}\n        ry={ry}\n        fill={fill}\n        stroke={stroke}\n        strokeWidth={sw}\n        strokeDasharray={strokeDasharray}\n        strokeDashoffset={strokeDashoffset}\n        pointerEvents=\"none\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </>\n  )\n})\n", "import * as React from 'react'\nimport { Utils, TLBounds, SVGContainer } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { defaultStyle } from '../shared/shape-styles'\nimport { ArrowShape, TransformInfo, Decoration, TDShapeType, DashStyle, TDMeta } from '~types'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  intersectArcBounds,\n  intersectLineSegmentBounds,\n  intersectLineSegmentLineSegment,\n} from '@tldraw/intersect'\nimport { GHOSTED_OPACITY } from '~constants'\nimport {\n  getArcLength,\n  getArcPoints,\n  getArrowPath,\n  getBendPoint,\n  getCtp,\n  isAngleBetween,\n} from './arrowHelpers'\nimport { styled } from '~styles'\nimport { TextLabel, getFontStyle, getShapeStyle } from '../shared'\nimport { getTextLabelSize } from '../shared/getTextSize'\nimport { StraightArrow } from './components/StraightArrow'\nimport { CurvedArrow } from './components/CurvedArrow.tsx'\nimport { LabelMask } from '../shared/LabelMask'\n\ntype T = ArrowShape\ntype E = HTMLDivElement\n\nexport class ArrowUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Arrow as const\n\n  hideBounds = true\n\n  canEdit = true\n\n  pathCache = new WeakMap<T, string>()\n\n  getShape = (props: Partial<T>): T => {\n    return {\n      id: 'id',\n      type: TDShapeType.Arrow,\n      name: 'Arrow',\n      parentId: 'page',\n      childIndex: 1,\n      point: [0, 0],\n      rotation: 0,\n      bend: 0,\n      handles: {\n        start: {\n          id: 'start',\n          index: 0,\n          point: [0, 0],\n          canBind: true,\n          ...props.handles?.start,\n        },\n        end: {\n          id: 'end',\n          index: 1,\n          point: [1, 1],\n          canBind: true,\n          ...props.handles?.end,\n        },\n        bend: {\n          id: 'bend',\n          index: 2,\n          point: [0.5, 0.5],\n          ...props.handles?.bend,\n        },\n      },\n      decorations: props.decorations ?? {\n        end: Decoration.Arrow,\n      },\n      style: {\n        ...defaultStyle,\n        isFilled: false,\n        ...props.style,\n      },\n      label: '',\n      labelPoint: [0.5, 0.5],\n      ...props,\n    }\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, isEditing, isGhost, meta, events, onShapeChange, onShapeBlur }, ref) => {\n      const {\n        id,\n        label = '',\n        handles: { start, bend, end },\n        decorations = {},\n        style,\n      } = shape\n\n      const hasLabel = label?.trim()?.length ?? 0 > 0\n\n      const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n\n      const font = getFontStyle(style)\n\n      const styles = getShapeStyle(style, meta.isDarkMode)\n\n      const labelSize = hasLabel || isEditing ? getTextLabelSize(label, font) : [0, 0]\n\n      const bounds = this.getBounds(shape)\n\n      const dist = React.useMemo(() => {\n        const { start, bend, end } = shape.handles\n        if (isStraightLine) return Vec.dist(start.point, end.point)\n        const circle = getCtp(start.point, bend.point, end.point)\n        const center = circle.slice(0, 2)\n        const radius = circle[2]\n        const length = getArcLength(center, radius, start.point, end.point)\n        return Math.abs(length)\n      }, [shape.handles])\n\n      const scale = Math.max(\n        0.5,\n        Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n      )\n\n      const offset = React.useMemo(() => {\n        const bounds = this.getBounds(shape)\n        const offset = Vec.sub(\n          shape.handles.bend.point,\n          Vec.toFixed([bounds.width / 2, bounds.height / 2])\n        )\n        return offset\n      }, [shape, scale])\n\n      const handleLabelChange = React.useCallback(\n        (label: string) => {\n          onShapeChange?.({ id, label })\n        },\n        [onShapeChange]\n      )\n\n      const Component = isStraightLine ? StraightArrow : CurvedArrow\n\n      return (\n        <FullWrapper ref={ref} {...events}>\n          <TextLabel\n            font={font}\n            text={label}\n            color={styles.stroke}\n            offsetX={offset[0]}\n            offsetY={offset[1]}\n            scale={scale}\n            isEditing={isEditing}\n            onChange={handleLabelChange}\n            onBlur={onShapeBlur}\n          />\n          <SVGContainer id={shape.id + '_svg'}>\n            <defs>\n              <mask id={shape.id + '_clip'}>\n                <rect\n                  x={-100}\n                  y={-100}\n                  width={bounds.width + 200}\n                  height={bounds.height + 200}\n                  fill=\"white\"\n                />\n                <rect\n                  x={bounds.width / 2 - (labelSize[0] / 2) * scale + offset[0]}\n                  y={bounds.height / 2 - (labelSize[1] / 2) * scale + offset[1]}\n                  width={labelSize[0] * scale}\n                  height={labelSize[1] * scale}\n                  rx={4 * scale}\n                  ry={4 * scale}\n                  fill=\"black\"\n                  opacity={1}\n                />\n              </mask>\n            </defs>\n            <g\n              pointerEvents=\"none\"\n              opacity={isGhost ? GHOSTED_OPACITY : 1}\n              mask={hasLabel || isEditing ? `url(#${shape.id}_clip)` : ``}\n            >\n              <Component\n                id={id}\n                style={style}\n                start={start.point}\n                end={end.point}\n                bend={bend.point}\n                arrowBend={shape.bend}\n                decorationStart={decorations?.start}\n                decorationEnd={decorations?.end}\n                isDraw={style.dash === DashStyle.Draw}\n                isDarkMode={meta.isDarkMode}\n              />\n            </g>\n          </SVGContainer>\n        </FullWrapper>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<ArrowShape>(({ shape, bounds }) => {\n    const {\n      style,\n      decorations,\n      label,\n      handles: { start, bend, end },\n    } = shape\n\n    const hasLabel = label?.trim()?.length ?? 0 > 0\n\n    const font = getFontStyle(style)\n    const labelSize = hasLabel ? getTextLabelSize(label!, font) : [0, 0]\n    const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n\n    const dist = React.useMemo(() => {\n      const { start, bend, end } = shape.handles\n      if (isStraightLine) return Vec.dist(start.point, end.point)\n      const circle = getCtp(start.point, bend.point, end.point)\n      const center = circle.slice(0, 2)\n      const radius = circle[2]\n      const length = getArcLength(center, radius, start.point, end.point)\n      return Math.abs(length)\n    }, [shape.handles])\n\n    const scale = Math.max(\n      0.5,\n      Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n    )\n\n    const offset = React.useMemo(() => {\n      const bounds = this.getBounds(shape)\n      const offset = Vec.sub(shape.handles.bend.point, [bounds.width / 2, bounds.height / 2])\n      return offset\n    }, [shape, scale])\n\n    return (\n      <>\n        {hasLabel && (\n          <LabelMask\n            id={shape.id}\n            scale={scale}\n            offset={offset}\n            bounds={bounds}\n            labelSize={labelSize}\n          />\n        )}\n        <path\n          d={getArrowPath(\n            style,\n            start.point,\n            bend.point,\n            end.point,\n            decorations?.start,\n            decorations?.end\n          )}\n          mask={hasLabel ? `url(#${shape.id}_clip)` : ``}\n        />\n        {hasLabel && (\n          <rect\n            x={bounds.width / 2 - (labelSize[0] / 2) * scale + offset[0]}\n            y={bounds.height / 2 - (labelSize[1] / 2) * scale + offset[1]}\n            width={labelSize[0] * scale}\n            height={labelSize[1] * scale}\n            rx={4 * scale}\n            ry={4 * scale}\n            fill=\"transparent\"\n          />\n        )}\n      </>\n    )\n  })\n\n  getBounds = (shape: T) => {\n    const bounds = Utils.getFromCache(this.boundsCache, shape, () => {\n      const {\n        handles: { start, bend, end },\n      } = shape\n      return Utils.getBoundsFromPoints(getArcPoints(start.point, bend.point, end.point))\n    })\n    return Utils.translateBounds(bounds, shape.point)\n  }\n\n  getRotatedBounds = (shape: T) => {\n    const {\n      handles: { start, bend, end },\n    } = shape\n    let points = getArcPoints(start.point, bend.point, end.point)\n    const { minX, minY, maxX, maxY } = Utils.getBoundsFromPoints(points)\n    if (shape.rotation !== 0) {\n      points = points.map((pt) =>\n        Vec.rotWith(pt, [(minX + maxX) / 2, (minY + maxY) / 2], shape.rotation || 0)\n      )\n    }\n\n    return Utils.translateBounds(Utils.getBoundsFromPoints(points), shape.point)\n  }\n\n  getCenter = (shape: T) => {\n    const { start, end } = shape.handles\n    return Vec.add(shape.point, Vec.med(start.point, end.point))\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return (\n      next.decorations !== prev.decorations ||\n      next.handles !== prev.handles ||\n      next.style !== prev.style ||\n      next.label !== prev.label\n    )\n  }\n\n  hitTestPoint = (shape: T, point: number[]): boolean => {\n    const {\n      handles: { start, bend, end },\n    } = shape\n    const pt = Vec.sub(point, shape.point)\n    const points = getArcPoints(start.point, bend.point, end.point)\n    for (let i = 1; i < points.length; i++) {\n      if (Vec.distanceToLineSegment(points[i - 1], points[i], pt) < 1) {\n        return true\n      }\n    }\n    return false\n  }\n\n  hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n    const {\n      handles: { start, bend, end },\n    } = shape\n    const ptA = Vec.sub(A, shape.point)\n    const ptB = Vec.sub(B, shape.point)\n    const points = getArcPoints(start.point, bend.point, end.point)\n    for (let i = 1; i < points.length; i++) {\n      if (intersectLineSegmentLineSegment(points[i - 1], points[i], ptA, ptB).didIntersect) {\n        return true\n      }\n    }\n    return false\n  }\n\n  hitTestBounds = (shape: T, bounds: TLBounds) => {\n    const { start, end, bend } = shape.handles\n    const sp = Vec.add(shape.point, start.point)\n    const ep = Vec.add(shape.point, end.point)\n    if (Utils.pointInBounds(sp, bounds) || Utils.pointInBounds(ep, bounds)) {\n      return true\n    }\n    if (Vec.isEqual(Vec.med(start.point, end.point), bend.point)) {\n      return intersectLineSegmentBounds(sp, ep, bounds).length > 0\n    } else {\n      const [cx, cy, r] = getCtp(start.point, bend.point, end.point)\n      const cp = Vec.add(shape.point, [cx, cy])\n      return intersectArcBounds(cp, r, sp, ep, bounds).length > 0\n    }\n  }\n\n  transform = (\n    shape: T,\n    bounds: TLBounds,\n    { initialShape, scaleX, scaleY }: TransformInfo<T>\n  ): Partial<T> => {\n    const initialShapeBounds = this.getBounds(initialShape)\n    const handles: (keyof T['handles'])[] = ['start', 'end']\n    const nextHandles = { ...initialShape.handles }\n    handles.forEach((handle) => {\n      const [x, y] = nextHandles[handle].point\n      const nw = x / initialShapeBounds.width\n      const nh = y / initialShapeBounds.height\n      nextHandles[handle] = {\n        ...nextHandles[handle],\n        point: [\n          bounds.width * (scaleX < 0 ? 1 - nw : nw),\n          bounds.height * (scaleY < 0 ? 1 - nh : nh),\n        ],\n      }\n    })\n    const { start, bend, end } = nextHandles\n    const dist = Vec.dist(start.point, end.point)\n    const midPoint = Vec.med(start.point, end.point)\n    const bendDist = (dist / 2) * initialShape.bend\n    const u = Vec.uni(Vec.vec(start.point, end.point))\n    const point = Vec.add(midPoint, Vec.mul(Vec.per(u), bendDist))\n    nextHandles['bend'] = {\n      ...bend,\n      point: Vec.toFixed(Math.abs(bendDist) < 10 ? midPoint : point),\n    }\n    return {\n      point: Vec.toFixed([bounds.minX, bounds.minY]),\n      handles: nextHandles,\n    }\n  }\n\n  onDoubleClickHandle = (shape: T, handle: Partial<T['handles']>): Partial<T> | void => {\n    switch (handle) {\n      case 'bend': {\n        return {\n          bend: 0,\n          handles: {\n            ...shape.handles,\n            bend: {\n              ...shape.handles.bend,\n              point: getBendPoint(shape.handles, shape.bend),\n            },\n          },\n        }\n      }\n      case 'start': {\n        return {\n          decorations: {\n            ...shape.decorations,\n            start: shape.decorations?.start ? undefined : Decoration.Arrow,\n          },\n        }\n      }\n      case 'end': {\n        return {\n          decorations: {\n            ...shape.decorations,\n            end: shape.decorations?.end ? undefined : Decoration.Arrow,\n          },\n        }\n      }\n    }\n\n    return this\n  }\n\n  onHandleChange = (shape: T, handles: Partial<T['handles']>): Partial<T> | void => {\n    let nextHandles = Utils.deepMerge<ArrowShape['handles']>(shape.handles, handles)\n    let nextBend = shape.bend\n\n    nextHandles = Utils.deepMerge(nextHandles, {\n      start: {\n        point: Vec.toFixed(nextHandles.start.point),\n      },\n      end: {\n        point: Vec.toFixed(nextHandles.end.point),\n      },\n    })\n\n    // This will produce NaN values\n    if (Vec.isEqual(nextHandles.start.point, nextHandles.end.point)) return\n\n    // If the user is moving the bend handle, we want to move the bend point\n    if ('bend' in handles) {\n      const { start, end, bend } = nextHandles\n\n      const distance = Vec.dist(start.point, end.point)\n      const midPoint = Vec.med(start.point, end.point)\n      const angle = Vec.angle(start.point, end.point)\n      const u = Vec.uni(Vec.vec(start.point, end.point))\n\n      // Create a line segment perendicular to the line between the start and end points\n      const ap = Vec.add(midPoint, Vec.mul(Vec.per(u), distance))\n      const bp = Vec.sub(midPoint, Vec.mul(Vec.per(u), distance))\n\n      const bendPoint = Vec.nearestPointOnLineSegment(ap, bp, bend.point, true)\n\n      // Find the distance between the midpoint and the nearest point on the\n      // line segment to the bend handle's dragged point\n      const bendDist = Vec.dist(midPoint, bendPoint)\n\n      // The shape's \"bend\" is the ratio of the bend to the distance between\n      // the start and end points. If the bend is below a certain amount, the\n      // bend should be zero.\n      const realBend = bendDist / (distance / 2)\n\n      nextBend = Utils.clamp(realBend, -0.99, 0.99)\n\n      // If the point is to the left of the line segment, we make the bend\n      // negative, otherwise it's positive.\n      const angleToBend = Vec.angle(start.point, bendPoint)\n\n      // If resulting bend is low enough that the handle will snap to center,\n      // then also snap the bend to center\n\n      if (Vec.isEqual(midPoint, getBendPoint(nextHandles, nextBend))) {\n        nextBend = 0\n      } else if (isAngleBetween(angle, angle + Math.PI, angleToBend)) {\n        // Otherwise, fix the bend direction\n        nextBend *= -1\n      }\n    }\n\n    const nextShape = {\n      point: shape.point,\n      bend: nextBend,\n      handles: {\n        ...nextHandles,\n        bend: {\n          ...nextHandles.bend,\n          point: getBendPoint(nextHandles, nextBend),\n        },\n      },\n    }\n\n    // Zero out the handles to prevent handles with negative points. If a handle's x or y\n    // is below zero, we need to move the shape left or up to make it zero.\n    const topLeft = shape.point\n\n    const nextBounds = this.getBounds({ ...nextShape } as ArrowShape)\n\n    const offset = Vec.sub([nextBounds.minX, nextBounds.minY], topLeft)\n\n    if (!Vec.isEqual(offset, [0, 0])) {\n      Object.values(nextShape.handles).forEach((handle) => {\n        handle.point = Vec.toFixed(Vec.sub(handle.point, offset))\n      })\n      nextShape.point = Vec.toFixed(Vec.add(nextShape.point, offset))\n    }\n\n    return nextShape\n  }\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import { Utils } from '@tldraw/core'\nimport { intersectCircleCircle, intersectCircleLineSegment } from '@tldraw/intersect'\nimport Vec from '@tldraw/vec'\nimport getStroke from 'perfect-freehand'\nimport { EASINGS } from '~constants'\nimport { getShapeStyle } from '../shared/shape-styles'\nimport type { ArrowShape, Decoration, ShapeStyles } from '~types'\nimport { TLDR } from '../../TLDR'\n\nexport function getArrowArcPath(start: number[], end: number[], circle: number[], bend: number) {\n  return [\n    'M',\n    start[0],\n    start[1],\n    'A',\n    circle[2],\n    circle[2],\n    0,\n    0,\n    bend < 0 ? 0 : 1,\n    end[0],\n    end[1],\n  ].join(' ')\n}\n\nexport function getBendPoint(handles: ArrowShape['handles'], bend: number) {\n  const { start, end } = handles\n\n  const dist = Vec.dist(start.point, end.point)\n\n  const midPoint = Vec.med(start.point, end.point)\n\n  const bendDist = (dist / 2) * bend\n\n  const u = Vec.uni(Vec.vec(start.point, end.point))\n\n  const point = Vec.toFixed(\n    Math.abs(bendDist) < 10 ? midPoint : Vec.add(midPoint, Vec.mul(Vec.per(u), bendDist))\n  )\n\n  return point\n}\n\nexport function renderFreehandArrowShaft(\n  id: string,\n  style: ShapeStyles,\n  start: number[],\n  end: number[],\n  decorationStart: Decoration | undefined,\n  decorationEnd: Decoration | undefined\n) {\n  const getRandom = Utils.rng(id)\n  const strokeWidth = getShapeStyle(style).strokeWidth\n  const startPoint = decorationStart ? Vec.nudge(start, end, strokeWidth) : start\n  const endPoint = decorationEnd ? Vec.nudge(end, start, strokeWidth) : end\n  const stroke = getStroke([startPoint, endPoint], {\n    size: strokeWidth,\n    thinning: 0.618 + getRandom() * 0.2,\n    easing: EASINGS.easeOutQuad,\n    simulatePressure: true,\n    streamline: 0,\n    last: true,\n  })\n  return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function renderCurvedFreehandArrowShaft(\n  id: string,\n  style: ShapeStyles,\n  start: number[],\n  end: number[],\n  decorationStart: Decoration | undefined,\n  decorationEnd: Decoration | undefined,\n  center: number[],\n  radius: number,\n  length: number,\n  easing: (t: number) => number\n) {\n  const getRandom = Utils.rng(id)\n  const strokeWidth = getShapeStyle(style).strokeWidth\n  const startPoint = decorationStart ? Vec.rotWith(start, center, strokeWidth / length) : start\n  const endPoint = decorationEnd ? Vec.rotWith(end, center, -(strokeWidth / length)) : end\n  const startAngle = Vec.angle(center, startPoint)\n  const endAngle = Vec.angle(center, endPoint)\n  const points: number[][] = []\n  const count = 8 + Math.floor((Math.abs(length) / 20) * 1 + getRandom() / 2)\n  for (let i = 0; i < count; i++) {\n    const t = easing(i / count)\n    const angle = Utils.lerpAngles(startAngle, endAngle, t)\n    points.push(Vec.toFixed(Vec.nudgeAtAngle(center, angle, radius)))\n  }\n  const stroke = getStroke([startPoint, ...points, endPoint], {\n    size: 1 + strokeWidth,\n    thinning: 0.618 + getRandom() * 0.2,\n    easing: EASINGS.easeOutQuad,\n    simulatePressure: false,\n    streamline: 0,\n    last: true,\n  })\n  return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getCtp(start: number[], bend: number[], end: number[]) {\n  return Utils.circleFromThreePoints(start, end, bend)\n}\n\nexport function getCurvedArrowHeadPoints(\n  A: number[],\n  r1: number,\n  C: number[],\n  r2: number,\n  sweep: boolean\n) {\n  const ints = intersectCircleCircle(A, r1 * 0.618, C, r2).points\n  if (!ints) {\n    TLDR.warn('Could not find an intersection for the arrow head.')\n    return { left: A, right: A }\n  }\n  const int = sweep ? ints[0] : ints[1]\n  const left = int ? Vec.nudge(Vec.rotWith(int, A, Math.PI / 6), A, r1 * -0.382) : A\n  const right = int ? Vec.nudge(Vec.rotWith(int, A, -Math.PI / 6), A, r1 * -0.382) : A\n  return { left, right }\n}\n\nexport function getStraightArrowHeadPoints(A: number[], B: number[], r: number) {\n  const ints = intersectCircleLineSegment(A, r, A, B).points\n  if (!ints) {\n    TLDR.warn('Could not find an intersection for the arrow head.')\n    return { left: A, right: A }\n  }\n  const int = ints[0]\n  const left = int ? Vec.rotWith(int, A, Math.PI / 6) : A\n  const right = int ? Vec.rotWith(int, A, -Math.PI / 6) : A\n  return { left, right }\n}\n\nexport function getCurvedArrowHeadPath(\n  A: number[],\n  r1: number,\n  C: number[],\n  r2: number,\n  sweep: boolean\n) {\n  const { left, right } = getCurvedArrowHeadPoints(A, r1, C, r2, sweep)\n  return `M ${left} L ${A} ${right}`\n}\n\nexport function getStraightArrowHeadPath(A: number[], B: number[], r: number) {\n  const { left, right } = getStraightArrowHeadPoints(A, B, r)\n  return `M ${left} L ${A} ${right}`\n}\n\nexport function getArrowPath(\n  style: ShapeStyles,\n  start: number[],\n  bend: number[],\n  end: number[],\n  decorationStart: Decoration | undefined,\n  decorationEnd: Decoration | undefined\n) {\n  const { strokeWidth } = getShapeStyle(style, false)\n  const arrowDist = Vec.dist(start, end)\n  const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n  const path: (string | number)[] = []\n  const isStraightLine = Vec.dist(bend, Vec.toFixed(Vec.med(start, end))) < 1\n  if (isStraightLine) {\n    path.push(`M ${start} L ${end}`)\n    if (decorationStart) {\n      path.push(getStraightArrowHeadPath(start, end, arrowHeadLength))\n    }\n    if (decorationEnd) {\n      path.push(getStraightArrowHeadPath(end, start, arrowHeadLength))\n    }\n  } else {\n    const circle = getCtp(start, bend, end)\n    const center = [circle[0], circle[1]]\n    const radius = circle[2]\n    const length = getArcLength(center, radius, start, end)\n    path.push(`M ${start} A ${radius} ${radius} 0 0 ${length > 0 ? '1' : '0'} ${end}`)\n    if (decorationStart)\n      path.push(getCurvedArrowHeadPath(start, arrowHeadLength, center, radius, length < 0))\n    if (decorationEnd) {\n      path.push(getCurvedArrowHeadPath(end, arrowHeadLength, center, radius, length >= 0))\n    }\n  }\n  return path.join(' ')\n}\n\nexport function getArcPoints(start: number[], bend: number[], end: number[]) {\n  if (Vec.dist2(bend, Vec.med(start, end)) <= 4) return [start, end]\n  // The arc is curved; calculate twenty points along the arc\n  const points: number[][] = []\n  const circle = getCtp(start, bend, end)\n  const center = [circle[0], circle[1]]\n  const radius = circle[2]\n  const startAngle = Vec.angle(center, start)\n  const endAngle = Vec.angle(center, end)\n  for (let i = 1 / 20; i < 1; i += 1 / 20) {\n    const angle = Utils.lerpAngles(startAngle, endAngle, i)\n    points.push(Vec.nudgeAtAngle(center, angle, radius))\n  }\n  return points\n}\n\nexport function isAngleBetween(a: number, b: number, c: number): boolean {\n  if (c === a || c === b) return true\n  const PI2 = Math.PI * 2\n  const AB = (b - a + PI2) % PI2\n  const AC = (c - a + PI2) % PI2\n  return AB <= Math.PI !== AC > AB\n}\n\nexport function getArcLength(C: number[], r: number, A: number[], B: number[]): number {\n  const sweep = Utils.getSweep(C, A, B)\n  return r * (2 * Math.PI) * (sweep / (2 * Math.PI))\n}\n", "import { Utils } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport * as React from 'react'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { Decoration, ShapeStyles } from '~types'\nimport { getStraightArrowHeadPoints, renderFreehandArrowShaft } from '../arrowHelpers'\nimport { Arrowhead } from './ArrowHead'\n\ninterface ArrowSvgProps {\n  id: string\n  style: ShapeStyles\n  start: number[]\n  bend: number[]\n  end: number[]\n  arrowBend: number\n  decorationStart: Decoration | undefined\n  decorationEnd: Decoration | undefined\n  isDarkMode: boolean\n  isDraw: boolean\n}\n\nexport const StraightArrow = React.memo(function StraightArrow({\n  id,\n  style,\n  start,\n  end,\n  decorationStart,\n  decorationEnd,\n  isDraw,\n  isDarkMode,\n}: ArrowSvgProps) {\n  const arrowDist = Vec.dist(start, end)\n  if (arrowDist < 2) return null\n  const styles = getShapeStyle(style, isDarkMode)\n  const { strokeWidth } = styles\n  const sw = 1 + strokeWidth * 1.618\n  // Path between start and end points\n  const path = isDraw\n    ? renderFreehandArrowShaft(id, style, start, end, decorationStart, decorationEnd)\n    : 'M' + Vec.toFixed(start) + 'L' + Vec.toFixed(end)\n  const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n    arrowDist,\n    strokeWidth * 1.618,\n    style.dash,\n    2,\n    false\n  )\n  // Arrowheads\n  const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n  const startArrowHead = decorationStart\n    ? getStraightArrowHeadPoints(start, end, arrowHeadLength)\n    : null\n  const endArrowHead = decorationEnd\n    ? getStraightArrowHeadPoints(end, start, arrowHeadLength)\n    : null\n  return (\n    <>\n      <path className=\"tl-stroke-hitarea\" d={path} />\n      <path\n        d={path}\n        fill={styles.stroke}\n        stroke={styles.stroke}\n        strokeWidth={isDraw ? sw / 2 : sw}\n        strokeDasharray={strokeDasharray}\n        strokeDashoffset={strokeDashoffset}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        pointerEvents=\"stroke\"\n      />\n      {startArrowHead && (\n        <Arrowhead\n          left={startArrowHead.left}\n          middle={start}\n          right={startArrowHead.right}\n          stroke={styles.stroke}\n          strokeWidth={sw}\n        />\n      )}\n      {endArrowHead && (\n        <Arrowhead\n          left={endArrowHead.left}\n          middle={end}\n          right={endArrowHead.right}\n          stroke={styles.stroke}\n          strokeWidth={sw}\n        />\n      )}\n    </>\n  )\n})\n", "import * as React from 'react'\n\nexport interface ArrowheadProps {\n  left: number[]\n  middle: number[]\n  right: number[]\n  stroke: string\n  strokeWidth: number\n}\n\nexport function Arrowhead({ left, middle, right, stroke, strokeWidth }: ArrowheadProps) {\n  return (\n    <g>\n      <path className=\"tl-stroke-hitarea\" d={`M ${left} L ${middle} ${right}`} />\n      <path\n        d={`M ${left} L ${middle} ${right}`}\n        fill=\"none\"\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        pointerEvents=\"none\"\n      />\n    </g>\n  )\n}\n", "import { Utils } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport * as React from 'react'\nimport { EASINGS } from '~constants'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { Decoration, ShapeStyles } from '~types'\nimport {\n  getArcLength,\n  getArrowArcPath,\n  getCtp,\n  getCurvedArrowHeadPoints,\n  renderCurvedFreehandArrowShaft,\n} from '../arrowHelpers'\nimport { Arrowhead } from './ArrowHead'\n\ninterface ArrowSvgProps {\n  id: string\n  style: ShapeStyles\n  start: number[]\n  bend: number[]\n  end: number[]\n  arrowBend: number\n  decorationStart: Decoration | undefined\n  decorationEnd: Decoration | undefined\n  isDarkMode: boolean\n  isDraw: boolean\n}\n\nexport const CurvedArrow = React.memo(function CurvedArrow({\n  id,\n  style,\n  start,\n  bend,\n  end,\n  arrowBend,\n  decorationStart,\n  decorationEnd,\n  isDraw,\n  isDarkMode,\n}: ArrowSvgProps) {\n  const arrowDist = Vec.dist(start, end)\n  if (arrowDist < 2) return null\n  const styles = getShapeStyle(style, isDarkMode)\n  const { strokeWidth } = styles\n  const sw = 1 + strokeWidth * 1.618\n  // Calculate a path as a segment of a circle passing through the three points start, bend, and end\n  const circle = getCtp(start, bend, end)\n  const center = [circle[0], circle[1]]\n  const radius = circle[2]\n  const length = getArcLength(center, radius, start, end)\n  const getRandom = Utils.rng(id)\n  const easing = EASINGS[getRandom() > 0 ? 'easeInOutSine' : 'easeInOutCubic']\n  const path = isDraw\n    ? renderCurvedFreehandArrowShaft(\n        id,\n        style,\n        start,\n        end,\n        decorationStart,\n        decorationEnd,\n        center,\n        radius,\n        length,\n        easing\n      )\n    : getArrowArcPath(start, end, circle, arrowBend)\n  const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n    Math.abs(length),\n    sw,\n    style.dash,\n    2,\n    false\n  )\n  // Arrowheads\n  const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n  const startArrowHead = decorationStart\n    ? getCurvedArrowHeadPoints(start, arrowHeadLength, center, radius, length < 0)\n    : null\n  const endArrowHead = decorationEnd\n    ? getCurvedArrowHeadPoints(end, arrowHeadLength, center, radius, length >= 0)\n    : null\n  return (\n    <>\n      <path className=\"tl-stroke-hitarea\" d={path} />\n      <path\n        d={path}\n        fill={isDraw ? styles.stroke : 'none'}\n        stroke={styles.stroke}\n        strokeWidth={isDraw ? 0 : sw}\n        strokeDasharray={strokeDasharray}\n        strokeDashoffset={strokeDashoffset}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        pointerEvents=\"none\"\n      />\n      {startArrowHead && (\n        <Arrowhead\n          left={startArrowHead.left}\n          middle={start}\n          right={startArrowHead.right}\n          stroke={styles.stroke}\n          strokeWidth={sw}\n        />\n      )}\n      {endArrowHead && (\n        <Arrowhead\n          left={endArrowHead.left}\n          middle={end}\n          right={endArrowHead.right}\n          stroke={styles.stroke}\n          strokeWidth={sw}\n        />\n      )}\n    </>\n  )\n})\n", "import type { TLBounds } from '@tldraw/core'\nimport * as React from 'react'\n\ninterface WithLabelMaskProps {\n  id: string\n  bounds: TLBounds\n  labelSize: number[]\n  offset?: number[]\n  scale?: number\n}\n\nexport function LabelMask({ id, bounds, labelSize, offset, scale = 1 }: WithLabelMaskProps) {\n  return (\n    <defs>\n      <mask id={id + '_clip'}>\n        <rect\n          x={-100}\n          y={-100}\n          width={bounds.width + 200}\n          height={bounds.height + 200}\n          fill=\"white\"\n        />\n        <rect\n          x={bounds.width / 2 - (labelSize[0] / 2) * scale + (offset?.[0] || 0)}\n          y={bounds.height / 2 - (labelSize[1] / 2) * scale + (offset?.[1] || 0)}\n          width={labelSize[0] * scale}\n          height={labelSize[1] * scale}\n          rx={4 * scale}\n          ry={4 * scale}\n          fill=\"black\"\n          opacity={Math.max(scale, 0.8)}\n        />\n      </mask>\n    </defs>\n  )\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { Utils, SVGContainer } from '@tldraw/core'\nimport { defaultStyle } from '../shared/shape-styles'\nimport { TDShapeType, GroupShape, ColorStyle, TDMeta } from '~types'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getBoundsRectangle } from '../shared'\n\ntype T = GroupShape\ntype E = SVGSVGElement\n\nexport class GroupUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Group as const\n\n  canBind = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Group,\n        name: 'Group',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [100, 100],\n        rotation: 0,\n        children: [],\n        style: defaultStyle,\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, isBinding, isGhost, isHovered, isSelected, events }, ref) => {\n      const { id, size } = shape\n\n      const sw = 2\n      const w = Math.max(0, size[0] - sw / 2)\n      const h = Math.max(0, size[1] - sw / 2)\n\n      const strokes: [number[], number[], number][] = [\n        [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n        [[w, sw / 2], [w, h], h - sw / 2],\n        [[w, h], [sw / 2, h], w - sw / 2],\n        [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n      ]\n\n      const paths = strokes.map(([start, end], i) => {\n        return <line key={id + '_' + i} x1={start[0]} y1={start[1]} x2={end[0]} y2={end[1]} />\n      })\n\n      return (\n        <SVGContainer ref={ref} {...events}>\n          {isBinding && (\n            <rect className=\"tl-binding-indicator\" strokeWidth={this.bindingDistance} />\n          )}\n          <g opacity={isGhost ? GHOSTED_OPACITY : 1}>\n            <rect\n              x={0}\n              y={0}\n              width={size[0]}\n              height={size[1]}\n              fill=\"transparent\"\n              pointerEvents=\"all\"\n            />\n            <ScaledLines\n              stroke={ColorStyle.Black}\n              opacity={isHovered || isSelected ? 1 : 0}\n              strokeLinecap=\"round\"\n              pointerEvents=\"stroke\"\n            >\n              {paths}\n            </ScaledLines>\n          </g>\n        </SVGContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const { id, size } = shape\n\n    const sw = 2\n    const w = Math.max(0, size[0] - sw / 2)\n    const h = Math.max(0, size[1] - sw / 2)\n\n    const strokes: [number[], number[], number][] = [\n      [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n      [[w, sw / 2], [w, h], h - sw / 2],\n      [[w, h], [sw / 2, h], w - sw / 2],\n      [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n    ]\n\n    const paths = strokes.map(([start, end], i) => {\n      return <line key={id + '_' + i} x1={start[0]} y1={start[1]} x2={end[0]} y2={end[1]} />\n    })\n\n    return (\n      <ScaledLines strokeLinecap=\"round\" pointerEvents=\"stroke\">\n        {paths}\n      </ScaledLines>\n    )\n  })\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style\n  }\n}\n\nconst ScaledLines = styled('g', {\n  strokeWidth: 'calc(1.5px * var(--tl-scale))',\n  strokeDasharray: `calc(1px * var(--tl-scale)), calc(3px * var(--tl-scale))`,\n})\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { AlignStyle, StickyShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { defaultTextStyle, getBoundsRectangle, TextAreaUtils } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getStickyFontStyle, getStickyShapeStyle } from '../shared/shape-styles'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TLDR } from '~state/TLDR'\nimport { getTextSvgElement } from '../shared/getTextSvgElement'\nimport { stopPropagation } from '~components/stopPropagation'\n\ntype T = StickyShape\ntype E = HTMLDivElement\n\nexport class StickyUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Sticky as const\n\n  canBind = true\n\n  canEdit = true\n\n  canClone = true\n\n  hideResizeHandles = true\n\n  showCloneHandles = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Sticky,\n        name: 'Sticky',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [200, 200],\n        text: '',\n        rotation: 0,\n        style: defaultTextStyle,\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, events, isGhost, isBinding, isEditing, onShapeBlur, onShapeChange }, ref) => {\n      const font = getStickyFontStyle(shape.style)\n\n      const { color, fill } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n      const rContainer = React.useRef<HTMLDivElement>(null)\n\n      const rTextArea = React.useRef<HTMLTextAreaElement>(null)\n\n      const rText = React.useRef<HTMLDivElement>(null)\n\n      const rIsMounted = React.useRef(false)\n\n      const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n        e.stopPropagation()\n      }, [])\n\n      const onChange = React.useCallback(\n        (text: string) => {\n          onShapeChange?.({\n            id: shape.id,\n            type: shape.type,\n            text: TLDR.normalizeText(text),\n          })\n        },\n        [shape.id]\n      )\n\n      const handleTextChange = React.useCallback(\n        (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n          onChange(e.currentTarget.value)\n        },\n        [onShapeChange, onChange]\n      )\n\n      const handleKeyDown = React.useCallback(\n        (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n          if (e.key === 'Escape') {\n            e.preventDefault()\n            e.stopPropagation()\n            onShapeBlur?.()\n            return\n          }\n\n          if (e.key === 'Tab' && shape.text.length === 0) {\n            e.preventDefault()\n            return\n          }\n\n          if (!(e.key === 'Meta' || e.metaKey)) {\n            e.stopPropagation()\n          } else if (e.key === 'z' && e.metaKey) {\n            if (e.shiftKey) {\n              document.execCommand('redo', false)\n            } else {\n              document.execCommand('undo', false)\n            }\n            e.stopPropagation()\n            e.preventDefault()\n            return\n          }\n          if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n            e.preventDefault()\n          }\n          if (e.key === 'Tab') {\n            e.preventDefault()\n            if (e.shiftKey) {\n              TextAreaUtils.unindent(e.currentTarget)\n            } else {\n              TextAreaUtils.indent(e.currentTarget)\n            }\n\n            onShapeChange?.({ ...shape, text: TLDR.normalizeText(e.currentTarget.value) })\n          }\n        },\n        [shape, onShapeChange]\n      )\n\n      const handleBlur = React.useCallback((e: React.FocusEvent<HTMLTextAreaElement>) => {\n        e.currentTarget.setSelectionRange(0, 0)\n        onShapeBlur?.()\n      }, [])\n\n      const handleFocus = React.useCallback(\n        (e: React.FocusEvent<HTMLTextAreaElement>) => {\n          if (!isEditing) return\n          if (!rIsMounted.current) return\n          e.currentTarget.select()\n        },\n        [isEditing]\n      )\n\n      // Focus when editing changes to true\n      React.useEffect(() => {\n        if (isEditing) {\n          rIsMounted.current = true\n          const elm = rTextArea.current!\n          elm.focus()\n          elm.select()\n        }\n      }, [isEditing])\n\n      // Resize to fit text\n      React.useEffect(() => {\n        const text = rText.current!\n\n        const { size } = shape\n        const { offsetHeight: currTextHeight } = text\n        const minTextHeight = MIN_CONTAINER_HEIGHT - PADDING * 2\n        const prevTextHeight = size[1] - PADDING * 2\n\n        // Same size? We can quit here\n        if (currTextHeight === prevTextHeight) return\n\n        if (currTextHeight > minTextHeight) {\n          // Snap the size to the text content if the text only when the\n          // text is larger than the minimum text height.\n          onShapeChange?.({ id: shape.id, size: [size[0], currTextHeight + PADDING * 2] })\n          return\n        }\n\n        if (currTextHeight < minTextHeight && size[1] > MIN_CONTAINER_HEIGHT) {\n          // If we're smaller than the minimum height and the container\n          // is too tall, snap it down to the minimum container height\n          onShapeChange?.({ id: shape.id, size: [size[0], MIN_CONTAINER_HEIGHT] })\n          return\n        }\n\n        const textarea = rTextArea.current\n        textarea?.focus()\n      }, [shape.text, shape.size[1], shape.style])\n\n      const style = {\n        font,\n        color,\n        textShadow: meta.isDarkMode\n          ? `0.5px 0.5px 2px rgba(255, 255, 255,.25)`\n          : `0.5px 0.5px 2px rgba(255, 255, 255,.5)`,\n      }\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <StyledStickyContainer\n            ref={rContainer}\n            isDarkMode={meta.isDarkMode}\n            isGhost={isGhost}\n            style={{ backgroundColor: fill, ...style }}\n          >\n            {isBinding && (\n              <div\n                className=\"tl-binding-indicator\"\n                style={{\n                  position: 'absolute',\n                  top: -this.bindingDistance,\n                  left: -this.bindingDistance,\n                  width: `calc(100% + ${this.bindingDistance * 2}px)`,\n                  height: `calc(100% + ${this.bindingDistance * 2}px)`,\n                  backgroundColor: 'var(--tl-selectFill)',\n                }}\n              />\n            )}\n            <StyledText ref={rText} isEditing={isEditing} alignment={shape.style.textAlign}>\n              {shape.text}&#8203;\n            </StyledText>\n            {isEditing && (\n              <StyledTextArea\n                ref={rTextArea}\n                onPointerDown={handlePointerDown}\n                value={shape.text}\n                onChange={handleTextChange}\n                onKeyDown={handleKeyDown}\n                onFocus={handleFocus}\n                onBlur={handleBlur}\n                tabIndex={-1}\n                autoComplete=\"false\"\n                autoCapitalize=\"false\"\n                autoCorrect=\"false\"\n                autoSave=\"false\"\n                autoFocus\n                spellCheck={true}\n                alignment={shape.style.textAlign}\n                onContextMenu={stopPropagation}\n                onCopy={stopPropagation}\n                onPaste={stopPropagation}\n                onCut={stopPropagation}\n              />\n            )}\n          </StyledStickyContainer>\n        </HTMLContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const {\n      size: [width, height],\n    } = shape\n\n    return (\n      <rect x={0} y={0} rx={3} ry={3} width={Math.max(1, width)} height={Math.max(1, height)} />\n    )\n  })\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style || next.text !== prev.text\n  }\n\n  transform = (\n    shape: T,\n    bounds: TLBounds,\n    { scaleX, scaleY, transformOrigin }: TransformInfo<T>\n  ): Partial<T> => {\n    const point = Vec.toFixed([\n      bounds.minX +\n        (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]),\n      bounds.minY +\n        (bounds.height - shape.size[1]) *\n          (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]),\n    ])\n\n    return {\n      point,\n    }\n  }\n\n  transformSingle = (shape: T): Partial<T> => {\n    return shape\n  }\n\n  getSvgElement = (shape: T, isDarkMode: boolean): SVGElement | void => {\n    const bounds = this.getBounds(shape)\n    const textBounds = Utils.expandBounds(bounds, -PADDING)\n    const textElm = getTextSvgElement(shape.text, shape.style, textBounds)\n    const style = getStickyShapeStyle(shape.style, isDarkMode)\n    textElm.setAttribute('fill', style.color)\n    textElm.setAttribute('transform', `translate(${PADDING}, ${PADDING})`)\n\n    const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n    const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n    rect.setAttribute('width', bounds.width + '')\n    rect.setAttribute('height', bounds.height + '')\n    rect.setAttribute('fill', style.fill)\n    rect.setAttribute('rx', '3')\n    rect.setAttribute('ry', '3')\n\n    g.appendChild(rect)\n    g.appendChild(textElm)\n\n    return g\n  }\n}\n\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\nconst PADDING = 16\nconst MIN_CONTAINER_HEIGHT = 200\n\nconst StyledStickyContainer = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  backgroundColor: 'rgba(255, 220, 100)',\n  fontFamily: 'sans-serif',\n  height: '100%',\n  width: '100%',\n  padding: PADDING + 'px',\n  borderRadius: '3px',\n  perspective: '800px',\n  variants: {\n    isGhost: {\n      false: { opacity: 1 },\n      true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n    },\n    isDarkMode: {\n      true: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n      },\n      false: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16),  1px 1px 2px rgba(0,0,0,.16)',\n      },\n    },\n  },\n})\n\nconst commonTextWrapping = {\n  whiteSpace: 'pre-wrap',\n  overflowWrap: 'break-word',\n}\n\nconst StyledText = styled('div', {\n  position: 'absolute',\n  top: PADDING,\n  left: PADDING,\n  width: `calc(100% - ${PADDING * 2}px)`,\n  height: 'fit-content',\n  font: 'inherit',\n  pointerEvents: 'none',\n  userSelect: 'none',\n  variants: {\n    isEditing: {\n      true: {\n        opacity: 1,\n      },\n      false: {\n        opacity: 1,\n      },\n    },\n    alignment: {\n      [AlignStyle.Start]: {\n        textAlign: 'left',\n      },\n      [AlignStyle.Middle]: {\n        textAlign: 'center',\n      },\n      [AlignStyle.End]: {\n        textAlign: 'right',\n      },\n      [AlignStyle.Justify]: {\n        textAlign: 'justify',\n      },\n    },\n  },\n  ...commonTextWrapping,\n})\n\nconst StyledTextArea = styled('textarea', {\n  width: '100%',\n  height: '100%',\n  border: 'none',\n  overflow: 'hidden',\n  background: 'none',\n  outline: 'none',\n  textAlign: 'left',\n  font: 'inherit',\n  padding: 0,\n  color: 'transparent',\n  verticalAlign: 'top',\n  resize: 'none',\n  caretColor: 'black',\n  ...commonTextWrapping,\n  variants: {\n    alignment: {\n      [AlignStyle.Start]: {\n        textAlign: 'left',\n      },\n      [AlignStyle.Middle]: {\n        textAlign: 'center',\n      },\n      [AlignStyle.End]: {\n        textAlign: 'right',\n      },\n      [AlignStyle.Justify]: {\n        textAlign: 'justify',\n      },\n    },\n  },\n  '&:focus': {\n    outline: 'none',\n    border: 'none',\n  },\n})\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { TextShape, TDMeta, TDShapeType, TransformInfo, AlignStyle } from '~types'\nimport { BINDING_DISTANCE, GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport { stopPropagation } from '~components/stopPropagation'\nimport {\n  getTextSvgElement,\n  TextAreaUtils,\n  defaultTextStyle,\n  getShapeStyle,\n  getFontStyle,\n  getTextAlign,\n} from '../shared'\n\ntype T = TextShape\ntype E = HTMLDivElement\n\nexport class TextUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Text as const\n\n  isAspectRatioLocked = true\n\n  canEdit = true\n\n  canBind = true\n\n  canClone = true\n\n  bindingDistance = BINDING_DISTANCE / 2\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Text,\n        name: 'Text',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        rotation: 0,\n        text: ' ',\n        style: defaultTextStyle,\n      },\n      props\n    )\n  }\n\n  texts = new Map<string, string>()\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, isBinding, isGhost, isEditing, onShapeBlur, onShapeChange, meta, events }, ref) => {\n      const { text, style } = shape\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const font = getFontStyle(shape.style)\n      const rInput = React.useRef<HTMLTextAreaElement>(null)\n      const rIsMounted = React.useRef(false)\n\n      const rEditedText = React.useRef(text)\n\n      React.useLayoutEffect(() => {\n        if (text !== rEditedText.current) {\n          let delta = [0, 0]\n          this.texts.set(shape.id, text)\n          const currentBounds = this.getBounds(shape)\n          const nextBounds = this.getBounds(shape)\n          switch (shape.style.textAlign) {\n            case AlignStyle.Start: {\n              break\n            }\n            case AlignStyle.Middle: {\n              delta = Vec.div([nextBounds.width - currentBounds.width, 0], 2)\n              break\n            }\n            case AlignStyle.End: {\n              delta = [nextBounds.width - currentBounds.width, 0]\n              break\n            }\n          }\n\n          rEditedText.current = text\n\n          onShapeChange?.({\n            ...shape,\n            id: shape.id,\n            point: Vec.sub(shape.point, delta),\n            text,\n          })\n        }\n      }, [text])\n\n      const handleChange = React.useCallback(\n        (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n          let delta = [0, 0]\n          const newText = TLDR.normalizeText(e.currentTarget.value)\n          const currentBounds = this.getBounds(shape)\n          this.texts.set(shape.id, newText)\n          const nextBounds = this.getBounds({\n            ...shape,\n            text: newText,\n          })\n\n          switch (shape.style.textAlign) {\n            case AlignStyle.Start: {\n              break\n            }\n            case AlignStyle.Middle: {\n              delta = Vec.div([nextBounds.width - currentBounds.width, 0], 2)\n              break\n            }\n            case AlignStyle.End: {\n              delta = [nextBounds.width - currentBounds.width, 0]\n              break\n            }\n          }\n\n          rEditedText.current = newText\n\n          onShapeChange?.({\n            ...shape,\n            id: shape.id,\n            point: Vec.sub(shape.point, delta),\n            text: newText,\n          })\n        },\n        [shape.id, shape.point]\n      )\n\n      const handleKeyDown = React.useCallback(\n        (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n          if (e.key === 'Escape') {\n            e.preventDefault()\n            e.stopPropagation()\n            onShapeBlur?.()\n            return\n          }\n\n          if (e.key === 'Tab' && shape.text.length === 0) {\n            e.preventDefault()\n            return\n          }\n\n          if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n            e.preventDefault()\n            e.stopPropagation()\n            rInput.current!.blur()\n            return\n          }\n\n          if (!(e.key === 'Meta' || e.metaKey)) {\n            e.stopPropagation()\n          } else if (e.key === 'z' && e.metaKey) {\n            if (e.shiftKey) {\n              document.execCommand('redo', false)\n            } else {\n              document.execCommand('undo', false)\n            }\n            e.stopPropagation()\n            e.preventDefault()\n            return\n          }\n          if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n            e.preventDefault()\n          }\n          if (e.key === 'Tab') {\n            e.preventDefault()\n            if (e.shiftKey) {\n              TextAreaUtils.unindent(e.currentTarget)\n            } else {\n              TextAreaUtils.indent(e.currentTarget)\n            }\n\n            onShapeChange?.({ ...shape, text: TLDR.normalizeText(e.currentTarget.value) })\n          }\n        },\n        [shape, onShapeChange]\n      )\n\n      const handleBlur = React.useCallback((e: React.FocusEvent<HTMLTextAreaElement>) => {\n        e.currentTarget.setSelectionRange(0, 0)\n        onShapeBlur?.()\n      }, [])\n\n      const handleFocus = React.useCallback(\n        (e: React.FocusEvent<HTMLTextAreaElement>) => {\n          if (!isEditing) return\n          if (!rIsMounted.current) return\n          if (document.activeElement === e.currentTarget) {\n            e.currentTarget.select()\n          }\n        },\n        [isEditing]\n      )\n\n      const handlePointerDown = React.useCallback(\n        (e: React.PointerEvent<HTMLDivElement | HTMLTextAreaElement>) => {\n          if (isEditing) {\n            e.stopPropagation()\n          }\n        },\n        [isEditing]\n      )\n\n      React.useEffect(() => {\n        if (isEditing) {\n          this.texts.set(shape.id, text)\n          requestAnimationFrame(() => {\n            rIsMounted.current = true\n            const elm = rInput.current\n            if (elm) {\n              elm.focus()\n              elm.select()\n            }\n          })\n        } else {\n          onShapeBlur?.()\n        }\n      }, [isEditing])\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <Wrapper isGhost={isGhost} isEditing={isEditing} onPointerDown={handlePointerDown}>\n            <InnerWrapper\n              style={{\n                font,\n                color: styles.stroke,\n                textAlign: getTextAlign(style.textAlign),\n              }}\n            >\n              {isBinding && (\n                <div\n                  className=\"tl-binding-indicator\"\n                  style={{\n                    position: 'absolute',\n                    top: -this.bindingDistance,\n                    left: -this.bindingDistance,\n                    width: `calc(100% + ${this.bindingDistance * 2}px)`,\n                    height: `calc(100% + ${this.bindingDistance * 2}px)`,\n                    backgroundColor: 'var(--tl-selectFill)',\n                  }}\n                />\n              )}\n              {isEditing ? (\n                <TextArea\n                  ref={rInput}\n                  style={{\n                    font,\n                    color: styles.stroke,\n                  }}\n                  name=\"text\"\n                  tabIndex={-1}\n                  autoComplete=\"false\"\n                  autoCapitalize=\"false\"\n                  autoCorrect=\"false\"\n                  autoSave=\"false\"\n                  autoFocus\n                  placeholder=\"\"\n                  spellCheck=\"true\"\n                  wrap=\"off\"\n                  dir=\"auto\"\n                  datatype=\"wysiwyg\"\n                  defaultValue={text}\n                  color={styles.stroke}\n                  onFocus={handleFocus}\n                  onChange={handleChange}\n                  onKeyDown={handleKeyDown}\n                  onBlur={handleBlur}\n                  onPointerDown={handlePointerDown}\n                  onContextMenu={stopPropagation}\n                  onCopy={stopPropagation}\n                  onPaste={stopPropagation}\n                  onCut={stopPropagation}\n                />\n              ) : (\n                text\n              )}\n              &#8203;\n            </InnerWrapper>\n          </Wrapper>\n        </HTMLContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const { width, height } = this.getBounds(shape)\n    return <rect x={0} y={0} width={width} height={height} />\n  })\n\n  getBounds = (shape: T) => {\n    const bounds = Utils.getFromCache(this.boundsCache, shape, () => {\n      if (!melm) {\n        // We're in SSR\n        return { minX: 0, minY: 0, maxX: 10, maxY: 10, width: 10, height: 10 }\n      }\n\n      if (!melm.parentNode) document.body.appendChild(melm)\n\n      melm.style.font = getFontStyle(shape.style)\n      melm.textContent = this.texts.get(shape.id) ?? shape.text\n\n      // In tests, offsetWidth and offsetHeight will be 0\n      const width = melm.offsetWidth || 1\n      const height = melm.offsetHeight || 1\n\n      return {\n        minX: 0,\n        maxX: width,\n        minY: 0,\n        maxY: height,\n        width,\n        height,\n      }\n    })\n\n    return Utils.translateBounds(bounds, shape.point)\n  }\n\n  shouldRender = (prev: T, next: T): boolean => {\n    return (\n      next.text !== prev.text || next.style.scale !== prev.style.scale || next.style !== prev.style\n    )\n  }\n\n  transform = (\n    shape: T,\n    bounds: TLBounds,\n    { initialShape, scaleX, scaleY }: TransformInfo<T>\n  ): Partial<T> => {\n    const {\n      rotation = 0,\n      style: { scale = 1 },\n    } = initialShape\n\n    const nextScale = scale * Math.abs(Math.min(scaleX, scaleY))\n\n    return {\n      point: [bounds.minX, bounds.minY],\n      rotation:\n        (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0) ? -(rotation || 0) : rotation,\n      style: {\n        ...initialShape.style,\n        scale: nextScale,\n      },\n    }\n  }\n\n  transformSingle = (\n    shape: T,\n    bounds: TLBounds,\n    { initialShape, scaleX, scaleY }: TransformInfo<T>\n  ): Partial<T> | void => {\n    const {\n      style: { scale = 1 },\n    } = initialShape\n\n    return {\n      point: Vec.toFixed([bounds.minX, bounds.minY]),\n      style: {\n        ...initialShape.style,\n        scale: scale * Math.max(Math.abs(scaleY), Math.abs(scaleX)),\n      },\n    }\n  }\n\n  onDoubleClickBoundsHandle = (shape: T) => {\n    const center = this.getCenter(shape)\n\n    const newCenter = this.getCenter({\n      ...shape,\n      style: {\n        ...shape.style,\n        scale: 1,\n      },\n    })\n\n    return {\n      style: {\n        ...shape.style,\n        scale: 1,\n      },\n      point: Vec.toFixed(Vec.add(shape.point, Vec.sub(center, newCenter))),\n    }\n  }\n\n  getSvgElement = (shape: T, isDarkMode: boolean): SVGElement | void => {\n    const bounds = this.getBounds(shape)\n    const style = getShapeStyle(shape.style, isDarkMode)\n    const elm = getTextSvgElement(shape.text, shape.style, bounds)\n    elm.setAttribute('fill', style.stroke)\n\n    return elm\n  }\n}\n\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet melm: any\n\nfunction getMeasurementDiv() {\n  // A div used for measurement\n  document.getElementById('__textMeasure')?.remove()\n\n  const pre = document.createElement('pre')\n  pre.id = '__textMeasure'\n\n  Object.assign(pre.style, {\n    whiteSpace: 'pre',\n    width: 'auto',\n    border: '1px solid transparent',\n    padding: '4px',\n    margin: '0px',\n    letterSpacing: LETTER_SPACING,\n    opacity: '0',\n    position: 'absolute',\n    top: '-500px',\n    left: '0px',\n    zIndex: '9999',\n    pointerEvents: 'none',\n    userSelect: 'none',\n    alignmentBaseline: 'mathematical',\n    dominantBaseline: 'mathematical',\n  })\n\n  pre.tabIndex = -1\n\n  document.body.appendChild(pre)\n  return pre\n}\n\nif (typeof window !== 'undefined') {\n  melm = getMeasurementDiv()\n}\n\nconst Wrapper = styled('div', {\n  width: '100%',\n  height: '100%',\n  variants: {\n    isGhost: {\n      false: { opacity: 1 },\n      true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n    },\n    isEditing: {\n      false: {\n        pointerEvents: 'all',\n        userSelect: 'all',\n      },\n      true: {\n        pointerEvents: 'none',\n        userSelect: 'none',\n      },\n    },\n  },\n})\n\nconst commonTextWrapping = {\n  whiteSpace: 'pre-wrap',\n  overflowWrap: 'break-word',\n}\n\nconst InnerWrapper = styled('div', {\n  position: 'absolute',\n  width: '100%',\n  height: '100%',\n  padding: '4px',\n  zIndex: 1,\n  minHeight: 1,\n  minWidth: 1,\n  lineHeight: 1,\n  letterSpacing: LETTER_SPACING,\n  outline: 0,\n  fontWeight: '500',\n  backfaceVisibility: 'hidden',\n  userSelect: 'none',\n  pointerEvents: 'none',\n  WebkitUserSelect: 'none',\n  WebkitTouchCallout: 'none',\n  isEditing: {\n    false: {},\n    true: {\n      pointerEvents: 'all',\n      background: '$boundsBg',\n      userSelect: 'text',\n      WebkitUserSelect: 'text',\n    },\n  },\n  ...commonTextWrapping,\n})\n\nconst TextArea = styled('textarea', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  zIndex: 1,\n  width: '100%',\n  height: '100%',\n  border: 'none',\n  padding: '4px',\n  resize: 'none',\n  textAlign: 'inherit',\n  minHeight: 'inherit',\n  minWidth: 'inherit',\n  lineHeight: 'inherit',\n  letterSpacing: 'inherit',\n  outline: 0,\n  fontWeight: 'inherit',\n  overflow: 'hidden',\n  backfaceVisibility: 'hidden',\n  display: 'inline-block',\n  pointerEvents: 'all',\n  background: '$boundsBg',\n  userSelect: 'text',\n  WebkitUserSelect: 'text',\n  ...commonTextWrapping,\n  '&:focus': {\n    outline: 'none',\n    border: 'none',\n  },\n})\n", "import * as React from 'react'\nimport { Utils, SVGContainer, TLBounds } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { defaultStyle, getShapeStyle } from '../shared/shape-styles'\nimport { DrawShape, DashStyle, TDShapeType, TransformInfo, TDMeta } from '~types'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  intersectBoundsBounds,\n  intersectBoundsPolyline,\n  intersectLineSegmentBounds,\n  intersectLineSegmentLineSegment,\n} from '@tldraw/intersect'\nimport {\n  getDrawStrokePathTDSnapshot,\n  getFillPath,\n  getSolidStrokePathTDSnapshot,\n} from './drawHelpers'\nimport { GHOSTED_OPACITY } from '~constants'\n\ntype T = DrawShape\ntype E = SVGSVGElement\n\nexport class DrawUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Draw as const\n\n  pointsBoundsCache = new WeakMap<T['points'], TLBounds>([])\n\n  shapeBoundsCache = new Map<string, TLBounds>()\n\n  rotatedCache = new WeakMap<T, number[][]>([])\n\n  pointCache: Record<string, number[]> = {}\n\n  canClone = true\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Draw,\n        name: 'Draw',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        rotation: 0,\n        style: defaultStyle,\n        points: [],\n        isComplete: false,\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, isSelected, isGhost, events }, ref) => {\n      const { points, style, isComplete } = shape\n\n      const polygonPathTDSnapshot = React.useMemo(() => {\n        return getFillPath(shape)\n      }, [points, style.size])\n\n      const pathTDSnapshot = React.useMemo(() => {\n        return style.dash === DashStyle.Draw\n          ? getDrawStrokePathTDSnapshot(shape)\n          : getSolidStrokePathTDSnapshot(shape)\n      }, [points, style.size, style.dash, isComplete])\n\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const { stroke, fill, strokeWidth } = styles\n\n      // For very short lines, draw a point instead of a line\n      const bounds = this.getBounds(shape)\n\n      const verySmall = bounds.width <= strokeWidth / 2 && bounds.height <= strokeWidth / 2\n\n      if (verySmall) {\n        const sw = 1 + strokeWidth\n\n        return (\n          <SVGContainer ref={ref} id={shape.id + '_svg'} {...events}>\n            <circle\n              r={sw}\n              fill={stroke}\n              stroke={stroke}\n              pointerEvents=\"all\"\n              opacity={isGhost ? GHOSTED_OPACITY : 1}\n            />\n          </SVGContainer>\n        )\n      }\n\n      const shouldFill =\n        style.isFilled &&\n        points.length > 3 &&\n        Vec.dist(points[0], points[points.length - 1]) < strokeWidth * 2\n\n      if (shape.style.dash === DashStyle.Draw) {\n        return (\n          <SVGContainer ref={ref} id={shape.id + '_svg'} {...events}>\n            <g opacity={isGhost ? GHOSTED_OPACITY : 1}>\n              <path\n                className={shouldFill || isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n                d={pathTDSnapshot}\n              />\n              {shouldFill && (\n                <path\n                  d={polygonPathTDSnapshot}\n                  stroke=\"none\"\n                  fill={fill}\n                  strokeLinejoin=\"round\"\n                  strokeLinecap=\"round\"\n                  pointerEvents=\"none\"\n                />\n              )}\n              <path\n                d={pathTDSnapshot}\n                fill={stroke}\n                stroke={stroke}\n                strokeWidth={strokeWidth / 2}\n                strokeLinejoin=\"round\"\n                strokeLinecap=\"round\"\n                pointerEvents=\"none\"\n              />\n            </g>\n          </SVGContainer>\n        )\n      }\n\n      // For solid, dash and dotted lines, draw a regular stroke path\n\n      const strokeDasharray = {\n        [DashStyle.Draw]: 'none',\n        [DashStyle.Solid]: `none`,\n        [DashStyle.Dotted]: `0.1 ${strokeWidth * 4}`,\n        [DashStyle.Dashed]: `${strokeWidth * 4} ${strokeWidth * 4}`,\n      }[style.dash]\n\n      const strokeDashoffset = {\n        [DashStyle.Draw]: 'none',\n        [DashStyle.Solid]: `none`,\n        [DashStyle.Dotted]: `0`,\n        [DashStyle.Dashed]: `0`,\n      }[style.dash]\n\n      const sw = 1 + strokeWidth * 1.5\n\n      return (\n        <SVGContainer ref={ref} id={shape.id + '_svg'} {...events}>\n          <g opacity={isGhost ? GHOSTED_OPACITY : 1}>\n            <path\n              className={shouldFill && isSelected ? 'tl-fill-hitarea' : 'tl-stroke-hitarea'}\n              d={pathTDSnapshot}\n            />\n            <path\n              d={pathTDSnapshot}\n              fill={shouldFill ? fill : 'none'}\n              stroke=\"none\"\n              strokeWidth={Math.min(4, strokeWidth * 2)}\n              strokeLinejoin=\"round\"\n              strokeLinecap=\"round\"\n              pointerEvents=\"none\"\n            />\n            <path\n              d={pathTDSnapshot}\n              fill=\"none\"\n              stroke={stroke}\n              strokeWidth={sw}\n              strokeDasharray={strokeDasharray}\n              strokeDashoffset={strokeDashoffset}\n              strokeLinejoin=\"round\"\n              strokeLinecap=\"round\"\n              pointerEvents=\"none\"\n            />\n          </g>\n        </SVGContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const { points } = shape\n\n    const pathTDSnapshot = React.useMemo(() => {\n      return getSolidStrokePathTDSnapshot(shape)\n    }, [points])\n\n    const bounds = this.getBounds(shape)\n\n    const verySmall = bounds.width < 4 && bounds.height < 4\n\n    if (verySmall) {\n      return <circle x={bounds.width / 2} y={bounds.height / 2} r={1} />\n    }\n\n    return <path d={pathTDSnapshot} />\n  })\n\n  transform = (\n    shape: T,\n    bounds: TLBounds,\n    { initialShape, scaleX, scaleY }: TransformInfo<T>\n  ): Partial<T> => {\n    const initialShapeBounds = Utils.getFromCache(this.boundsCache, initialShape, () =>\n      Utils.getBoundsFromPoints(initialShape.points)\n    )\n\n    const points = initialShape.points.map(([x, y, r]) => {\n      return [\n        bounds.width *\n          (scaleX < 0 // * sin?\n            ? 1 - x / initialShapeBounds.width\n            : x / initialShapeBounds.width),\n        bounds.height *\n          (scaleY < 0 // * cos?\n            ? 1 - y / initialShapeBounds.height\n            : y / initialShapeBounds.height),\n        r,\n      ]\n    })\n\n    const newBounds = Utils.getBoundsFromPoints(shape.points)\n\n    const point = Vec.sub([bounds.minX, bounds.minY], [newBounds.minX, newBounds.minY])\n\n    return {\n      points,\n      point,\n    }\n  }\n\n  getBounds = (shape: T) => {\n    // The goal here is to avoid recalculating the bounds from the\n    // points array, which is expensive. However, we still need a\n    // new bounds if the point has changed, but we will reuse the\n    // previous bounds-from-points result if we can.\n\n    const pointsHaveChanged = !this.pointsBoundsCache.has(shape.points)\n    const pointHasChanged = !(this.pointCache[shape.id] === shape.point)\n\n    if (pointsHaveChanged) {\n      // If the points have changed, then bust the points cache\n      const bounds = Utils.getBoundsFromPoints(shape.points)\n      this.pointsBoundsCache.set(shape.points, bounds)\n      this.shapeBoundsCache.set(shape.id, Utils.translateBounds(bounds, shape.point))\n      this.pointCache[shape.id] = shape.point\n    } else if (pointHasChanged && !pointsHaveChanged) {\n      // If the point have has changed, then bust the point cache\n      this.pointCache[shape.id] = shape.point\n      this.shapeBoundsCache.set(\n        shape.id,\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        Utils.translateBounds(this.pointsBoundsCache.get(shape.points)!, shape.point)\n      )\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return this.shapeBoundsCache.get(shape.id)!\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return (\n      next.points !== prev.points ||\n      next.style !== prev.style ||\n      next.isComplete !== prev.isComplete\n    )\n  }\n\n  hitTestPoint = (shape: T, point: number[]) => {\n    const ptA = Vec.sub(point, shape.point)\n    return Utils.pointInPolyline(ptA, shape.points)\n  }\n\n  hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n    const { points, point } = shape\n    const ptA = Vec.sub(A, point)\n    const ptB = Vec.sub(B, point)\n    const bounds = this.getBounds(shape)\n\n    if (bounds.width < 8 && bounds.height < 8) {\n      return Vec.distanceToLineSegment(A, B, Utils.getBoundsCenter(bounds)) < 5 // divide by zoom\n    }\n\n    if (intersectLineSegmentBounds(ptA, ptB, bounds)) {\n      for (let i = 1; i < points.length; i++) {\n        if (intersectLineSegmentLineSegment(points[i - 1], points[i], ptA, ptB).didIntersect) {\n          return true\n        }\n      }\n    }\n\n    return false\n  }\n\n  hitTestBounds = (shape: T, bounds: TLBounds) => {\n    // Test axis-aligned shape\n    if (!shape.rotation) {\n      const shapeBounds = this.getBounds(shape)\n\n      return (\n        Utils.boundsContain(bounds, shapeBounds) ||\n        ((Utils.boundsContain(shapeBounds, bounds) ||\n          intersectBoundsBounds(shapeBounds, bounds).length > 0) &&\n          intersectBoundsPolyline(Utils.translateBounds(bounds, Vec.neg(shape.point)), shape.points)\n            .length > 0)\n      )\n    }\n\n    // Test rotated shape\n    const rBounds = this.getRotatedBounds(shape)\n\n    const rotatedBounds = Utils.getFromCache(this.rotatedCache, shape, () => {\n      const c = Utils.getBoundsCenter(Utils.getBoundsFromPoints(shape.points))\n      return shape.points.map((pt) => Vec.rotWith(pt, c, shape.rotation || 0))\n    })\n\n    return (\n      Utils.boundsContain(bounds, rBounds) ||\n      intersectBoundsPolyline(Utils.translateBounds(bounds, Vec.neg(shape.point)), rotatedBounds)\n        .length > 0\n    )\n  }\n}\n", "import { Utils } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { getStrokeOutlinePoints, getStrokePoints, StrokeOptions } from 'perfect-freehand'\nimport type { DrawShape } from '~types'\nimport { getShapeStyle } from '../shared/shape-styles'\n\nconst simulatePressureSettings: StrokeOptions = {\n  easing: (t) => Math.sin((t * Math.PI) / 2),\n  simulatePressure: true,\n}\n\nconst realPressureSettings: StrokeOptions = {\n  easing: (t) => t * t,\n  simulatePressure: false,\n}\n\nexport function getFreehandOptions(shape: DrawShape) {\n  const styles = getShapeStyle(shape.style)\n\n  const options: StrokeOptions = {\n    size: 1 + styles.strokeWidth * 1.5,\n    thinning: 0.65,\n    streamline: 0.65,\n    smoothing: 0.65,\n    ...(shape.points[1][2] === 0.5 ? simulatePressureSettings : realPressureSettings),\n    last: shape.isComplete,\n  }\n\n  return options\n}\n\nexport function getFillPath(shape: DrawShape) {\n  if (shape.points.length < 2) return ''\n\n  return Utils.getSvgPathFromStroke(\n    getStrokePoints(shape.points, getFreehandOptions(shape)).map((pt) => pt.point)\n  )\n}\n\nexport function getDrawStrokePoints(shape: DrawShape, options: StrokeOptions) {\n  return getStrokePoints(shape.points, options)\n}\n\n/**\n * Get path data for a stroke with the DashStyle.Draw dash style.\n */\nexport function getDrawStrokePathTDSnapshot(shape: DrawShape) {\n  if (shape.points.length < 2) return ''\n  const options = getFreehandOptions(shape)\n  const strokePoints = getDrawStrokePoints(shape, options)\n  const path = Utils.getSvgPathFromStroke(getStrokeOutlinePoints(strokePoints, options))\n  return path\n}\n\n/**\n * Get SVG path data for a shape that has a DashStyle other than DashStyles.Draw.\n */\nexport function getSolidStrokePathTDSnapshot(shape: DrawShape) {\n  const { points } = shape\n  if (points.length < 2) return 'M 0 0 L 0 0'\n  const options = getFreehandOptions(shape)\n  const strokePoints = getDrawStrokePoints(shape, options).map((pt) => pt.point.slice(0, 2))\n  const last = points[points.length - 1].slice(0, 2)\n  if (!Vec.isEqual(strokePoints[0], last)) strokePoints.push(last)\n  const path = Utils.getSvgPathFromStroke(strokePoints, false)\n  return path\n}\n", "import * as React from 'react'\nimport { Utils, HTMLContainer } from '@tldraw/core'\nimport { TDShapeType, TDMeta, ImageShape, TDImageAsset } from '~types'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  defaultStyle,\n  getBoundsRectangle,\n  transformRectangle,\n  transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { styled } from '@stitches/react'\n\ntype T = ImageShape\ntype E = HTMLDivElement\n\nexport class ImageUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Image as const\n\n  canBind = true\n\n  canClone = true\n\n  isAspectRatioLocked = true\n\n  showCloneHandles = false\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'image',\n        type: TDShapeType.Image,\n        name: 'Image',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [1, 1],\n        rotation: 0,\n        style: { ...defaultStyle, isFilled: true },\n        assetId: 'assetId',\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, asset = { src: '' }, isBinding, isGhost, meta, events, onShapeChange }, ref) => {\n      const { size, style } = shape\n      const { bindingDistance } = this\n\n      const rImage = React.useRef<HTMLImageElement>(null)\n      const rWrapper = React.useRef<HTMLDivElement>(null)\n\n      React.useLayoutEffect(() => {\n        const wrapper = rWrapper.current\n        if (!wrapper) return\n        const [width, height] = size\n        wrapper.style.width = `${width}px`\n        wrapper.style.height = `${height}px`\n      }, [size])\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          {isBinding && (\n            <div\n              className=\"tl-binding-indicator\"\n              style={{\n                position: 'absolute',\n                top: `calc(${-bindingDistance}px * var(--tl-zoom))`,\n                left: `calc(${-bindingDistance}px * var(--tl-zoom))`,\n                width: `calc(100% + ${bindingDistance * 2}px * var(--tl-zoom))`,\n                height: `calc(100% + ${bindingDistance * 2}px * var(--tl-zoom))`,\n                backgroundColor: 'var(--tl-selectFill)',\n              }}\n            />\n          )}\n          <Wrapper\n            ref={rWrapper}\n            isDarkMode={meta.isDarkMode} //\n            isFilled={style.isFilled}\n            isGhost={isGhost}\n          >\n            <ImageElement\n              id={shape.id + '_image'}\n              ref={rImage}\n              src={(asset as TDImageAsset).src}\n              alt=\"tl_image_asset\"\n              draggable={false}\n            />\n          </Wrapper>\n        </HTMLContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const {\n      size: [width, height],\n    } = shape\n\n    return (\n      <rect x={0} y={0} rx={2} ry={2} width={Math.max(1, width)} height={Math.max(1, height)} />\n    )\n  })\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style\n  }\n\n  transform = transformRectangle\n\n  transformSingle = transformSingleRectangle\n\n  getSvgElement = (shape: ImageShape) => {\n    const bounds = this.getBounds(shape)\n    const elm = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n    elm.setAttribute('width', `${bounds.width}`)\n    elm.setAttribute('height', `${bounds.height}`)\n    elm.setAttribute('xmlns:xlink', `http://www.w3.org/1999/xlink`)\n    return elm\n  }\n}\n\nconst Wrapper = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  fontFamily: 'sans-serif',\n  fontSize: '2em',\n  height: '100%',\n  width: '100%',\n  borderRadius: '3px',\n  perspective: '800px',\n  overflow: 'hidden',\n  p: {\n    userSelect: 'none',\n  },\n  img: {\n    userSelect: 'none',\n  },\n  variants: {\n    isGhost: {\n      false: { opacity: 1 },\n      true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n    },\n    isFilled: {\n      true: {},\n      false: {},\n    },\n    isDarkMode: {\n      true: {},\n      false: {},\n    },\n  },\n  compoundVariants: [\n    {\n      isFilled: true,\n      isDarkMode: true,\n      css: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n      },\n    },\n    {\n      isFilled: true,\n      isDarkMode: false,\n      css: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16),  1px 1px 2px rgba(0,0,0,.16)',\n      },\n    },\n  ],\n})\n\nconst ImageElement = styled('img', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  maxWidth: '100%',\n  minWidth: '100%',\n  pointerEvents: 'none',\n  objectFit: 'cover',\n  userSelect: 'none',\n  borderRadius: 2,\n})\n", "import * as React from 'react'\nimport { Utils, HTMLContainer } from '@tldraw/core'\nimport { TDShapeType, TDMeta, VideoShape, TDVideoAsset } from '~types'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  defaultStyle,\n  getBoundsRectangle,\n  transformRectangle,\n  transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { styled } from '@stitches/react'\n\ntype T = VideoShape\ntype E = HTMLDivElement\n\nexport class VideoUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Video as const\n  canBind = true\n  canEdit = true\n  canClone = true\n  isAspectRatioLocked = true\n  showCloneHandles = false\n  isStateful = true // don't unmount\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'video',\n        type: TDShapeType.Video,\n        name: 'Video',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [1, 1],\n        rotation: 0,\n        style: defaultStyle,\n        assetId: 'assetId',\n        isPlaying: true,\n        currentTime: 0,\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    (\n      { shape, asset = { src: '' }, isBinding, isEditing, isGhost, meta, events, onShapeChange },\n      ref\n    ) => {\n      const rVideo = React.useRef<HTMLVideoElement>(null)\n      const rWrapper = React.useRef<HTMLDivElement>(null)\n\n      const { currentTime = 0, size, isPlaying, style } = shape\n\n      React.useLayoutEffect(() => {\n        const wrapper = rWrapper.current\n        if (!wrapper) return\n        const [width, height] = size\n        wrapper.style.width = `${width}px`\n        wrapper.style.height = `${height}px`\n      }, [size])\n\n      React.useLayoutEffect(() => {\n        const video = rVideo.current\n        if (!video) return\n        if (isPlaying) video.play()\n        // throws error on safari\n        else video.pause()\n      }, [isPlaying])\n\n      React.useLayoutEffect(() => {\n        const video = rVideo.current\n        if (!video) return\n        if (currentTime !== video.currentTime) {\n          video.currentTime = currentTime\n        }\n      }, [currentTime])\n\n      const handlePlay = React.useCallback(() => {\n        onShapeChange?.({ id: shape.id, isPlaying: true })\n      }, [])\n\n      const handlePause = React.useCallback(() => {\n        onShapeChange?.({ id: shape.id, isPlaying: false })\n      }, [])\n\n      const handleSetCurrentTime = React.useCallback(() => {\n        const video = rVideo.current\n        if (!video) return\n        if (!isEditing) return\n        onShapeChange?.({ id: shape.id, currentTime: video.currentTime })\n      }, [isEditing])\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          {isBinding && (\n            <div\n              className=\"tl-binding-indicator\"\n              style={{\n                position: 'absolute',\n                top: -this.bindingDistance,\n                left: -this.bindingDistance,\n                width: `calc(100% + ${this.bindingDistance * 2}px)`,\n                height: `calc(100% + ${this.bindingDistance * 2}px)`,\n                backgroundColor: 'var(--tl-selectFill)',\n              }}\n            />\n          )}\n          <Wrapper\n            ref={rWrapper}\n            isDarkMode={meta.isDarkMode}\n            isGhost={isGhost}\n            isFilled={style.isFilled}\n          >\n            <VideoElement\n              ref={rVideo}\n              id={shape.id + '_video'}\n              muted\n              loop\n              playsInline\n              disableRemotePlayback\n              disablePictureInPicture\n              controls={isEditing}\n              autoPlay={isPlaying}\n              onPlay={handlePlay}\n              onPause={handlePause}\n              onTimeUpdate={handleSetCurrentTime}\n            >\n              <source src={(asset as TDVideoAsset).src} />\n            </VideoElement>\n          </Wrapper>\n        </HTMLContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const {\n      size: [width, height],\n    } = shape\n\n    return (\n      <rect x={0} y={0} rx={2} ry={2} width={Math.max(1, width)} height={Math.max(1, height)} />\n    )\n  })\n\n  getBounds = (shape: T) => {\n    return getBoundsRectangle(shape, this.boundsCache)\n  }\n\n  shouldRender = (prev: T, next: T) => {\n    return next.size !== prev.size || next.style !== prev.style || next.isPlaying !== prev.isPlaying\n  }\n\n  getSvgElement = (shape: VideoShape) => {\n    const bounds = this.getBounds(shape)\n    const elm = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n    elm.setAttribute('width', `${bounds.width}`)\n    elm.setAttribute('height', `${bounds.height}`)\n    elm.setAttribute('xmlns:xlink', `http://www.w3.org/1999/xlink`)\n    return elm\n  }\n\n  transform = transformRectangle\n\n  transformSingle = transformSingleRectangle\n}\n\nconst Wrapper = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  fontFamily: 'sans-serif',\n  fontSize: '2em',\n  height: '100%',\n  width: '100%',\n  borderRadius: '3px',\n  perspective: '800px',\n  overflow: 'hidden',\n  p: {\n    userSelect: 'none',\n  },\n  img: {\n    userSelect: 'none',\n  },\n  variants: {\n    isGhost: {\n      false: { opacity: 1 },\n      true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n    },\n    isFilled: {\n      true: {},\n      false: {},\n    },\n    isDarkMode: {\n      true: {},\n      false: {},\n    },\n  },\n  compoundVariants: [\n    {\n      isFilled: true,\n      isDarkMode: true,\n      css: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n      },\n    },\n    {\n      isFilled: true,\n      isDarkMode: false,\n      css: {\n        boxShadow:\n          '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16),  1px 1px 2px rgba(0,0,0,.16)',\n      },\n    },\n  ],\n})\n\nconst VideoElement = styled('video', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  maxWidth: '100%',\n  minWidth: '100%',\n  pointerEvents: 'none',\n  objectFit: 'cover',\n  userSelect: 'none',\n  borderRadius: 2,\n})\n", "import type { TDShapeUtil } from './TDShapeUtil'\nimport { RectangleUtil } from './RectangleUtil'\nimport { TriangleUtil } from './TriangleUtil'\nimport { EllipseUtil } from './EllipseUtil'\nimport { ArrowUtil } from './ArrowUtil'\nimport { GroupUtil } from './GroupUtil'\nimport { StickyUtil } from './StickyUtil'\nimport { TextUtil } from './TextUtil'\nimport { DrawUtil } from './DrawUtil'\nimport { ImageUtil } from './ImageUtil'\nimport { TDShape, TDShapeType } from '~types'\nimport { VideoUtil } from './VideoUtil'\n\nexport const Rectangle = new RectangleUtil()\nexport const Triangle = new TriangleUtil()\nexport const Ellipse = new EllipseUtil()\nexport const Draw = new DrawUtil()\nexport const Arrow = new ArrowUtil()\nexport const Text = new TextUtil()\nexport const Group = new GroupUtil()\nexport const Sticky = new StickyUtil()\nexport const Image = new ImageUtil()\nexport const Video = new VideoUtil()\n\nexport const shapeUtils = {\n  [TDShapeType.Rectangle]: Rectangle,\n  [TDShapeType.Triangle]: Triangle,\n  [TDShapeType.Ellipse]: Ellipse,\n  [TDShapeType.Draw]: Draw,\n  [TDShapeType.Arrow]: Arrow,\n  [TDShapeType.Text]: Text,\n  [TDShapeType.Group]: Group,\n  [TDShapeType.Sticky]: Sticky,\n  [TDShapeType.Image]: Image,\n  [TDShapeType.Video]: Video,\n}\n\nexport const getShapeUtil = <T extends TDShape>(shape: T | T['type']) => {\n  if (typeof shape === 'string') return shapeUtils[shape] as unknown as TDShapeUtil<T>\n  return shapeUtils[shape.type] as unknown as TDShapeUtil<T>\n}\n", "/**\n * Deep copy function for TypeScript.\n * @param T Generic type of target/copied value.\n * @param target Target value to be copied.\n * @see Source project, ts-deeply https://github.com/ykdr2017/ts-deepcopy\n * @see Code pen https://codepen.io/erikvullings/pen/ejyBYg\n */\nexport function deepCopy<T>(target: T): T {\n  if (target === null) {\n    return target\n  }\n  if (target instanceof Date) {\n    return new Date(target.getTime()) as any\n  }\n\n  // First part is for array and second part is for Realm.Collection\n  // if (target instanceof Array || typeof (target as any).type === 'string') {\n  if (typeof target === 'object') {\n    if (typeof target[Symbol.iterator as keyof T] === 'function') {\n      const cp = [] as any[]\n      if ((target as any as any[]).length > 0) {\n        for (const arrayMember of target as any as any[]) {\n          cp.push(deepCopy(arrayMember))\n        }\n      }\n      return cp as any as T\n    } else {\n      const targetKeys = Object.keys(target)\n      const cp = {} as T\n      if (targetKeys.length > 0) {\n        for (const key of targetKeys) {\n          cp[key as keyof T] = deepCopy(target[key as keyof T])\n        }\n      }\n      return cp\n    }\n  }\n\n  // Means that object is atomic\n  return target\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Vec } from '@tldraw/vec'\nimport { Utils } from '@tldraw/core'\nimport { AlignType, TldrawCommand, TDShapeType } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nexport function alignShapes(app: TldrawApp, ids: string[], type: AlignType): TldrawCommand {\n  const { currentPageId } = app\n\n  const initialShapes = ids.map((id) => app.getShape(id))\n\n  const boundsForShapes = initialShapes.map((shape) => {\n    return {\n      id: shape.id,\n      point: [...shape.point],\n      bounds: TLDR.getBounds(shape),\n    }\n  })\n\n  const commonBounds = Utils.getCommonBounds(boundsForShapes.map(({ bounds }) => bounds))\n\n  const midX = commonBounds.minX + commonBounds.width / 2\n  const midY = commonBounds.minY + commonBounds.height / 2\n\n  const deltaMap = Object.fromEntries(\n    boundsForShapes.map(({ id, point, bounds }) => {\n      return [\n        id,\n        {\n          prev: point,\n          next: {\n            [AlignType.Top]: [point[0], commonBounds.minY],\n            [AlignType.CenterVertical]: [point[0], midY - bounds.height / 2],\n            [AlignType.Bottom]: [point[0], commonBounds.maxY - bounds.height],\n            [AlignType.Left]: [commonBounds.minX, point[1]],\n            [AlignType.CenterHorizontal]: [midX - bounds.width / 2, point[1]],\n            [AlignType.Right]: [commonBounds.maxX - bounds.width, point[1]],\n          }[type],\n        },\n      ]\n    })\n  )\n\n  const { before, after } = TLDR.mutateShapes(\n    app.state,\n    ids,\n    (shape) => {\n      if (!deltaMap[shape.id]) return shape\n      return { point: deltaMap[shape.id].next }\n    },\n    currentPageId\n  )\n\n  initialShapes.forEach((shape) => {\n    if (shape.type === TDShapeType.Group) {\n      const delta = Vec.sub(after[shape.id].point!, before[shape.id].point!)\n\n      shape.children.forEach((id) => {\n        const child = app.getShape(id)\n        before[child.id] = { point: child.point }\n        after[child.id] = { point: Vec.add(child.point, delta) }\n      })\n\n      delete before[shape.id]\n      delete after[shape.id]\n    }\n  })\n\n  return {\n    id: 'align',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: before,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: after,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function changePage(app: TldrawApp, pageId: string): TldrawCommand {\n  return {\n    id: 'change_page',\n    before: {\n      appState: {\n        currentPageId: app.currentPageId,\n      },\n    },\n    after: {\n      appState: {\n        currentPageId: pageId,\n      },\n    },\n  }\n}\n", "import type { TldrawCommand, TDPage } from '~types'\nimport { Utils, TLPageState } from '@tldraw/core'\nimport type { TldrawApp } from '~state'\nimport { getIncrementedName } from '../shared/getIncrementedName'\n\nexport function createPage(\n  app: TldrawApp,\n  center: number[],\n  pageId = Utils.uniqueId(),\n  pageName = 'Page'\n): TldrawCommand {\n  const { currentPageId } = app\n\n  const pages = Object.values(app.state.document.pages).sort(\n    (a, b) => (a.childIndex ?? 0) - (b.childIndex ?? 0)\n  )\n\n  const topPage = pages[pages.length - 1]\n\n  const nextChildIndex = topPage?.childIndex ? topPage?.childIndex + 1 : 1\n\n  const page: TDPage = {\n    id: pageId,\n    name: getIncrementedName(\n      pageName,\n      pages.map((p) => p.name ?? '')\n    ),\n    childIndex: nextChildIndex,\n    shapes: {},\n    bindings: {},\n  }\n\n  const pageState: TLPageState = {\n    id: pageId,\n    selectedIds: [],\n    camera: { point: center, zoom: 1 },\n    editingId: undefined,\n    bindingId: undefined,\n    hoveredId: undefined,\n    pointedId: undefined,\n  }\n\n  return {\n    id: 'create_page',\n    before: {\n      appState: {\n        currentPageId,\n      },\n      document: {\n        pages: {\n          [pageId]: undefined,\n        },\n        pageStates: {\n          [pageId]: undefined,\n        },\n      },\n    },\n    after: {\n      appState: {\n        currentPageId: page.id,\n      },\n      document: {\n        pages: {\n          [pageId]: page,\n        },\n        pageStates: {\n          [pageId]: pageState,\n        },\n      },\n    },\n  }\n}\n", "/**\n * Get an incremented name (e.g. Page 2) from a name (e.g. Page 1), based on an array of existing names.\n *\n * @param name The name to increment.\n * @param others The array of existing names.\n */\nexport function getIncrementedName(name: string, others: string[]) {\n  let result = name\n  const set = new Set(others)\n\n  while (set.has(result)) {\n    result = /^.*(\\d+)$/.exec(result)?.[1]\n      ? result.replace(/(\\d+)(?=\\D?)$/, (m) => (+m + 1).toString())\n      : `${result} 1`\n  }\n\n  return result\n}\n", "import type { Patch, TDShape, TldrawCommand, TDBinding } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function createShapes(\n  app: TldrawApp,\n  shapes: TDShape[],\n  bindings: TDBinding[] = []\n): TldrawCommand {\n  const { currentPageId } = app\n\n  const beforeShapes: Record<string, Patch<TDShape> | undefined> = {}\n  const afterShapes: Record<string, Patch<TDShape> | undefined> = {}\n\n  shapes.forEach((shape) => {\n    beforeShapes[shape.id] = undefined\n    afterShapes[shape.id] = shape\n  })\n\n  const beforeBindings: Record<string, Patch<TDBinding> | undefined> = {}\n  const afterBindings: Record<string, Patch<TDBinding> | undefined> = {}\n\n  bindings.forEach((binding) => {\n    beforeBindings[binding.id] = undefined\n    afterBindings[binding.id] = binding\n  })\n\n  return {\n    id: 'create',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: beforeShapes,\n            bindings: beforeBindings,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: [...app.selectedIds],\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: afterShapes,\n            bindings: afterBindings,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: shapes.map((shape) => shape.id),\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function deletePage(app: TldrawApp, pageId: string): TldrawCommand {\n  const {\n    currentPageId,\n    document: { pages, pageStates },\n  } = app\n\n  const pagesArr = Object.values(pages).sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n\n  const currentIndex = pagesArr.findIndex((page) => page.id === pageId)\n\n  let nextCurrentPageId: string\n\n  if (pageId === currentPageId) {\n    if (currentIndex === pagesArr.length - 1) {\n      nextCurrentPageId = pagesArr[pagesArr.length - 2].id\n    } else {\n      nextCurrentPageId = pagesArr[currentIndex + 1].id\n    }\n  } else {\n    nextCurrentPageId = currentPageId\n  }\n\n  return {\n    id: 'delete_page',\n    before: {\n      appState: {\n        currentPageId: pageId,\n      },\n      document: {\n        pages: {\n          [pageId]: { ...pages[pageId] },\n        },\n        pageStates: {\n          [pageId]: { ...pageStates[pageId] },\n        },\n      },\n    },\n    after: {\n      appState: {\n        currentPageId: nextCurrentPageId,\n      },\n      document: {\n        pages: {\n          [pageId]: undefined,\n        },\n        pageStates: {\n          [pageId]: undefined,\n        },\n      },\n    },\n  }\n}\n", "import { TLDR } from '~state/TLDR'\nimport type { ArrowShape, GroupShape, PagePartial, TDPage, TDSnapshot } from '~types'\n\nexport function removeShapesFromPage(data: TDSnapshot, ids: string[], pageId: string) {\n  const before: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const after: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const parentsToUpdate: GroupShape[] = []\n  const deletedIds = new Set()\n  const assetsToRemove = new Set<string>()\n\n  // These are the shapes we're definitely going to delete\n\n  ids\n    .filter((id) => !TLDR.getShape(data, id, pageId).isLocked)\n    .forEach((id) => {\n      deletedIds.add(id)\n      const shape = TLDR.getShape(data, id, pageId)\n      before.shapes[id] = shape\n      after.shapes[id] = undefined\n\n      // Also delete the shape's children\n\n      if (shape.children !== undefined) {\n        shape.children.forEach((childId) => {\n          deletedIds.add(childId)\n          const child = TLDR.getShape(data, childId, pageId)\n          before.shapes[childId] = child\n          after.shapes[childId] = undefined\n        })\n      }\n\n      if (shape.parentId !== pageId) {\n        parentsToUpdate.push(TLDR.getShape(data, shape.parentId, pageId))\n      }\n\n      if (shape.assetId) {\n        assetsToRemove.add(shape.assetId)\n      }\n    })\n\n  parentsToUpdate.forEach((parent) => {\n    if (ids.includes(parent.id)) return\n    deletedIds.add(parent.id)\n    before.shapes[parent.id] = { children: parent.children }\n    after.shapes[parent.id] = { children: parent.children.filter((id) => !ids.includes(id)) }\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    if (after.shapes[parent.id]?.children!.length === 0) {\n      after.shapes[parent.id] = undefined\n      before.shapes[parent.id] = TLDR.getShape(data, parent.id, pageId)\n    }\n  })\n\n  // Recursively check for empty parents?\n\n  const page = TLDR.getPage(data, pageId)\n\n  // We also need to delete bindings that reference the deleted shapes\n  Object.values(page.bindings)\n    .filter((binding) => deletedIds.has(binding.fromId) || deletedIds.has(binding.toId))\n    .forEach((binding) => {\n      for (const id of [binding.toId, binding.fromId]) {\n        // If the binding references a deleted shape...\n        if (after.shapes[id] === undefined) {\n          // Delete this binding\n          before.bindings[binding.id] = binding\n          after.bindings[binding.id] = undefined\n\n          // Let's also look each the bound shape...\n          const shape = page.shapes[id]\n\n          // If the bound shape has a handle that references the deleted binding...\n          if (shape && shape.handles) {\n            Object.values(shape.handles)\n              .filter((handle) => handle.bindingId === binding.id)\n              .forEach((handle) => {\n                // Save the binding reference in the before patch\n                before.shapes[id] = {\n                  ...before.shapes[id],\n                  handles: {\n                    ...before.shapes[id]?.handles,\n                    [handle.id]: {\n                      ...before.shapes[id]?.handles?.[handle.id as keyof ArrowShape['handles']],\n                      bindingId: binding.id,\n                    },\n                  },\n                }\n\n                // Unless we're currently deleting the shape, remove the\n                // binding reference from the after patch\n                if (!deletedIds.has(id)) {\n                  after.shapes[id] = {\n                    ...after.shapes[id],\n                    handles: {\n                      ...after.shapes[id]?.handles,\n                      [handle.id]: {\n                        ...after.shapes[id]?.handles?.[handle.id as keyof ArrowShape['handles']],\n                        bindingId: undefined,\n                      },\n                    },\n                  }\n                }\n              })\n          }\n        }\n      }\n    })\n\n  // If any other shapes are using the deleted assets, don't remove them\n  Object.values(data.document.pages)\n    .flatMap((page) => Object.values(page.shapes))\n    .forEach((shape) => {\n      if ('assetId' in shape && shape.assetId && !deletedIds.has(shape.id)) {\n        assetsToRemove.delete(shape.assetId)\n      }\n    })\n\n  return { before, after, assetsToRemove: Array.from(assetsToRemove) }\n}\n", "import type { TDAsset, TDAssets, TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { removeShapesFromPage } from '../shared/removeShapesFromPage'\n\nconst removeAssetsFromDocument = (assets: TDAssets, idsToRemove: string[]) => {\n  const afterAssets: Record<string, TDAsset | undefined> = { ...assets }\n  idsToRemove.forEach((id) => (afterAssets[id] = undefined))\n  return afterAssets\n}\n\nexport function deleteShapes(\n  app: TldrawApp,\n  ids: string[],\n  pageId = app.currentPageId\n): TldrawCommand {\n  const {\n    pageState,\n    selectedIds,\n    document: { assets: beforeAssets },\n  } = app\n  const { before, after, assetsToRemove } = removeShapesFromPage(app.state, ids, pageId)\n  const afterAssets = removeAssetsFromDocument(beforeAssets, assetsToRemove)\n\n  return {\n    id: 'delete',\n    before: {\n      document: {\n        assets: beforeAssets,\n        pages: {\n          [pageId]: before,\n        },\n        pageStates: {\n          [pageId]: { selectedIds: [...app.selectedIds] },\n        },\n      },\n    },\n    after: {\n      document: {\n        assets: afterAssets,\n        pages: {\n          [pageId]: after,\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: selectedIds.filter((id) => !ids.includes(id)),\n            hoveredId:\n              pageState.hoveredId && ids.includes(pageState.hoveredId)\n                ? undefined\n                : pageState.hoveredId,\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Utils } from '@tldraw/core'\nimport { DistributeType, TDShape, TldrawCommand, TDShapeType } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport Vec from '@tldraw/vec'\nimport type { TldrawApp } from '../../internal'\n\nexport function distributeShapes(\n  app: TldrawApp,\n  ids: string[],\n  type: DistributeType\n): TldrawCommand {\n  const { currentPageId } = app\n\n  const initialShapes = ids.map((id) => app.getShape(id))\n\n  const deltaMap = Object.fromEntries(getDistributions(initialShapes, type).map((d) => [d.id, d]))\n\n  const { before, after } = TLDR.mutateShapes(\n    app.state,\n    ids.filter((id) => deltaMap[id] !== undefined),\n    (shape) => ({ point: deltaMap[shape.id].next }),\n    currentPageId\n  )\n\n  initialShapes.forEach((shape) => {\n    if (shape.type === TDShapeType.Group) {\n      const delta = Vec.sub(after[shape.id].point!, before[shape.id].point!)\n\n      shape.children.forEach((id) => {\n        const child = app.getShape(id)\n        before[child.id] = { point: child.point }\n        after[child.id] = { point: Vec.add(child.point, delta) }\n      })\n\n      delete before[shape.id]\n      delete after[shape.id]\n    }\n  })\n\n  return {\n    id: 'distribute',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n\nfunction getDistributions(initialShapes: TDShape[], type: DistributeType) {\n  const entries = initialShapes.map((shape) => {\n    const utils = TLDR.getShapeUtil(shape)\n    return {\n      id: shape.id,\n      point: [...shape.point],\n      bounds: utils.getBounds(shape),\n      center: utils.getCenter(shape),\n    }\n  })\n\n  const len = entries.length\n  const commonBounds = Utils.getCommonBounds(entries.map(({ bounds }) => bounds))\n\n  const results: { id: string; prev: number[]; next: number[] }[] = []\n\n  switch (type) {\n    case DistributeType.Horizontal: {\n      const span = entries.reduce((a, c) => a + c.bounds.width, 0)\n\n      if (span > commonBounds.width) {\n        const left = entries.sort((a, b) => a.bounds.minX - b.bounds.minX)[0]\n\n        const right = entries.sort((a, b) => b.bounds.maxX - a.bounds.maxX)[0]\n\n        const entriesToMove = entries\n          .filter((a) => a !== left && a !== right)\n          .sort((a, b) => a.center[0] - b.center[0])\n\n        const step = (right.center[0] - left.center[0]) / (len - 1)\n\n        const x = left.center[0] + step\n\n        entriesToMove.forEach(({ id, point, bounds }, i) => {\n          results.push({\n            id,\n            prev: point,\n            next: [x + step * i - bounds.width / 2, bounds.minY],\n          })\n        })\n      } else {\n        const entriesToMove = entries.sort((a, b) => a.center[0] - b.center[0])\n\n        let x = commonBounds.minX\n        const step = (commonBounds.width - span) / (len - 1)\n\n        entriesToMove.forEach(({ id, point, bounds }) => {\n          results.push({ id, prev: point, next: [x, bounds.minY] })\n          x += bounds.width + step\n        })\n      }\n      break\n    }\n    case DistributeType.Vertical: {\n      const span = entries.reduce((a, c) => a + c.bounds.height, 0)\n\n      if (span > commonBounds.height) {\n        const top = entries.sort((a, b) => a.bounds.minY - b.bounds.minY)[0]\n\n        const bottom = entries.sort((a, b) => b.bounds.maxY - a.bounds.maxY)[0]\n\n        const entriesToMove = entries\n          .filter((a) => a !== top && a !== bottom)\n          .sort((a, b) => a.center[1] - b.center[1])\n\n        const step = (bottom.center[1] - top.center[1]) / (len - 1)\n\n        const y = top.center[1] + step\n\n        entriesToMove.forEach(({ id, point, bounds }, i) => {\n          results.push({\n            id,\n            prev: point,\n            next: [bounds.minX, y + step * i - bounds.height / 2],\n          })\n        })\n      } else {\n        const entriesToMove = entries.sort((a, b) => a.center[1] - b.center[1])\n\n        let y = commonBounds.minY\n        const step = (commonBounds.height - span) / (len - 1)\n\n        entriesToMove.forEach(({ id, point, bounds }) => {\n          results.push({ id, prev: point, next: [bounds.minX, y] })\n          y += bounds.height + step\n        })\n      }\n\n      break\n    }\n  }\n\n  return results\n}\n", "import type { TldrawCommand } from '~types'\nimport { Utils } from '@tldraw/core'\nimport type { TldrawApp } from '../../internal'\n\nexport function duplicatePage(app: TldrawApp, pageId: string): TldrawCommand {\n  const newId = Utils.uniqueId()\n  const {\n    currentPageId,\n    page,\n    pageState: { camera },\n  } = app\n\n  const nextPage = {\n    ...page,\n    id: newId,\n    name: page.name + ' Copy',\n    shapes: Object.fromEntries(\n      Object.entries(page.shapes).map(([id, shape]) => {\n        return [\n          id,\n          {\n            ...shape,\n            parentId: shape.parentId === pageId ? newId : shape.parentId,\n          },\n        ]\n      })\n    ),\n  }\n\n  return {\n    id: 'duplicate_page',\n    before: {\n      appState: {\n        currentPageId,\n      },\n      document: {\n        pages: {\n          [newId]: undefined,\n        },\n        pageStates: {\n          [newId]: undefined,\n        },\n      },\n    },\n    after: {\n      appState: {\n        currentPageId: newId,\n      },\n      document: {\n        pages: {\n          [newId]: nextPage,\n        },\n        pageStates: {\n          [newId]: {\n            ...page,\n            id: newId,\n            selectedIds: [],\n            camera: { ...camera },\n            editingId: undefined,\n            bindingId: undefined,\n            hoveredId: undefined,\n            pointedId: undefined,\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport type { PagePartial, TldrawCommand, TDShape } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function duplicateShapes(app: TldrawApp, ids: string[], point?: number[]): TldrawCommand {\n  const { selectedIds, currentPageId, page, shapes } = app\n\n  const before: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const after: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const duplicateMap: Record<string, string> = {}\n\n  const shapesToDuplicate = ids\n    .map((id) => app.getShape(id))\n    .filter((shape) => !ids.includes(shape.parentId))\n\n  // Create duplicates\n  shapesToDuplicate.forEach((shape) => {\n    const duplicatedId = Utils.uniqueId()\n    before.shapes[duplicatedId] = undefined\n\n    after.shapes[duplicatedId] = {\n      ...Utils.deepClone(shape),\n      id: duplicatedId,\n      childIndex: TLDR.getChildIndexAbove(app.state, shape.id, currentPageId),\n    }\n\n    if (shape.children) {\n      after.shapes[duplicatedId]!.children = []\n    }\n\n    if (shape.parentId !== currentPageId) {\n      const parent = app.getShape(shape.parentId)\n\n      before.shapes[parent.id] = {\n        ...before.shapes[parent.id],\n        children: parent.children,\n      }\n\n      after.shapes[parent.id] = {\n        ...after.shapes[parent.id],\n        children: [...(after.shapes[parent.id] || parent).children!, duplicatedId],\n      }\n    }\n\n    duplicateMap[shape.id] = duplicatedId\n  })\n\n  // If the shapes have children, then duplicate those too\n  shapesToDuplicate.forEach((shape) => {\n    if (shape.children) {\n      shape.children.forEach((childId) => {\n        const child = app.getShape(childId)\n        const duplicatedId = Utils.uniqueId()\n        const duplicatedParentId = duplicateMap[shape.id]\n        before.shapes[duplicatedId] = undefined\n        after.shapes[duplicatedId] = {\n          ...Utils.deepClone(child),\n          id: duplicatedId,\n          parentId: duplicatedParentId,\n          childIndex: TLDR.getChildIndexAbove(app.state, child.id, currentPageId),\n        }\n        duplicateMap[childId] = duplicatedId\n        after.shapes[duplicateMap[shape.id]]?.children?.push(duplicatedId)\n      })\n    }\n  })\n\n  // Which ids did we end up duplicating?\n  const dupedShapeIds = new Set(Object.keys(duplicateMap))\n\n  // Handle bindings that effect duplicated shapes\n  Object.values(page.bindings)\n    .filter((binding) => dupedShapeIds.has(binding.fromId) || dupedShapeIds.has(binding.toId))\n    .forEach((binding) => {\n      if (dupedShapeIds.has(binding.fromId)) {\n        if (dupedShapeIds.has(binding.toId)) {\n          // If the binding is between two duplicating shapes then\n          // duplicate the binding, too\n          const duplicatedBindingId = Utils.uniqueId()\n\n          const duplicatedBinding = {\n            ...Utils.deepClone(binding),\n            id: duplicatedBindingId,\n            fromId: duplicateMap[binding.fromId],\n            toId: duplicateMap[binding.toId],\n          }\n\n          before.bindings[duplicatedBindingId] = undefined\n          after.bindings[duplicatedBindingId] = duplicatedBinding\n\n          // Change the duplicated shape's handle so that it reference\n          // the duplicated binding\n          const boundShape = after.shapes[duplicatedBinding.fromId]\n          Object.values(boundShape!.handles!).forEach((handle) => {\n            if (handle!.bindingId === binding.id) {\n              handle!.bindingId = duplicatedBindingId\n            }\n          })\n        } else {\n          // If only the fromId is selected, delete the binding on\n          // the duplicated shape's handles\n          const boundShape = after.shapes[duplicateMap[binding.fromId]]\n          Object.values(boundShape!.handles!).forEach((handle) => {\n            if (handle!.bindingId === binding.id) {\n              handle!.bindingId = undefined\n            }\n          })\n        }\n      }\n    })\n\n  // Now move the shapes\n\n  const shapesToMove = Object.values(after.shapes) as TDShape[]\n\n  if (point) {\n    const commonBounds = Utils.getCommonBounds(shapesToMove.map((shape) => TLDR.getBounds(shape)))\n    const center = Utils.getBoundsCenter(commonBounds)\n    shapesToMove.forEach((shape) => {\n      // Could be a group\n      if (!shape.point) return\n      shape.point = Vec.sub(point, Vec.sub(center, shape.point))\n    })\n  } else {\n    const offset = [16, 16]\n    shapesToMove.forEach((shape) => {\n      // Could be a group\n      if (!shape.point) return\n      shape.point = Vec.add(shape.point, offset)\n    })\n  }\n\n  // Unlock any locked shapes\n  shapesToMove.forEach((shape) => {\n    if (shape.isLocked) {\n      shape.isLocked = false\n    }\n  })\n\n  return {\n    id: 'duplicate',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: before,\n        },\n        pageStates: {\n          [currentPageId]: { selectedIds },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: after,\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: Array.from(dupedShapeIds.values()).map((id) => duplicateMap[id]),\n          },\n        },\n      },\n    },\n  }\n}\n", "import { FlipType } from '~types'\nimport { TLBoundsCorner, Utils } from '@tldraw/core'\nimport type { TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { TLDR } from '~state/TLDR'\n\nexport function flipShapes(app: TldrawApp, ids: string[], type: FlipType): TldrawCommand {\n  const {\n    selectedIds,\n    currentPageId,\n    page: { shapes },\n  } = app\n\n  const boundsForShapes = ids.map((id) => TLDR.getBounds(shapes[id]))\n\n  const commonBounds = Utils.getCommonBounds(boundsForShapes)\n\n  const { before, after } = TLDR.mutateShapes(\n    app.state,\n    ids,\n    (shape) => {\n      const shapeBounds = TLDR.getBounds(shape)\n\n      switch (type) {\n        case FlipType.Horizontal: {\n          const newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n            commonBounds,\n            commonBounds,\n            shapeBounds,\n            true,\n            false\n          )\n\n          return TLDR.getShapeUtil(shape).transform(shape, newShapeBounds, {\n            type: TLBoundsCorner.TopLeft,\n            scaleX: -1,\n            scaleY: 1,\n            initialShape: shape,\n            transformOrigin: [0.5, 0.5],\n          })\n        }\n        case FlipType.Vertical: {\n          const newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n            commonBounds,\n            commonBounds,\n            shapeBounds,\n            false,\n            true\n          )\n\n          return TLDR.getShapeUtil(shape).transform(shape, newShapeBounds, {\n            type: TLBoundsCorner.TopLeft,\n            scaleX: 1,\n            scaleY: -1,\n            initialShape: shape,\n            transformOrigin: [0.5, 0.5],\n          })\n        }\n      }\n    },\n    currentPageId\n  )\n\n  return {\n    id: 'flip',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import { TDShape, TDShapeType } from '~types'\nimport { Utils } from '@tldraw/core'\nimport type { Patch, TldrawCommand, TDBinding } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { TLDR } from '~state/TLDR'\n\nexport function groupShapes(\n  app: TldrawApp,\n  ids: string[],\n  groupId: string,\n  pageId: string\n): TldrawCommand | undefined {\n  if (ids.length < 2) return\n\n  const beforeShapes: Record<string, Patch<TDShape | undefined>> = {}\n  const afterShapes: Record<string, Patch<TDShape | undefined>> = {}\n\n  const beforeBindings: Record<string, Patch<TDBinding | undefined>> = {}\n  const afterBindings: Record<string, Patch<TDBinding | undefined>> = {}\n\n  const idsToGroup = [...ids]\n  const shapesToGroup: TDShape[] = []\n  const deletedGroupIds: string[] = []\n  const otherEffectedGroups: TDShape[] = []\n\n  // Collect all of the shapes to group (and their ids)\n  for (const id of ids) {\n    const shape = app.getShape(id)\n    if (shape.isLocked) continue\n\n    if (shape.children === undefined) {\n      shapesToGroup.push(shape)\n    } else {\n      const childIds = shape.children.filter((id) => !app.getShape(id).isLocked)\n      otherEffectedGroups.push(shape)\n      idsToGroup.push(...childIds)\n      shapesToGroup.push(...childIds.map((id) => app.getShape(id)).filter(Boolean))\n    }\n  }\n\n  // 1. Can we create this group?\n\n  // Do the shapes have the same parent?\n  if (shapesToGroup.every((shape) => shape.parentId === shapesToGroup[0].parentId)) {\n    // Is the common parent a shape (not the page)?\n    if (shapesToGroup[0].parentId !== pageId) {\n      const commonParent = app.getShape(shapesToGroup[0].parentId)\n      // Are all of the common parent's shapes selected?\n      if (commonParent.children?.length === idsToGroup.length) {\n        // Don't create a group if that group would be the same as the\n        // existing group.\n        return\n      }\n    }\n  }\n\n  // A flattened array of shapes from the page\n  const flattenedShapes = TLDR.flattenPage(app.state, pageId)\n\n  // A map of shapes to their index in flattendShapes\n  const shapeIndexMap = Object.fromEntries(\n    shapesToGroup.map((shape) => [shape.id, flattenedShapes.indexOf(shape)])\n  )\n\n  // An array of shapes in order by their index in flattendShapes\n  const sortedShapes = shapesToGroup.sort((a, b) => shapeIndexMap[a.id] - shapeIndexMap[b.id])\n\n  // The parentId is always the current page\n  const groupParentId = pageId // sortedShapes[0].parentId\n\n  // The childIndex should be the lowest index of the selected shapes\n  // with a parent that is the current page; or else the child index\n  // of the lowest selected shape.\n  const groupChildIndex = (\n    sortedShapes.filter((shape) => shape.parentId === pageId)[0] || sortedShapes[0]\n  ).childIndex\n\n  // The shape's point is the min point of its childrens' common bounds\n  const groupBounds = Utils.getCommonBounds(shapesToGroup.map((shape) => TLDR.getBounds(shape)))\n\n  // Create the group\n  beforeShapes[groupId] = undefined\n\n  afterShapes[groupId] = TLDR.getShapeUtil(TDShapeType.Group).create({\n    id: groupId,\n    childIndex: groupChildIndex,\n    parentId: groupParentId,\n    point: [groupBounds.minX, groupBounds.minY],\n    size: [groupBounds.width, groupBounds.height],\n    children: sortedShapes.map((shape) => shape.id),\n  })\n\n  // Reparent shapes to the new group\n  sortedShapes.forEach((shape, index) => {\n    // If the shape is part of a different group, mark the parent shape for cleanup\n    if (shape.parentId !== pageId) {\n      const parentShape = app.getShape(shape.parentId)\n      otherEffectedGroups.push(parentShape)\n    }\n\n    beforeShapes[shape.id] = {\n      ...beforeShapes[shape.id],\n      parentId: shape.parentId,\n      childIndex: shape.childIndex,\n    }\n\n    afterShapes[shape.id] = {\n      ...afterShapes[shape.id],\n      parentId: groupId,\n      childIndex: index + 1,\n    }\n  })\n\n  // Clean up effected parents\n  while (otherEffectedGroups.length > 0) {\n    const shape = otherEffectedGroups.pop()\n    if (!shape) break\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const nextChildren = (beforeShapes[shape.id]?.children || shape.children)!.filter(\n      (childId) => childId && !(idsToGroup.includes(childId) || deletedGroupIds.includes(childId))\n    )\n\n    // If the parent has no children, remove it\n    if (nextChildren.length === 0) {\n      beforeShapes[shape.id] = shape\n      afterShapes[shape.id] = undefined\n\n      // And if that parent is part of a different group, mark it for cleanup\n      // (This is necessary only when we implement nested groups.)\n      if (shape.parentId !== pageId) {\n        deletedGroupIds.push(shape.id)\n        otherEffectedGroups.push(app.getShape(shape.parentId))\n      }\n    } else {\n      beforeShapes[shape.id] = {\n        ...beforeShapes[shape.id],\n        children: shape.children,\n      }\n\n      afterShapes[shape.id] = {\n        ...afterShapes[shape.id],\n        children: nextChildren,\n      }\n    }\n  }\n\n  // TODO: This code is copied from delete.command. Create a shared helper!\n\n  const { bindings } = app\n\n  const deletedGroupIdsSet = new Set(deletedGroupIds)\n\n  // We also need to delete bindings that reference the deleted shapes\n  bindings.forEach((binding) => {\n    for (const id of [binding.toId, binding.fromId]) {\n      // If the binding references a deleted shape...\n      if (deletedGroupIdsSet.has(id)) {\n        // Delete this binding\n        beforeBindings[binding.id] = binding\n        afterBindings[binding.id] = undefined\n\n        // Let's also look each the bound shape...\n        const shape = app.getShape(id)\n\n        // If the bound shape has a handle that references the deleted binding...\n        if (shape.handles) {\n          Object.values(shape.handles)\n            .filter((handle) => handle.bindingId === binding.id)\n            .forEach((handle) => {\n              // Save the binding reference in the before patch\n              beforeShapes[id] = {\n                ...beforeShapes[id],\n                handles: {\n                  ...beforeShapes[id]?.handles,\n                  [handle.id]: { bindingId: binding.id },\n                },\n              }\n\n              // Unless we're currently deleting the shape, remove the\n              // binding reference from the after patch\n              if (!deletedGroupIds.includes(id)) {\n                afterShapes[id] = {\n                  ...afterShapes[id],\n                  handles: {\n                    ...afterShapes[id]?.handles,\n                    [handle.id]: { bindingId: undefined },\n                  },\n                }\n              }\n            })\n        }\n      }\n    }\n  })\n\n  return {\n    id: 'group',\n    before: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: beforeShapes,\n            bindings: beforeBindings,\n          },\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: afterShapes,\n            bindings: beforeBindings,\n          },\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: [groupId],\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type { ArrowShape, PagePartial, TldrawCommand, TDShape } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { TLDR } from '~state/TLDR'\nimport { Utils, TLBounds } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\n\nexport function moveShapesToPage(\n  app: TldrawApp,\n  ids: string[],\n  viewportBounds: TLBounds,\n  fromPageId: string,\n  toPageId: string\n): TldrawCommand {\n  const { page } = app\n\n  const fromPage: Record<string, PagePartial> = {\n    before: {\n      shapes: {},\n      bindings: {},\n    },\n    after: {\n      shapes: {},\n      bindings: {},\n    },\n  }\n\n  const toPage: Record<string, PagePartial> = {\n    before: {\n      shapes: {},\n      bindings: {},\n    },\n    after: {\n      shapes: {},\n      bindings: {},\n    },\n  }\n\n  // Collect all the shapes to move and their keys.\n  const movingShapeIds = new Set<string>()\n  const shapesToMove = new Set<TDShape>()\n\n  ids\n    .map((id) => app.getShape(id, fromPageId))\n    .filter((shape) => !shape.isLocked)\n    .forEach((shape) => {\n      movingShapeIds.add(shape.id)\n      shapesToMove.add(shape)\n      if (shape.children !== undefined) {\n        shape.children.forEach((childId) => {\n          movingShapeIds.add(childId)\n          shapesToMove.add(app.getShape(childId, fromPageId))\n        })\n      }\n    })\n\n  // Where should we put start putting shapes on the \"to\" page?\n  const startingChildIndex = TLDR.getTopChildIndex(app.state, toPageId)\n\n  // Which shapes are we moving?\n  const movingShapes = Array.from(shapesToMove.values())\n\n  movingShapes.forEach((shape, i) => {\n    // Remove the shape from the fromPage\n    fromPage.before.shapes[shape.id] = shape\n    fromPage.after.shapes[shape.id] = undefined\n\n    // But the moved shape on the \"to\" page\n    toPage.before.shapes[shape.id] = undefined\n    toPage.after.shapes[shape.id] = shape\n\n    // If the shape's parent isn't moving too, reparent the shape to\n    // the \"to\" page, at the top of the z stack\n    if (!movingShapeIds.has(shape.parentId)) {\n      toPage.after.shapes[shape.id] = {\n        ...shape,\n        parentId: toPageId,\n        childIndex: startingChildIndex + i,\n      }\n\n      // If the shape was in a group, then pull the shape from the\n      // parent's children array.\n      if (shape.parentId !== fromPageId) {\n        const parent = app.getShape(shape.parentId, fromPageId)\n        fromPage.before.shapes[parent.id] = {\n          children: parent.children,\n        }\n\n        fromPage.after.shapes[parent.id] = {\n          children: parent.children!.filter((childId) => childId !== shape.id),\n        }\n      }\n    }\n  })\n\n  // Handle bindings that effect duplicated shapes\n  Object.values(page.bindings)\n    .filter((binding) => movingShapeIds.has(binding.fromId) || movingShapeIds.has(binding.toId))\n    .forEach((binding) => {\n      // Always delete the binding from the from page\n\n      fromPage.before.bindings[binding.id] = binding\n      fromPage.after.bindings[binding.id] = undefined\n\n      // Delete the reference from the binding's fromShape\n\n      const fromBoundShape = app.getShape(binding.fromId, fromPageId)\n\n      // Will we be copying this binding to the new page?\n\n      const shouldCopy = movingShapeIds.has(binding.fromId) && movingShapeIds.has(binding.toId)\n\n      if (shouldCopy) {\n        // Just move the binding to the new page\n        toPage.before.bindings[binding.id] = undefined\n        toPage.after.bindings[binding.id] = binding\n      } else {\n        if (movingShapeIds.has(binding.fromId)) {\n          // If we are only moving the \"from\" shape, we need to delete\n          // the binding reference from the \"from\" shapes handles\n          const fromShape = app.getShape(binding.fromId, fromPageId)\n          const handle = Object.values(fromBoundShape.handles!).find(\n            (handle) => handle.bindingId === binding.id\n          )!\n\n          // Remove the handle from the shape on the toPage\n\n          const handleId = handle.id as keyof ArrowShape['handles']\n\n          const toPageShape = toPage.after.shapes[fromShape.id]!\n\n          toPageShape.handles = {\n            ...toPageShape.handles,\n            [handleId]: {\n              ...toPageShape.handles![handleId],\n              bindingId: undefined,\n            },\n          }\n        } else {\n          // If we are only moving the \"to\" shape, we need to delete\n          // the binding reference from the \"from\" shape's handles\n          const fromShape = app.getShape(binding.fromId, fromPageId)\n          const handle = Object.values(fromBoundShape.handles!).find(\n            (handle) => handle.bindingId === binding.id\n          )!\n\n          fromPage.before.shapes[fromShape.id] = {\n            handles: { [handle.id]: { bindingId: binding.id } },\n          }\n\n          fromPage.after.shapes[fromShape.id] = {\n            handles: { [handle.id]: { bindingId: undefined } },\n          }\n        }\n      }\n    })\n\n  // Finally, center camera on selection\n\n  const toPageState = app.state.document.pageStates[toPageId]\n\n  const bounds = Utils.getCommonBounds(movingShapes.map((shape) => TLDR.getBounds(shape)))\n\n  const zoom = TLDR.getCameraZoom(\n    viewportBounds.width < viewportBounds.height\n      ? (viewportBounds.width - 128) / bounds.width\n      : (viewportBounds.height - 128) / bounds.height\n  )\n\n  const mx = (viewportBounds.width - bounds.width * zoom) / 2 / zoom\n  const my = (viewportBounds.height - bounds.height * zoom) / 2 / zoom\n\n  const point = Vec.toFixed(Vec.add([-bounds.minX, -bounds.minY], [mx, my]))\n\n  return {\n    id: 'move_to_page',\n    before: {\n      appState: {\n        currentPageId: fromPageId,\n      },\n      document: {\n        pages: {\n          [fromPageId]: fromPage.before,\n          [toPageId]: toPage.before,\n        },\n        pageStates: {\n          [fromPageId]: { selectedIds: ids },\n          [toPageId]: {\n            selectedIds: toPageState.selectedIds,\n            camera: toPageState.camera,\n          },\n        },\n      },\n    },\n    after: {\n      appState: {\n        currentPageId: toPageId,\n      },\n      document: {\n        pages: {\n          [fromPageId]: fromPage.after,\n          [toPageId]: toPage.after,\n        },\n        pageStates: {\n          [fromPageId]: { selectedIds: [] },\n          [toPageId]: {\n            selectedIds: ids,\n            camera: {\n              zoom,\n              point,\n            },\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TDPage, TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function movePage(app: TldrawApp, pageId: string, index: number): TldrawCommand {\n  const { pages } = app.document\n\n  const movingPage = pages[pageId]\n\n  const beforePages = Object.values(pages).sort((a, b) => (a.childIndex ?? 0) - (b.childIndex ?? 0))\n\n  const fromIndex = beforePages.indexOf(movingPage)\n\n  const afterPages = [...beforePages]\n  afterPages.splice(fromIndex, 1)\n  afterPages.splice(index > fromIndex ? index - 1 : index, 0, movingPage)\n\n  return {\n    id: 'move_page',\n    before: {\n      document: {\n        pages: Object.fromEntries(\n          beforePages.map((p: TDPage) => [p.id, { childIndex: p.childIndex }])\n        ),\n      },\n    },\n    after: {\n      document: {\n        pages: Object.fromEntries(\n          afterPages.map((p: TDPage, childIndex) => [p.id, { childIndex }])\n        ),\n      },\n    },\n  }\n}\n", "import { MoveType, TDShape, TldrawCommand } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nexport function reorderShapes(app: TldrawApp, ids: string[], type: MoveType): TldrawCommand {\n  const { currentPageId, page } = app\n\n  // Get the unique parent ids for the selected elements\n  const parentIds = new Set(ids.map((id) => app.getShape(id).parentId))\n\n  let result: {\n    before: Record<string, Partial<TDShape>>\n    after: Record<string, Partial<TDShape>>\n  } = { before: {}, after: {} }\n\n  let startIndex: number\n  let startChildIndex: number\n  let step: number\n\n  // Collect shapes with common parents into a table under their parent id\n  Array.from(parentIds.values()).forEach((parentId) => {\n    let sortedChildren: TDShape[] = []\n    if (parentId === page.id) {\n      sortedChildren = Object.values(page.shapes).sort((a, b) => a.childIndex - b.childIndex)\n    } else {\n      const parent = app.getShape(parentId)\n      if (!parent.children) throw Error('No children in parent!')\n\n      sortedChildren = parent.children\n        .map((childId) => app.getShape(childId))\n        .sort((a, b) => a.childIndex - b.childIndex)\n    }\n\n    const sortedChildIds = sortedChildren.map((shape) => shape.id)\n\n    const sortedIndicesToMove = ids\n      .filter((id) => sortedChildIds.includes(id))\n      .map((id) => sortedChildIds.indexOf(id))\n      .sort((a, b) => a - b)\n\n    if (sortedIndicesToMove.length === sortedChildIds.length) return\n\n    switch (type) {\n      case MoveType.ToBack: {\n        //               a       b  c\n        // Initial   1   2    3  4  5  6  7\n        // Final   .25  .5  .75  1  3  6  7\n        //           a   b    c\n\n        // Find the lowest \"open\" index\n        for (let i = 0; i < sortedChildIds.length; i++) {\n          if (sortedIndicesToMove.includes(i)) continue\n          startIndex = i\n          break\n        }\n\n        // Find the lowest child index that isn't in sortedIndicesToMove\n        startChildIndex = sortedChildren[startIndex].childIndex\n\n        // Find the step for each additional child\n        step = startChildIndex / (sortedIndicesToMove.length + 1)\n\n        // Get the results of moving the selected shapes below the first open index's shape\n        result = TLDR.mutateShapes(\n          app.state,\n          sortedIndicesToMove.map((i) => sortedChildren[i].id).reverse(),\n          (_shape, i) => ({\n            childIndex: startChildIndex - (i + 1) * step,\n          }),\n          currentPageId\n        )\n\n        break\n      }\n      case MoveType.ToFront: {\n        //              a     b  c\n        // Initial   1  2  3  4  5  6   7\n        // Final     1  3  6  7  8  9  10\n        //                       a  b   c\n\n        // Find the highest \"open\" index\n        for (let i = sortedChildIds.length - 1; i >= 0; i--) {\n          if (sortedIndicesToMove.includes(i)) continue\n          startIndex = i\n          break\n        }\n\n        // Find the lowest child index that isn't in sortedIndicesToMove\n        startChildIndex = sortedChildren[startIndex].childIndex\n\n        // Find the step for each additional child\n        step = 1\n\n        // Get the results of moving the selected shapes below the first open index's shape\n        result = TLDR.mutateShapes(\n          app.state,\n          sortedIndicesToMove.map((i) => sortedChildren[i].id),\n          (_shape, i) => ({\n            childIndex: startChildIndex + (i + 1),\n          }),\n          currentPageId\n        )\n\n        break\n      }\n      case MoveType.Backward: {\n        //               a           b  c\n        // Initial    1  2     3     4  5  6  7\n        // Final     .5  1  1.66  2.33  3  6  7\n        //           a         b     c\n\n        const indexMap: Record<string, number> = {}\n\n        // Starting from the top...\n        for (let i = sortedChildIds.length - 1; i >= 0; i--) {\n          // If we found a moving index...\n          if (sortedIndicesToMove.includes(i)) {\n            for (let j = i; j >= 0; j--) {\n              // iterate downward until we find an open spot\n              if (!sortedIndicesToMove.includes(j)) {\n                // i = the index of the first closed spot\n                // j = the index of the first open spot\n\n                const endChildIndex = sortedChildren[j].childIndex\n                let startChildIndex: number\n                let step: number\n\n                if (j === 0) {\n                  // We're moving below the first child, start from\n                  // half of its child index.\n\n                  startChildIndex = endChildIndex / 2\n                  step = endChildIndex / 2 / (i - j + 1)\n                } else {\n                  // Start from the child index of the child below the\n                  // child above.\n                  startChildIndex = sortedChildren[j - 1].childIndex\n                  step = (endChildIndex - startChildIndex) / (i - j + 1)\n                  startChildIndex += step\n                }\n\n                for (let k = 0; k < i - j; k++) {\n                  indexMap[sortedChildren[j + k + 1].id] = startChildIndex + step * k\n                }\n\n                break\n              }\n            }\n          }\n        }\n\n        if (Object.values(indexMap).length > 0) {\n          // Get the results of moving the selected shapes below the first open index's shape\n          result = TLDR.mutateShapes(\n            app.state,\n            sortedIndicesToMove.map((i) => sortedChildren[i].id),\n            (shape) => ({\n              childIndex: indexMap[shape.id],\n            }),\n            currentPageId\n          )\n        }\n\n        break\n      }\n      case MoveType.Forward: {\n        //             a     b c\n        // Initial   1 2   3 4 5 6 7\n        // Final     1 3 3.5 6 7 8 9\n        //                 a     b c\n\n        const indexMap: Record<string, number> = {}\n\n        // Starting from the top...\n        for (let i = 0; i < sortedChildIds.length; i++) {\n          // If we found a moving index...\n          if (sortedIndicesToMove.includes(i)) {\n            // Search for the first open spot above this one\n            for (let j = i; j < sortedChildIds.length; j++) {\n              if (!sortedIndicesToMove.includes(j)) {\n                // i = the low index of the first closed spot\n                // j = the high index of the first open spot\n\n                startChildIndex = sortedChildren[j].childIndex\n\n                const step =\n                  j === sortedChildIds.length - 1\n                    ? 1\n                    : (sortedChildren[j + 1].childIndex - startChildIndex) / (j - i + 1)\n\n                for (let k = 0; k < j - i; k++) {\n                  indexMap[sortedChildren[i + k].id] = startChildIndex + step * (k + 1)\n                }\n\n                break\n              }\n            }\n          }\n        }\n\n        if (Object.values(indexMap).length > 0) {\n          // Get the results of moving the selected shapes below the first open index's shape\n          result = TLDR.mutateShapes(\n            app.state,\n            sortedIndicesToMove.map((i) => sortedChildren[i].id),\n            (shape) => ({\n              childIndex: indexMap[shape.id],\n            }),\n            currentPageId\n          )\n        }\n\n        break\n      }\n    }\n  })\n\n  return {\n    id: 'move',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: result.before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: result.after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function renamePage(app: TldrawApp, pageId: string, name: string): TldrawCommand {\n  const { page } = app\n\n  return {\n    id: 'rename_page',\n    before: {\n      document: {\n        pages: {\n          [pageId]: { name: page.name },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [pageId]: { name: name },\n        },\n      },\n    },\n  }\n}\n", "import type { TldrawCommand } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nexport function resetBounds(app: TldrawApp, ids: string[], pageId: string): TldrawCommand {\n  const { currentPageId } = app\n\n  const { before, after } = TLDR.mutateShapes(\n    app.state,\n    ids,\n    (shape) => app.getShapeUtil(shape).onDoubleClickBoundsHandle?.(shape),\n    pageId\n  )\n\n  return {\n    id: 'reset_bounds',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import { Utils } from '@tldraw/core'\nimport type { TldrawCommand, TDShape } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nconst PI2 = Math.PI * 2\n\nexport function rotateShapes(\n  app: TldrawApp,\n  ids: string[],\n  delta = -PI2 / 4\n): TldrawCommand | void {\n  const { currentPageId } = app\n\n  // The shapes for the before patch\n  const before: Record<string, Partial<TDShape>> = {}\n\n  // The shapes for the after patch\n  const after: Record<string, Partial<TDShape>> = {}\n\n  // Find the shapes that we want to rotate.\n  // We don't rotate groups: we rotate their children instead.\n  const shapesToRotate = ids\n    .flatMap((id) => {\n      const shape = app.getShape(id)\n      return shape.children ? shape.children.map((childId) => app.getShape(childId)) : shape\n    })\n    .filter((shape) => !shape.isLocked)\n\n  // Find the common center to all shapes\n  // This is the point that we'll rotate around\n  const origin = Utils.getBoundsCenter(\n    Utils.getCommonBounds(shapesToRotate.map((shape) => TLDR.getBounds(shape)))\n  )\n\n  // Find the rotate mutations for each shape\n  shapesToRotate.forEach((shape) => {\n    const change = TLDR.getRotatedShapeMutation(shape, TLDR.getCenter(shape), origin, delta)\n    if (!change) return\n    before[shape.id] = TLDR.getBeforeShape(shape, change)\n    after[shape.id] = change\n  })\n\n  return {\n    id: 'rotate',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { TLBoundsCorner, Utils } from '@tldraw/core'\nimport { StretchType, TDShapeType } from '~types'\nimport type { TldrawCommand } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nexport function stretchShapes(app: TldrawApp, ids: string[], type: StretchType): TldrawCommand {\n  const { currentPageId, selectedIds } = app\n\n  const initialShapes = ids.map((id) => app.getShape(id))\n\n  const boundsForShapes = initialShapes.map((shape) => TLDR.getBounds(shape))\n\n  const commonBounds = Utils.getCommonBounds(boundsForShapes)\n\n  const idsToMutate = ids\n    .flatMap((id) => {\n      const shape = app.getShape(id)\n      return shape.children ? shape.children : shape.id\n    })\n    .filter((id) => !app.getShape(id).isLocked)\n\n  const { before, after } = TLDR.mutateShapes(\n    app.state,\n    idsToMutate,\n    (shape) => {\n      const bounds = TLDR.getBounds(shape)\n\n      switch (type) {\n        case StretchType.Horizontal: {\n          const newBounds = {\n            ...bounds,\n            minX: commonBounds.minX,\n            maxX: commonBounds.maxX,\n            width: commonBounds.width,\n          }\n\n          return TLDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n            type: TLBoundsCorner.TopLeft,\n            scaleX: newBounds.width / bounds.width,\n            scaleY: 1,\n            initialShape: shape,\n            transformOrigin: [0.5, 0.5],\n          })\n        }\n        case StretchType.Vertical: {\n          const newBounds = {\n            ...bounds,\n            minY: commonBounds.minY,\n            maxY: commonBounds.maxY,\n            height: commonBounds.height,\n          }\n\n          return TLDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n            type: TLBoundsCorner.TopLeft,\n            scaleX: 1,\n            scaleY: newBounds.height / bounds.height,\n            initialShape: shape,\n            transformOrigin: [0.5, 0.5],\n          })\n        }\n      }\n    },\n    currentPageId\n  )\n\n  initialShapes.forEach((shape) => {\n    if (shape.type === TDShapeType.Group) {\n      delete before[shape.id]\n      delete after[shape.id]\n    }\n  })\n\n  return {\n    id: 'stretch',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: before },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: after },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import { Patch, ShapeStyles, TldrawCommand, TDShape, TDShapeType, TextShape } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { Vec } from '@tldraw/vec'\nimport type { TldrawApp } from '../../internal'\n\nexport function styleShapes(\n  app: TldrawApp,\n  ids: string[],\n  changes: Partial<ShapeStyles>\n): TldrawCommand {\n  const { currentPageId, selectedIds } = app\n\n  const shapeIdsToMutate = ids\n    .flatMap((id) => TLDR.getDocumentBranch(app.state, id, currentPageId))\n    .filter((id) => !app.getShape(id).isLocked)\n\n  const beforeShapes: Record<string, Patch<TDShape>> = {}\n  const afterShapes: Record<string, Patch<TDShape>> = {}\n\n  shapeIdsToMutate\n    .map((id) => app.getShape(id))\n    .filter((shape) => !shape.isLocked)\n    .forEach((shape) => {\n      beforeShapes[shape.id] = {\n        style: {\n          ...Object.fromEntries(\n            Object.keys(changes).map((key) => [key, shape.style[key as keyof typeof shape.style]])\n          ),\n        },\n      }\n\n      afterShapes[shape.id] = {\n        style: changes,\n      }\n\n      if (shape.type === TDShapeType.Text) {\n        beforeShapes[shape.id].point = shape.point\n        afterShapes[shape.id].point = Vec.toFixed(\n          Vec.add(\n            shape.point,\n            Vec.sub(\n              app.getShapeUtil(shape).getCenter(shape),\n              app.getShapeUtil(shape).getCenter({\n                ...shape,\n                style: { ...shape.style, ...changes },\n              } as TextShape)\n            )\n          )\n        )\n      }\n    })\n\n  return {\n    id: 'style',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: beforeShapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: selectedIds,\n          },\n        },\n      },\n      appState: {\n        currentStyle: { ...app.appState.currentStyle },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: afterShapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n      appState: {\n        currentStyle: changes,\n      },\n    },\n  }\n}\n", "import { Decoration } from '~types'\nimport type { Patch, ArrowShape, TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function toggleShapesDecoration(\n  app: TldrawApp,\n  ids: string[],\n  decorationId: 'start' | 'end'\n): TldrawCommand {\n  const { currentPageId, selectedIds } = app\n\n  const beforeShapes: Record<string, Patch<ArrowShape>> = Object.fromEntries(\n    ids.map((id) => [\n      id,\n      {\n        decorations: {\n          [decorationId]: app.getShape<ArrowShape>(id).decorations?.[decorationId],\n        },\n      },\n    ])\n  )\n\n  const afterShapes: Record<string, Patch<ArrowShape>> = Object.fromEntries(\n    ids\n      .filter((id) => !app.getShape(id).isLocked)\n      .map((id) => [\n        id,\n        {\n          decorations: {\n            [decorationId]: app.getShape<ArrowShape>(id).decorations?.[decorationId]\n              ? undefined\n              : Decoration.Arrow,\n          },\n        },\n      ])\n  )\n\n  return {\n    id: 'toggle_decorations',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: beforeShapes },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: { shapes: afterShapes },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TDShape, TldrawCommand } from '~types'\nimport type { TldrawApp } from '~state'\n\nexport function toggleShapeProp(app: TldrawApp, ids: string[], prop: keyof TDShape): TldrawCommand {\n  const { currentPageId } = app\n\n  const initialShapes = ids\n    .map((id) => app.getShape(id))\n    .filter((shape) => (prop === 'isLocked' ? true : !shape.isLocked))\n\n  const isAllToggled = initialShapes.every((shape) => shape[prop])\n\n  const before: Record<string, Partial<TDShape>> = {}\n  const after: Record<string, Partial<TDShape>> = {}\n\n  initialShapes.forEach((shape) => {\n    before[shape.id] = { [prop]: shape[prop] }\n    after[shape.id] = { [prop]: !isAllToggled }\n  })\n\n  return {\n    id: 'toggle',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: before,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: after,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import { Vec } from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawCommand, PagePartial } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function translateShapes(app: TldrawApp, ids: string[], delta: number[]): TldrawCommand {\n  const { currentPageId, selectedIds } = app\n\n  // Clear session cache\n  app.rotationInfo.selectedIds = [...selectedIds]\n\n  const before: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const after: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const idsToMutate = ids\n    .flatMap((id) => {\n      const shape = app.getShape(id)\n      return shape.children ? shape.children : shape.id\n    })\n    .filter((id) => !app.getShape(id).isLocked)\n\n  const change = TLDR.mutateShapes(\n    app.state,\n    idsToMutate,\n    (shape) => ({\n      point: Vec.toFixed(Vec.add(shape.point, delta)),\n    }),\n    currentPageId\n  )\n\n  before.shapes = change.before\n  after.shapes = change.after\n\n  // Delete bindings from nudged shapes, unless both bound and bound-to shapes are selected\n  const bindingsToDelete = TLDR.getBindings(app.state, currentPageId).filter(\n    (binding) => ids.includes(binding.fromId) && !ids.includes(binding.toId)\n  )\n\n  bindingsToDelete.forEach((binding) => {\n    before.bindings[binding.id] = binding\n    after.bindings[binding.id] = undefined\n\n    for (const id of [binding.toId, binding.fromId]) {\n      // Let's also look at the bound shape...\n      const shape = app.getShape(id)\n\n      if (!shape.handles) continue\n\n      // If the bound shape has a handle that references the deleted binding, delete that reference\n\n      Object.values(shape.handles)\n        .filter((handle) => handle.bindingId === binding.id)\n        .forEach((handle) => {\n          before.shapes[id] = {\n            ...before.shapes[id],\n            handles: {\n              ...before.shapes[id]?.handles,\n              [handle.id]: { bindingId: binding.id },\n            },\n          }\n          after.shapes[id] = {\n            ...after.shapes[id],\n            handles: { ...after.shapes[id]?.handles, [handle.id]: { bindingId: undefined } },\n          }\n        })\n    }\n  })\n\n  return {\n    id: 'translate',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: before,\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: after,\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: ids,\n          },\n        },\n      },\n    },\n  }\n}\n", "import { TLDR } from '~state/TLDR'\nimport type { Patch, GroupShape, TDBinding, TDShape } from '~types'\nimport type { TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function ungroupShapes(\n  app: TldrawApp,\n  selectedIds: string[],\n  groupShapes: GroupShape[],\n  pageId: string\n): TldrawCommand | undefined {\n  const { bindings } = app\n\n  const beforeShapes: Record<string, Patch<TDShape | undefined>> = {}\n  const afterShapes: Record<string, Patch<TDShape | undefined>> = {}\n\n  const beforeBindings: Record<string, Patch<TDBinding | undefined>> = {}\n  const afterBindings: Record<string, Patch<TDBinding | undefined>> = {}\n\n  const beforeSelectedIds = selectedIds\n  const afterSelectedIds = selectedIds.filter((id) => !groupShapes.find((shape) => shape.id === id))\n\n  // The group shape\n  groupShapes\n    .filter((shape) => !shape.isLocked)\n    .forEach((groupShape) => {\n      const shapesToReparent: TDShape[] = []\n      const deletedGroupIds: string[] = []\n\n      // Remove the group shape in the next state\n      beforeShapes[groupShape.id] = groupShape\n      afterShapes[groupShape.id] = undefined\n\n      // Select its children in the next state\n      groupShape.children.forEach((id) => {\n        afterSelectedIds.push(id)\n        const shape = app.getShape(id, pageId)\n        shapesToReparent.push(shape)\n      })\n\n      // We'll start placing the shapes at this childIndex\n      const startingChildIndex = groupShape.childIndex\n\n      // And we'll need to fit them under this child index\n      const endingChildIndex = TLDR.getChildIndexAbove(app.state, groupShape.id, pageId)\n\n      const step = (endingChildIndex - startingChildIndex) / shapesToReparent.length\n\n      // An array of shapes in order by their child index\n      const sortedShapes = shapesToReparent.sort((a, b) => a.childIndex - b.childIndex)\n\n      // Reparent shapes to the page\n      sortedShapes.forEach((shape, index) => {\n        beforeShapes[shape.id] = {\n          parentId: shape.parentId,\n          childIndex: shape.childIndex,\n        }\n\n        afterShapes[shape.id] = {\n          parentId: pageId,\n          childIndex: startingChildIndex + step * index,\n        }\n      })\n\n      // We also need to delete bindings that reference the deleted shapes\n      bindings\n        .filter((binding) => binding.toId === groupShape.id || binding.fromId === groupShape.id)\n        .forEach((binding) => {\n          for (const id of [binding.toId, binding.fromId]) {\n            // If the binding references the deleted group...\n            if (afterShapes[id] === undefined) {\n              // Delete the binding\n              beforeBindings[binding.id] = binding\n              afterBindings[binding.id] = undefined\n\n              // Let's also look each the bound shape...\n              const shape = app.getShape(id, pageId)\n\n              // If the bound shape has a handle that references the deleted binding...\n              if (shape.handles) {\n                Object.values(shape.handles)\n                  .filter((handle) => handle.bindingId === binding.id)\n                  .forEach((handle) => {\n                    // Save the binding reference in the before patch\n                    beforeShapes[id] = {\n                      ...beforeShapes[id],\n                      handles: {\n                        ...beforeShapes[id]?.handles,\n                        [handle.id]: { bindingId: binding.id },\n                      },\n                    }\n\n                    // Unless we're currently deleting the shape, remove the\n                    // binding reference from the after patch\n                    if (!deletedGroupIds.includes(id)) {\n                      afterShapes[id] = {\n                        ...afterShapes[id],\n                        handles: {\n                          ...afterShapes[id]?.handles,\n                          [handle.id]: { bindingId: undefined },\n                        },\n                      }\n                    }\n                  })\n              }\n            }\n          }\n        })\n    })\n\n  return {\n    id: 'ungroup',\n    before: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: beforeShapes,\n            bindings: beforeBindings,\n          },\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: beforeSelectedIds,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: afterShapes,\n            bindings: beforeBindings,\n          },\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: afterSelectedIds,\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TldrawCommand, TDShape } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport type { TldrawApp } from '../../internal'\n\nexport function updateShapes(\n  app: TldrawApp,\n  updates: ({ id: string } & Partial<TDShape>)[],\n  pageId: string\n): TldrawCommand {\n  const ids = updates.map((update) => update.id)\n\n  const change = TLDR.mutateShapes(\n    app.state,\n    ids.filter((id) => !app.getShape(id, pageId).isLocked),\n    (_shape, i) => updates[i],\n    pageId\n  )\n\n  return {\n    id: 'update',\n    before: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: change.before,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: change.after,\n          },\n        },\n      },\n    },\n  }\n}\n", "import type { TDShape, TldrawCommand } from '~types'\nimport type { TldrawApp } from '~state'\n\nexport function setShapesProps<T extends TDShape>(\n  app: TldrawApp,\n  ids: string[],\n  partial: Partial<T>\n): TldrawCommand {\n  const { currentPageId, selectedIds } = app\n\n  const initialShapes = ids\n    .map((id) => app.getShape<T>(id))\n    .filter((shape) => (partial['isLocked'] ? true : !shape.isLocked))\n\n  const before: Record<string, Partial<TDShape>> = {}\n  const after: Record<string, Partial<TDShape>> = {}\n\n  const keys = Object.keys(partial) as (keyof T)[]\n\n  initialShapes.forEach((shape) => {\n    before[shape.id] = Object.fromEntries(keys.map((key) => [key, shape[key]]))\n    after[shape.id] = partial\n  })\n\n  return {\n    id: 'set_props',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: before,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds,\n          },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: after,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds,\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport type { PagePartial, TldrawCommand, TDShape, TDBinding, TDAsset } from '~types'\nimport type { TldrawApp } from '../../internal'\n\nexport function insertContent(\n  app: TldrawApp,\n  content: { shapes: TDShape[]; bindings?: TDBinding[]; assets?: TDAsset[] },\n  opts = {} as { point?: number[]; select?: boolean; overwrite?: boolean }\n): TldrawCommand {\n  const { currentPageId } = app\n  const { point, select, overwrite } = opts\n\n  const page = app.document.pages[currentPageId]\n\n  const before: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  const afterAssets: Record<string, TDAsset> = {}\n\n  const after: PagePartial = {\n    shapes: {},\n    bindings: {},\n  }\n\n  if (overwrite) {\n    // Map shapes and bindings onto new IDs to avoid overwriting existing content.\n    for (const shape of content.shapes) {\n      before.shapes[shape.id] = page.shapes[shape.id]\n      after.shapes[shape.id] = shape\n    }\n    if (content.bindings) {\n      for (const binding of content.bindings) {\n        before.bindings[binding.id] = page.bindings[binding.id]\n        after.bindings[binding.id] = binding\n      }\n    }\n    if (content.assets) {\n      for (const asset of content.assets) {\n        afterAssets[asset.id] = asset\n      }\n    }\n  } else {\n    // Map shapes and bindings onto new IDs to avoid overwriting existing content.\n\n    const oldToNewIds: Record<string, string> = {}\n\n    // The index of the new shape\n    let nextIndex = TLDR.getTopChildIndex(app.state, currentPageId)\n\n    const shapesToInsert: TDShape[] = content.shapes\n      .sort((a, b) => a.childIndex - b.childIndex)\n      .map((shape) => {\n        const newShapeId = Utils.uniqueId()\n        oldToNewIds[shape.id] = newShapeId\n\n        // The redo should include a clone of the new shape\n        return {\n          ...Utils.deepClone(shape),\n          id: newShapeId,\n        }\n      })\n\n    const visited = new Set<string>()\n\n    // Iterate through the list, starting from the front\n    while (shapesToInsert.length > 0) {\n      const shape = shapesToInsert.shift()\n\n      if (!shape) break\n\n      visited.add(shape.id)\n\n      if (shape.parentId === 'currentPageId') {\n        shape.parentId = currentPageId\n        shape.childIndex = nextIndex++\n      } else {\n        // The shape had another shape as its parent.\n\n        // Re-assign the shape's parentId to the new id\n        shape.parentId = oldToNewIds[shape.parentId]\n\n        // Has that parent been added yet to the after object?\n        const parent = after.shapes[shape.parentId]\n\n        if (!parent) {\n          if (visited.has(shape.id)) {\n            // If we've already visited this shape, then that means\n            // its parent was not among the shapes to insert. Set it\n            // to be a child of the current page instead.\n            shape.parentId = 'currentPageId'\n          }\n\n          // If the parent hasn't been added yet, push this shape\n          // to back of the queue; we'll try and add it again later\n          shapesToInsert.push(shape)\n          continue\n        }\n\n        // If we've found the parent, add this shape's id to its children\n        parent.children!.push(shape.id)\n      }\n\n      // If the inserting shape has its own children, set the children to\n      // an empty array; we'll add them later, as just shown above\n      if (shape.children) {\n        shape.children = []\n      }\n\n      // The undo should remove the inserted shape\n      before.shapes[shape.id] = undefined\n\n      // The redo should include the inserted shape\n      after.shapes[shape.id] = shape\n    }\n\n    Object.values(after.shapes).forEach((shape) => {\n      // If the shape used to have children, but no longer does have children,\n      // then delete the shape. This prevents inserting groups without children.\n      if (shape!.children && shape!.children.length === 0) {\n        delete before.shapes[shape!.id!]\n        delete after.shapes[shape!.id!]\n      }\n    })\n\n    // Insert bindings\n    if (content.bindings) {\n      content.bindings.forEach((binding) => {\n        const newBindingId = Utils.uniqueId()\n        oldToNewIds[binding.id] = newBindingId\n\n        const toId = oldToNewIds[binding.toId]\n        const fromId = oldToNewIds[binding.fromId]\n\n        // If the binding is \"to\" or \"from\" a shape that hasn't been inserted,\n        // we'll need to skip the binding and remove it from any shape that\n        // references it.\n        if (!toId || !fromId) {\n          if (fromId) {\n            const handles = after.shapes[fromId]!.handles\n            if (handles) {\n              Object.values(handles).forEach((handle) => {\n                if (handle!.bindingId === binding.id) {\n                  handle!.bindingId = undefined\n                }\n              })\n            }\n          }\n\n          if (toId) {\n            const handles = after.shapes[toId]!.handles\n            if (handles) {\n              Object.values(handles).forEach((handle) => {\n                if (handle!.bindingId === binding.id) {\n                  handle!.bindingId = undefined\n                }\n              })\n            }\n          }\n\n          return\n        }\n\n        // Update the shape's to and from references to the new bindingid\n\n        const fromHandles = after.shapes[fromId]!.handles\n        if (fromHandles) {\n          Object.values(fromHandles).forEach((handle) => {\n            if (handle!.bindingId === binding.id) {\n              handle!.bindingId = newBindingId\n            }\n          })\n        }\n\n        const toHandles = after.shapes[toId]!.handles\n        if (toHandles) {\n          Object.values(after.shapes[toId]!.handles!).forEach((handle) => {\n            if (handle!.bindingId === binding.id) {\n              handle!.bindingId = newBindingId\n            }\n          })\n        }\n\n        const newBinding = {\n          ...Utils.deepClone(binding),\n          id: newBindingId,\n          toId,\n          fromId,\n        }\n\n        // The undo should remove the inserted binding\n        before.bindings[newBinding.id] = undefined\n\n        // The redo should include the inserted binding\n        after.bindings[newBinding.id] = newBinding\n      })\n    }\n\n    // Now move the shapes\n\n    const shapesToMove = Object.values(after.shapes) as TDShape[]\n\n    if (shapesToMove.length > 0) {\n      if (point) {\n        // Move the shapes so that they're centered on the given point\n        const commonBounds = Utils.getCommonBounds(\n          shapesToMove.map((shape) => TLDR.getBounds(shape))\n        )\n        const center = Utils.getBoundsCenter(commonBounds)\n        shapesToMove.forEach((shape) => {\n          if (!shape.point) return\n          shape.point = Vec.sub(point, Vec.sub(center, shape.point))\n        })\n      } else {\n        const commonBounds = Utils.getCommonBounds(shapesToMove.map(TLDR.getBounds))\n\n        if (\n          !(\n            Utils.boundsContain(app.viewport, commonBounds) ||\n            Utils.boundsCollide(app.viewport, commonBounds)\n          )\n        ) {\n          const center = Vec.toFixed(app.getPagePoint(app.centerPoint))\n\n          const centeredBounds = Utils.centerBounds(commonBounds, center)\n\n          const delta = Vec.sub(\n            Utils.getBoundsCenter(centeredBounds),\n            Utils.getBoundsCenter(commonBounds)\n          )\n\n          shapesToMove.forEach((shape) => {\n            shape.point = Vec.toFixed(Vec.add(shape.point, delta))\n          })\n        }\n      }\n    }\n    if (content.assets) {\n      for (const asset of content.assets) {\n        afterAssets[asset.id] = asset\n      }\n    }\n  }\n\n  const elm = document.createElement('textarea')\n\n  Object.values(after.shapes as Record<string, TDShape>).forEach((shape) => {\n    if ('text' in shape) {\n      elm.innerHTML = shape.text\n      shape.text = elm.value\n    }\n\n    if ('label' in shape) {\n      elm.innerHTML = shape.label!\n      shape.label = elm.value\n    }\n  })\n\n  elm.remove()\n\n  return {\n    id: 'insert',\n    before: {\n      document: {\n        pages: {\n          [currentPageId]: before,\n        },\n        pageStates: {\n          [currentPageId]: { selectedIds: [...app.selectedIds] },\n        },\n      },\n    },\n    after: {\n      document: {\n        pages: {\n          [currentPageId]: after,\n        },\n        assets: afterAssets,\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: select ? Object.keys(after.shapes) : [...app.selectedIds],\n          },\n        },\n      },\n    },\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n  ArrowBinding,\n  ArrowShape,\n  TDShape,\n  TDBinding,\n  TDStatus,\n  SessionType,\n  TDShapeType,\n  TldrawPatch,\n  TldrawCommand,\n} from '~types'\nimport { Vec } from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport { shapeUtils } from '~state/shapes'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\nimport { Utils } from '@tldraw/core'\nimport { deepCopy } from '~state/StateManager/copy'\n\nexport class ArrowSession extends BaseSession {\n  type = SessionType.Arrow\n  performanceMode = undefined\n  status = TDStatus.TranslatingHandle\n  newStartBindingId = Utils.uniqueId()\n  draggedBindingId = Utils.uniqueId()\n  didBind = false\n  initialShape: ArrowShape\n  handleId: 'start' | 'end'\n  bindableShapeIds: string[]\n  initialBinding?: TDBinding\n  startBindingShapeId?: string\n  isCreate: boolean\n\n  constructor(app: TldrawApp, shapeId: string, handleId: 'start' | 'end', isCreate = false) {\n    super(app)\n\n    this.isCreate = isCreate\n\n    const { currentPageId } = app.state.appState\n\n    const page = app.state.document.pages[currentPageId]\n\n    this.handleId = handleId\n\n    this.initialShape = deepCopy(page.shapes[shapeId] as ArrowShape)\n\n    this.bindableShapeIds = TLDR.getBindableShapeIds(app.state).filter(\n      (id) => !(id === this.initialShape.id || id === this.initialShape.parentId)\n    )\n\n    // TODO: find out why this the oppositeHandleBindingId is sometimes missing\n    const oppositeHandleBindingId =\n      this.initialShape.handles[handleId === 'start' ? 'end' : 'start']?.bindingId\n\n    if (oppositeHandleBindingId) {\n      const oppositeToId = page.bindings[oppositeHandleBindingId]?.toId\n      if (oppositeToId) {\n        this.bindableShapeIds = this.bindableShapeIds.filter((id) => id !== oppositeToId)\n      }\n    }\n\n    const { originPoint } = this.app\n\n    if (this.isCreate) {\n      // If we're creating a new shape, should we bind its first point?\n      // The method may return undefined, which is correct if there is no\n      // bindable shape under the pointer.\n      this.startBindingShapeId = this.bindableShapeIds\n        .map((id) => page.shapes[id])\n        .filter(\n          (shape) =>\n            !shape.isLocked &&\n            Utils.pointInBounds(originPoint, TLDR.getShapeUtil(shape).getBounds(shape))\n        )\n        .sort((a, b) => {\n          // TODO - We should be smarter here, what's the right logic?\n          return b.childIndex - a.childIndex\n        })[0]?.id\n\n      if (this.startBindingShapeId) {\n        this.bindableShapeIds.splice(this.bindableShapeIds.indexOf(this.startBindingShapeId), 1)\n      }\n    } else {\n      // If we're editing an existing line, is there a binding already\n      // for the dragging handle?\n      const initialBindingId = this.initialShape.handles[this.handleId].bindingId\n\n      if (initialBindingId) {\n        this.initialBinding = page.bindings[initialBindingId]\n      } else {\n        // If not, explicitly set this handle to undefined, so that it gets deleted on undo\n        this.initialShape.handles[this.handleId].bindingId = undefined\n      }\n    }\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const { initialShape } = this\n    const {\n      currentPoint,\n      shiftKey,\n      altKey,\n      metaKey,\n      currentGrid,\n      settings: { showGrid },\n    } = this.app\n\n    const shape = this.app.getShape<ArrowShape>(initialShape.id)\n\n    if (shape.isLocked) return\n\n    const { handles } = initialShape\n\n    const handleId = this.handleId as keyof typeof handles\n    // If the handle can bind, then we need to search bindable shapes for\n    // a binding.\n    if (!handles[handleId].canBind) return\n\n    // Find the delta (in shape space)\n    let delta = Vec.sub(currentPoint, Vec.add(handles[handleId].point, initialShape.point))\n\n    if (shiftKey) {\n      const A = altKey\n        ? Vec.med(handles.start.point, handles.end.point)\n        : handles[handleId === 'start' ? 'end' : 'start'].point\n      const B = handles[handleId].point\n      const C = Vec.add(B, delta)\n\n      const angle = Vec.angle(A, C)\n\n      const adjusted = Vec.rotWith(C, A, Utils.snapAngleToSegments(angle, 24) - angle)\n\n      delta = Vec.add(delta, Vec.sub(adjusted, C))\n    }\n\n    const nextPoint = Vec.add(handles[handleId].point, delta)\n\n    const handleChanges = {\n      [handleId]: {\n        ...handles[handleId],\n        point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n        bindingId: undefined,\n      },\n    }\n\n    // if (altKey) {\n    //   // If the user is holding alt key, apply the inverse delta\n    //   // to the oppoosite handle.\n    //   const oppositeHandleId = handleId === 'start' ? 'end' : 'start'\n\n    //   const nextPoint = Vec.sub(handles[oppositeHandleId].point, delta)\n\n    //   handleChanges[oppositeHandleId] = {\n    //     ...handles[oppositeHandleId],\n    //     point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n    //     bindingId: undefined,\n    //   }\n    // }\n\n    const utils = shapeUtils[TDShapeType.Arrow]\n    const handleChange = utils.onHandleChange?.(initialShape, handleChanges)\n\n    // If the handle changed produced no change, bail here\n    if (!handleChange) return\n\n    // If nothing changes, we want these to be the same object reference as\n    // before. If it does change, we'll redefine this later on. And if we've\n    // made it this far, the shape should be a new object reference that\n    // incorporates the changes we've made due to the handle movement.\n    const next: { shape: ArrowShape; bindings: Record<string, TDBinding | undefined> } = {\n      shape: Utils.deepMerge(shape, handleChange),\n      bindings: {},\n    }\n\n    let draggedBinding: ArrowBinding | undefined\n\n    const draggingHandle = next.shape.handles[this.handleId]\n\n    const oppositeHandle = next.shape.handles[this.handleId === 'start' ? 'end' : 'start']\n\n    // START BINDING\n    // If we have a start binding shape id, the recompute the binding\n    // point based on the current end handle position\n    if (this.startBindingShapeId) {\n      let nextStartBinding: ArrowBinding | undefined\n\n      const startTarget = this.app.page.shapes[this.startBindingShapeId]\n\n      const startTargetUtils = TLDR.getShapeUtil(startTarget)\n\n      const center = startTargetUtils.getCenter(startTarget)\n\n      const startHandle = next.shape.handles.start\n\n      const endHandle = next.shape.handles.end\n\n      const rayPoint = Vec.add(startHandle.point, next.shape.point)\n\n      if (Vec.isEqual(rayPoint, center)) rayPoint[1]++ // Fix bug where ray and center are identical\n\n      const rayOrigin = center\n\n      const isInsideShape = startTargetUtils.hitTestPoint(startTarget, currentPoint)\n\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n\n      const hasStartBinding = this.app.getBinding(this.newStartBindingId) !== undefined\n\n      // Don't bind the start handle if both handles are inside of the target shape.\n      if (\n        !metaKey &&\n        !startTargetUtils.hitTestPoint(startTarget, Vec.add(next.shape.point, endHandle.point))\n      ) {\n        nextStartBinding = this.findBindingPoint(\n          shape,\n          startTarget,\n          'start',\n          this.newStartBindingId,\n          center,\n          rayOrigin,\n          rayDirection,\n          isInsideShape\n        )\n      }\n\n      if (nextStartBinding && !hasStartBinding) {\n        // Bind the arrow's start handle to the start target\n        this.didBind = true\n\n        next.bindings[this.newStartBindingId] = nextStartBinding\n\n        next.shape = Utils.deepMerge(next.shape, {\n          handles: {\n            start: {\n              bindingId: nextStartBinding.id,\n            },\n          },\n        })\n      } else if (!nextStartBinding && hasStartBinding) {\n        // Remove the start binding\n        this.didBind = false\n\n        next.bindings[this.newStartBindingId] = undefined\n\n        next.shape = Utils.deepMerge(initialShape, {\n          handles: {\n            start: {\n              bindingId: undefined,\n            },\n          },\n        })\n      }\n    }\n\n    // DRAGGED POINT BINDING\n    if (!metaKey) {\n      const rayOrigin = Vec.add(oppositeHandle.point, next.shape.point)\n\n      const rayPoint = Vec.add(draggingHandle.point, next.shape.point)\n\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n\n      const startPoint = Vec.add(next.shape.point!, next.shape.handles!.start.point!)\n\n      const endPoint = Vec.add(next.shape.point!, next.shape.handles!.end.point!)\n\n      const targets = this.bindableShapeIds\n        .map((id) => this.app.page.shapes[id])\n        .sort((a, b) => b.childIndex - a.childIndex)\n        .filter((shape) => {\n          if (shape.isLocked) return false\n          const utils = TLDR.getShapeUtil(shape)\n          return ![startPoint, endPoint].every((point) => utils.hitTestPoint(shape, point))\n        })\n\n      for (const target of targets) {\n        draggedBinding = this.findBindingPoint(\n          shape,\n          target,\n          this.handleId,\n          this.draggedBindingId,\n          rayPoint,\n          rayOrigin,\n          rayDirection,\n          altKey\n        )\n\n        if (draggedBinding) break\n      }\n    }\n\n    if (draggedBinding) {\n      // Create the dragged point binding\n      this.didBind = true\n\n      next.bindings[this.draggedBindingId] = draggedBinding\n\n      next.shape = Utils.deepMerge(next.shape, {\n        handles: {\n          [this.handleId]: {\n            bindingId: this.draggedBindingId,\n          },\n        },\n      })\n    } else {\n      // Remove the dragging point binding\n      this.didBind = this.didBind || false\n\n      const currentBindingId = shape.handles[this.handleId].bindingId\n\n      if (currentBindingId !== undefined) {\n        next.bindings[currentBindingId] = undefined\n\n        next.shape = Utils.deepMerge(next.shape, {\n          handles: {\n            [this.handleId]: {\n              bindingId: undefined,\n            },\n          },\n        })\n      }\n    }\n\n    const change = TLDR.getShapeUtil<ArrowShape>(next.shape).onHandleChange?.(\n      next.shape,\n      next.shape.handles\n    )\n\n    return {\n      document: {\n        pages: {\n          [this.app.currentPageId]: {\n            shapes: {\n              [shape.id]: { ...next.shape, ...(change ?? {}) },\n            },\n            bindings: next.bindings,\n          },\n        },\n        pageStates: {\n          [this.app.currentPageId]: {\n            bindingId: next.shape.handles[handleId].bindingId,\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const { initialShape, initialBinding, newStartBindingId, draggedBindingId } = this\n\n    const currentShape = TLDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ArrowShape\n\n    const isDeleting =\n      this.isCreate ||\n      Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point) < 4\n\n    const afterBindings: Record<string, TDBinding | undefined> = {}\n\n    afterBindings[draggedBindingId] = undefined\n\n    if (initialBinding) {\n      afterBindings[initialBinding.id] = isDeleting ? undefined : initialBinding\n    }\n\n    if (newStartBindingId) {\n      afterBindings[newStartBindingId] = undefined\n    }\n\n    return {\n      document: {\n        pages: {\n          [this.app.currentPageId]: {\n            shapes: {\n              [initialShape.id]: isDeleting ? undefined : initialShape,\n            },\n            bindings: afterBindings,\n          },\n        },\n        pageStates: {\n          [this.app.currentPageId]: {\n            selectedIds: isDeleting ? [] : [initialShape.id],\n            bindingId: undefined,\n            hoveredId: undefined,\n            editingId: undefined,\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const { initialShape, initialBinding, newStartBindingId, startBindingShapeId, handleId } = this\n\n    const currentShape = TLDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ArrowShape\n\n    const currentBindingId = currentShape.handles[handleId].bindingId\n\n    const length = Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point)\n\n    if (!(currentBindingId || initialBinding) && length < 4) return this.cancel()\n\n    const beforeBindings: Partial<Record<string, TDBinding>> = {}\n\n    const afterBindings: Partial<Record<string, TDBinding>> = {}\n\n    if (initialBinding) {\n      beforeBindings[initialBinding.id] = this.isCreate ? undefined : initialBinding\n      afterBindings[initialBinding.id] = undefined\n    }\n\n    if (currentBindingId) {\n      beforeBindings[currentBindingId] = undefined\n      afterBindings[currentBindingId] = this.app.page.bindings[currentBindingId]\n    }\n\n    if (startBindingShapeId) {\n      beforeBindings[newStartBindingId] = undefined\n      afterBindings[newStartBindingId] = this.app.page.bindings[newStartBindingId]\n    }\n\n    return {\n      id: 'arrow',\n      before: {\n        document: {\n          pages: {\n            [this.app.currentPageId]: {\n              shapes: {\n                [initialShape.id]: this.isCreate ? undefined : initialShape,\n              },\n              bindings: beforeBindings,\n            },\n          },\n          pageStates: {\n            [this.app.currentPageId]: {\n              selectedIds: this.isCreate ? [] : [initialShape.id],\n              bindingId: undefined,\n              hoveredId: undefined,\n              editingId: undefined,\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [this.app.currentPageId]: {\n              shapes: {\n                [initialShape.id]: currentShape,\n              },\n              bindings: afterBindings,\n            },\n          },\n          pageStates: {\n            [this.app.currentPageId]: {\n              selectedIds: [initialShape.id],\n              bindingId: undefined,\n              hoveredId: undefined,\n              editingId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n\n  private findBindingPoint = (\n    shape: ArrowShape,\n    target: TDShape,\n    handleId: 'start' | 'end',\n    bindingId: string,\n    point: number[],\n    origin: number[],\n    direction: number[],\n    bindAnywhere: boolean\n  ) => {\n    const util = TLDR.getShapeUtil<TDShape>(target.type)\n\n    const bindingPoint = util.getBindingPoint(\n      target,\n      shape,\n      point, // fix dead center bug\n      origin,\n      direction,\n      bindAnywhere\n    )\n\n    // Not all shapes will produce a binding point\n    if (!bindingPoint) return\n\n    return {\n      id: bindingId,\n      type: 'arrow',\n      fromId: shape.id,\n      toId: target.id,\n      handleId: handleId,\n      point: Vec.toFixed(bindingPoint.point),\n      distance: bindingPoint.distance,\n    }\n  }\n}\n", "import type { TLPerformanceMode } from '@tldraw/core'\nimport type { SessionType, TldrawCommand, TldrawPatch } from '~types'\nimport type { TldrawApp } from '../internal'\n\nexport abstract class BaseSession {\n  abstract type: SessionType\n  abstract performanceMode: TLPerformanceMode | undefined\n  constructor(public app: TldrawApp) {}\n  abstract start: () => TldrawPatch | undefined\n  abstract update: () => TldrawPatch | undefined\n  abstract complete: () => TldrawPatch | TldrawCommand | undefined\n  abstract cancel: () => TldrawPatch | undefined\n}\n", "import { TLBounds, Utils } from '@tldraw/core'\nimport { SessionType, TldrawPatch, TDStatus, TldrawCommand } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { BaseSession } from '../BaseSession'\n\nexport class BrushSession extends BaseSession {\n  type = SessionType.Brush\n  performanceMode = undefined\n  status = TDStatus.Brushing\n  initialSelectedIds: Set<string>\n  shapesToTest: {\n    id: string\n    bounds: TLBounds\n    selectId: string\n  }[]\n\n  constructor(app: TldrawApp) {\n    super(app)\n    const { currentPageId } = app\n    this.initialSelectedIds = new Set(this.app.selectedIds)\n    this.shapesToTest = this.app.shapes\n      .filter(\n        (shape) =>\n          !(\n            shape.isLocked ||\n            shape.isHidden ||\n            shape.parentId !== currentPageId ||\n            this.initialSelectedIds.has(shape.id) ||\n            this.initialSelectedIds.has(shape.parentId)\n          )\n      )\n      .map((shape) => ({\n        id: shape.id,\n        bounds: this.app.getShapeUtil(shape).getBounds(shape),\n        selectId: shape.id, //TLDR.getTopParentId(data, shape.id, currentPageId),\n      }))\n\n    this.update()\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const {\n      initialSelectedIds,\n      shapesToTest,\n      app: { metaKey, settings, originPoint, currentPoint },\n    } = this\n\n    // Create a bounding box between the origin and the new point\n    const brush = Utils.getBoundsFromPoints([originPoint, currentPoint])\n\n    // Decide weather to select by intersecting or by overlapping\n    // Using a xor to revers the behaviour if the ctrl key is pressed\n    // Do it only if the user choose to enable cad like selection\n    const selectByContain = settings.isCadSelectMode\n      ? !metaKey && originPoint[0] < currentPoint[0]\n      : metaKey\n\n    // Find ids of brushed shapes\n    const hits = new Set<string>()\n\n    const selectedIds = new Set(initialSelectedIds)\n\n    shapesToTest.forEach(({ id, selectId }) => {\n      const shape = this.app.getShape(id)\n\n      if (!hits.has(selectId)) {\n        const util = this.app.getShapeUtil(shape)\n        if (\n          selectByContain\n            ? Utils.boundsContain(brush, util.getBounds(shape))\n            : util.hitTestBounds(shape, brush)\n        ) {\n          hits.add(selectId)\n\n          // When brushing a shape, select its top group parent.\n          if (!selectedIds.has(selectId)) {\n            selectedIds.add(selectId)\n          }\n        } else if (selectedIds.has(selectId)) {\n          selectedIds.delete(selectId)\n        }\n      }\n    })\n\n    const currentSelectedIds = this.app.selectedIds\n\n    const didChange =\n      selectedIds.size !== currentSelectedIds.length ||\n      currentSelectedIds.some((id) => !selectedIds.has(id))\n\n    const afterSelectedIds = didChange ? Array.from(selectedIds.values()) : currentSelectedIds\n\n    if (!didChange)\n      return {\n        document: {\n          pageStates: {\n            [this.app.currentPageId]: {\n              brush,\n            },\n          },\n        },\n      }\n\n    return {\n      appState: {\n        selectByContain,\n      },\n      document: {\n        pageStates: {\n          [this.app.currentPageId]: {\n            brush,\n            selectedIds: afterSelectedIds,\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    return {\n      appState: {\n        selectByContain: false,\n      },\n      document: {\n        pageStates: {\n          [this.app.currentPageId]: {\n            brush: null,\n            selectedIds: Array.from(this.initialSelectedIds.values()),\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    return {\n      appState: {\n        selectByContain: false,\n      },\n      document: {\n        pageStates: {\n          [this.app.currentPageId]: {\n            brush: null,\n            selectedIds: [...this.app.selectedIds],\n          },\n        },\n      },\n    }\n  }\n}\n", "import { Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { SessionType, TDStatus, TldrawPatch, TldrawCommand, DrawShape } from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { BaseSession } from '../BaseSession'\n\nexport class DrawSession extends BaseSession {\n  type = SessionType.Draw\n  performanceMode = undefined\n  status = TDStatus.Creating\n  topLeft: number[]\n  points: number[][]\n  initialShape: DrawShape\n  lastAdjustedPoint: number[]\n  shiftedPoints: number[][] = []\n  shapeId: string\n  isLocked?: boolean\n  isExtending: boolean\n  lockedDirection?: 'horizontal' | 'vertical'\n\n  constructor(app: TldrawApp, id: string) {\n    super(app)\n    const { originPoint } = this.app\n    this.shapeId = id\n    this.initialShape = this.app.getShape<DrawShape>(id)\n    this.topLeft = [...this.initialShape.point]\n    const currentPoint = [0, 0, originPoint[2] ?? 0.5]\n    const delta = Vec.sub(originPoint, this.topLeft)\n    const initialPoints = this.initialShape.points.map((pt) => Vec.sub(pt, delta).concat(pt[2]))\n    this.isExtending = initialPoints.length > 0\n    const newPoints: number[][] = []\n    if (this.isExtending) {\n      // Continuing with shift\n      const prevPoint = initialPoints[initialPoints.length - 1]\n      if (prevPoint) {\n        newPoints.push(prevPoint, prevPoint)\n        const len = Math.floor(Vec.dist(prevPoint, currentPoint) / 16)\n\n        if (len > 1) {\n          for (let i = 0; i < len; i++) {\n            const t = i / (len - 1)\n            newPoints.push(Vec.lrp(prevPoint, currentPoint, t).concat(prevPoint[2]))\n          }\n        } else {\n          newPoints.push(currentPoint, currentPoint)\n        }\n      }\n    } else {\n      newPoints.push(currentPoint)\n    }\n    // Add a first point but don't update the shape yet. We'll update\n    // when the draw session ends; if the user hasn't added additional\n    // points, this single point will be interpreted as a \"dot\" shape.\n    this.points = [...initialPoints, ...newPoints]\n    this.shiftedPoints = this.points.map((pt) => Vec.add(pt, delta).concat(pt[2]))\n    this.lastAdjustedPoint = this.points[this.points.length - 1]\n  }\n\n  start = () => {\n    const currentPoint = this.app.originPoint\n    const newAdjustedPoint = [0, 0, currentPoint[2] ?? 0.5]\n    // Add the new adjusted point to the points array\n    this.points.push(newAdjustedPoint)\n    const topLeft = [\n      Math.min(this.topLeft[0], currentPoint[0]),\n      Math.min(this.topLeft[1], currentPoint[1]),\n    ]\n    const delta = Vec.sub(topLeft, currentPoint)\n    this.topLeft = topLeft\n    this.shiftedPoints = this.points.map((pt) => Vec.toFixed(Vec.sub(pt, delta)).concat(pt[2]))\n\n    return {\n      document: {\n        pages: {\n          [this.app.currentPageId]: {\n            shapes: {\n              [this.shapeId]: {\n                point: this.topLeft,\n                points: this.shiftedPoints,\n              },\n            },\n          },\n        },\n        pageStates: {\n          [this.app.currentPageId]: {\n            selectedIds: [this.shapeId],\n          },\n        },\n      },\n    }\n  }\n\n  update = (): TldrawPatch | undefined => {\n    const { shapeId } = this\n    const { currentPoint, originPoint, shiftKey } = this.app\n\n    // Even if we're not locked yet, we base the future locking direction\n    // on the first dimension to reach a threshold, or the bigger dimension\n    // once one or both dimensions have reached the threshold.\n    if (!this.lockedDirection && this.points.length > 1) {\n      const bounds = Utils.getBoundsFromPoints(this.points)\n      if (bounds.width > 8 || bounds.height > 8) {\n        this.lockedDirection = bounds.width > bounds.height ? 'horizontal' : 'vertical'\n      }\n    }\n\n    // Drawing while holding shift will \"lock\" the pen to either the\n    // x or y axis, depending on the locking direction.\n    if (shiftKey) {\n      if (!this.isLocked && this.points.length > 2) {\n        // If we're locking before knowing what direction we're in, set it\n        // early based on the bigger dimension.\n        if (!this.lockedDirection) {\n          const bounds = Utils.getBoundsFromPoints(this.points)\n          this.lockedDirection = bounds.width > bounds.height ? 'horizontal' : 'vertical'\n        }\n\n        this.isLocked = true\n        // Start locking\n        const returning = [...this.lastAdjustedPoint]\n\n        if (this.lockedDirection === 'vertical') {\n          returning[0] = 0\n        } else {\n          returning[1] = 0\n        }\n\n        this.points.push(returning.concat(currentPoint[2]))\n      }\n    } else if (this.isLocked) {\n      this.isLocked = false\n    }\n\n    if (this.isLocked) {\n      if (this.lockedDirection === 'vertical') {\n        currentPoint[0] = originPoint[0]\n      } else {\n        currentPoint[1] = originPoint[1]\n      }\n    }\n\n    const change = this.addPoint(currentPoint)\n\n    if (!change) return\n\n    return {\n      document: {\n        pages: {\n          [this.app.currentPageId]: {\n            shapes: {\n              [shapeId]: change,\n            },\n          },\n        },\n        pageStates: {\n          [this.app.currentPageId]: {\n            selectedIds: [shapeId],\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const { shapeId } = this\n    const pageId = this.app.currentPageId\n\n    return {\n      document: {\n        pages: {\n          [pageId]: {\n            shapes: {\n              [shapeId]: this.isExtending ? this.initialShape : undefined,\n            },\n          },\n        },\n        pageStates: {\n          [pageId]: {\n            selectedIds: [],\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const { shapeId } = this\n    const pageId = this.app.currentPageId\n    const shape = this.app.getShape<DrawShape>(shapeId)\n    return {\n      id: 'create_draw',\n      before: {\n        document: {\n          pages: {\n            [pageId]: {\n              shapes: {\n                [shapeId]: this.isExtending ? this.initialShape : undefined,\n              },\n            },\n          },\n          pageStates: {\n            [pageId]: {\n              selectedIds: [],\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [pageId]: {\n              shapes: {\n                [shapeId]: {\n                  ...shape,\n                  point: Vec.toFixed(shape.point),\n                  points: shape.points.map((pt) => Vec.toFixed(pt)),\n                  isComplete: true,\n                },\n              },\n            },\n          },\n          pageStates: {\n            [this.app.currentPageId]: {\n              selectedIds: [],\n            },\n          },\n        },\n      },\n    }\n  }\n\n  addPoint = (currentPoint: number[]) => {\n    const { originPoint } = this.app\n    // The new adjusted point\n    const newAdjustedPoint = Vec.toFixed(Vec.sub(currentPoint, originPoint)).concat(currentPoint[2])\n\n    // Don't add duplicate points.\n    if (Vec.isEqual(this.lastAdjustedPoint, newAdjustedPoint)) return\n\n    // Add the new adjusted point to the points array\n    this.points.push(newAdjustedPoint)\n\n    // The new adjusted point is now the previous adjusted point.\n    this.lastAdjustedPoint = newAdjustedPoint\n\n    // Does the input point create a new top left?\n    const prevTopLeft = [...this.topLeft]\n\n    const topLeft = [\n      Math.min(this.topLeft[0], currentPoint[0]),\n      Math.min(this.topLeft[1], currentPoint[1]),\n    ]\n\n    const delta = Vec.sub(topLeft, originPoint)\n\n    // Time to shift some points!\n    let points: number[][]\n\n    if (prevTopLeft[0] !== topLeft[0] || prevTopLeft[1] !== topLeft[1]) {\n      this.topLeft = topLeft\n      // If we have a new top left, then we need to iterate through\n      // the \"unshifted\" points array and shift them based on the\n      // offset between the new top left and the original top left.\n      points = this.points.map((pt) => Vec.toFixed(Vec.sub(pt, delta)).concat(pt[2]))\n    } else {\n      // If the new top left is the same as the previous top left,\n      // we don't need to shift anything: we just shift the new point\n      // and add it to the shifted points array.\n      points = [...this.shiftedPoints, Vec.sub(newAdjustedPoint, delta).concat(newAdjustedPoint[2])]\n    }\n\n    this.shiftedPoints = points\n\n    return {\n      point: this.topLeft,\n      points,\n    }\n  }\n}\n", "import { Vec } from '@tldraw/vec'\nimport { SessionType, ShapesWithProp, TldrawCommand, TldrawPatch, TDStatus } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\nexport class HandleSession extends BaseSession {\n  type = SessionType.Handle\n  performanceMode = undefined\n  status = TDStatus.TranslatingHandle\n  commandId: string\n  topLeft: number[]\n  shiftKey = false\n  initialShape: ShapesWithProp<'handles'>\n  handleId: string\n\n  constructor(app: TldrawApp, shapeId: string, handleId: string, commandId = 'move_handle') {\n    super(app)\n    const { originPoint } = app\n    this.topLeft = [...originPoint]\n    this.handleId = handleId\n    this.initialShape = this.app.getShape(shapeId)\n    this.commandId = commandId\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const {\n      initialShape,\n      app: { currentPageId, currentPoint },\n    } = this\n\n    const shape = this.app.getShape<ShapesWithProp<'handles'>>(initialShape.id)\n\n    if (shape.isLocked) return void null\n\n    const handles = shape.handles\n\n    const handleId = this.handleId as keyof typeof handles\n\n    const delta = Vec.sub(currentPoint, handles[handleId].point)\n\n    const handleChanges = {\n      [handleId]: {\n        ...handles[handleId],\n        point: Vec.sub(Vec.add(handles[handleId].point, delta), shape.point),\n      },\n    }\n\n    // First update the handle's next point\n    const change = TLDR.getShapeUtil(shape).onHandleChange?.(shape, handleChanges)\n\n    if (!change) return\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: {\n              [shape.id]: change,\n            },\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const {\n      initialShape,\n      app: { currentPageId },\n    } = this\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: {\n              [initialShape.id]: initialShape,\n            },\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      initialShape,\n      app: { currentPageId },\n    } = this\n\n    return {\n      id: this.commandId,\n      before: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: {\n                [initialShape.id]: initialShape,\n              },\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: {\n                [initialShape.id]: TLDR.onSessionComplete(this.app.getShape(this.initialShape.id)),\n              },\n            },\n          },\n        },\n      },\n    }\n  }\n}\n", "import { TLPerformanceMode, Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { SessionType, TldrawCommand, TldrawPatch, TDShape, TDStatus } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\nexport class RotateSession extends BaseSession {\n  type = SessionType.Rotate\n  status = TDStatus.Transforming\n  performanceMode = undefined\n  delta = [0, 0]\n  commonBoundsCenter: number[]\n  initialAngle: number\n  initialShapes: {\n    shape: TDShape\n    center: number[]\n  }[]\n  changes: Record<string, Partial<TDShape>> = {}\n\n  constructor(app: TldrawApp) {\n    super(app)\n\n    const {\n      app: { currentPageId, pageState, originPoint },\n    } = this\n\n    const initialShapes = TLDR.getSelectedBranchSnapshot(app.state, currentPageId).filter(\n      (shape) => !shape.isLocked\n    )\n\n    if (initialShapes.length === 0) {\n      throw Error('No selected shapes!')\n    }\n\n    if (app.rotationInfo.selectedIds === pageState.selectedIds) {\n      if (app.rotationInfo.center === undefined) {\n        throw Error('We should have a center for rotation!')\n      }\n\n      this.commonBoundsCenter = app.rotationInfo.center\n    } else {\n      this.commonBoundsCenter = Utils.getBoundsCenter(\n        Utils.getCommonBounds(initialShapes.map(TLDR.getBounds))\n      )\n      app.rotationInfo.selectedIds = pageState.selectedIds\n      app.rotationInfo.center = this.commonBoundsCenter\n    }\n\n    this.initialShapes = initialShapes\n      .filter((shape) => shape.children === undefined)\n      .map((shape) => {\n        return {\n          shape,\n          center: this.app.getShapeUtil(shape).getCenter(shape),\n        }\n      })\n\n    this.initialAngle = Vec.angle(this.commonBoundsCenter, originPoint)\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const {\n      commonBoundsCenter,\n      initialShapes,\n      app: { currentPageId, currentPoint, shiftKey },\n    } = this\n\n    const shapes: Record<string, Partial<TDShape>> = {}\n\n    let directionDelta = Vec.angle(commonBoundsCenter, currentPoint) - this.initialAngle\n\n    if (shiftKey) {\n      directionDelta = Utils.snapAngleToSegments(directionDelta, 24) // 15 degrees\n    }\n\n    // Update the shapes\n    initialShapes.forEach(({ center, shape }) => {\n      const { rotation = 0 } = shape\n      let shapeDelta = 0\n\n      if (shiftKey) {\n        const snappedRotation = Utils.snapAngleToSegments(rotation, 24)\n        shapeDelta = snappedRotation - rotation\n      }\n\n      const change = TLDR.getRotatedShapeMutation(\n        shape,\n        center,\n        commonBoundsCenter,\n        shiftKey ? directionDelta + shapeDelta : directionDelta\n      )\n\n      if (change) {\n        shapes[shape.id] = change\n      }\n    })\n\n    this.changes = shapes\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const {\n      initialShapes,\n      app: { currentPageId },\n    } = this\n\n    const shapes: Record<string, TDShape> = {}\n    initialShapes.forEach(({ shape }) => (shapes[shape.id] = shape))\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      initialShapes,\n      app: { currentPageId },\n    } = this\n\n    const beforeShapes = {} as Record<string, Partial<TDShape>>\n    const afterShapes = this.changes\n\n    initialShapes.forEach(({ shape: { id, point, rotation, handles } }) => {\n      beforeShapes[id] = { point, rotation, handles }\n    })\n\n    return {\n      id: 'rotate',\n      before: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: afterShapes,\n            },\n          },\n        },\n      },\n    }\n  }\n}\n", "import { TLBounds, TLBoundsCorner, TLBoundsEdge, TLPerformanceMode, Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport type { TLSnapLine, TLBoundsWithCenter } from '@tldraw/core'\nimport { SessionType, TldrawCommand, TldrawPatch, TDShape, TDStatus } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\ntype SnapInfo =\n  | {\n      state: 'empty'\n    }\n  | {\n      state: 'ready'\n      bounds: TLBoundsWithCenter[]\n    }\n\nexport class TransformSession extends BaseSession {\n  type = SessionType.Transform\n  performanceMode = undefined\n  status = TDStatus.Transforming\n  scaleX = 1\n  scaleY = 1\n  initialShapes: TDShape[]\n  initialShapeIds: string[]\n  initialSelectedIds: string[]\n  shapeBounds: {\n    initialShape: TDShape\n    initialShapeBounds: TLBounds\n    transformOrigin: number[]\n  }[]\n  hasUnlockedShapes: boolean\n  isAllAspectRatioLocked: boolean\n  initialCommonBounds: TLBounds\n  snapInfo: SnapInfo = { state: 'empty' }\n  prevPoint = [0, 0]\n  speed = 1\n\n  constructor(\n    app: TldrawApp,\n    public transformType: TLBoundsEdge | TLBoundsCorner = TLBoundsCorner.BottomRight,\n    public isCreate = false\n  ) {\n    super(app)\n    this.initialSelectedIds = [...this.app.selectedIds]\n    this.app.rotationInfo.selectedIds = [...this.initialSelectedIds]\n\n    this.initialShapes = TLDR.getSelectedBranchSnapshot(\n      this.app.state,\n      this.app.currentPageId\n    ).filter((shape) => !shape.isLocked)\n\n    this.initialShapeIds = this.initialShapes.map((shape) => shape.id)\n\n    this.hasUnlockedShapes = this.initialShapes.length > 0\n\n    this.isAllAspectRatioLocked = this.initialShapes.every(\n      (shape) => shape.isAspectRatioLocked || TLDR.getShapeUtil(shape).isAspectRatioLocked\n    )\n\n    const shapesBounds = Object.fromEntries(\n      this.initialShapes.map((shape) => [shape.id, TLDR.getBounds(shape)])\n    )\n\n    const boundsArr = Object.values(shapesBounds)\n\n    this.initialCommonBounds = Utils.getCommonBounds(boundsArr)\n\n    const initialInnerBounds = Utils.getBoundsFromPoints(boundsArr.map(Utils.getBoundsCenter))\n\n    // Return a mapping of shapes to bounds together with the relative\n    // positions of the shape's bounds within the common bounds shape.\n    this.shapeBounds = this.initialShapes.map((shape) => {\n      const initialShapeBounds = shapesBounds[shape.id]\n      const ic = Utils.getBoundsCenter(initialShapeBounds)\n\n      const ix = (ic[0] - initialInnerBounds.minX) / initialInnerBounds.width\n      const iy = (ic[1] - initialInnerBounds.minY) / initialInnerBounds.height\n\n      return {\n        initialShape: shape,\n        initialShapeBounds,\n        transformOrigin: [ix, iy],\n      }\n    })\n  }\n\n  start = (): TldrawPatch | undefined => {\n    this.snapInfo = {\n      state: 'ready',\n      bounds: this.app.shapes\n        .filter((shape) => !this.initialShapeIds.includes(shape.id))\n        .map((shape) => Utils.getBoundsWithCenter(TLDR.getRotatedBounds(shape))),\n    }\n\n    return void null\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  update = (): TldrawPatch | undefined => {\n    const {\n      transformType,\n      shapeBounds,\n      initialCommonBounds,\n      isAllAspectRatioLocked,\n      app: {\n        currentPageId,\n        pageState: { camera },\n        viewport,\n        currentPoint,\n        previousPoint,\n        originPoint,\n        shiftKey,\n        altKey,\n        metaKey,\n        currentGrid,\n        settings: { isSnapping, showGrid },\n      },\n    } = this\n\n    const shapes = {} as Record<string, TDShape>\n\n    const delta = altKey\n      ? Vec.mul(Vec.sub(currentPoint, originPoint), 2)\n      : Vec.sub(currentPoint, originPoint)\n\n    let newBounds = Utils.getTransformedBoundingBox(\n      initialCommonBounds,\n      transformType,\n      delta,\n      0,\n      shiftKey || isAllAspectRatioLocked\n    )\n\n    if (altKey) {\n      newBounds = {\n        ...newBounds,\n        ...Utils.centerBounds(newBounds, Utils.getBoundsCenter(initialCommonBounds)),\n      }\n    }\n\n    if (showGrid) {\n      newBounds = {\n        ...newBounds,\n        ...Utils.snapBoundsToGrid(newBounds, currentGrid),\n      }\n    }\n\n    // Should we snap?\n\n    const speed = Vec.dist(currentPoint, previousPoint)\n\n    const speedChange = speed - this.speed\n\n    this.speed = this.speed + speedChange * (speedChange > 1 ? 0.5 : 0.15)\n\n    let snapLines: TLSnapLine[] = []\n\n    if (\n      ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n      this.speed * camera.zoom < SLOW_SPEED &&\n      this.snapInfo.state === 'ready'\n    ) {\n      const snapResult = Utils.getSnapPoints(\n        Utils.getBoundsWithCenter(newBounds),\n        this.snapInfo.bounds.filter(\n          (bounds) => Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n        ),\n        SNAP_DISTANCE / camera.zoom\n      )\n\n      if (snapResult) {\n        snapLines = snapResult.snapLines\n\n        newBounds = Utils.getTransformedBoundingBox(\n          initialCommonBounds,\n          transformType,\n          Vec.sub(delta, snapResult.offset),\n          0,\n          shiftKey || isAllAspectRatioLocked\n        )\n      }\n    }\n\n    // Now work backward to calculate a new bounding box for each of the shapes.\n\n    this.scaleX = newBounds.scaleX\n    this.scaleY = newBounds.scaleY\n\n    shapeBounds.forEach(({ initialShape, initialShapeBounds, transformOrigin }) => {\n      let newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n        newBounds,\n        initialCommonBounds,\n        initialShapeBounds,\n        this.scaleX < 0,\n        this.scaleY < 0\n      )\n\n      if (showGrid) {\n        newShapeBounds = Utils.snapBoundsToGrid(newShapeBounds, currentGrid)\n      }\n\n      const afterShape = TLDR.transform(this.app.getShape(initialShape.id), newShapeBounds, {\n        type: this.transformType,\n        initialShape,\n        scaleX: this.scaleX,\n        scaleY: this.scaleY,\n        transformOrigin,\n      })\n\n      shapes[initialShape.id] = afterShape\n    })\n\n    return {\n      appState: {\n        snapLines,\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const {\n      shapeBounds,\n      app: { currentPageId },\n    } = this\n\n    const shapes = {} as Record<string, TDShape | undefined>\n\n    if (this.isCreate) {\n      shapeBounds.forEach((shape) => (shapes[shape.initialShape.id] = undefined))\n    } else {\n      shapeBounds.forEach((shape) => (shapes[shape.initialShape.id] = shape.initialShape))\n    }\n\n    return {\n      appState: {\n        snapLines: [],\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: this.isCreate ? [] : shapeBounds.map((shape) => shape.initialShape.id),\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      isCreate,\n      shapeBounds,\n      hasUnlockedShapes,\n      app: { currentPageId },\n    } = this\n\n    if (!hasUnlockedShapes) return\n\n    if (this.isCreate && Vec.dist(this.app.originPoint, this.app.currentPoint) < 2) {\n      return this.cancel()\n    }\n\n    const beforeShapes: Record<string, TDShape | undefined> = {}\n    const afterShapes: Record<string, TDShape> = {}\n\n    let beforeSelectedIds: string[]\n    let afterSelectedIds: string[]\n\n    if (isCreate) {\n      beforeSelectedIds = []\n      afterSelectedIds = []\n      shapeBounds.forEach(({ initialShape }) => {\n        beforeShapes[initialShape.id] = undefined\n        afterShapes[initialShape.id] = this.app.getShape(initialShape.id)\n      })\n    } else {\n      beforeSelectedIds = this.initialSelectedIds\n      afterSelectedIds = this.initialSelectedIds\n      shapeBounds.forEach(({ initialShape }) => {\n        beforeShapes[initialShape.id] = initialShape\n        afterShapes[initialShape.id] = this.app.getShape(initialShape.id)\n      })\n    }\n\n    return {\n      id: 'transform',\n      before: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: beforeSelectedIds,\n              hoveredId: undefined,\n              editingId: undefined,\n            },\n          },\n        },\n      },\n      after: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: afterShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: afterSelectedIds,\n              hoveredId: undefined,\n              editingId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n}\n", "import {\n  TLBoundsCorner,\n  TLSnapLine,\n  TLBoundsEdge,\n  Utils,\n  TLBoundsWithCenter,\n  TLBounds,\n  TLPerformanceMode,\n} from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { SessionType, TldrawCommand, TldrawPatch, TDShape, TDStatus } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\ntype SnapInfo =\n  | {\n      state: 'empty'\n    }\n  | {\n      state: 'ready'\n      bounds: TLBoundsWithCenter[]\n    }\n\nexport class TransformSingleSession extends BaseSession {\n  type = SessionType.TransformSingle\n  status = TDStatus.Transforming\n  performanceMode = undefined\n  transformType: TLBoundsEdge | TLBoundsCorner\n  scaleX = 1\n  scaleY = 1\n  isCreate: boolean\n  initialShape: TDShape\n  initialShapeBounds: TLBounds\n  initialCommonBounds: TLBounds\n  snapInfo: SnapInfo = { state: 'empty' }\n  prevPoint = [0, 0]\n  speed = 1\n\n  constructor(\n    app: TldrawApp,\n    id: string,\n    transformType: TLBoundsEdge | TLBoundsCorner,\n    isCreate = false\n  ) {\n    super(app)\n    this.isCreate = isCreate\n    this.transformType = transformType\n\n    const shape = this.app.getShape(id)\n    this.initialShape = shape\n    this.initialShapeBounds = TLDR.getBounds(shape)\n    this.initialCommonBounds = TLDR.getRotatedBounds(shape)\n    this.app.rotationInfo.selectedIds = [shape.id]\n  }\n\n  start = (): TldrawPatch | undefined => {\n    this.snapInfo = {\n      state: 'ready',\n      bounds: this.app.shapes\n        .filter((shape) => shape.id !== this.initialShape.id)\n        .map((shape) => Utils.getBoundsWithCenter(TLDR.getRotatedBounds(shape))),\n    }\n\n    return void null\n  }\n\n  update = (): TldrawPatch | undefined => {\n    const {\n      transformType,\n      initialShape,\n      initialShapeBounds,\n      app: {\n        settings: { isSnapping, showGrid },\n        currentPageId,\n        pageState: { camera },\n        viewport,\n        currentPoint,\n        previousPoint,\n        originPoint,\n        currentGrid,\n        shiftKey,\n        altKey,\n        metaKey,\n      },\n    } = this\n\n    if (initialShape.isLocked) return void null\n\n    const shapes = {} as Record<string, Partial<TDShape>>\n\n    const delta = altKey\n      ? Vec.mul(Vec.sub(currentPoint, originPoint), 2)\n      : Vec.sub(currentPoint, originPoint)\n\n    const shape = this.app.getShape(initialShape.id)\n\n    const utils = TLDR.getShapeUtil(shape)\n\n    let newBounds = Utils.getTransformedBoundingBox(\n      initialShapeBounds,\n      transformType,\n      delta,\n      shape.rotation,\n      shiftKey || shape.isAspectRatioLocked || utils.isAspectRatioLocked\n    )\n\n    if (altKey) {\n      newBounds = {\n        ...newBounds,\n        ...Utils.centerBounds(newBounds, Utils.getBoundsCenter(initialShapeBounds)),\n      }\n    }\n\n    if (showGrid) {\n      newBounds = {\n        ...newBounds,\n        ...Utils.snapBoundsToGrid(newBounds, currentGrid),\n      }\n    }\n\n    // Should we snap?\n\n    const speed = Vec.dist(currentPoint, previousPoint)\n\n    const speedChange = speed - this.speed\n\n    this.speed = this.speed + speedChange * (speedChange > 1 ? 0.5 : 0.15)\n\n    let snapLines: TLSnapLine[] = []\n\n    if (\n      ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n      !initialShape.rotation && // not now anyway\n      this.speed * camera.zoom < SLOW_SPEED &&\n      this.snapInfo.state === 'ready'\n    ) {\n      const snapResult = Utils.getSnapPoints(\n        Utils.getBoundsWithCenter(newBounds),\n        this.snapInfo.bounds.filter(\n          (bounds) => Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n        ),\n        SNAP_DISTANCE / camera.zoom\n      )\n\n      if (snapResult) {\n        snapLines = snapResult.snapLines\n\n        newBounds = Utils.getTransformedBoundingBox(\n          initialShapeBounds,\n          transformType,\n          Vec.sub(delta, snapResult.offset),\n          shape.rotation,\n          shiftKey || shape.isAspectRatioLocked || utils.isAspectRatioLocked\n        )\n      }\n    }\n\n    const afterShape = TLDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n      initialShape,\n      type: this.transformType,\n      scaleX: newBounds.scaleX,\n      scaleY: newBounds.scaleY,\n      transformOrigin: [0.5, 0.5],\n    })\n\n    if (afterShape) {\n      shapes[shape.id] = afterShape\n    }\n\n    if (showGrid && afterShape && afterShape.point) {\n      afterShape.point = Vec.snap(afterShape.point, currentGrid)\n    }\n\n    return {\n      appState: {\n        snapLines,\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const {\n      initialShape,\n      app: { currentPageId },\n    } = this\n\n    const shapes = {} as Record<string, TDShape | undefined>\n\n    if (this.isCreate) {\n      shapes[initialShape.id] = undefined\n    } else {\n      shapes[initialShape.id] = initialShape\n    }\n\n    return {\n      appState: {\n        snapLines: [],\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: this.isCreate ? [] : [initialShape.id],\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      initialShape,\n      app: { currentPageId },\n    } = this\n\n    if (initialShape.isLocked) return\n\n    if (this.isCreate && Vec.dist(this.app.originPoint, this.app.currentPoint) < 2) {\n      return this.cancel()\n    }\n\n    const beforeShapes = {} as Record<string, Partial<TDShape> | undefined>\n    const afterShapes = {} as Record<string, Partial<TDShape>>\n\n    beforeShapes[initialShape.id] = this.isCreate ? undefined : initialShape\n\n    afterShapes[initialShape.id] = TLDR.onSessionComplete(this.app.getShape(initialShape.id))\n\n    return {\n      id: 'transform_single',\n      before: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: this.isCreate ? [] : [initialShape.id],\n              editingId: undefined,\n              hoveredId: undefined,\n            },\n          },\n        },\n      },\n      after: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: afterShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: [initialShape.id],\n              editingId: undefined,\n              hoveredId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { TLPageState, Utils, TLBoundsWithCenter, TLSnapLine, TLBounds } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport {\n  TDShape,\n  TDBinding,\n  TldrawCommand,\n  TDStatus,\n  ArrowShape,\n  Patch,\n  GroupShape,\n  SessionType,\n  ArrowBinding,\n  TldrawPatch,\n  TDShapeType,\n} from '~types'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { TLDR } from '~state/TLDR'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\ntype CloneInfo =\n  | {\n      state: 'empty'\n    }\n  | {\n      state: 'ready'\n      cloneMap: Record<string, string>\n      clones: TDShape[]\n      clonedBindings: ArrowBinding[]\n    }\n\ntype SnapInfo =\n  | {\n      state: 'empty'\n    }\n  | {\n      state: 'ready'\n      others: TLBoundsWithCenter[]\n      bounds: TLBoundsWithCenter[]\n    }\n\nexport class TranslateSession extends BaseSession {\n  performanceMode = undefined\n  type = SessionType.Translate\n  status = TDStatus.Translating\n  delta = [0, 0]\n  prev = [0, 0]\n  prevPoint = [0, 0]\n  speed = 1\n  cloneInfo: CloneInfo = {\n    state: 'empty',\n  }\n  snapInfo: SnapInfo = {\n    state: 'empty',\n  }\n  snapLines: TLSnapLine[] = []\n  isCloning = false\n  isCreate: boolean\n  link: 'left' | 'right' | 'center' | false\n\n  initialIds: Set<string>\n  hasUnlockedShapes: boolean\n  initialSelectedIds: string[]\n  initialCommonBounds: TLBounds\n  initialShapes: TDShape[]\n  initialParentChildren: Record<string, string[]>\n  bindingsToDelete: ArrowBinding[]\n\n  constructor(app: TldrawApp, isCreate = false, link: 'left' | 'right' | 'center' | false = false) {\n    super(app)\n    this.isCreate = isCreate\n    this.link = link\n\n    const { currentPageId, selectedIds, page } = this.app\n\n    this.initialSelectedIds = [...selectedIds]\n\n    const selectedShapes = (\n      link ? TLDR.getLinkedShapeIds(this.app.state, currentPageId, link, false) : selectedIds\n    )\n      .map((id) => this.app.getShape(id))\n      .filter((shape) => !shape.isLocked)\n\n    const selectedShapeIds = new Set(selectedShapes.map((shape) => shape.id))\n\n    this.hasUnlockedShapes = selectedShapes.length > 0\n\n    this.initialShapes = Array.from(\n      new Set(\n        selectedShapes\n          .filter((shape) => !selectedShapeIds.has(shape.parentId))\n          .flatMap((shape) => {\n            return shape.children\n              ? [shape, ...shape.children.map((childId) => this.app.getShape(childId))]\n              : [shape]\n          })\n      ).values()\n    )\n\n    this.initialIds = new Set(this.initialShapes.map((shape) => shape.id))\n\n    this.bindingsToDelete = []\n\n    Object.values(page.bindings)\n      .filter((binding) => this.initialIds.has(binding.fromId) || this.initialIds.has(binding.toId))\n      .forEach((binding) => {\n        if (this.initialIds.has(binding.fromId)) {\n          if (!this.initialIds.has(binding.toId)) {\n            this.bindingsToDelete.push(binding)\n          }\n        }\n      })\n\n    this.initialParentChildren = {}\n\n    this.initialShapes\n      .map((s) => s.parentId)\n      .filter((id) => id !== page.id)\n      .forEach((id) => {\n        this.initialParentChildren[id] = this.app.getShape(id).children!\n      })\n\n    this.initialCommonBounds = Utils.getCommonBounds(this.initialShapes.map(TLDR.getRotatedBounds))\n\n    this.app.rotationInfo.selectedIds = [...this.app.selectedIds]\n  }\n\n  start = (): TldrawPatch | undefined => {\n    const {\n      bindingsToDelete,\n      initialIds,\n      app: { currentPageId, page },\n    } = this\n\n    const allBounds: TLBoundsWithCenter[] = []\n    const otherBounds: TLBoundsWithCenter[] = []\n\n    Object.values(page.shapes).forEach((shape) => {\n      const bounds = Utils.getBoundsWithCenter(TLDR.getRotatedBounds(shape))\n      allBounds.push(bounds)\n      if (!initialIds.has(shape.id)) {\n        otherBounds.push(bounds)\n      }\n    })\n\n    this.snapInfo = {\n      state: 'ready',\n      bounds: allBounds,\n      others: otherBounds,\n    }\n\n    if (bindingsToDelete.length === 0) return\n\n    const nextBindings: Patch<Record<string, TDBinding>> = {}\n\n    bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = undefined))\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            bindings: nextBindings,\n          },\n        },\n      },\n    }\n  }\n\n  update = (): TldrawPatch | undefined => {\n    const {\n      initialParentChildren,\n      initialShapes,\n      initialCommonBounds,\n      bindingsToDelete,\n      app: {\n        pageState: { camera },\n        settings: { isSnapping, showGrid },\n        currentPageId,\n        viewport,\n        selectedIds,\n        currentPoint,\n        previousPoint,\n        originPoint,\n        altKey,\n        shiftKey,\n        metaKey,\n        currentGrid,\n      },\n    } = this\n\n    const nextBindings: Patch<Record<string, TDBinding>> = {}\n    const nextShapes: Patch<Record<string, TDShape>> = {}\n    const nextPageState: Patch<TLPageState> = {}\n\n    let delta = Vec.sub(currentPoint, originPoint)\n\n    let didChangeCloning = false\n\n    if (!this.isCreate) {\n      if (altKey && !this.isCloning) {\n        this.isCloning = true\n        didChangeCloning = true\n      } else if (!altKey && this.isCloning) {\n        this.isCloning = false\n        didChangeCloning = true\n      }\n    }\n\n    if (shiftKey) {\n      if (Math.abs(delta[0]) < Math.abs(delta[1])) {\n        delta[0] = 0\n      } else {\n        delta[1] = 0\n      }\n    }\n\n    // Should we snap?\n\n    // Speed is used to decide which snap points to use. At a high\n    // speed, we don't use any snap points. At a low speed, we only\n    // allow center-to-center snap points. At very low speed, we\n    // enable all snap points (still preferring middle snaps). We're\n    // using an acceleration function here to smooth the changes in\n    // speed, but we also want the speed to accelerate faster than\n    // it decelerates.\n\n    const speed = Vec.dist(currentPoint, previousPoint)\n\n    const change = speed - this.speed\n\n    this.speed = this.speed + change * (change > 1 ? 0.5 : 0.15)\n\n    this.snapLines = []\n\n    if (\n      ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n      this.speed * camera.zoom < SLOW_SPEED &&\n      this.snapInfo.state === 'ready'\n    ) {\n      const snapResult = Utils.getSnapPoints(\n        Utils.getBoundsWithCenter(\n          showGrid\n            ? Utils.snapBoundsToGrid(Utils.translateBounds(initialCommonBounds, delta), currentGrid)\n            : Utils.translateBounds(initialCommonBounds, delta)\n        ),\n        (this.isCloning ? this.snapInfo.bounds : this.snapInfo.others).filter((bounds) => {\n          return Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n        }),\n        SNAP_DISTANCE / camera.zoom\n      )\n\n      if (snapResult) {\n        this.snapLines = snapResult.snapLines\n        delta = Vec.sub(delta, snapResult.offset)\n      }\n    }\n\n    // We've now calculated the \"delta\", or difference between the\n    // cursor's position (real or adjusted by snaps or axis locking)\n    // and the cursor's original position (\"origin\").\n\n    // The \"movement\" is the actual change of position between this\n    // computed position and the previous computed position.\n\n    this.prev = delta\n\n    // If cloning...\n    if (this.isCloning) {\n      // Not Cloning -> Cloning\n      if (didChangeCloning) {\n        if (this.cloneInfo.state === 'empty') {\n          this.createCloneInfo()\n        }\n\n        if (this.cloneInfo.state === 'empty') {\n          throw Error\n        }\n\n        const { clones, clonedBindings } = this.cloneInfo\n\n        this.isCloning = true\n\n        // Put back any bindings we deleted\n        bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = binding))\n\n        // Move original shapes back to start\n        initialShapes.forEach((shape) => (nextShapes[shape.id] = { point: shape.point }))\n\n        // Add the clones to the page\n        clones.forEach((clone) => {\n          nextShapes[clone.id] = { ...clone }\n\n          // Add clones to non-selected parents\n          if (clone.parentId !== currentPageId && !selectedIds.includes(clone.parentId)) {\n            const children =\n              nextShapes[clone.parentId]?.children || initialParentChildren[clone.parentId]\n\n            if (!children.includes(clone.id)) {\n              nextShapes[clone.parentId] = {\n                ...nextShapes[clone.parentId],\n                children: [...children, clone.id],\n              }\n            }\n          }\n        })\n\n        // Add the cloned bindings\n        for (const binding of clonedBindings) {\n          nextBindings[binding.id] = binding\n        }\n\n        // Set the selected ids to the clones\n        nextPageState.selectedIds = clones.map((clone) => clone.id)\n\n        // Either way, move the clones\n        clones.forEach((clone) => {\n          nextShapes[clone.id] = {\n            ...clone,\n            point: showGrid\n              ? Vec.snap(Vec.toFixed(Vec.add(clone.point, delta)), currentGrid)\n              : Vec.toFixed(Vec.add(clone.point, delta)),\n          }\n        })\n      } else {\n        if (this.cloneInfo.state === 'empty') throw Error\n\n        const { clones } = this.cloneInfo\n\n        clones.forEach((clone) => {\n          nextShapes[clone.id] = {\n            point: showGrid\n              ? Vec.snap(Vec.toFixed(Vec.add(clone.point, delta)), currentGrid)\n              : Vec.toFixed(Vec.add(clone.point, delta)),\n          }\n        })\n      }\n    } else {\n      // If not cloning...\n\n      // Cloning -> Not Cloning\n      if (didChangeCloning) {\n        if (this.cloneInfo.state === 'empty') throw Error\n\n        const { clones, clonedBindings } = this.cloneInfo\n\n        this.isCloning = false\n\n        // Delete the bindings\n        bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = undefined))\n\n        // Remove the clones from parents\n        clones.forEach((clone) => {\n          if (clone.parentId !== currentPageId) {\n            nextShapes[clone.parentId] = {\n              ...nextShapes[clone.parentId],\n              children: initialParentChildren[clone.parentId],\n            }\n          }\n        })\n\n        // Delete the clones (including any parent clones)\n        clones.forEach((clone) => (nextShapes[clone.id] = undefined))\n\n        // Move the original shapes back to the cursor position\n        initialShapes.forEach((shape) => {\n          nextShapes[shape.id] = {\n            point: showGrid\n              ? Vec.snap(Vec.toFixed(Vec.add(shape.point, delta)), currentGrid)\n              : Vec.toFixed(Vec.add(shape.point, delta)),\n          }\n        })\n\n        // Delete the cloned bindings\n        for (const binding of clonedBindings) {\n          nextBindings[binding.id] = undefined\n        }\n\n        // Set selected ids\n        nextPageState.selectedIds = initialShapes.map((shape) => shape.id)\n      } else {\n        // Move the shapes by the delta\n        initialShapes.forEach((shape) => {\n          // const current = (nextShapes[shape.id] || this.app.getShape(shape.id)) as TDShape\n\n          nextShapes[shape.id] = {\n            point: showGrid\n              ? Vec.snap(Vec.toFixed(Vec.add(shape.point, delta)), currentGrid)\n              : Vec.toFixed(Vec.add(shape.point, delta)),\n          }\n        })\n      }\n    }\n\n    return {\n      appState: {\n        snapLines: this.snapLines,\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: nextShapes,\n            bindings: nextBindings,\n          },\n        },\n        pageStates: {\n          [currentPageId]: nextPageState,\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const {\n      initialShapes,\n      initialSelectedIds,\n      bindingsToDelete,\n      app: { currentPageId },\n    } = this\n\n    const nextBindings: Record<string, Partial<TDBinding> | undefined> = {}\n    const nextShapes: Record<string, Partial<TDShape> | undefined> = {}\n    const nextPageState: Partial<TLPageState> = {\n      editingId: undefined,\n      hoveredId: undefined,\n    }\n\n    // Put back any deleted bindings\n    bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = binding))\n\n    if (this.isCreate) {\n      initialShapes.forEach(({ id }) => (nextShapes[id] = undefined))\n      nextPageState.selectedIds = []\n    } else {\n      // Put initial shapes back to where they started\n      initialShapes.forEach(({ id, point }) => (nextShapes[id] = { ...nextShapes[id], point }))\n      nextPageState.selectedIds = initialSelectedIds\n    }\n\n    if (this.cloneInfo.state === 'ready') {\n      const { clones, clonedBindings } = this.cloneInfo\n      // Delete clones\n      clones.forEach((clone) => (nextShapes[clone.id] = undefined))\n\n      // Delete cloned bindings\n      clonedBindings.forEach((binding) => (nextBindings[binding.id] = undefined))\n    }\n\n    return {\n      appState: {\n        snapLines: [],\n      },\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: nextShapes,\n            bindings: nextBindings,\n          },\n        },\n        pageStates: {\n          [currentPageId]: nextPageState,\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      initialShapes,\n      initialParentChildren,\n      bindingsToDelete,\n      app: { currentPageId },\n    } = this\n\n    const beforeBindings: Patch<Record<string, TDBinding>> = {}\n    const beforeShapes: Patch<Record<string, TDShape>> = {}\n\n    const afterBindings: Patch<Record<string, TDBinding>> = {}\n    const afterShapes: Patch<Record<string, TDShape>> = {}\n\n    if (this.isCloning) {\n      if (this.cloneInfo.state === 'empty') {\n        this.createCloneInfo()\n      }\n\n      if (this.cloneInfo.state !== 'ready') throw Error\n      const { clones, clonedBindings } = this.cloneInfo\n\n      // Update the clones\n      clones.forEach((clone) => {\n        beforeShapes[clone.id] = undefined\n\n        afterShapes[clone.id] = this.app.getShape(clone.id)\n\n        if (clone.parentId !== currentPageId) {\n          beforeShapes[clone.parentId] = {\n            ...beforeShapes[clone.parentId],\n            children: initialParentChildren[clone.parentId],\n          }\n\n          afterShapes[clone.parentId] = {\n            ...afterShapes[clone.parentId],\n            children: this.app.getShape<GroupShape>(clone.parentId).children,\n          }\n        }\n      })\n\n      // Update the cloned bindings\n      clonedBindings.forEach((binding) => {\n        beforeBindings[binding.id] = undefined\n        afterBindings[binding.id] = this.app.getBinding(binding.id)\n      })\n    } else {\n      // If we aren't cloning, then update the initial shapes\n      initialShapes.forEach((shape) => {\n        beforeShapes[shape.id] = this.isCreate\n          ? undefined\n          : {\n              ...beforeShapes[shape.id],\n              point: shape.point,\n            }\n\n        afterShapes[shape.id] = {\n          ...afterShapes[shape.id],\n          ...(this.isCreate\n            ? this.app.getShape(shape.id)\n            : { point: this.app.getShape(shape.id).point }),\n        }\n      })\n    }\n\n    // Update the deleted bindings and any associated shapes\n    bindingsToDelete.forEach((binding) => {\n      beforeBindings[binding.id] = binding\n\n      for (const id of [binding.toId, binding.fromId]) {\n        // Let's also look at the bound shape...\n        const shape = this.app.getShape(id)\n\n        // If the bound shape has a handle that references the deleted binding, delete that reference\n        if (!shape.handles) continue\n\n        Object.values(shape.handles)\n          .filter((handle) => handle.bindingId === binding.id)\n          .forEach((handle) => {\n            beforeShapes[id] = { ...beforeShapes[id], handles: {} }\n\n            afterShapes[id] = { ...afterShapes[id], handles: {} }\n\n            // There should be before and after shapes\n\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            beforeShapes[id]!.handles![handle.id as keyof ArrowShape['handles']] = {\n              bindingId: binding.id,\n            }\n\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            afterShapes[id]!.handles![handle.id as keyof ArrowShape['handles']] = {\n              bindingId: undefined,\n            }\n          })\n      }\n    })\n\n    return {\n      id: 'translate',\n      before: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n              bindings: beforeBindings,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: this.isCreate ? [] : [...this.initialSelectedIds],\n            },\n          },\n        },\n      },\n      after: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: afterShapes,\n              bindings: afterBindings,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: [...this.app.selectedIds],\n            },\n          },\n        },\n      },\n    }\n  }\n\n  private createCloneInfo = () => {\n    // Create clones when as they're needed.\n    // Consider doing this work in a worker.\n\n    const {\n      initialShapes,\n      initialParentChildren,\n      app: { selectedIds, currentPageId, page },\n    } = this\n\n    const cloneMap: Record<string, string> = {}\n    const clonedBindingsMap: Record<string, string> = {}\n    const clonedBindings: TDBinding[] = []\n\n    // Create clones of selected shapes\n    const clones: TDShape[] = []\n\n    initialShapes.forEach((shape) => {\n      const newId = Utils.uniqueId()\n\n      initialParentChildren[newId] = initialParentChildren[shape.id]\n\n      cloneMap[shape.id] = newId\n\n      const clone = {\n        ...Utils.deepClone(shape),\n        id: newId,\n        parentId: shape.parentId,\n        childIndex: TLDR.getChildIndexAbove(this.app.state, shape.id, currentPageId),\n      }\n\n      if (clone.type === TDShapeType.Video) {\n        const element = document.getElementById(shape.id + '_video') as HTMLVideoElement\n        if (element) clone.currentTime = (element.currentTime + 16) % element.duration\n      }\n\n      clones.push(clone)\n    })\n\n    clones.forEach((clone) => {\n      if (clone.children !== undefined) {\n        clone.children = clone.children.map((childId) => cloneMap[childId])\n      }\n    })\n\n    clones.forEach((clone) => {\n      if (selectedIds.includes(clone.parentId)) {\n        clone.parentId = cloneMap[clone.parentId]\n      }\n    })\n\n    // Potentially confusing name here: these are the ids of the\n    // original shapes that were cloned, not their clones' ids.\n    const clonedShapeIds = new Set(Object.keys(cloneMap))\n\n    // Create cloned bindings for shapes where both to and from shapes are selected\n    // (if the user clones, then we will create a new binding for the clones)\n    Object.values(page.bindings)\n      .filter((binding) => clonedShapeIds.has(binding.fromId) || clonedShapeIds.has(binding.toId))\n      .forEach((binding) => {\n        if (clonedShapeIds.has(binding.fromId)) {\n          if (clonedShapeIds.has(binding.toId)) {\n            const cloneId = Utils.uniqueId()\n            const cloneBinding = {\n              ...Utils.deepClone(binding),\n              id: cloneId,\n              fromId: cloneMap[binding.fromId] || binding.fromId,\n              toId: cloneMap[binding.toId] || binding.toId,\n            }\n            clonedBindingsMap[binding.id] = cloneId\n            clonedBindings.push(cloneBinding)\n          }\n        }\n      })\n\n    // Assign new binding ids to clones (or delete them!)\n    clones.forEach((clone) => {\n      if (clone.handles) {\n        if (clone.handles) {\n          for (const id in clone.handles) {\n            const handle = clone.handles[id as keyof ArrowShape['handles']]\n            handle.bindingId = handle.bindingId ? clonedBindingsMap[handle.bindingId] : undefined\n          }\n        }\n      }\n    })\n\n    clones.forEach((clone) => {\n      if (page.shapes[clone.id]) {\n        throw Error(\"uh oh, we didn't clone correctly\")\n      }\n    })\n\n    this.cloneInfo = {\n      state: 'ready',\n      clones,\n      cloneMap,\n      clonedBindings,\n    }\n  }\n}\n", "import { Vec } from '@tldraw/vec'\nimport {\n  SessionType,\n  TDStatus,\n  TDShape,\n  PagePartial,\n  TDBinding,\n  TldrawPatch,\n  TldrawCommand,\n} from '~types'\nimport type { TldrawApp } from '../../internal'\nimport { BaseSession } from '../BaseSession'\n\nexport class EraseSession extends BaseSession {\n  type = SessionType.Draw\n  performanceMode = undefined\n  status = TDStatus.Creating\n  isLocked?: boolean\n  lockedDirection?: 'horizontal' | 'vertical'\n  erasedShapes = new Set<TDShape>()\n  erasedBindings = new Set<TDBinding>()\n  initialSelectedShapes: TDShape[]\n  erasableShapes: Set<TDShape>\n  prevPoint: number[]\n  prevEraseShapesSize = 0\n\n  constructor(app: TldrawApp) {\n    super(app)\n    this.prevPoint = [...app.originPoint]\n    this.initialSelectedShapes = this.app.selectedIds.map((id) => this.app.getShape(id))\n    this.erasableShapes = new Set(this.app.shapes.filter((shape) => !shape.isLocked))\n    this.interval = this.loop()\n  }\n\n  interval: any\n  timestamp1 = 0\n  timestamp2 = 0\n  prevErasePoint: number[] = []\n\n  loop = () => {\n    const now = Date.now()\n    const elapsed1 = now - this.timestamp1\n    const elapsed2 = now - this.timestamp2\n    const { eraseLine } = this.app.appState\n\n    let next = [...eraseLine]\n    let didUpdate = false\n\n    if (elapsed1 > 16 && this.prevErasePoint !== this.prevPoint) {\n      didUpdate = true\n      next = [...eraseLine, this.prevPoint]\n      this.prevErasePoint = this.prevPoint\n    }\n\n    if (elapsed2 > 32) {\n      if (next.length > 1) {\n        didUpdate = true\n        next.splice(0, Math.ceil(next.length * 0.1))\n        this.timestamp2 = now\n      }\n    }\n\n    if (didUpdate) {\n      this.app.patchState(\n        {\n          appState: {\n            eraseLine: next,\n          },\n        },\n        'eraseline'\n      )\n    }\n\n    this.interval = requestAnimationFrame(this.loop)\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const { page, shiftKey, originPoint, currentPoint, zoom } = this.app\n\n    if (shiftKey) {\n      if (!this.isLocked && Vec.dist(originPoint, currentPoint) > 4 / zoom) {\n        // If we're locking before knowing what direction we're in, set it\n        // early based on the bigger dimension.\n        if (!this.lockedDirection) {\n          const delta = Vec.sub(currentPoint, originPoint)\n          this.lockedDirection = delta[0] > delta[1] ? 'horizontal' : 'vertical'\n        }\n\n        this.isLocked = true\n      }\n    } else if (this.isLocked) {\n      this.isLocked = false\n    }\n\n    if (this.isLocked) {\n      if (this.lockedDirection === 'vertical') {\n        currentPoint[0] = originPoint[0]\n      } else {\n        currentPoint[1] = originPoint[1]\n      }\n    }\n\n    const newPoint = Vec.toFixed(Vec.add(originPoint, Vec.sub(currentPoint, originPoint)))\n\n    const deletedShapeIds = new Set<string>([])\n\n    this.erasableShapes.forEach((shape) => {\n      if (this.erasedShapes.has(shape)) return\n      if (this.app.getShapeUtil(shape).hitTestLineSegment(shape, this.prevPoint, newPoint)) {\n        this.erasedShapes.add(shape)\n        deletedShapeIds.add(shape.id)\n\n        if (shape.children !== undefined) {\n          for (const childId of shape.children) {\n            this.erasedShapes.add(this.app.getShape(childId))\n            deletedShapeIds.add(childId)\n          }\n        }\n      }\n    })\n\n    // Erase bindings that reference deleted shapes\n\n    Object.values(page.bindings).forEach((binding) => {\n      for (const id of [binding.toId, binding.fromId]) {\n        if (deletedShapeIds.has(id)) {\n          this.erasedBindings.add(binding)\n        }\n      }\n    })\n\n    this.erasedShapes.forEach((shape) => {\n      // Has the shape been deleted? If so, pull it from the list.\n      if (!this.app.getShape(shape.id)) {\n        this.erasedShapes.delete(shape)\n        this.erasableShapes.delete(shape)\n        deletedShapeIds.delete(shape.id)\n      }\n    })\n\n    const erasedShapes = Array.from(this.erasedShapes.values())\n\n    this.prevPoint = newPoint\n\n    if (erasedShapes.length === this.prevEraseShapesSize) {\n      return\n    }\n\n    this.prevEraseShapesSize = erasedShapes.length\n\n    return {\n      document: {\n        pages: {\n          [page.id]: {\n            shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, { isGhost: true }])),\n          },\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const { page } = this.app\n\n    cancelAnimationFrame(this.interval)\n\n    this.erasedShapes.forEach((shape) => {\n      if (!this.app.getShape(shape.id)) {\n        this.erasedShapes.delete(shape)\n        this.erasableShapes.delete(shape)\n      }\n    })\n\n    const erasedShapes = Array.from(this.erasedShapes.values())\n\n    return {\n      document: {\n        pages: {\n          [page.id]: {\n            shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, { isGhost: false }])),\n          },\n        },\n        pageStates: {\n          [page.id]: {\n            selectedIds: this.initialSelectedShapes.map((shape) => shape.id),\n          },\n        },\n      },\n      appState: {\n        eraseLine: [],\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const { page } = this.app\n\n    cancelAnimationFrame(this.interval)\n\n    this.erasedShapes.forEach((shape) => {\n      if (!this.app.getShape(shape.id)) {\n        this.erasedShapes.delete(shape)\n        this.erasableShapes.delete(shape)\n      }\n    })\n\n    this.erasedBindings.forEach((binding) => {\n      if (!this.app.getBinding(binding.id)) {\n        this.erasedBindings.delete(binding)\n      }\n    })\n\n    const erasedShapes = Array.from(this.erasedShapes.values())\n    const erasedBindings = Array.from(this.erasedBindings.values())\n    const erasedShapeIds = erasedShapes.map((shape) => shape.id)\n    const erasedBindingIds = erasedBindings.map((binding) => binding.id)\n\n    const before: PagePartial = {\n      shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, shape])),\n      bindings: Object.fromEntries(erasedBindings.map((binding) => [binding.id, binding])),\n    }\n\n    const after: PagePartial = {\n      shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, undefined])),\n      bindings: Object.fromEntries(erasedBindings.map((binding) => [binding.id, undefined])),\n    }\n\n    // Remove references on any shape's handles to any deleted bindings\n    this.app.shapes.forEach((shape) => {\n      if (shape.handles && !after.shapes[shape.id]) {\n        Object.values(shape.handles).forEach((handle) => {\n          if (handle.bindingId && erasedBindingIds.includes(handle.bindingId)) {\n            // Save the binding reference in the before patch\n            before.shapes[shape.id] = {\n              ...before.shapes[shape.id],\n              handles: {\n                ...before.shapes[shape.id]?.handles,\n                [handle.id]: handle,\n              },\n            }\n\n            // Save the binding reference in the before patch\n            if (!erasedShapeIds.includes(shape.id)) {\n              after.shapes[shape.id] = {\n                ...after.shapes[shape.id],\n                handles: {\n                  ...after.shapes[shape.id]?.handles,\n                  [handle.id]: {\n                    ...handle,\n                    bindingId: undefined,\n                  },\n                },\n              }\n            }\n          }\n        })\n      }\n    })\n\n    return {\n      id: 'erase',\n      before: {\n        document: {\n          pages: {\n            [page.id]: before,\n          },\n          pageStates: {\n            [page.id]: {\n              selectedIds: this.initialSelectedShapes\n                .filter((shape) => !!this.app.getShape(shape.id))\n                .map((shape) => shape.id),\n            },\n          },\n        },\n        appState: {\n          eraseLine: [],\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [page.id]: after,\n          },\n          pageStates: {\n            [page.id]: {\n              selectedIds: this.initialSelectedShapes\n                .filter((shape) => !!this.app.getShape(shape.id))\n                .filter((shape) => !erasedShapeIds.includes(shape.id))\n                .map((shape) => shape.id),\n            },\n          },\n        },\n        appState: {\n          eraseLine: [],\n        },\n      },\n    }\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { TLPageState, TLBounds, Utils } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport {\n  Patch,\n  TDShape,\n  TDStatus,\n  SessionType,\n  TDShapeType,\n  TldrawPatch,\n  TldrawCommand,\n} from '~types'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\nexport class GridSession extends BaseSession {\n  type = SessionType.Grid\n  performanceMode = undefined\n  status = TDStatus.Translating\n  shape: TDShape\n  bounds: TLBounds\n  initialSelectedIds: string[]\n  initialSiblings?: string[]\n  grid: Record<string, string> = {}\n  columns = 1\n  rows = 1\n  isCopying = false\n\n  constructor(app: TldrawApp, id: string) {\n    super(app)\n    this.shape = this.app.getShape(id)\n    this.grid['0_0'] = this.shape.id\n    this.bounds = this.app.getShapeBounds(id)\n    this.initialSelectedIds = [...this.app.selectedIds]\n    if (this.shape.parentId !== this.app.currentPageId) {\n      this.initialSiblings = this.app\n        .getShape(this.shape.parentId)\n        .children?.filter((id) => id !== this.shape.id)\n    }\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const { currentPageId, altKey, shiftKey, currentPoint } = this.app\n\n    const nextShapes: Patch<Record<string, TDShape>> = {}\n\n    const nextPageState: Patch<TLPageState> = {}\n\n    const center = Utils.getBoundsCenter(this.bounds)\n\n    const offset = Vec.sub(currentPoint, center)\n\n    if (shiftKey) {\n      if (Math.abs(offset[0]) < Math.abs(offset[1])) {\n        offset[0] = 0\n      } else {\n        offset[1] = 0\n      }\n    }\n    // use the distance from center to determine the grid\n\n    const gapX = this.bounds.width + 32\n    const gapY = this.bounds.height + 32\n\n    const columns = Math.ceil(offset[0] / gapX)\n    const rows = Math.ceil(offset[1] / gapY)\n\n    const minX = Math.min(columns, 0)\n    const minY = Math.min(rows, 0)\n    const maxX = Math.max(columns, 1)\n    const maxY = Math.max(rows, 1)\n\n    const inGrid = new Set<string>()\n\n    const isCopying = altKey\n\n    if (isCopying !== this.isCopying) {\n      // Recreate shapes copying\n      Object.values(this.grid)\n        .filter((id) => id !== this.shape.id)\n        .forEach((id) => (nextShapes[id] = undefined))\n\n      this.grid = { '0_0': this.shape.id }\n\n      this.isCopying = isCopying\n    }\n\n    // Go through grid, adding items in positions\n    // that aren't already filled.\n    for (let x = minX; x < maxX; x++) {\n      for (let y = minY; y < maxY; y++) {\n        const position = `${x}_${y}`\n\n        inGrid.add(position)\n\n        if (this.grid[position]) continue\n\n        if (x === 0 && y === 0) continue\n\n        const clone = this.getClone(Vec.add(this.shape.point, [x * gapX, y * gapY]), isCopying)\n\n        nextShapes[clone.id] = clone\n\n        this.grid[position] = clone.id\n      }\n    }\n\n    // Remove any other items from the grid\n    Object.entries(this.grid).forEach(([position, id]) => {\n      if (!inGrid.has(position)) {\n        nextShapes[id] = undefined\n        delete this.grid[position]\n      }\n    })\n\n    if (Object.values(nextShapes).length === 0) return\n\n    // Add shapes to parent id\n    if (this.initialSiblings) {\n      nextShapes[this.shape.parentId] = {\n        children: [...this.initialSiblings, ...Object.values(this.grid)],\n      }\n    }\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: nextShapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: nextPageState,\n        },\n      },\n    }\n  }\n\n  cancel = (): TldrawPatch | undefined => {\n    const { currentPageId } = this.app\n    const nextShapes: Record<string, Partial<TDShape> | undefined> = {}\n\n    // Delete clones\n    Object.values(this.grid).forEach((id) => {\n      nextShapes[id] = undefined\n      // TODO: Remove from parent if grouped\n    })\n\n    // Put back the initial shape\n    nextShapes[this.shape.id] = { ...nextShapes[this.shape.id], point: this.shape.point }\n\n    if (this.initialSiblings) {\n      nextShapes[this.shape.parentId] = {\n        children: [...this.initialSiblings, this.shape.id],\n      }\n    }\n\n    return {\n      document: {\n        pages: {\n          [currentPageId]: {\n            shapes: nextShapes,\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: [this.shape.id],\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const { currentPageId } = this.app\n\n    const beforeShapes: Patch<Record<string, TDShape>> = {}\n\n    const afterShapes: Patch<Record<string, TDShape>> = {}\n\n    const afterSelectedIds: string[] = []\n\n    Object.values(this.grid).forEach((id) => {\n      beforeShapes[id] = undefined\n      afterShapes[id] = this.app.getShape(id)\n      afterSelectedIds.push(id)\n      // TODO: Add shape to parent if grouped\n    })\n\n    beforeShapes[this.shape.id] = this.shape\n\n    // Add shapes to parent id\n    if (this.initialSiblings) {\n      beforeShapes[this.shape.parentId] = {\n        children: [...this.initialSiblings, this.shape.id],\n      }\n\n      afterShapes[this.shape.parentId] = {\n        children: [...this.initialSiblings, ...Object.values(this.grid)],\n      }\n    }\n\n    // If no new shapes have been created, bail\n    if (afterSelectedIds.length === 1) return\n\n    return {\n      id: 'grid',\n      before: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: [],\n              hoveredId: undefined,\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: afterShapes,\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: afterSelectedIds,\n              hoveredId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n\n  private getClone = (point: number[], copy: boolean) => {\n    const clone = {\n      ...this.shape,\n      id: Utils.uniqueId(),\n      point,\n    }\n\n    if (!copy) {\n      if (clone.type === TDShapeType.Sticky) {\n        clone.text = ''\n      }\n    }\n\n    return clone\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { TDShape, SessionType, TldrawPatch, TldrawCommand } from '~types'\nimport { BaseSession } from '../BaseSession'\nimport type { TldrawApp } from '../../internal'\n\nexport class EditSession extends BaseSession {\n  type = SessionType.Edit\n  performanceMode = undefined\n\n  initialShape: TDShape\n  initialSelectedIds: string[]\n  currentPageId: string\n  isCreating: boolean\n\n  constructor(app: TldrawApp, id: string, isCreating: boolean) {\n    super(app)\n    this.initialShape = app.getShape(id, app.currentPageId)\n    this.currentPageId = app.currentPageId\n    this.isCreating = isCreating\n    this.initialSelectedIds = [...app.selectedIds]\n  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => void null\n\n  cancel = (): TldrawPatch | undefined => {\n    return {\n      document: {\n        pages: {\n          [this.currentPageId]: {\n            shapes: {\n              [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,\n            },\n          },\n        },\n        pageStates: {\n          [this.currentPageId]: {\n            selectedIds: this.isCreating ? [] : this.initialSelectedIds,\n            editingId: undefined,\n          },\n        },\n      },\n    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const shape = this.app.getShape(this.initialShape.id)\n\n    return {\n      id: 'edit',\n      before: {\n        document: {\n          pages: {\n            [this.currentPageId]: {\n              shapes: {\n                [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,\n              },\n            },\n          },\n          pageStates: {\n            [this.currentPageId]: {\n              selectedIds: this.isCreating ? [] : this.initialSelectedIds,\n              editingId: undefined,\n            },\n          },\n        },\n      },\n      after: {\n        document: {\n          pages: {\n            [this.currentPageId]: {\n              shapes: {\n                [this.initialShape.id]: shape,\n              },\n            },\n          },\n          pageStates: {\n            [this.currentPageId]: {\n              selectedIds: [shape.id],\n              editingId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n}\n", "import { ExceptFirst, SessionType } from '~types'\nimport { ArrowSession } from './ArrowSession'\nimport { BrushSession } from './BrushSession'\nimport { DrawSession } from './DrawSession'\nimport { HandleSession } from './HandleSession'\nimport { RotateSession } from './RotateSession'\nimport { TransformSession } from './TransformSession'\nimport { TransformSingleSession } from './TransformSingleSession'\nimport { TranslateSession } from './TranslateSession'\nimport { EraseSession } from './EraseSession'\nimport { GridSession } from './GridSession'\nimport { EditSession } from './EditSession'\n\nexport type TldrawSession =\n  | ArrowSession\n  | BrushSession\n  | DrawSession\n  | HandleSession\n  | RotateSession\n  | TransformSession\n  | TransformSingleSession\n  | TranslateSession\n  | EraseSession\n  | GridSession\n  | EditSession\n\nexport interface SessionsMap {\n  [SessionType.Arrow]: typeof ArrowSession\n  [SessionType.Brush]: typeof BrushSession\n  [SessionType.Draw]: typeof DrawSession\n  [SessionType.Erase]: typeof EraseSession\n  [SessionType.Handle]: typeof HandleSession\n  [SessionType.Rotate]: typeof RotateSession\n  [SessionType.Transform]: typeof TransformSession\n  [SessionType.TransformSingle]: typeof TransformSingleSession\n  [SessionType.Translate]: typeof TranslateSession\n  [SessionType.Grid]: typeof GridSession\n  [SessionType.Edit]: typeof EditSession\n}\n\nexport type SessionOfType<K extends SessionType> = SessionsMap[K]\n\nexport type SessionArgsOfType<K extends SessionType> = ExceptFirst<\n  ConstructorParameters<SessionOfType<K>>\n>\n\nexport const sessions: { [K in SessionType]: SessionsMap[K] } = {\n  [SessionType.Arrow]: ArrowSession,\n  [SessionType.Brush]: BrushSession,\n  [SessionType.Draw]: DrawSession,\n  [SessionType.Erase]: EraseSession,\n  [SessionType.Handle]: HandleSession,\n  [SessionType.Rotate]: RotateSession,\n  [SessionType.Transform]: TransformSession,\n  [SessionType.TransformSingle]: TransformSingleSession,\n  [SessionType.Translate]: TranslateSession,\n  [SessionType.Grid]: GridSession,\n  [SessionType.Edit]: EditSession,\n}\n\nexport const getSession = <K extends SessionType>(type: K): SessionOfType<K> => {\n  return sessions[type]\n}\n", "import {\n  TLBoundsCorner,\n  TLBoundsEdge,\n  TLBoundsEventHandler,\n  TLBoundsHandleEventHandler,\n  TLCanvasEventHandler,\n  TLPointerEventHandler,\n  TLKeyboardEventHandler,\n  TLShapeCloneHandler,\n  Utils,\n} from '@tldraw/core'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool } from '../BaseTool'\nimport Vec from '@tldraw/vec'\nimport { TLDR } from '~state/TLDR'\nimport { CLONING_DISTANCE, DEAD_ZONE } from '~constants'\n\nenum Status {\n  Idle = 'idle',\n  Creating = 'creating',\n  Pinching = 'pinching',\n  PointingCanvas = 'pointingCanvas',\n  PointingHandle = 'pointingHandle',\n  PointingBounds = 'pointingBounds',\n  PointingClone = 'pointingClone',\n  TranslatingClone = 'translatingClone',\n  PointingBoundsHandle = 'pointingBoundsHandle',\n  TranslatingHandle = 'translatingHandle',\n  Translating = 'translating',\n  Transforming = 'transforming',\n  Rotating = 'rotating',\n  Brushing = 'brushing',\n  GridCloning = 'gridCloning',\n  ClonePainting = 'clonePainting',\n}\n\nexport class SelectTool extends BaseTool<Status> {\n  type = 'select' as const\n\n  pointedId?: string\n\n  selectedGroupId?: string\n\n  pointedHandleId?: 'start' | 'end' | 'bend'\n\n  pointedBoundsHandle?: TLBoundsCorner | TLBoundsEdge | 'rotate' | 'center' | 'left' | 'right'\n\n  pointedLinkHandleId?: 'left' | 'center' | 'right'\n\n  /* --------------------- Methods -------------------- */\n\n  private deselect(id: string) {\n    this.app.select(...this.app.selectedIds.filter((oid) => oid !== id))\n  }\n\n  private select(id: string) {\n    this.app.select(id)\n  }\n\n  private pushSelect(id: string) {\n    const shape = this.app.getShape(id)\n    this.app.select(...this.app.selectedIds.filter((oid) => oid !== shape.parentId), id)\n  }\n\n  private selectNone() {\n    this.app.selectNone()\n  }\n\n  onEnter = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  onExit = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  clonePaint = (point: number[]) => {\n    if (this.app.selectedIds.length === 0) return\n\n    const shapes = this.app.selectedIds.map((id) => this.app.getShape(id))\n\n    const bounds = Utils.expandBounds(Utils.getCommonBounds(shapes.map(TLDR.getBounds)), 16)\n\n    const center = Utils.getBoundsCenter(bounds)\n\n    const size = [bounds.width, bounds.height]\n\n    const gridPoint = [\n      center[0] + size[0] * Math.floor((point[0] + size[0] / 2 - center[0]) / size[0]),\n      center[1] + size[1] * Math.floor((point[1] + size[1] / 2 - center[1]) / size[1]),\n    ]\n\n    const centeredBounds = Utils.centerBounds(bounds, gridPoint)\n\n    const hit = this.app.shapes.some((shape) =>\n      TLDR.getShapeUtil(shape).hitTestBounds(shape, centeredBounds)\n    )\n\n    if (!hit) {\n      this.app.duplicate(this.app.selectedIds, gridPoint)\n    }\n  }\n\n  getShapeClone = (\n    id: string,\n    side:\n      | 'top'\n      | 'right'\n      | 'bottom'\n      | 'left'\n      | 'topLeft'\n      | 'topRight'\n      | 'bottomRight'\n      | 'bottomLeft'\n  ) => {\n    const shape = this.app.getShape(id)\n\n    const utils = TLDR.getShapeUtil(shape)\n\n    if (utils.canClone) {\n      const bounds = utils.getBounds(shape)\n\n      const center = utils.getCenter(shape)\n\n      let point = {\n        top: [bounds.minX, bounds.minY - (bounds.height + CLONING_DISTANCE)],\n        right: [bounds.maxX + CLONING_DISTANCE, bounds.minY],\n        bottom: [bounds.minX, bounds.maxY + CLONING_DISTANCE],\n        left: [bounds.minX - (bounds.width + CLONING_DISTANCE), bounds.minY],\n        topLeft: [\n          bounds.minX - (bounds.width + CLONING_DISTANCE),\n          bounds.minY - (bounds.height + CLONING_DISTANCE),\n        ],\n        topRight: [\n          bounds.maxX + CLONING_DISTANCE,\n          bounds.minY - (bounds.height + CLONING_DISTANCE),\n        ],\n        bottomLeft: [\n          bounds.minX - (bounds.width + CLONING_DISTANCE),\n          bounds.maxY + CLONING_DISTANCE,\n        ],\n        bottomRight: [bounds.maxX + CLONING_DISTANCE, bounds.maxY + CLONING_DISTANCE],\n      }[side]\n\n      if (shape.rotation !== 0) {\n        const newCenter = Vec.add(point, [bounds.width / 2, bounds.height / 2])\n\n        const rotatedCenter = Vec.rotWith(newCenter, center, shape.rotation || 0)\n\n        point = Vec.sub(rotatedCenter, [bounds.width / 2, bounds.height / 2])\n      }\n\n      const id = Utils.uniqueId()\n\n      const clone = {\n        ...shape,\n        id,\n        point,\n      }\n\n      if (clone.type === TDShapeType.Sticky) {\n        clone.text = ''\n      }\n\n      return clone\n    }\n\n    return\n  }\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onCancel = () => {\n    if (this.app.session) {\n      this.app.cancelSession()\n    } else {\n      this.selectNone()\n    }\n\n    this.setStatus(Status.Idle)\n  }\n\n  onKeyDown: TLKeyboardEventHandler = (key, info, e) => {\n    switch (key) {\n      case 'Escape': {\n        this.onCancel()\n        break\n      }\n      case 'Tab': {\n        if (this.app.readOnly) return\n\n        if (\n          !this.app.pageState.editingId &&\n          this.status === Status.Idle &&\n          this.app.selectedIds.length === 1\n        ) {\n          const [selectedId] = this.app.selectedIds\n          const clonedShape = this.getShapeClone(selectedId, 'right')\n\n          if (clonedShape) {\n            this.app.createShapes(clonedShape)\n            this.setStatus(Status.Idle)\n            if (clonedShape.type === TDShapeType.Sticky) {\n              this.app.select(clonedShape.id)\n              this.app.setEditingId(clonedShape.id)\n            }\n          }\n        }\n        break\n      }\n      case 'Meta':\n      case 'Control':\n      case 'Alt': {\n        this.app.updateSession()\n        break\n      }\n      case 'Enter': {\n        if (this.app.readOnly) return\n\n        const { pageState } = this.app\n        if (pageState.selectedIds.length === 1 && !pageState.editingId) {\n          this.app.setEditingId(pageState.selectedIds[0])\n          e.preventDefault()\n        }\n      }\n    }\n  }\n\n  onKeyUp: TLKeyboardEventHandler = (key, info) => {\n    if (this.status === Status.ClonePainting && !(info.altKey && info.shiftKey)) {\n      this.setStatus(Status.Idle)\n      return\n    }\n\n    /* noop */\n    if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n      this.app.updateSession()\n      return\n    }\n  }\n\n  // Keyup is handled on BaseTool\n\n  // Pointer Events (generic)\n\n  onPointerMove: TLPointerEventHandler = () => {\n    const { originPoint, currentPoint } = this.app\n\n    if (this.app.readOnly && this.app.isPointing) {\n      if (this.app.session) {\n        this.app.updateSession()\n      } else {\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          this.app.startSession(SessionType.Brush)\n          this.setStatus(Status.Brushing)\n        }\n      }\n      return\n    }\n\n    switch (this.status) {\n      case Status.PointingBoundsHandle: {\n        if (!this.pointedBoundsHandle) throw Error('No pointed bounds handle')\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          if (this.pointedBoundsHandle === 'rotate') {\n            // Stat a rotate session\n            this.setStatus(Status.Rotating)\n            this.app.startSession(SessionType.Rotate)\n          } else if (\n            this.pointedBoundsHandle === 'center' ||\n            this.pointedBoundsHandle === 'left' ||\n            this.pointedBoundsHandle === 'right'\n          ) {\n            this.setStatus(Status.Translating)\n            this.app.startSession(SessionType.Translate, false, this.pointedBoundsHandle)\n          } else {\n            // Stat a transform session\n            this.setStatus(Status.Transforming)\n            const idsToTransform = this.app.selectedIds.flatMap((id) =>\n              TLDR.getDocumentBranch(this.app.state, id, this.app.currentPageId)\n            )\n            if (idsToTransform.length === 1) {\n              // if only one shape is selected, transform single\n              this.app.startSession(\n                SessionType.TransformSingle,\n                idsToTransform[0],\n                this.pointedBoundsHandle\n              )\n            } else {\n              // otherwise, transform\n              this.app.startSession(SessionType.Transform, this.pointedBoundsHandle)\n            }\n          }\n\n          // Also update the session with the current point\n          this.app.updateSession()\n        }\n        break\n      }\n      case Status.PointingCanvas: {\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          this.app.startSession(SessionType.Brush)\n          this.setStatus(Status.Brushing)\n        }\n        break\n      }\n      case Status.PointingClone: {\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          this.setStatus(Status.TranslatingClone)\n          this.app.startSession(SessionType.Translate)\n          this.app.updateSession()\n        }\n        break\n      }\n      case Status.PointingBounds: {\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          this.setStatus(Status.Translating)\n          this.app.startSession(SessionType.Translate)\n          this.app.updateSession()\n        }\n        break\n      }\n      case Status.PointingHandle: {\n        if (!this.pointedHandleId) throw Error('No pointed handle')\n        if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n          this.setStatus(Status.TranslatingHandle)\n          const selectedShape = this.app.getShape(this.app.selectedIds[0])\n          if (selectedShape) {\n            if (this.pointedHandleId === 'bend') {\n              this.app.startSession(SessionType.Handle, selectedShape.id, this.pointedHandleId)\n              this.app.updateSession()\n            } else {\n              this.app.startSession(\n                SessionType.Arrow,\n                selectedShape.id,\n                this.pointedHandleId,\n                false\n              )\n              this.app.updateSession()\n            }\n          }\n        }\n        break\n      }\n      case Status.ClonePainting: {\n        this.clonePaint(currentPoint)\n        break\n      }\n      default: {\n        if (this.app.session) {\n          this.app.updateSession()\n          break\n        }\n      }\n    }\n  }\n\n  onPointerDown: TLPointerEventHandler = (info, e) => {\n    if (info.target === 'canvas' && this.status === Status.Idle) {\n      const { currentPoint } = this.app\n\n      if (info.spaceKey && e.buttons === 1) return\n\n      if (this.status === Status.Idle && info.altKey && info.shiftKey) {\n        this.setStatus(Status.ClonePainting)\n        this.clonePaint(currentPoint)\n        return\n      }\n\n      // Unless the user is holding shift or meta, clear the current selection\n      if (!info.shiftKey) {\n        this.app.onShapeBlur()\n\n        if (info.altKey && this.app.selectedIds.length > 0) {\n          this.app.duplicate(this.app.selectedIds, currentPoint)\n          return\n        }\n\n        this.selectNone()\n      }\n\n      this.setStatus(Status.PointingCanvas)\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = (info) => {\n    if (this.status === Status.TranslatingClone || this.status === Status.PointingClone) {\n      if (this.pointedId) {\n        this.app.completeSession()\n        this.app.setEditingId(this.pointedId)\n      }\n      this.setStatus(Status.Idle)\n      this.pointedId = undefined\n      return\n    }\n\n    if (this.status === Status.PointingBounds) {\n      if (info.target === 'bounds') {\n        // If we just clicked the selecting bounds's background,\n        // clear the selection\n        this.selectNone()\n      } else if (this.app.isSelected(info.target)) {\n        // If we're holding shift...\n        if (info.shiftKey) {\n          // unless we just shift-selected the shape, remove it from\n          // the selected shapes\n          if (this.pointedId !== info.target) {\n            this.deselect(info.target)\n          }\n        } else {\n          // If we have other selected shapes, select this one instead\n          if (this.pointedId !== info.target && this.app.selectedIds.length > 1) {\n            this.select(info.target)\n          }\n        }\n      } else if (this.pointedId === info.target) {\n        if (this.app.getShape(info.target).isLocked) return\n        // If the target is not selected and was just pointed\n        // on pointer down...\n        if (info.shiftKey) {\n          this.pushSelect(info.target)\n        } else {\n          this.select(info.target)\n        }\n      }\n    }\n\n    // Complete the current session, if any; and reset the status\n\n    this.setStatus(Status.Idle)\n    this.pointedBoundsHandle = undefined\n    this.pointedHandleId = undefined\n    this.pointedId = undefined\n\n    // Don't complete a session if we've just started one\n    if (this.app.session?.type === SessionType.Edit) {\n      return\n    }\n\n    this.app.completeSession()\n  }\n\n  // Canvas\n\n  onDoubleClickCanvas: TLCanvasEventHandler = () => {\n    if (this.app.readOnly) return\n    // Needs debugging\n    // const { currentPoint } = this.app\n    // this.app.selectTool(TDShapeType.Text)\n    // this.setStatus(Status.Idle)\n    // this.app.createTextShapeAtPoint(currentPoint)\n  }\n\n  // Shape\n\n  onPointShape: TLPointerEventHandler = (info, e) => {\n    if (info.spaceKey && e.buttons === 1) return\n\n    if (this.app.getShape(info.target).isLocked) return\n\n    const { editingId, hoveredId } = this.app.pageState\n\n    if (editingId && info.target !== editingId) {\n      this.app.onShapeBlur()\n    }\n\n    // While holding command and shift, select or deselect\n    // the shape, ignoring any group that may contain it. Yikes!\n    if (\n      (this.status === Status.Idle || this.status === Status.PointingBounds) &&\n      info.metaKey &&\n      info.shiftKey &&\n      hoveredId\n    ) {\n      this.pointedId = hoveredId\n\n      if (this.app.isSelected(hoveredId)) {\n        this.deselect(hoveredId)\n      } else {\n        this.pushSelect(hoveredId)\n        this.setStatus(Status.PointingBounds)\n      }\n\n      return\n    }\n\n    if (this.status === Status.PointingBounds) {\n      // The pointed id should be the shape's group, if it belongs\n      // to a group, or else the shape itself, if it is on the page.\n      const { parentId } = this.app.getShape(info.target)\n      this.pointedId = parentId === this.app.currentPageId ? info.target : parentId\n      return\n    }\n\n    if (this.status === Status.Idle) {\n      this.setStatus(Status.PointingBounds)\n\n      if (info.metaKey) {\n        if (!info.shiftKey) {\n          this.selectNone()\n        }\n\n        this.app.startSession(SessionType.Brush)\n\n        this.setStatus(Status.Brushing)\n        return\n      }\n\n      // If we've clicked on a shape that is inside of a group,\n      // then select the group rather than the shape.\n      let shapeIdToSelect: string\n      const { parentId } = this.app.getShape(info.target)\n\n      // If the pointed shape is a child of the page, select the\n      // target shape and clear the selected group id.\n      if (parentId === this.app.currentPageId) {\n        shapeIdToSelect = info.target\n        this.selectedGroupId = undefined\n      } else {\n        // If the parent is some other group...\n        if (parentId === this.selectedGroupId) {\n          // If that group is the selected group, then select\n          // the target shape.\n          shapeIdToSelect = info.target\n        } else {\n          // Otherwise, select the group and clear the selected\n          // group id.\n          shapeIdToSelect = parentId\n\n          this.selectedGroupId = undefined\n        }\n      }\n\n      if (!this.app.isSelected(shapeIdToSelect)) {\n        // Set the pointed ID to the shape that was clicked.\n        this.pointedId = shapeIdToSelect\n\n        // If the shape is not selected: then if the user is pressing shift,\n        // add the shape to the current selection; otherwise, set the shape as\n        // the only selected shape.\n        if (info.shiftKey) {\n          this.pushSelect(shapeIdToSelect)\n        } else {\n          this.select(shapeIdToSelect)\n        }\n      }\n    }\n  }\n\n  onDoubleClickShape: TLPointerEventHandler = (info) => {\n    if (this.app.readOnly) return\n\n    const shape = this.app.getShape(info.target)\n\n    if (shape.isLocked) {\n      this.app.select(info.target)\n      return\n    }\n\n    // If we can edit the shape (and if we can select the shape) then\n    // start editing\n    if (\n      TLDR.getShapeUtil(shape.type).canEdit &&\n      (shape.parentId === this.app.currentPageId || shape.parentId === this.selectedGroupId)\n    ) {\n      this.app.setEditingId(info.target)\n    }\n\n    // If the shape is the child of a group, then drill into the group?\n    if (shape.parentId !== this.app.currentPageId) {\n      this.selectedGroupId = shape.parentId\n    }\n\n    this.app.select(info.target)\n  }\n\n  onRightPointShape: TLPointerEventHandler = (info) => {\n    if (!this.app.isSelected(info.target)) {\n      this.app.select(info.target)\n    }\n  }\n\n  onHoverShape: TLPointerEventHandler = (info) => {\n    this.app.setHoveredId(info.target)\n  }\n\n  onUnhoverShape: TLPointerEventHandler = (info) => {\n    const { currentPageId: oldCurrentPageId } = this.app\n\n    // Wait a frame; and if we haven't changed the hovered id,\n    // clear the current hovered id\n    requestAnimationFrame(() => {\n      if (\n        oldCurrentPageId === this.app.currentPageId &&\n        this.app.pageState.hoveredId === info.target\n      ) {\n        this.app.setHoveredId(undefined)\n      }\n    })\n  }\n\n  /* --------------------- Bounds --------------------- */\n\n  onPointBounds: TLBoundsEventHandler = (info) => {\n    if (info.metaKey) {\n      if (!info.shiftKey) {\n        this.selectNone()\n      }\n\n      this.app.startSession(SessionType.Brush)\n\n      this.setStatus(Status.Brushing)\n      return\n    }\n\n    this.setStatus(Status.PointingBounds)\n  }\n\n  onRightPointBounds: TLPointerEventHandler = (info, e) => {\n    e.stopPropagation()\n  }\n\n  onReleaseBounds: TLBoundsEventHandler = () => {\n    if (this.status === Status.Translating || this.status === Status.Brushing) {\n      this.app.completeSession()\n    }\n\n    this.setStatus(Status.Idle)\n  }\n\n  /* ----------------- Bounds Handles ----------------- */\n\n  onPointBoundsHandle: TLBoundsHandleEventHandler = (info) => {\n    this.pointedBoundsHandle = info.target\n    this.setStatus(Status.PointingBoundsHandle)\n  }\n\n  onDoubleClickBoundsHandle: TLBoundsHandleEventHandler = (info) => {\n    switch (info.target) {\n      case 'center':\n      case 'left':\n      case 'right': {\n        this.app.select(\n          ...TLDR.getLinkedShapeIds(\n            this.app.state,\n            this.app.currentPageId,\n            info.target,\n            info.shiftKey\n          )\n        )\n        break\n      }\n      default: {\n        if (this.app.selectedIds.length === 1) {\n          this.app.resetBounds(this.app.selectedIds)\n          const shape = this.app.getShape(this.app.selectedIds[0])\n          if ('label' in shape) {\n            this.app.setEditingId(shape.id)\n          }\n        }\n      }\n    }\n  }\n\n  onReleaseBoundsHandle: TLBoundsHandleEventHandler = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  /* --------------------- Handles -------------------- */\n\n  onPointHandle: TLPointerEventHandler = (info) => {\n    this.pointedHandleId = info.target as 'start' | 'end'\n    this.setStatus(Status.PointingHandle)\n  }\n\n  onDoubleClickHandle: TLPointerEventHandler = (info) => {\n    if (info.target === 'bend') {\n      const { selectedIds } = this.app\n      if (selectedIds.length !== 1) return\n      const shape = this.app.getShape(selectedIds[0])\n      if (\n        TLDR.getShapeUtil(shape.type).canEdit &&\n        (shape.parentId === this.app.currentPageId || shape.parentId === this.selectedGroupId)\n      ) {\n        this.app.setEditingId(shape.id)\n      }\n      return\n    }\n\n    this.app.toggleDecoration(info.target)\n  }\n\n  onReleaseHandle: TLPointerEventHandler = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  /* ---------------------- Misc ---------------------- */\n\n  onShapeClone: TLShapeCloneHandler = (info) => {\n    const selectedShapeId = this.app.selectedIds[0]\n\n    const clonedShape = this.getShapeClone(selectedShapeId, info.target)\n\n    if (\n      info.target === 'left' ||\n      info.target === 'right' ||\n      info.target === 'top' ||\n      info.target === 'bottom'\n    ) {\n      if (clonedShape) {\n        this.app.createShapes(clonedShape)\n\n        // Now start pointing the bounds, so that a user can start\n        // dragging to reposition if they wish.\n        this.pointedId = clonedShape.id\n        this.setStatus(Status.PointingClone)\n      }\n    } else {\n      this.setStatus(Status.GridCloning)\n      this.app.startSession(SessionType.Grid, selectedShapeId)\n    }\n  }\n}\n", "import {\n  TLKeyboardEventHandler,\n  TLPinchEventHandler,\n  TLPointerEventHandler,\n  Utils,\n} from '@tldraw/core'\nimport type { TldrawApp } from '../internal'\nimport { TDEventHandler, TDToolType } from '~types'\n\nexport enum Status {\n  Idle = 'idle',\n  Creating = 'creating',\n  Pinching = 'pinching',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport abstract class BaseTool<T extends string = any> extends TDEventHandler {\n  type: TDToolType = 'select' as const\n\n  previous?: TDToolType\n\n  status: Status | T = Status.Idle\n\n  constructor(public app: TldrawApp) {\n    super()\n  }\n\n  protected readonly setStatus = (status: Status | T) => {\n    this.status = status as Status | T\n    this.app.setStatus(this.status as string)\n  }\n\n  onEnter = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  onExit = () => {\n    this.setStatus(Status.Idle)\n  }\n\n  onCancel = () => {\n    if (this.status === Status.Idle) {\n      this.app.selectTool('select')\n    } else {\n      this.setStatus(Status.Idle)\n    }\n\n    this.app.cancelSession()\n  }\n\n  getNextChildIndex = () => {\n    const {\n      shapes,\n      appState: { currentPageId },\n    } = this.app\n\n    return shapes.length === 0\n      ? 1\n      : shapes\n          .filter((shape) => shape.parentId === currentPageId)\n          .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n  }\n\n  /* --------------------- Camera --------------------- */\n\n  onPinchStart: TLPinchEventHandler = () => {\n    this.app.cancelSession()\n    this.setStatus(Status.Pinching)\n  }\n\n  onPinchEnd: TLPinchEventHandler = () => {\n    if (Utils.isMobileSafari()) {\n      this.app.undoSelect()\n    }\n    this.setStatus(Status.Idle)\n  }\n\n  onPinch: TLPinchEventHandler = (info, e) => {\n    if (this.status !== 'pinching') return\n    if (isNaN(info.delta[0]) || isNaN(info.delta[1])) return\n    this.app.pinchZoom(info.point, info.delta, info.delta[2])\n    this.onPointerMove?.(info, e as unknown as React.PointerEvent)\n  }\n\n  /* ---------------------- Keys ---------------------- */\n\n  onKeyDown: TLKeyboardEventHandler = (key) => {\n    if (key === 'Escape') {\n      this.onCancel()\n      return\n    }\n\n    if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n      this.app.updateSession()\n      return\n    }\n  }\n\n  onKeyUp: TLKeyboardEventHandler = (key) => {\n    if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n      this.app.updateSession()\n      return\n    }\n  }\n\n  /* --------------------- Pointer -------------------- */\n\n  onPointerMove: TLPointerEventHandler = () => {\n    if (this.status === Status.Creating) {\n      this.app.updateSession()\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    if (this.status === Status.Creating) {\n      this.app.completeSession()\n\n      const { isToolLocked } = this.app.appState\n\n      if (!isToolLocked) {\n        this.app.selectTool('select')\n      }\n    }\n\n    this.setStatus(Status.Idle)\n  }\n}\n", "import Vec from '@tldraw/vec'\nimport type { TLPointerEventHandler } from '@tldraw/core'\nimport { SessionType } from '~types'\nimport { BaseTool } from '../BaseTool'\nimport { DEAD_ZONE } from '~constants'\n\nenum Status {\n  Idle = 'idle',\n  Pointing = 'pointing',\n  Erasing = 'erasing',\n}\n\nexport class EraseTool extends BaseTool {\n  type = 'erase' as const\n\n  status: Status = Status.Idle\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status !== Status.Idle) return\n\n    this.setStatus(Status.Pointing)\n  }\n\n  onPointerMove: TLPointerEventHandler = (info) => {\n    if (this.app.readOnly) return\n    switch (this.status) {\n      case Status.Pointing: {\n        if (Vec.dist(info.origin, info.point) > DEAD_ZONE) {\n          this.app.startSession(SessionType.Erase)\n          this.app.updateSession()\n          this.setStatus(Status.Erasing)\n        }\n        break\n      }\n      case Status.Erasing: {\n        this.app.updateSession()\n      }\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    switch (this.status) {\n      case Status.Pointing: {\n        const shapeIdsAtPoint = this.app.shapes\n          .filter((shape) => !shape.isLocked)\n          .filter((shape) =>\n            this.app.getShapeUtil(shape).hitTestPoint(shape, this.app.currentPoint)\n          )\n          .flatMap((shape) => (shape.children ? [shape.id, ...shape.children] : shape.id))\n\n        this.app.delete(shapeIdsAtPoint)\n\n        break\n      }\n      case Status.Erasing: {\n        this.app.completeSession()\n\n        // Should the app go back to the previous state, the select\n        // state, or stay in the eraser state?\n\n        // if (this.previous) {\n        //   this.app.selectTool(this.previous)\n        // } else {\n        //   this.app.selectTool('select')\n        // }\n      }\n    }\n\n    this.setStatus(Status.Idle)\n  }\n\n  onCancel = () => {\n    if (this.status === Status.Idle) {\n      if (this.previous) {\n        this.app.selectTool(this.previous)\n      } else {\n        this.app.selectTool('select')\n      }\n    } else {\n      this.setStatus(Status.Idle)\n    }\n\n    this.app.cancelSession()\n  }\n}\n", "import type { TLPointerEventHandler, TLKeyboardEventHandler } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class TextTool extends BaseTool {\n  type = TDShapeType.Text as const\n\n  /* --------------------- Methods -------------------- */\n\n  stopEditingShape = () => {\n    this.setStatus(Status.Idle)\n\n    if (!this.app.appState.isToolLocked) {\n      this.app.selectTool('select')\n    }\n  }\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onKeyUp: TLKeyboardEventHandler = () => {\n    // noop\n  }\n\n  onKeyDown: TLKeyboardEventHandler = () => {\n    // noop\n  }\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.status === Status.Creating) {\n      this.stopEditingShape()\n      return\n    }\n\n    if (this.status === Status.Idle) {\n      const {\n        currentPoint,\n        currentGrid,\n        settings: { showGrid },\n      } = this.app\n\n      this.app.createTextShapeAtPoint(\n        showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n        undefined,\n        true\n      )\n      this.setStatus(Status.Creating)\n      return\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    // noop important! We don't want the inherited event\n    // from BaseUtil to run.\n  }\n\n  onPointShape: TLPointerEventHandler = (info) => {\n    if (this.app.readOnly) return\n    const shape = this.app.getShape(info.target)\n    if (shape.type === TDShapeType.Text) {\n      this.setStatus(Status.Idle)\n      this.app.setEditingId(shape.id)\n    }\n  }\n\n  onShapeBlur = () => {\n    if (this.app.readOnly) return\n    this.stopEditingShape()\n  }\n}\n", "import { Utils, TLPointerEventHandler } from '@tldraw/core'\nimport { Draw } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool } from '../BaseTool'\n\nenum Status {\n  Idle = 'idle',\n  Creating = 'creating',\n  Extending = 'extending',\n  Pinching = 'pinching',\n}\n\nexport class DrawTool extends BaseTool {\n  type = TDShapeType.Draw as const\n\n  private lastShapeId?: string\n\n  onEnter = () => {\n    this.lastShapeId = undefined\n  }\n\n  onCancel = () => {\n    switch (this.status) {\n      case Status.Idle: {\n        this.app.selectTool('select')\n        break\n      }\n      default: {\n        this.setStatus(Status.Idle)\n        break\n      }\n    }\n\n    this.app.cancelSession()\n  }\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = info => {\n    if (this.status !== Status.Idle) return\n    if (this.app.readOnly) return\n    const {\n      currentPoint,\n      appState: { currentPageId, currentStyle },\n    } = this.app\n    const previous = this.lastShapeId && this.app.getShape(this.lastShapeId)\n    if (info.shiftKey && previous) {\n      // Extend the previous shape\n      this.app.startSession(SessionType.Draw, previous.id)\n      this.setStatus(Status.Extending)\n    } else {\n      // Create a new shape\n      const childIndex = this.getNextChildIndex()\n      const id = Utils.uniqueId()\n      const newShape = Draw.create({\n        id,\n        parentId: currentPageId,\n        childIndex,\n        point: currentPoint,\n        style: { ...currentStyle },\n      })\n      this.lastShapeId = id\n      this.app.patchCreate([newShape])\n      this.app.startSession(SessionType.Draw, id)\n      this.setStatus(Status.Creating)\n    }\n  }\n\n  onPointerMove: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n\n    switch (this.status) {\n      case Status.Extending:\n      case Status.Creating: {\n        this.app.updateSession()\n      }\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    this.app.completeSession()\n    this.setStatus(Status.Idle)\n  }\n}\n", "import { Utils, TLPointerEventHandler, TLBoundsCorner } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Ellipse } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class EllipseTool extends BaseTool {\n  type = TDShapeType.Ellipse as const\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentStyle },\n    } = this.app\n\n    const childIndex = this.getNextChildIndex()\n\n    const id = Utils.uniqueId()\n\n    const newShape = Ellipse.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      style: { ...currentStyle },\n    })\n\n    this.app.patchCreate([newShape])\n\n    this.app.startSession(\n      SessionType.TransformSingle,\n      newShape.id,\n      TLBoundsCorner.BottomRight,\n      true\n    )\n\n    this.setStatus(Status.Creating)\n  }\n}\n", "import { Utils, TLPointerEventHandler, TLBoundsCorner } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Rectangle } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class RectangleTool extends BaseTool {\n  type = TDShapeType.Rectangle as const\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentStyle },\n    } = this.app\n\n    const childIndex = this.getNextChildIndex()\n\n    const id = Utils.uniqueId()\n\n    const newShape = Rectangle.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      style: { ...currentStyle },\n    })\n\n    this.app.patchCreate([newShape])\n\n    this.app.startSession(\n      SessionType.TransformSingle,\n      newShape.id,\n      TLBoundsCorner.BottomRight,\n      true\n    )\n\n    this.setStatus(Status.Creating)\n  }\n}\n", "import { Utils, TLPointerEventHandler, TLBoundsCorner } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Triangle } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class TriangleTool extends BaseTool {\n  type = TDShapeType.Triangle as const\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentStyle },\n    } = this.app\n\n    const childIndex = this.getNextChildIndex()\n\n    const id = Utils.uniqueId()\n\n    const newShape = Triangle.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      style: { ...currentStyle },\n    })\n\n    this.app.patchCreate([newShape])\n\n    this.app.startSession(\n      SessionType.TransformSingle,\n      newShape.id,\n      TLBoundsCorner.BottomRight,\n      true\n    )\n\n    this.setStatus(Status.Creating)\n  }\n}\n", "import { Utils, TLPointerEventHandler } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Arrow } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class LineTool extends BaseTool {\n  type = TDShapeType.Line as const\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentStyle },\n    } = this.app\n\n    const childIndex = this.getNextChildIndex()\n\n    const id = Utils.uniqueId()\n\n    const newShape = Arrow.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      decorations: {\n        start: undefined,\n        end: undefined,\n      },\n      style: { ...currentStyle },\n    })\n\n    this.app.patchCreate([newShape])\n\n    this.app.startSession(SessionType.Arrow, newShape.id, 'end', true)\n\n    this.setStatus(Status.Creating)\n  }\n}\n", "import { Utils, TLPointerEventHandler } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Arrow } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class ArrowTool extends BaseTool {\n  type = TDShapeType.Arrow as const\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentStyle },\n    } = this.app\n\n    const childIndex = this.getNextChildIndex()\n\n    const id = Utils.uniqueId()\n\n    const newShape = Arrow.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      style: { ...currentStyle },\n    })\n\n    this.app.patchCreate([newShape])\n\n    this.app.startSession(SessionType.Arrow, newShape.id, 'end', true)\n\n    this.setStatus(Status.Creating)\n  }\n}\n", "import Vec from '@tldraw/vec'\nimport type { TLPointerEventHandler } from '@tldraw/core'\nimport { Utils } from '@tldraw/core'\nimport { Sticky } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class StickyTool extends BaseTool {\n  type = TDShapeType.Sticky as const\n\n  shapeId?: string\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status === Status.Creating) {\n      this.setStatus(Status.Idle)\n\n      if (!this.app.appState.isToolLocked) {\n        this.app.selectTool('select')\n      }\n\n      return\n    }\n\n    if (this.status === Status.Idle) {\n      const {\n        currentPoint,\n        currentGrid,\n        settings: { showGrid },\n        appState: { currentPageId, currentStyle },\n      } = this.app\n\n      const childIndex = this.getNextChildIndex()\n\n      const id = Utils.uniqueId()\n\n      this.shapeId = id\n\n      const newShape = Sticky.create({\n        id,\n        parentId: currentPageId,\n        childIndex,\n        point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n        style: { ...currentStyle },\n      })\n\n      const bounds = Sticky.getBounds(newShape)\n\n      newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n\n      this.app.patchCreate([newShape])\n\n      this.app.startSession(SessionType.Translate)\n\n      this.setStatus(Status.Creating)\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    if (this.app.readOnly) return\n    if (this.status === Status.Creating) {\n      this.setStatus(Status.Idle)\n      this.app.completeSession()\n      this.app.selectTool('select')\n      this.app.setEditingId(this.shapeId)\n    }\n  }\n}\n", "import createVanilla, { StoreApi } from 'zustand/vanilla'\nimport create, { UseBoundStore } from 'zustand'\nimport * as idb from 'idb-keyval'\nimport { deepCopy } from './copy'\nimport type { Patch, Command } from '../../types'\nimport { Utils } from '@tldraw/core'\n\nexport class StateManager<T extends Record<string, any>> {\n  /**\n   * An ID used to persist state in indexdb.\n   */\n  protected _idbId?: string\n\n  /**\n   * The initial state.\n   */\n  private initialState: T\n\n  /**\n   * A zustand store that also holds the state.\n   */\n  private store: StoreApi<T>\n\n  /**\n   * The index of the current command.\n   */\n  protected pointer = -1\n\n  /**\n   * The current state.\n   */\n  private _state: T\n\n  /**\n   * The state manager's current status, with regard to restoring persisted state.\n   */\n  private _status: 'loading' | 'ready' = 'loading'\n\n  /**\n   * A stack of commands used for history (undo and redo).\n   */\n  protected stack: Command<T>[] = []\n\n  /**\n   * A snapshot of the current state.\n   */\n  protected _snapshot: T\n\n  /**\n   * A React hook for accessing the zustand store.\n   */\n  public readonly useStore: UseBoundStore<T>\n\n  /**\n   * A promise that will resolve when the state manager has loaded any peristed state.\n   */\n  public ready: Promise<'none' | 'restored' | 'migrated'>\n\n  public isPaused = false\n\n  constructor(\n    initialState: T,\n    id?: string,\n    version?: number,\n    update?: (prev: T, next: T, prevVersion: number) => T\n  ) {\n    this._idbId = id\n    this._state = deepCopy(initialState)\n    this._snapshot = deepCopy(initialState)\n    this.initialState = deepCopy(initialState)\n    this.store = createVanilla(() => this._state)\n    this.useStore = create(this.store)\n\n    this.ready = new Promise<'none' | 'restored' | 'migrated'>((resolve) => {\n      let message: 'none' | 'restored' | 'migrated' = 'none'\n\n      if (this._idbId) {\n        message = 'restored'\n\n        idb\n          .get(this._idbId)\n          .then(async (saved) => {\n            if (saved) {\n              let next = saved\n\n              if (version) {\n                const savedVersion = await idb.get<number>(id + '_version')\n\n                if (savedVersion && savedVersion < version) {\n                  next = update ? update(saved, initialState, savedVersion) : initialState\n\n                  message = 'migrated'\n                }\n              }\n\n              await idb.set(id + '_version', version || -1)\n\n              // why is this necessary? but it is...\n              const prevEmpty = this._state.appState.isEmptyCanvas\n\n              next = this.migrate(next)\n\n              this._state = deepCopy(next)\n              this._snapshot = deepCopy(next)\n\n              this._state.appState.isEmptyCanvas = prevEmpty\n              this.store.setState(this._state, true)\n            } else {\n              await idb.set(id + '_version', version || -1)\n            }\n            this._status = 'ready'\n            resolve(message)\n          })\n          .catch((e) => console.error(e))\n      } else {\n        // We need to wait for any override to `onReady` to take effect.\n        this._status = 'ready'\n        resolve(message)\n      }\n    }).then((message) => {\n      if (this.onReady) this.onReady(message)\n      return message\n    })\n  }\n\n  /**\n   * Save the current state to indexdb.\n   */\n  protected persist = (patch: Patch<T>, id?: string): void | Promise<void> => {\n    if (this._status !== 'ready') return\n\n    if (this.onPersist) {\n      this.onPersist(this._state, patch, id)\n    }\n\n    if (this._idbId) {\n      return idb.set(this._idbId, this._state).catch((e) => console.error(e))\n    }\n  }\n\n  /**\n   * Apply a patch to the current state.\n   * This does not effect the undo/redo stack.\n   * This does not persist the state.\n   * @param patch The patch to apply.\n   * @param id (optional) An id for the patch.\n   */\n  private applyPatch = (patch: Patch<T>, id?: string) => {\n    const prev = this._state\n    const next = Utils.deepMerge(this._state, patch as any)\n    const final = this.cleanup(next, prev, patch, id)\n    if (this.onStateWillChange) {\n      this.onStateWillChange(final, id)\n    }\n    this._state = final\n    this.store.setState(this._state, true)\n    if (this.onStateDidChange) {\n      this.onStateDidChange(this._state, id)\n    }\n    return this\n  }\n\n  // Internal API ---------------------------------\n\n  protected migrate = (next: T): T => {\n    return next\n  }\n\n  /**\n   * Perform any last changes to the state before updating.\n   * Override this on your extending class.\n   * @param nextState The next state.\n   * @param prevState The previous state.\n   * @param patch The patch that was just applied.\n   * @param id (optional) An id for the just-applied patch.\n   * @returns The final new state to apply.\n   */\n  protected cleanup = (nextState: T, _prevState: T, _patch: Patch<T>, _id?: string): T => nextState\n\n  /**\n   * A life-cycle method called when the state is about to change.\n   * @param state The next state.\n   * @param id An id for the change.\n   */\n  protected onStateWillChange?: (state: T, id?: string) => void\n\n  /**\n   * A life-cycle method called when the state has changed.\n   * @param state The next state.\n   * @param id An id for the change.\n   */\n  protected onStateDidChange?: (state: T, id?: string) => void\n\n  /**\n   * Apply a patch to the current state.\n   * This does not effect the undo/redo stack.\n   * This does not persist the state.\n   * @param patch The patch to apply.\n   * @param id (optional) An id for this patch.\n   */\n  patchState = (patch: Patch<T>, id?: string): this => {\n    this.applyPatch(patch, id)\n    if (this.onPatch) {\n      this.onPatch(this._state, patch, id)\n    }\n    return this\n  }\n\n  /**\n   * Replace the current state.\n   * This does not effect the undo/redo stack.\n   * This does not persist the state.\n   * @param state The new state.\n   * @param id An id for this change.\n   */\n  protected replaceState = (state: T, id?: string): this => {\n    const final = this.cleanup(state, this._state, state, id)\n    if (this.onStateWillChange) {\n      this.onStateWillChange(final, 'replace')\n    }\n    this._state = final\n    this.store.setState(this._state, true)\n    if (this.onStateDidChange) {\n      this.onStateDidChange(this._state, 'replace')\n    }\n    return this\n  }\n\n  /**\n   * Update the state using a Command.\n   * This effects the undo/redo stack.\n   * This persists the state.\n   * @param command The command to apply and add to the undo/redo stack.\n   * @param id (optional) An id for this command.\n   */\n  protected setState = (command: Command<T>, id = command.id) => {\n    if (this.pointer < this.stack.length - 1) {\n      this.stack = this.stack.slice(0, this.pointer + 1)\n    }\n    this.stack.push({ ...command, id })\n    this.pointer = this.stack.length - 1\n    this.applyPatch(command.after, id)\n    if (this.onCommand) this.onCommand(this._state, command, id)\n    this.persist(command.after, id)\n    return this\n  }\n\n  // Public API ---------------------------------\n\n  public pause() {\n    this.isPaused = true\n  }\n\n  public resume() {\n    this.isPaused = false\n  }\n\n  /**\n   * A callback fired when the constructor finishes loading any\n   * persisted data.\n   */\n  protected onReady?: (message: 'none' | 'restored' | 'migrated') => void\n\n  /**\n   * A callback fired when a patch is applied.\n   */\n  public onPatch?: (state: T, patch: Patch<T>, id?: string) => void\n\n  /**\n   * A callback fired when a patch is applied.\n   */\n  public onCommand?: (state: T, command: Command<T>, id?: string) => void\n\n  /**\n   * A callback fired when the state is persisted.\n   */\n  public onPersist?: (state: T, patch: Patch<T>, id?: string) => void\n\n  /**\n   * A callback fired when the state is replaced.\n   */\n  public onReplace?: (state: T) => void\n\n  /**\n   * A callback fired when the state is reset.\n   */\n  public onReset?: (state: T) => void\n\n  /**\n   * A callback fired when the history is reset.\n   */\n  public onResetHistory?: (state: T) => void\n\n  /**\n   * A callback fired when a command is undone.\n   */\n  public onUndo?: (state: T) => void\n\n  /**\n   * A callback fired when a command is redone.\n   */\n  public onRedo?: (state: T) => void\n\n  /**\n   * Reset the state to the initial state and reset history.\n   */\n  public reset = () => {\n    if (this.onStateWillChange) {\n      this.onStateWillChange(this.initialState, 'reset')\n    }\n    this._state = this.initialState\n    this.store.setState(this._state, true)\n    this.resetHistory()\n    this.persist({}, 'reset')\n    if (this.onStateDidChange) {\n      this.onStateDidChange(this._state, 'reset')\n    }\n    if (this.onReset) {\n      this.onReset(this._state)\n    }\n    return this\n  }\n\n  /**\n   * Force replace a new undo/redo history. It's your responsibility\n   * to make sure that this is compatible with the current state!\n   * @param history The new array of commands.\n   * @param pointer (optional) The new pointer position.\n   */\n  public replaceHistory = (history: Command<T>[], pointer = history.length - 1): this => {\n    this.stack = history\n    this.pointer = pointer\n    if (this.onReplace) {\n      this.onReplace(this._state)\n    }\n    return this\n  }\n\n  /**\n   * Reset the history stack (without resetting the state).\n   */\n  public resetHistory = (): this => {\n    this.stack = []\n    this.pointer = -1\n    if (this.onResetHistory) {\n      this.onResetHistory(this._state)\n    }\n    return this\n  }\n\n  /**\n   * Move backward in the undo/redo stack.\n   */\n  public undo = (): this => {\n    if (!this.isPaused) {\n      if (!this.canUndo) return this\n      const command = this.stack[this.pointer]\n      this.pointer--\n      this.applyPatch(command.before, `undo`)\n      this.persist(command.before, 'undo')\n    }\n    if (this.onUndo) this.onUndo(this._state)\n    return this\n  }\n\n  /**\n   * Move forward in the undo/redo stack.\n   */\n  public redo = (): this => {\n    if (!this.isPaused) {\n      if (!this.canRedo) return this\n      this.pointer++\n      const command = this.stack[this.pointer]\n      this.applyPatch(command.after, 'redo')\n      this.persist(command.after, 'undo')\n    }\n    if (this.onRedo) this.onRedo(this._state)\n    return this\n  }\n\n  /**\n   * Save a snapshot of the current state, accessible at `this.snapshot`.\n   */\n  public setSnapshot = (): this => {\n    this._snapshot = { ...this._state }\n    return this\n  }\n\n  /**\n   * Force the zustand state to update.\n   */\n  public forceUpdate = () => {\n    this.store.setState(this._state, true)\n  }\n\n  /**\n   * Get whether the state manager can undo.\n   */\n  public get canUndo(): boolean {\n    return this.pointer > -1\n  }\n\n  /**\n   * Get whether the state manager can redo.\n   */\n  public get canRedo(): boolean {\n    return this.pointer < this.stack.length - 1\n  }\n\n  /**\n   * The current state.\n   */\n  public get state(): T {\n    return this._state\n  }\n\n  /**\n   * The current status.\n   */\n  public get status(): string {\n    return this._status\n  }\n\n  /**\n   * The most-recent snapshot.\n   */\n  protected get snapshot(): T {\n    return this._snapshot\n  }\n}\n", "import { get, set, del } from 'idb-keyval'\n\n// Used for clipboard\n\nconst ID = 'tldraw_clipboard'\n\nexport async function getClipboard(): Promise<string | undefined> {\n  return get(ID)\n}\n\nexport async function setClipboard(item: string): Promise<void> {\n  return set(ID, item)\n}\n\nexport function clearClipboard(): Promise<void> {\n  return del(ID)\n}\n", "import { TDShapeType, TDToolType } from '~types'\nimport { ArrowTool } from './ArrowTool'\nimport { LineTool } from './LineTool'\nimport { DrawTool } from './DrawTool'\nimport { EllipseTool } from './EllipseTool'\nimport { RectangleTool } from './RectangleTool'\nimport { TriangleTool } from './TriangleTool'\nimport { SelectTool } from './SelectTool'\nimport { StickyTool } from './StickyTool'\nimport { TextTool } from './TextTool'\nimport { EraseTool } from './EraseTool'\n\nexport interface ToolsMap {\n  select: typeof SelectTool\n  erase: typeof EraseTool\n  [TDShapeType.Text]: typeof TextTool\n  [TDShapeType.Draw]: typeof DrawTool\n  [TDShapeType.Ellipse]: typeof EllipseTool\n  [TDShapeType.Rectangle]: typeof RectangleTool\n  [TDShapeType.Triangle]: typeof TriangleTool\n  [TDShapeType.Line]: typeof LineTool\n  [TDShapeType.Arrow]: typeof ArrowTool\n  [TDShapeType.Sticky]: typeof StickyTool\n}\n\nexport type ToolOfType<K extends TDToolType> = ToolsMap[K]\n\nexport type ArgsOfType<K extends TDToolType> = ConstructorParameters<ToolOfType<K>>\n\nexport const tools: { [K in TDToolType]: ToolsMap[K] } = {\n  select: SelectTool,\n  erase: EraseTool,\n  [TDShapeType.Text]: TextTool,\n  [TDShapeType.Draw]: DrawTool,\n  [TDShapeType.Ellipse]: EllipseTool,\n  [TDShapeType.Rectangle]: RectangleTool,\n  [TDShapeType.Triangle]: TriangleTool,\n  [TDShapeType.Line]: LineTool,\n  [TDShapeType.Arrow]: ArrowTool,\n  [TDShapeType.Sticky]: StickyTool,\n}\n", "import * as React from 'react'\nimport { useHotkeys } from 'react-hotkeys-hook'\nimport { AlignStyle, TDShapeType } from '~types'\nimport { useFileSystemHandlers, useTldrawApp } from '~hooks'\n\nexport function useKeyboardShortcuts(ref: React.RefObject<HTMLDivElement>) {\n  const app = useTldrawApp()\n\n  const canHandleEvent = React.useCallback(\n    (ignoreMenus = false) => {\n      const elm = ref.current\n      if (ignoreMenus && (app.isMenuOpen || app.settings.keepStyleMenuOpen)) return true\n      return elm && (document.activeElement === elm || elm.contains(document.activeElement))\n    },\n    [ref]\n  )\n\n  React.useEffect(() => {\n    if (!app) return\n\n    const handleCut = (e: ClipboardEvent) => {\n      if (!canHandleEvent(true)) return\n\n      if (app.readOnly) {\n        app.copy(undefined, e)\n        return\n      }\n\n      app.cut(undefined, e)\n    }\n\n    const handleCopy = (e: ClipboardEvent) => {\n      if (!canHandleEvent(true)) return\n\n      app.copy(undefined, e)\n    }\n\n    const handlePaste = (e: ClipboardEvent) => {\n      if (!canHandleEvent(true)) return\n      if (app.readOnly) return\n\n      app.paste(undefined, e)\n    }\n\n    document.addEventListener('cut', handleCut)\n    document.addEventListener('copy', handleCopy)\n    document.addEventListener('paste', handlePaste)\n    return () => {\n      document.removeEventListener('cut', handleCut)\n      document.removeEventListener('copy', handleCopy)\n      document.removeEventListener('paste', handlePaste)\n    }\n  }, [app])\n\n  /* ---------------------- Tools --------------------- */\n\n  useHotkeys(\n    'v,1',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool('select')\n    },\n    [app, ref.current]\n  )\n\n  useHotkeys(\n    'd,p,2',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Draw)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'e,3',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool('erase')\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'r,4',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Rectangle)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'o,5',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Ellipse)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'g,6',\n    () => {\n      if (!canHandleEvent()) return\n      app.selectTool(TDShapeType.Triangle)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'l,7',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Line)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'a,8',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Arrow)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    't,9',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Text)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    's,0',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectTool(TDShapeType.Sticky)\n    },\n    undefined,\n    [app]\n  )\n\n  /* ---------------------- Misc ---------------------- */\n\n  // Dark Mode\n\n  useHotkeys(\n    'ctrl+shift+d,\u2318+shift+d',\n    (e) => {\n      if (!canHandleEvent(true)) return\n      app.toggleDarkMode()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  // Focus Mode\n\n  useHotkeys(\n    'ctrl+.,\u2318+.',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.toggleFocusMode()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+shift+g,\u2318+shift+g',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.toggleGrid()\n    },\n    undefined,\n    [app]\n  )\n\n  // File System\n\n  const { onNewProject, onOpenProject, onSaveProject, onSaveProjectAs, onOpenMedia } =\n    useFileSystemHandlers()\n\n  useHotkeys(\n    'ctrl+n,\u2318+n',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      onNewProject(e)\n    },\n    undefined,\n    [app]\n  )\n  useHotkeys(\n    'ctrl+s,\u2318+s',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      onSaveProject(e)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+shift+s,\u2318+shift+s',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      onSaveProjectAs(e)\n    },\n    undefined,\n    [app]\n  )\n  useHotkeys(\n    'ctrl+o,\u2318+o',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      onOpenProject(e)\n    },\n    undefined,\n    [app]\n  )\n  useHotkeys(\n    'ctrl+u,\u2318+u',\n    (e) => {\n      if (!canHandleEvent()) return\n      onOpenMedia(e)\n    },\n    undefined,\n    [app]\n  )\n\n  // Undo Redo\n\n  useHotkeys(\n    '\u2318+z,ctrl+z',\n    (e) => {\n      e.preventDefault();\n      if (!canHandleEvent(true)) return\n\n      if (app.session) {\n        app.cancelSession()\n      } else {\n        app.undo()\n      }\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+shift+z,\u2318+shift+z',\n    () => {\n      if (!canHandleEvent(true)) return\n\n      if (app.session) {\n        app.cancelSession()\n      } else {\n        app.redo()\n      }\n    },\n    undefined,\n    [app]\n  )\n\n  // Undo Redo\n\n  useHotkeys(\n    '\u2318+u,ctrl+u',\n    () => {\n      if (!canHandleEvent()) return\n      app.undoSelect()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+shift-u,\u2318+shift+u',\n    () => {\n      if (!canHandleEvent()) return\n      app.redoSelect()\n    },\n    undefined,\n    [app]\n  )\n\n  /* -------------------- Commands -------------------- */\n\n  // Camera\n\n  useHotkeys(\n    'ctrl+=,\u2318+=,ctrl+num_subtract,\u2318+num_subtract',\n    (e) => {\n      if (!canHandleEvent(true)) return\n      app.zoomIn()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+-,\u2318+-,ctrl+num_add,\u2318+num_add',\n    (e) => {\n      if (!canHandleEvent(true)) return\n\n      app.zoomOut()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+0,ctrl+numpad_0,\u2318+numpad_0',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.resetZoom()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+1',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.zoomToFit()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+2',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.zoomToSelection()\n    },\n    undefined,\n    [app]\n  )\n\n  // Duplicate\n\n  useHotkeys(\n    'ctrl+d,\u2318+d',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      app.duplicate()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  // Flip\n\n  useHotkeys(\n    'shift+h',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.flipHorizontal()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+v',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.flipVertical()\n    },\n    undefined,\n    [app]\n  )\n\n  // Cancel\n\n  useHotkeys(\n    'escape',\n    () => {\n      if (!canHandleEvent(true)) return\n\n      app.cancel()\n    },\n    undefined,\n    [app]\n  )\n\n  // Delete\n\n  useHotkeys(\n    'backspace,del',\n    () => {\n      if (!canHandleEvent()) return\n      app.delete()\n    },\n    undefined,\n    [app]\n  )\n\n  // Select All\n\n  useHotkeys(\n    '\u2318+a,ctrl+a',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.selectAll()\n    },\n    undefined,\n    [app]\n  )\n\n  // Nudge\n\n  useHotkeys(\n    'up',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([0, -1], false)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'right',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([1, 0], false)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'down',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([0, 1], false)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'left',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([-1, 0], false)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+up',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([0, -1], true)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+right',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([1, 0], true)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+down',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([0, 1], true)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+left',\n    () => {\n      if (!canHandleEvent()) return\n      app.nudge([-1, 0], true)\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    '\u2318+shift+l,ctrl+shift+l',\n    () => {\n      if (!canHandleEvent()) return\n      app.toggleLocked()\n    },\n    undefined,\n    [app]\n  )\n\n  // Copy, Cut & Paste\n\n  // useHotkeys(\n  //   '\u2318+c,ctrl+c',\n  //   () => {\n  //     if (!canHandleEvent()) return\n  //     app.copy()\n  //   },\n  //   undefined,\n  //   [app]\n  // )\n\n  useHotkeys(\n    '\u2318+shift+c,ctrl+shift+c',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      app.copySvg()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  // useHotkeys(\n  //   '\u2318+x,ctrl+x',\n  //   () => {\n  //     if (!canHandleEvent()) return\n  //     app.cut()\n  //   },\n  //   undefined,\n  //   [app]\n  // )\n\n  // useHotkeys(\n  //   '\u2318+v,ctrl+v',\n  //   () => {\n  //     if (!canHandleEvent()) return\n\n  //     app.paste()\n  //   },\n  //   undefined,\n  //   [app]\n  // )\n\n  // Group & Ungroup\n\n  useHotkeys(\n    '\u2318+g,ctrl+g',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      app.group()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    '\u2318+shift+g,ctrl+shift+g',\n    (e) => {\n      if (!canHandleEvent()) return\n\n      app.ungroup()\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  // Move\n\n  useHotkeys(\n    '[',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.moveBackward()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    ']',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.moveForward()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+[',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.moveToBack()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'shift+]',\n    () => {\n      if (!canHandleEvent(true)) return\n      app.moveToFront()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'ctrl+shift+backspace,\u2318+shift+backspace',\n    (e) => {\n      if (!canHandleEvent()) return\n      if (app.settings.isDebugMode) {\n        app.resetDocument()\n      }\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  // Text Align\n\n  useHotkeys(\n    'alt+command+l,alt+ctrl+l',\n    (e) => {\n      if (!canHandleEvent(true)) return\n      app.style({ textAlign: AlignStyle.Start })\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'alt+command+t,alt+ctrl+t',\n    (e) => {\n      if (!canHandleEvent(true)) return\n      app.style({ textAlign: AlignStyle.Middle })\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n\n  useHotkeys(\n    'alt+command+r,alt+ctrl+r',\n    (e) => {\n      if (!canHandleEvent(true)) return\n      app.style({ textAlign: AlignStyle.End })\n      e.preventDefault()\n    },\n    undefined,\n    [app]\n  )\n}\n", "import * as React from 'react'\nimport type { TldrawApp } from '~state'\n\nexport const TldrawContext = React.createContext<TldrawApp>({} as TldrawApp)\n\nexport function useTldrawApp() {\n  const context = React.useContext(TldrawContext)\n  return context\n}\n", "import * as React from 'react'\n\nconst styles = new Map<string, HTMLStyleElement>()\n\nconst UID = `tldraw-fonts`\n\nconst CSS = `\n@import url('https://fonts.googleapis.com/css2?family=Caveat+Brush&family=Source+Code+Pro&family=Source+Sans+Pro&family=Crimson+Pro&display=block');\n\n@font-face {\n  font-family: 'Recursive';\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(https://fonts.gstatic.com/s/recursive/v23/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlTGZnI14ZeY.woff2)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,\n    U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n@font-face {\n  font-family: 'Recursive';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(https://fonts.gstatic.com/s/recursive/v23/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlTGZnI14ZeY.woff2)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,\n    U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n@font-face {\n  font-family: 'Recursive Mono';\n  font-style: normal;\n  font-weight: 420;\n  font-display: swap;\n  src: url(https://fonts.gstatic.com/s/recursive/v23/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImqvTxvU-MXGX2fSqasNfUlTGZnI14ZeY.woff2)\n    format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,\n    U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n`\n\nexport function useStylesheet() {\n  React.useLayoutEffect(() => {\n    if (styles.get(UID)) return\n    const style = document.createElement('style')\n    style.innerHTML = CSS\n    style.setAttribute('id', UID)\n    document.head.appendChild(style)\n    styles.set(UID, style)\n\n    return () => {\n      if (style && document.head.contains(style)) {\n        document.head.removeChild(style)\n        styles.delete(UID)\n      }\n    }\n  }, [])\n}\n", "import * as React from 'react'\nimport { useTldrawApp } from '~hooks'\n\nexport function useFileSystemHandlers() {\n  const app = useTldrawApp()\n\n  const onNewProject = React.useCallback(\n    async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n      if (e && app.callbacks.onOpenProject) e.preventDefault()\n      app.callbacks.onNewProject?.(app)\n    },\n    [app]\n  )\n\n  const onSaveProject = React.useCallback(\n    (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n      if (e && app.callbacks.onOpenProject) e.preventDefault()\n      app.callbacks.onSaveProject?.(app)\n    },\n    [app]\n  )\n\n  const onSaveProjectAs = React.useCallback(\n    (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n      if (e && app.callbacks.onOpenProject) e.preventDefault()\n      app.callbacks.onSaveProjectAs?.(app)\n    },\n    [app]\n  )\n\n  const onOpenProject = React.useCallback(\n    async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n      if (e && app.callbacks.onOpenProject) e.preventDefault()\n      app.callbacks.onOpenProject?.(app)\n    },\n    [app]\n  )\n\n  const onOpenMedia = React.useCallback(\n    async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n      if (e && app.callbacks.onOpenMedia) e.preventDefault()\n      app.callbacks.onOpenMedia?.(app)\n    },\n    [app]\n  )\n\n  return {\n    onNewProject,\n    onSaveProject,\n    onSaveProjectAs,\n    onOpenProject,\n    onOpenMedia,\n  }\n}\n", "import * as React from 'react'\nimport type { TldrawApp } from '~state'\n\nexport function useFileSystem() {\n  const promptSaveBeforeChange = React.useCallback(async (app: TldrawApp) => {\n    if (app.isDirty) {\n      if (app.fileSystemHandle) {\n        if (window.confirm('Do you want to save changes to your current project?')) {\n          await app.saveProject()\n        }\n      } else {\n        if (window.confirm('Do you want to save your current project?')) {\n          await app.saveProject()\n        }\n      }\n    }\n  }, [])\n\n  const onNewProject = React.useCallback(\n    async (app: TldrawApp) => {\n      if (window.confirm('Do you want to create a new project?')) {\n        await promptSaveBeforeChange(app)\n        app.newProject()\n      }\n    },\n    [promptSaveBeforeChange]\n  )\n\n  const onSaveProject = React.useCallback((app: TldrawApp) => {\n    app.saveProject()\n  }, [])\n\n  const onSaveProjectAs = React.useCallback((app: TldrawApp) => {\n    app.saveProjectAs()\n  }, [])\n\n  const onOpenProject = React.useCallback(\n    async (app: TldrawApp) => {\n      await promptSaveBeforeChange(app)\n      app.openProject()\n    },\n    [promptSaveBeforeChange]\n  )\n\n  const onOpenMedia = React.useCallback(async (app: TldrawApp) => {\n    app.openAsset?.()\n  }, [])\n\n  return {\n    onNewProject,\n    onSaveProject,\n    onSaveProjectAs,\n    onOpenProject,\n    onOpenMedia,\n  }\n}\n", "import * as React from 'react'\nimport { getTranslation, TDLanguage } from '../translations/translations'\n\nexport function useTranslation(locale?: TDLanguage) {\n  return React.useMemo(() => {\n    return getTranslation(locale ?? navigator.language.split(/[-_]/)[0])\n  }, [locale])\n}\n", "import ar from './ar.json'\nimport da from './da.json'\nimport de from './de.json'\nimport en from './en.json'\nimport es from './es.json'\nimport fa from './fa.json'\nimport fr from './fr.json'\nimport he from './he.json'\nimport it from './it.json'\nimport ja from './ja.json'\nimport ko_kr from './ko-kr.json'\nimport main from './main.json'\nimport ne from './ne.json'\nimport no from './no.json'\nimport pl from './pl.json'\nimport pt_br from './pt-br.json'\nimport ru from './ru.json'\nimport tr from './tr.json'\nimport uk from './uk.json'\nimport zh_cn from './zh-cn.json'\nimport zh_tw from './zh-tw.json'\n\n// The default language (english) must have a value for every message.\n// Other languages may have missing messages. If the application finds\n// a missing message for the current language, it will use the english\n// translation instead.\n\nexport const TRANSLATIONS: TDTranslations = [\n  { locale: 'ar', label: '\u0639\u0631\u0628\u064A', messages: ar },\n  { locale: 'da', label: 'Danish', messages: da },\n  { locale: 'de', label: 'Deutsch', messages: de },\n  { locale: 'en', label: 'English', messages: en },\n  { locale: 'es', label: 'Espa\u00F1ol', messages: es },\n  { locale: 'fa', label: '\u0641\u0627\u0631\u0633\u06CC', messages: fa },\n  { locale: 'fr', label: 'Fran\u00E7ais', messages: fr },\n  { locale: 'he', label: '\u05E2\u05D1\u05E8\u05D9\u05EA', messages: he },\n  { locale: 'it', label: 'Italiano', messages: it },\n  { locale: 'ja', label: '\u65E5\u672C\u8A9E', messages: ja },\n  { locale: 'ko-kr', label: '\uD55C\uAD6D\uC5B4', messages: ko_kr },\n  { locale: 'ne', label: '\u0928\u0947\u092A\u093E\u0932\u0940', messages: ne },\n  { locale: 'no', label: 'Norwegian', messages: no },\n  { locale: 'pl', label: 'Polski', messages: pl },\n  { locale: 'pt-br', label: 'Portugu\u00EAs - Brasil', messages: pt_br },\n  { locale: 'ru', label: 'Russian', messages: ru },\n  { locale: 'tr', label: 'T\u00FCrk\u00E7e', messages: tr },\n  { locale: 'uk', label: 'Ukrainian', messages: uk },\n  { locale: 'zh-ch', label: 'Chinese - Simplified', messages: zh_cn },\n  { locale: 'zh-tw', label: '\u7E41\u9AD4\u4E2D\u6587 (\u53F0\u7063)', messages: zh_tw },\n]\n\n/* ----------------- (do not change) ---------------- */\n\nTRANSLATIONS.sort((a, b) => (a.locale < b.locale ? -1 : 1))\n\nexport type TDTranslation = {\n  readonly locale: string\n  readonly label: string\n  readonly messages: Partial<typeof main>\n}\n\nexport type TDTranslations = TDTranslation[]\n\nexport type TDLanguage = TDTranslations[number]['locale']\n\nexport function getTranslation(locale: TDLanguage): TDTranslation {\n  const translation = TRANSLATIONS.find((t) => t.locale === locale)\n\n  return {\n    locale,\n    label: translation?.label ?? locale,\n    messages: {\n      ...main,\n      ...translation?.messages,\n    },\n  }\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport type { TDSnapshot } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { StatusBar } from './StatusBar'\nimport { BackToContent } from './BackToContent'\nimport { PrimaryTools } from './PrimaryTools'\nimport { ActionButton } from './ActionButton'\nimport { DeleteButton } from './DeleteButton'\nimport { breakpoints } from '~components/breakpoints'\nimport { HelpPanel } from './HelpPanel'\n\nconst isDebugModeSelector = (s: TDSnapshot) => s.settings.isDebugMode\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\ninterface ToolsPanelProps {\n  onBlur?: React.FocusEventHandler\n}\n\nexport const ToolsPanel = React.memo(function ToolsPanel({ onBlur }: ToolsPanelProps) {\n  const app = useTldrawApp()\n  const side = app.useStore(dockPositionState)\n  const isDebugMode = app.useStore(isDebugModeSelector)\n\n  return (\n    <>\n      <StyledToolsPanelContainer side={side} onBlur={onBlur} bp={breakpoints} debug={isDebugMode}>\n        <StyledCenterWrap id=\"TD-Tools\">\n          <BackToContent />\n          <StyledPrimaryTools\n            orientation={side === 'bottom' || side === 'top' ? 'horizontal' : 'vertical'}\n          >\n            <ActionButton />\n            <PrimaryTools />\n            <DeleteButton />\n          </StyledPrimaryTools>\n        </StyledCenterWrap>\n      </StyledToolsPanelContainer>\n      <HelpPanel />\n      {isDebugMode && (\n        <StyledStatusWrap>\n          <StatusBar />\n        </StyledStatusWrap>\n      )}\n    </>\n  )\n})\n\nconst StyledToolsPanelContainer = styled('div', {\n  position: 'absolute',\n  width: '100%',\n  minWidth: 0,\n  maxWidth: '100%',\n  height: 64,\n  gap: '$4',\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  zIndex: 200,\n  overflow: 'hidden',\n  pointerEvents: 'none',\n  '& > div > *': {\n    pointerEvents: 'all',\n  },\n  variants: {\n    debug: {\n      true: {},\n      false: {},\n    },\n    bp: {\n      mobile: {},\n      small: {},\n      medium: {},\n      large: {},\n    },\n    side: {\n      top: {\n        width: '100%',\n        height: 64,\n        left: 0,\n        right: 0,\n        top: 45,\n      },\n      right: { width: 64, height: '100%', top: 0, right: 0 },\n      bottom: {\n        width: '100%',\n        left: 0,\n        right: 0,\n        bottom: 4,\n      },\n      left: { width: 64, height: '100%', left: 0 },\n    },\n  },\n  compoundVariants: [\n    {\n      side: 'top',\n      bp: 'large',\n      css: {\n        top: 10,\n      },\n    },\n    {\n      side: 'bottom',\n      debug: true,\n      css: {\n        bottom: 44,\n      },\n    },\n  ],\n})\n\nconst StyledCenterWrap = styled('div', {\n  display: 'flex',\n  width: 'fit-content',\n  height: 'fit-content',\n  alignItems: 'center',\n  justifyContent: 'center',\n  flexDirection: 'column',\n  gap: '$4',\n})\n\nconst StyledStatusWrap = styled('div', {\n  position: 'absolute',\n  bottom: '0px',\n  left: '0px',\n  right: '0px',\n  height: '40px',\n  width: '100%',\n  maxWidth: '100%',\n})\n\nconst StyledPrimaryTools = styled('div', {\n  position: 'relative',\n  display: 'flex',\n  alignItems: 'center',\n  height: 'fit-content',\n  gap: '$3',\n  variants: {\n    orientation: {\n      horizontal: {\n        flexDirection: 'row',\n      },\n      vertical: {\n        flexDirection: 'column',\n      },\n    },\n  },\n})\n", "/* -------------------------------------------------- */\n/*                     Breakpoints                    */\n/* -------------------------------------------------- */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const breakpoints: any = {\n  '@initial': 'mobile',\n  '@micro': 'micro',\n  '@sm': 'small',\n  '@md': 'medium',\n  '@lg': 'large',\n}\n", "import * as React from 'react'\nimport { useTldrawApp } from '~hooks'\nimport type { TDSnapshot } from '~types'\nimport { styled } from '~styles'\nimport { breakpoints } from '~components/breakpoints'\n\nconst statusSelector = (s: TDSnapshot) => s.appState.status\nconst activeToolSelector = (s: TDSnapshot) => s.appState.activeTool\n\nexport function StatusBar() {\n  const app = useTldrawApp()\n  const status = app.useStore(statusSelector)\n  const activeTool = app.useStore(activeToolSelector)\n\n  return (\n    <StyledStatusBar bp={breakpoints} id=\"TD-StatusBar\">\n      <StyledSection>\n        {activeTool} | {status}\n      </StyledSection>\n    </StyledStatusBar>\n  )\n}\n\nconst StyledStatusBar = styled('div', {\n  height: 40,\n  userSelect: 'none',\n  borderTop: '1px solid $panelContrast',\n  gridArea: 'status',\n  display: 'flex',\n  color: '$text',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n  backgroundColor: '$panel',\n  gap: 8,\n  fontFamily: '$ui',\n  fontSize: '$0',\n  padding: '0 16px',\n\n  variants: {\n    bp: {\n      small: {\n        fontSize: '$1',\n      },\n    },\n  },\n})\n\nconst StyledSection = styled('div', {\n  whiteSpace: 'nowrap',\n  overflow: 'hidden',\n})\n", "import * as React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { styled } from '~styles'\nimport type { TDSnapshot } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { MenuContent } from '~components/Primitives/MenuContent'\n\nconst isEmptyCanvasSelector = (s: TDSnapshot) => {\n  return (\n    s.appState.isEmptyCanvas &&\n    Object.keys(s.document.pages[s.appState.currentPageId].shapes).length > 0\n  )\n}\n\nconst isDebugModeSelector = (s: TDSnapshot) => s.settings.isDebugMode\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\nexport const BackToContent = React.memo(function BackToContent() {\n  const app = useTldrawApp()\n\n  const isEmptyCanvas = app.useStore(isEmptyCanvasSelector)\n  const dockPosition = app.useStore(dockPositionState)\n  const isDebugMode = app.useStore(isDebugModeSelector)\n\n  const style = {\n    bottom:\n      dockPosition === 'bottom' && isDebugMode\n        ? 120\n        : dockPosition === 'bottom'\n        ? 80\n        : isDebugMode\n        ? 60\n        : 20,\n    left: '50%',\n    transform: 'translate(-50%,0)',\n  }\n\n  if (!isEmptyCanvas) return null\n\n  return (\n    <BackToContentContainer id=\"TD-Tools-Back_to_content\" style={{ ...style }}>\n      <RowButton onClick={app.zoomToContent}>\n        <FormattedMessage id=\"zoom.to.content\" />\n      </RowButton>\n    </BackToContentContainer>\n  )\n})\n\nconst BackToContentContainer = styled(MenuContent, {\n  pointerEvents: 'all',\n  width: 'fit-content',\n  minWidth: 0,\n  position: 'fixed',\n  bottom: 0,\n})\n", "import { ItemIndicator } from '@radix-ui/react-dropdown-menu'\nimport { ChevronRightIcon, CheckIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { breakpoints } from '~components/breakpoints'\nimport { Kbd } from '~components/Primitives/Kbd'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { styled } from '~styles'\n\nexport interface RowButtonProps {\n  onClick?: React.MouseEventHandler<HTMLButtonElement>\n  children: React.ReactNode\n  disabled?: boolean\n  kbd?: string\n  variant?: 'wide' | 'styleMenu'\n  isActive?: boolean\n  isWarning?: boolean\n  hasIndicator?: boolean\n  hasArrow?: boolean\n  id?: string\n}\n\nexport const RowButton = React.forwardRef<HTMLButtonElement, RowButtonProps>(\n  (\n    {\n      onClick,\n      isActive = false,\n      isWarning = false,\n      hasIndicator = false,\n      hasArrow = false,\n      disabled = false,\n      variant,\n      kbd,\n      children,\n      ...rest\n    },\n    ref\n  ) => {\n    return (\n      <StyledRowButton\n        ref={ref}\n        bp={breakpoints}\n        isWarning={isWarning}\n        isActive={isActive}\n        disabled={disabled}\n        onClick={onClick}\n        variant={variant}\n        {...rest}\n      >\n        <StyledRowButtonInner>\n          {children}\n          {kbd ? <Kbd variant=\"menu\">{kbd}</Kbd> : undefined}\n          {hasIndicator && (\n            <ItemIndicator dir=\"ltr\">\n              <SmallIcon>\n                <CheckIcon />\n              </SmallIcon>\n            </ItemIndicator>\n          )}\n          {hasArrow && (\n            <SmallIcon>\n              <ChevronRightIcon />\n            </SmallIcon>\n          )}\n        </StyledRowButtonInner>\n      </StyledRowButton>\n    )\n  }\n)\n\nconst StyledRowButtonInner = styled('div', {\n  height: '100%',\n  width: '100%',\n  backgroundColor: '$panel',\n  borderRadius: '$2',\n  display: 'flex',\n  gap: '$1',\n  flexDirection: 'row',\n  alignItems: 'center',\n  padding: '0 $3',\n  justifyContent: 'space-between',\n  border: '1px solid transparent',\n\n  '& svg': {\n    position: 'relative',\n    stroke: '$overlay',\n    strokeWidth: 1,\n    zIndex: 1,\n  },\n\n  [`& > ${SmallIcon}`]: {\n    paddingLeft: '$3',\n  },\n})\n\nexport const StyledRowButton = styled('button', {\n  position: 'relative',\n  width: '100%',\n  background: 'none',\n  border: 'none',\n  cursor: 'pointer',\n  height: 32,\n  minHeight: 32,\n  outline: 'none',\n  color: '$text',\n  fontFamily: '$ui',\n  fontWeight: 400,\n  fontSize: '$1',\n  borderRadius: 4,\n  userSelect: 'none',\n  margin: 0,\n  padding: '0 0',\n\n  '&[data-disabled]': {\n    opacity: 0.3,\n  },\n\n  '&:disabled': {\n    opacity: 0.3,\n  },\n\n  [`&:focus:not(:disabled) ${StyledRowButtonInner}`]: {\n    backgroundColor: '$hover',\n  },\n\n  '& a': {\n    textDecoration: 'none',\n    color: '$text',\n  },\n\n  variants: {\n    bp: {\n      mobile: {},\n      small: {},\n    },\n    variant: {\n      styleMenu: {\n        margin: '$1 0 $1 0',\n      },\n      wide: {\n        gridColumn: '1 / span 4',\n      },\n    },\n    size: {\n      icon: {\n        padding: '4px ',\n        width: 'auto',\n      },\n    },\n    isWarning: {\n      true: {\n        color: '$warn',\n      },\n    },\n    isActive: {\n      true: {\n        backgroundColor: '$hover',\n      },\n      false: {},\n    },\n  },\n})\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { Utils } from '@tldraw/core'\n\n/* -------------------------------------------------- */\n/*                  Keyboard Shortcut                 */\n/* -------------------------------------------------- */\n\nconst commandKey = () => (Utils.isDarwin() ? '\u2318' : 'Ctrl')\n\nexport function Kbd({ variant, children }: { variant: 'tooltip' | 'menu'; children: string }) {\n  return (\n    <StyledKbd variant={variant}>\n      {children.split('').map((k, i) => {\n        return <span key={i}>{k.replace('#', commandKey())}</span>\n      })}\n    </StyledKbd>\n  )\n}\n\nexport const StyledKbd = styled('kbd', {\n  marginLeft: '$3',\n  textShadow: '$2',\n  textAlign: 'center',\n  fontSize: '$0',\n  fontFamily: '$ui',\n  color: '$text',\n  background: 'none',\n  fontWeight: 400,\n  gap: '$1',\n  display: 'flex',\n  alignItems: 'center',\n\n  '& > span': {\n    padding: '$0',\n    borderRadius: '$0',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n\n  variants: {\n    variant: {\n      tooltip: {\n        '& > span': {\n          color: '$tooltipContrast',\n          background: '$overlayContrast',\n          boxShadow: '$key',\n          width: '20px',\n          height: '20px',\n        },\n      },\n      menu: {},\n    },\n  },\n})\n", "import { styled } from '~styles'\n\nexport const SmallIcon = styled('div', {\n  height: '100%',\n  borderRadius: '4px',\n  marginRight: '1px',\n  width: 'fit-content',\n  display: 'grid',\n  alignItems: 'center',\n  justifyContent: 'center',\n  outline: 'none',\n  border: 'none',\n  pointerEvents: 'all',\n  cursor: 'pointer',\n  color: 'currentColor',\n\n  '& svg': {\n    height: 16,\n    width: 16,\n    strokeWidth: 1,\n  },\n\n  '& > *': {\n    gridRow: 1,\n    gridColumn: 1,\n  },\n})\n", "import { styled } from '~styles'\n\nexport const MenuContent = styled('div', {\n  position: 'relative',\n  overflow: 'hidden',\n  userSelect: 'none',\n  display: 'flex',\n  flexDirection: 'column',\n  zIndex: 180,\n  minWidth: 180,\n  pointerEvents: 'all',\n  backgroundColor: '$panel',\n  border: '1px solid $panelContrast',\n  boxShadow: '$panel',\n  padding: '$2 $2',\n  borderRadius: '$3',\n  font: '$ui',\n  maxHeight: '100vh',\n  overflowY: 'auto',\n  overflowX: 'hidden',\n  '&::webkit-scrollbar': {\n    display: 'none',\n  },\n  '-ms-overflow-style': 'none' /* for Internet Explorer, Edge */,\n  scrollbarWidth: 'none',\n  variants: {\n    size: {\n      small: {\n        minWidth: 72,\n      },\n    },\n    overflow: {\n      true: {\n        maxHeight: '60vh',\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { useIntl } from 'react-intl'\nimport {\n  ArrowTopRightIcon,\n  CursorArrowIcon,\n  ImageIcon,\n  Pencil1Icon,\n  Pencil2Icon,\n  TextIcon,\n} from '@radix-ui/react-icons'\nimport { TDSnapshot, TDShapeType } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { ToolButtonWithTooltip } from '~components/Primitives/ToolButton'\nimport { Panel } from '~components/Primitives/Panel'\nimport { ShapesMenu } from './ShapesMenu'\nimport { EraserIcon } from '~components/Primitives/icons'\nimport { styled } from '~styles/stitches.config'\nimport { breakpoints } from '~components/breakpoints'\n\nconst activeToolSelector = (s: TDSnapshot) => s.appState.activeTool\nconst toolLockedSelector = (s: TDSnapshot) => s.appState.isToolLocked\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\nexport const PrimaryTools = React.memo(function PrimaryTools() {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const activeTool = app.useStore(activeToolSelector)\n\n  const isToolLocked = app.useStore(toolLockedSelector)\n  const dockPosition = app.useStore(dockPositionState)\n\n  const selectSelectTool = React.useCallback(() => {\n    app.selectTool('select')\n  }, [app])\n\n  const selectEraseTool = React.useCallback(() => {\n    app.selectTool('erase')\n  }, [app])\n\n  const selectDrawTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Draw)\n  }, [app])\n\n  const selectArrowTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Arrow)\n  }, [app])\n\n  const selectTextTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Text)\n  }, [app])\n\n  const selectStickyTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Sticky)\n  }, [app])\n\n  const uploadMedias = React.useCallback(async () => {\n    app.openAsset()\n  }, [app])\n\n  const panelStyle = dockPosition === 'bottom' || dockPosition === 'top' ? 'row' : 'column'\n\n  return (\n    <StyledPanel\n      side=\"center\"\n      id=\"TD-PrimaryTools\"\n      style={{ flexDirection: panelStyle }}\n      bp={breakpoints}\n    >\n      <ToolButtonWithTooltip\n        kbd={'1'}\n        label={intl.formatMessage({ id: 'select' })}\n        onClick={selectSelectTool}\n        isActive={activeTool === 'select'}\n        id=\"TD-PrimaryTools-CursorArrow\"\n      >\n        <CursorArrowIcon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'2'}\n        label={intl.formatMessage({ id: 'draw' })}\n        onClick={selectDrawTool}\n        isActive={activeTool === TDShapeType.Draw}\n        id=\"TD-PrimaryTools-Pencil\"\n      >\n        <Pencil1Icon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'3'}\n        label={intl.formatMessage({ id: 'eraser' })}\n        onClick={selectEraseTool}\n        isActive={activeTool === 'erase'}\n        id=\"TD-PrimaryTools-Eraser\"\n      >\n        <EraserIcon />\n      </ToolButtonWithTooltip>\n      <ShapesMenu activeTool={activeTool} isToolLocked={isToolLocked} />\n      <ToolButtonWithTooltip\n        kbd={'8'}\n        label={intl.formatMessage({ id: 'arrow' })}\n        onClick={selectArrowTool}\n        isLocked={isToolLocked}\n        isActive={activeTool === TDShapeType.Arrow}\n        id=\"TD-PrimaryTools-ArrowTopRight\"\n      >\n        <ArrowTopRightIcon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'9'}\n        label={intl.formatMessage({ id: 'text' })}\n        onClick={selectTextTool}\n        isLocked={isToolLocked}\n        isActive={activeTool === TDShapeType.Text}\n        id=\"TD-PrimaryTools-Text\"\n      >\n        <TextIcon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={intl.formatMessage({ id: 'sticky' })}\n        onClick={selectStickyTool}\n        isActive={activeTool === TDShapeType.Sticky}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        <Pencil2Icon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip label=\"Image\" onClick={uploadMedias} id=\"TD-PrimaryTools-Image\">\n        <ImageIcon />\n      </ToolButtonWithTooltip>\n    </StyledPanel>\n  )\n})\n\nconst StyledPanel = styled(Panel, {\n  variants: {\n    bp: {\n      mobile: {\n        padding: '$0',\n        borderRadius: '10px',\n      },\n      small: {\n        padding: '$2',\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { breakpoints } from '~components/breakpoints'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\n\nexport interface ToolButtonProps {\n  onClick?: () => void\n  onSelect?: () => void\n  onDoubleClick?: () => void\n  disabled?: boolean\n  isActive?: boolean\n  isToolLocked?: boolean\n  variant?: 'icon' | 'text' | 'circle' | 'primary'\n  children: React.ReactNode\n  id?: string\n  onKeyDown?: React.KeyboardEventHandler<HTMLButtonElement>\n}\n\nexport const ToolButton = React.forwardRef<HTMLButtonElement, ToolButtonProps>(\n  (\n    {\n      onSelect,\n      onClick,\n      onDoubleClick,\n      variant,\n      children,\n      isToolLocked = false,\n      disabled = false,\n      isActive = false,\n      onKeyDown,\n      id,\n      ...rest\n    },\n    ref\n  ) => {\n    return (\n      <StyledToolButton\n        ref={ref}\n        isActive={isActive}\n        variant={variant}\n        onClick={onClick}\n        disabled={disabled}\n        onPointerDown={onSelect}\n        onDoubleClick={onDoubleClick}\n        onKeyDown={onKeyDown}\n        bp={breakpoints}\n        id={id}\n        {...rest}\n      >\n        <StyledToolButtonInner>{children}</StyledToolButtonInner>\n        {isToolLocked && <ToolLockIndicator />}\n      </StyledToolButton>\n    )\n  }\n)\n\n/* ------------------ With Tooltip ------------------ */\n\ninterface ToolButtonWithTooltipProps extends ToolButtonProps {\n  label: string\n  isLocked?: boolean\n  kbd?: string\n}\n\nexport function ToolButtonWithTooltip({\n  label,\n  kbd,\n  isLocked,\n  ...rest\n}: ToolButtonWithTooltipProps) {\n  const app = useTldrawApp()\n\n  const handleDoubleClick = React.useCallback(() => {\n    app.toggleToolLock()\n  }, [])\n\n  const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLButtonElement>) => {\n    if (e.key === ' ' && app.isForcePanning) {\n      e.preventDefault()\n    }\n  }, [])\n\n  return (\n    <Tooltip label={label[0].toUpperCase() + label.slice(1)} kbd={kbd}>\n      <ToolButton\n        {...rest}\n        variant=\"primary\"\n        isToolLocked={isLocked && rest.isActive}\n        onDoubleClick={handleDoubleClick}\n        onKeyDown={handleKeyDown}\n      />\n    </Tooltip>\n  )\n}\n\nexport const StyledToolButtonInner = styled('div', {\n  position: 'relative',\n  height: '100%',\n  width: '100%',\n  backgroundColor: '$panel',\n  borderRadius: '$2',\n  margin: '0',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  fontFamily: '$ui',\n  color: 'inherit',\n  userSelect: 'none',\n  boxSizing: 'border-box',\n  border: '1px solid transparent',\n  '-webkit-tap-highlight-color': 'transparent',\n  'tap-highlight-color': 'transparent',\n})\n\nexport const StyledToolButton = styled('button', {\n  position: 'relative',\n  color: '$text',\n  fontSize: '$0',\n  background: 'none',\n  margin: '0',\n  padding: '$2',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  outline: 'none',\n  cursor: 'pointer',\n  pointerEvents: 'all',\n  height: '40px',\n  width: '40px',\n  border: '1px solid $panel',\n  '-webkit-tap-highlight-color': 'transparent',\n  'tap-highlight-color': 'transparent',\n\n  [`&:disabled ${StyledToolButtonInner}`]: {\n    opacity: 0.618,\n  },\n\n  variants: {\n    variant: {\n      primary: {\n        marginTop: '0',\n      },\n      icon: {\n        [`& ${StyledToolButtonInner}`]: {\n          display: 'grid',\n          '& > *': {\n            gridRow: 1,\n            gridColumn: 1,\n          },\n        },\n      },\n      text: {\n        width: 'auto',\n        [`& ${StyledToolButtonInner}`]: {\n          fontSize: '$1',\n          padding: '0 $3',\n          gap: '$3',\n        },\n      },\n      circle: {\n        padding: 0,\n        height: 32,\n        width: 32,\n        border: 'none',\n        [`& ${StyledToolButtonInner}`]: {\n          border: '1px solid $panelContrast',\n          borderRadius: '100%',\n          boxShadow: '$panel',\n        },\n        [`& ${StyledToolButtonInner} > svg`]: {\n          width: 14,\n          height: 14,\n        },\n      },\n    },\n    isActive: {\n      true: {},\n      false: {},\n    },\n    bp: {\n      mobile: {\n        padding: 0,\n      },\n      small: {},\n    },\n  },\n  compoundVariants: [\n    {\n      variant: 'primary',\n      bp: 'mobile',\n      css: {\n        height: 40,\n        width: 36,\n        [`& ${StyledToolButtonInner} > svg`]: {\n          width: 16,\n          height: 16,\n        },\n      },\n    },\n    {\n      variant: 'primary',\n      bp: 'small',\n      css: {\n        height: '44px',\n        width: '44px',\n        [`& ${StyledToolButtonInner} > svg`]: {\n          width: 20,\n          height: 20,\n        },\n      },\n    },\n    {\n      isActive: true,\n      css: {\n        [`${StyledToolButtonInner}`]: {\n          backgroundColor: '$selected',\n          color: '$selectedContrast',\n        },\n      },\n    },\n    {\n      isActive: false,\n      bp: 'small',\n      css: {\n        [`&:hover:not(:disabled) ${StyledToolButtonInner}`]: {\n          backgroundColor: '$hover',\n        },\n        [`&:focus:not(:disabled) ${StyledToolButtonInner}`]: {\n          backgroundColor: '$hover',\n        },\n      },\n    },\n  ],\n})\n\nconst ToolLockIndicator = styled('div', {\n  position: 'absolute',\n  width: 10,\n  height: 10,\n  backgroundColor: '$selected',\n  borderRadius: '100%',\n  bottom: -2,\n  border: '2px solid $panel',\n  zIndex: 100,\n})\n", "import * as RadixTooltip from '@radix-ui/react-tooltip'\nimport * as React from 'react'\nimport { Kbd } from '~components/Primitives/Kbd'\nimport { styled } from '~styles'\n\n/* -------------------------------------------------- */\n/*                       Tooltip                      */\n/* -------------------------------------------------- */\n\ninterface TooltipProps {\n  children: React.ReactNode\n  label: string\n  kbd?: string\n  id?: string\n  side?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nexport function Tooltip({ children, label, kbd: kbdProp, id, side = 'top' }: TooltipProps) {\n  return (\n    <span id={id}>\n      <RadixTooltip.Root>\n        <RadixTooltip.Trigger dir=\"ltr\" asChild={true}>\n          <span>{children}</span>\n        </RadixTooltip.Trigger>\n        <StyledContent dir=\"ltr\" side={side} sideOffset={8}>\n          {label}\n          {kbdProp ? <Kbd variant=\"tooltip\">{kbdProp}</Kbd> : null}\n          <StyledArrow />\n        </StyledContent>\n      </RadixTooltip.Root>\n    </span>\n  )\n}\n\nconst StyledContent = styled(RadixTooltip.Content, {\n  borderRadius: 3,\n  padding: '$3 $3 $3 $3',\n  fontSize: '$1',\n  backgroundColor: '$tooltip',\n  color: '$tooltipContrast',\n  boxShadow: '$3',\n  display: 'flex',\n  alignItems: 'center',\n  fontFamily: '$ui',\n  userSelect: 'none',\n})\n\nconst StyledArrow = styled(RadixTooltip.Arrow, {\n  fill: '$tooltip',\n  margin: '0 8px',\n})\n", "import { styled } from '~styles/stitches.config'\n\nexport const Panel = styled('div', {\n  backgroundColor: '$panel',\n  display: 'flex',\n  flexDirection: 'row',\n  boxShadow: '$panel',\n  padding: '$2',\n  border: '1px solid $panelContrast',\n  gap: 0,\n  overflow: 'hidden',\n  variants: {\n    side: {\n      center: {\n        borderRadius: 9,\n      },\n      left: {\n        padding: 0,\n        borderTop: 0,\n        borderLeft: 0,\n        borderTopRightRadius: 0,\n        borderBottomRightRadius: 9,\n        borderBottomLeftRadius: 0,\n      },\n      right: {\n        padding: 0,\n        borderTop: 0,\n        borderRight: 0,\n        borderTopLeftRadius: 0,\n        borderBottomLeftRadius: 9,\n        borderBottomRightRadius: 0,\n      },\n    },\n  },\n  '& hr': {\n    height: 10,\n    width: '100%',\n    backgroundColor: 'red',\n    border: 'none',\n  },\n})\n", "import * as React from 'react'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Panel } from '~components/Primitives/Panel'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { TDShapeType, TDSnapshot, TDToolType } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { SquareIcon, CircleIcon, VercelLogoIcon } from '@radix-ui/react-icons'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { LineIcon } from '~components/Primitives/icons'\nimport { useIntl } from 'react-intl'\n\ninterface ShapesMenuProps {\n  activeTool: TDToolType\n  isToolLocked: boolean\n}\n\ntype ShapeShape =\n  | TDShapeType.Rectangle\n  | TDShapeType.Ellipse\n  | TDShapeType.Triangle\n  | TDShapeType.Line\n\nconst shapeShapes: ShapeShape[] = [\n  TDShapeType.Rectangle,\n  TDShapeType.Ellipse,\n  TDShapeType.Triangle,\n  TDShapeType.Line,\n]\n\nconst shapeShapeIcons = {\n  [TDShapeType.Rectangle]: <SquareIcon />,\n  [TDShapeType.Ellipse]: <CircleIcon />,\n  [TDShapeType.Triangle]: <VercelLogoIcon />,\n  [TDShapeType.Line]: <LineIcon />,\n}\n\nenum Status {\n  SpacePanning = 'spacePanning',\n}\n\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\nexport const ShapesMenu = React.memo(function ShapesMenu({\n  activeTool,\n  isToolLocked,\n}: ShapesMenuProps) {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const dockPosition = app.useStore(dockPositionState)\n\n  const [lastActiveTool, setLastActiveTool] = React.useState<ShapeShape>(TDShapeType.Rectangle)\n\n  React.useEffect(() => {\n    if (shapeShapes.includes(activeTool as ShapeShape) && lastActiveTool !== activeTool) {\n      setLastActiveTool(activeTool as ShapeShape)\n    }\n  }, [activeTool])\n\n  const selectShapeTool = React.useCallback(() => {\n    app.selectTool(lastActiveTool)\n  }, [activeTool, app])\n\n  const handleDoubleClick = React.useCallback(() => {\n    app.toggleToolLock()\n  }, [app])\n\n  const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLButtonElement>) => {\n    if (e.key === ' ') {\n      if (app.shiftKey) {\n        e.preventDefault()\n      }\n    }\n  }, [])\n\n  const isActive = shapeShapes.includes(activeTool as ShapeShape)\n  const contentSide = dockPosition === 'bottom' || dockPosition === 'top' ? 'top' : dockPosition\n\n  const panelStyle = dockPosition === 'bottom' || dockPosition === 'top' ? 'row' : 'column'\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\" onOpenChange={selectShapeTool}>\n      <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-PrimaryTools-Shapes\">\n        <ToolButton\n          disabled={isActive && app.shiftKey} // otherwise this continuously opens and closes on \"SpacePanning\"\n          variant=\"primary\"\n          onDoubleClick={handleDoubleClick}\n          isToolLocked={isActive && isToolLocked}\n          isActive={isActive}\n          onKeyDown={handleKeyDown}\n        >\n          {shapeShapeIcons[lastActiveTool]}\n        </ToolButton>\n      </DropdownMenu.Trigger>\n      <DropdownMenu.Content asChild dir=\"ltr\" side={contentSide} sideOffset={12}>\n        <Panel side=\"center\" style={{ flexDirection: panelStyle }}>\n          {shapeShapes.map((shape, i) => (\n            <Tooltip\n              key={shape}\n              label={intl.formatMessage({ id: shape })}\n              kbd={(4 + i).toString()}\n              id={`TD-PrimaryTools-Shapes-${shape}`}\n            >\n              <DropdownMenu.Item asChild>\n                <ToolButton\n                  variant=\"primary\"\n                  onClick={() => {\n                    app.selectTool(shape)\n                    setLastActiveTool(shape)\n                  }}\n                >\n                  {shapeShapeIcons[shape]}\n                </ToolButton>\n              </DropdownMenu.Item>\n            </Tooltip>\n          ))}\n        </Panel>\n      </DropdownMenu.Content>\n    </DropdownMenu.Root>\n  )\n})\n", "import * as React from 'react'\n\nexport function CircleIcon(\n  props: Pick<React.SVGProps<SVGSVGElement>, 'strokeWidth' | 'stroke' | 'fill'> & {\n    size: number\n  }\n) {\n  const { size = 16, ...rest } = props\n  return (\n    <svg width={24} height={24} {...rest}>\n      <circle cx={12} cy={12} r={size / 2} />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function DashDashedIcon() {\n  return (\n    <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle\n        cx={12}\n        cy={12}\n        r={8}\n        fill=\"none\"\n        strokeWidth={2.5}\n        strokeLinecap=\"round\"\n        strokeDasharray={50.26548 * 0.1}\n      />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nconst dottedDasharray = `${50.26548 * 0.025} ${50.26548 * 0.1}`\n\nexport function DashDottedIcon() {\n  return (\n    <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle\n        cx={12}\n        cy={12}\n        r={8}\n        fill=\"none\"\n        strokeWidth={2.5}\n        strokeLinecap=\"round\"\n        strokeDasharray={dottedDasharray}\n      />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function DashDrawIcon() {\n  return (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"1 1.5 21 22\"\n      fill=\"currentColor\"\n      stroke=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M10.0162 19.2768C10.0162 19.2768 9.90679 19.2517 9.6879 19.2017C9.46275 19.1454 9.12816 19.0422 8.68413 18.8921C8.23384 18.7358 7.81482 18.545 7.42707 18.3199C7.03307 18.101 6.62343 17.7883 6.19816 17.3818C5.77289 16.9753 5.33511 16.3718 4.88482 15.5713C4.43453 14.7645 4.1531 13.8545 4.04053 12.8414C3.92795 11.822 4.04991 10.8464 4.40639 9.91451C4.76286 8.98266 5.39452 8.10084 6.30135 7.26906C7.21444 6.44353 8.29325 5.83377 9.5378 5.43976C10.7823 5.05202 11.833 4.92068 12.6898 5.04576C13.5466 5.16459 14.3878 5.43664 15.2133 5.86191C16.0388 6.28718 16.7768 6.8688 17.4272 7.60678C18.0714 8.34475 18.5404 9.21406 18.8344 10.2147C19.1283 11.2153 19.1721 12.2598 18.9657 13.348C18.7593 14.4299 18.2872 15.4337 17.5492 16.3593C16.8112 17.2849 15.9263 18.0072 14.8944 18.5263C13.8624 19.0391 12.9056 19.3174 12.0238 19.3612C11.142 19.405 10.2101 19.2705 9.22823 18.9578C8.24635 18.6451 7.35828 18.151 6.56402 17.4756C5.77601 16.8002 6.08871 16.8658 7.50212 17.6726C8.90927 18.4731 10.1444 18.8484 11.2076 18.7983C12.2645 18.7545 13.2965 18.4825 14.3034 17.9822C15.3102 17.4819 16.1264 16.8221 16.7518 16.0028C17.3772 15.1835 17.7681 14.3111 17.9244 13.3855C18.0808 12.4599 18.0401 11.5781 17.8025 10.74C17.5586 9.902 17.1739 9.15464 16.6486 8.49797C16.1233 7.8413 15.2289 7.27844 13.9656 6.80939C12.7086 6.34034 11.4203 6.20901 10.1007 6.41539C8.78732 6.61552 7.69599 7.06893 6.82669 7.77564C5.96363 8.48859 5.34761 9.26409 4.97863 10.1021C4.60964 10.9402 4.45329 11.8376 4.50958 12.7945C4.56586 13.7513 4.79101 14.6238 5.18501 15.4118C5.57276 16.1998 5.96363 16.8002 6.35764 17.2129C6.75164 17.6257 7.13313 17.9509 7.50212 18.1886C7.87736 18.4325 8.28074 18.642 8.71227 18.8171C9.15005 18.9922 9.47839 19.111 9.69728 19.1736C9.91617 19.2361 10.0256 19.2705 10.0256 19.2768H10.0162Z\"\n        strokeWidth=\"2\"\n      />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function DashSolidIcon() {\n  return (\n    <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx={12} cy={12} r={8} fill=\"none\" strokeWidth={2} strokeLinecap=\"round\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function TrashIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      width={18}\n      height={18}\n      viewBox=\"0 0 15 15\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M2 4.656a.5.5 0 01.5-.5h9.7a.5.5 0 010 1H2.5a.5.5 0 01-.5-.5z\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M6.272 3a.578.578 0 00-.578.578v.578h3.311v-.578A.578.578 0 008.428 3H6.272zm3.733 1.156v-.578A1.578 1.578 0 008.428 2H6.272a1.578 1.578 0 00-1.578 1.578v.578H3.578a.5.5 0 00-.5.5V12.2a1.578 1.578 0 001.577 1.578h5.39a1.578 1.578 0 001.577-1.578V4.656a.5.5 0 00-.5-.5h-1.117zm-5.927 1V12.2a.578.578 0 00.577.578h5.39a.578.578 0 00.577-.578V5.156H4.078z\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M6.272 6.85a.5.5 0 01.5.5v3.233a.5.5 0 11-1 0V7.35a.5.5 0 01.5-.5zM8.428 6.85a.5.5 0 01.5.5v3.233a.5.5 0 11-1 0V7.35a.5.5 0 01.5-.5z\"\n      />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function UndoIcon({\n  flipHorizontal,\n  ...props\n}: React.SVGProps<SVGSVGElement> & { flipHorizontal?: boolean }) {\n  return (\n    <svg\n      width={24}\n      height={24}\n      viewBox=\"0 0 15 15\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n      transform={flipHorizontal ? 'scale(-1, 1)' : undefined}\n    >\n      <path d=\"M10.6707 8.5081C10.6707 10.1923 9.3004 11.5625 7.61631 11.5625H6.5351C6.35593 11.5625 6.21074 11.4173 6.21074 11.2382V11.13C6.21074 10.9508 6.35591 10.8057 6.5351 10.8057H7.61631C8.88313 10.8057 9.91387 9.77492 9.91387 8.5081C9.91387 7.24128 8.88313 6.21054 7.61631 6.21054H5.62155L6.99534 7.58433C7.14289 7.73183 7.14289 7.97195 6.99534 8.11944C6.85216 8.26251 6.60298 8.2623 6.46013 8.11944L4.44045 6.09971C4.36898 6.02824 4.32959 5.93321 4.32959 5.8321C4.32959 5.73106 4.36898 5.63598 4.44045 5.56454L6.46024 3.54472C6.60309 3.40176 6.85248 3.40176 6.99535 3.54472C7.14291 3.69218 7.14291 3.93234 6.99535 4.07979L5.62156 5.45368H7.61631C9.3004 5.45368 10.6707 6.82393 10.6707 8.5081Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function SizeSmallIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      width={24}\n      height={24}\n      viewBox=\"-2 -2 28 28\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path d=\"M12.4239 4.62C13.3572 4.62 14.1572 4.73333 14.8239 4.96C15.4906 5.17333 15.9772 5.43333 16.2839 5.74C16.3639 5.82 16.4039 5.94 16.4039 6.1V8.86H14.0639C13.9172 8.86 13.8439 8.78666 13.8439 8.64V7.26C13.4306 7.12666 12.9572 7.06 12.4239 7.06C11.6506 7.06 11.0639 7.18 10.6639 7.42C10.2639 7.66 10.0639 8.04666 10.0639 8.58V9C10.0639 9.38666 10.1639 9.69333 10.3639 9.92C10.5772 10.1333 11.0306 10.3467 11.7239 10.56L13.6439 11.14C14.4706 11.38 15.1172 11.66 15.5839 11.98C16.0506 12.3 16.3772 12.68 16.5639 13.12C16.7639 13.5467 16.8639 14.0733 16.8639 14.7V15.62C16.8639 16.7933 16.4039 17.7133 15.4839 18.38C14.5639 19.0467 13.2839 19.38 11.6439 19.38C10.6706 19.38 9.79723 19.2867 9.0239 19.1C8.2639 18.9133 7.71056 18.6533 7.3639 18.32C7.3239 18.28 7.29056 18.24 7.2639 18.2C7.25056 18.1467 7.2439 18.06 7.2439 17.94V15.74H7.6239C8.2239 16.1533 8.85056 16.4533 9.5039 16.64C10.1572 16.8267 10.9306 16.92 11.8239 16.92C12.6506 16.92 13.2506 16.7867 13.6239 16.52C14.0106 16.2533 14.2039 15.9333 14.2039 15.56V14.88C14.2039 14.6667 14.1639 14.48 14.0839 14.32C14.0172 14.16 13.8706 14.0133 13.6439 13.88C13.4172 13.7467 13.0572 13.6067 12.5639 13.46L10.6639 12.88C9.7839 12.6133 9.11056 12.3 8.6439 11.94C8.17723 11.58 7.85056 11.18 7.6639 10.74C7.49056 10.3 7.4039 9.83333 7.4039 9.34V8.38C7.4039 7.64666 7.61056 7 8.0239 6.44C8.43723 5.88 9.01723 5.44 9.7639 5.12C10.5239 4.78666 11.4106 4.62 12.4239 4.62Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function SizeMediumIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      width={24}\n      height={24}\n      viewBox=\"-2 -2 28 28\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path d=\"M8.16191 19H5.68191C5.53525 19 5.46191 18.9267 5.46191 18.78V5H8.76191C8.88191 5 8.97525 5.03333 9.04191 5.1C9.10858 5.15333 9.17525 5.27333 9.24191 5.46C9.72191 6.59333 10.1686 7.7 10.5819 8.78C11.0086 9.84667 11.4352 10.98 11.8619 12.18H12.1619C12.6019 10.9667 13.0352 9.79333 13.4619 8.66C13.8886 7.52667 14.3552 6.30667 14.8619 5H18.3219C18.4686 5 18.5419 5.07333 18.5419 5.22V19H16.0619C15.9152 19 15.8419 18.9267 15.8419 18.78V16.26C15.8419 15.5267 15.8486 14.8133 15.8619 14.12C15.8886 13.4267 15.9286 12.6867 15.9819 11.9C16.0486 11.1 16.1419 10.1933 16.2619 9.18H15.9019C15.4352 10.3533 14.9486 11.5667 14.4419 12.82C13.9486 14.06 13.4819 15.2333 13.0419 16.34H11.1019C11.0619 16.34 11.0152 16.3333 10.9619 16.32C10.9219 16.2933 10.8886 16.2467 10.8619 16.18C10.4619 15.18 10.0086 14.06 9.50191 12.82C9.00858 11.58 8.53525 10.3667 8.08191 9.18H7.70191C7.83525 10.18 7.93525 11.0733 8.00191 11.86C8.06858 12.6467 8.10858 13.3933 8.12191 14.1C8.14858 14.8067 8.16191 15.5267 8.16191 16.26V19Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function SizeLargeIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      width={24}\n      height={24}\n      viewBox=\"-2 -2 28 28\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path d=\"M7.68191 19C7.53525 19 7.46191 18.9267 7.46191 18.78V5H10.1219C10.2686 5 10.3419 5.07333 10.3419 5.22V16.56H13.4419V15.02H15.7619C15.9086 15.02 15.9819 15.0933 15.9819 15.24V19H7.68191Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function EraserIcon() {\n  return (\n    <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path\n        d=\"M1.72838 9.33987L8.84935 2.34732C9.23874 1.96494 9.86279 1.96539 10.2516 2.34831L13.5636 5.60975C13.9655 6.00555 13.9607 6.65526 13.553 7.04507L8.13212 12.2278C7.94604 12.4057 7.69851 12.505 7.44107 12.505L6.06722 12.505L3.83772 12.505C3.5673 12.505 3.30842 12.3954 3.12009 12.2014L1.7114 10.7498C1.32837 10.3551 1.33596 9.72521 1.72838 9.33987Z\"\n        stroke=\"currentColor\"\n      />\n      <line\n        x1=\"6.01807\"\n        y1=\"12.5\"\n        x2=\"10.7959\"\n        y2=\"12.5\"\n        stroke=\"currentColor\"\n        strokeLinecap=\"round\"\n      />\n      <line x1=\"5.50834\" y1=\"5.74606\" x2=\"10.1984\" y2=\"10.4361\" stroke=\"currentColor\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function DiscordIcon() {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"16\"\n      height=\"16\"\n      fill=\"currentColor\"\n      viewBox=\"0 0 16 16\"\n    >\n      <path d=\"M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function LineIcon() {\n  return (\n    <svg\n      width=\"15\"\n      height=\"15\"\n      viewBox=\"0 0 15 15\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M3.64645 11.3536C3.45118 11.1583 3.45118 10.8417 3.64645 10.6465L11.1464 3.14645C11.3417 2.95118 11.6583 2.95118 11.8536 3.14645C12.0488 3.34171 12.0488 3.65829 11.8536 3.85355L4.35355 11.3536C4.15829 11.5488 3.84171 11.5488 3.64645 11.3536Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\nimport { Tooltip } from '~components/Primitives/Tooltip/Tooltip'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\nimport { AlignType, TDSnapshot, DistributeType, StretchType } from '~types'\nimport {\n  ArrowDownIcon,\n  ArrowUpIcon,\n  AspectRatioIcon,\n  CopyIcon,\n  DotsHorizontalIcon,\n  GroupIcon,\n  LockClosedIcon,\n  LockOpen1Icon,\n  PinBottomIcon,\n  PinTopIcon,\n  RotateCounterClockwiseIcon,\n  AlignBottomIcon,\n  AlignCenterHorizontallyIcon,\n  AlignCenterVerticallyIcon,\n  AlignLeftIcon,\n  AlignRightIcon,\n  AlignTopIcon,\n  SpaceEvenlyHorizontallyIcon,\n  SpaceEvenlyVerticallyIcon,\n  StretchHorizontallyIcon,\n  StretchVerticallyIcon,\n  BoxIcon,\n  AngleIcon,\n} from '@radix-ui/react-icons'\nimport { DMContent } from '~components/Primitives/DropdownMenu'\nimport { Divider } from '~components/Primitives/Divider'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { useIntl } from 'react-intl'\n\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\nconst selectedShapesCountSelector = (s: TDSnapshot) =>\n  s.document.pageStates[s.appState.currentPageId].selectedIds.length\n\nconst isAllLockedSelector = (s: TDSnapshot) => {\n  const page = s.document.pages[s.appState.currentPageId]\n  const { selectedIds } = s.document.pageStates[s.appState.currentPageId]\n  return selectedIds.every((id) => page.shapes[id].isLocked)\n}\n\nconst isAllAspectLockedSelector = (s: TDSnapshot) => {\n  const page = s.document.pages[s.appState.currentPageId]\n  const { selectedIds } = s.document.pageStates[s.appState.currentPageId]\n  return selectedIds.every((id) => page.shapes[id].isAspectRatioLocked)\n}\n\nconst isAllGroupedSelector = (s: TDSnapshot) => {\n  const page = s.document.pages[s.appState.currentPageId]\n  const selectedShapes = s.document.pageStates[s.appState.currentPageId].selectedIds.map(\n    (id) => page.shapes[id]\n  )\n\n  return selectedShapes.every(\n    (shape) =>\n      shape.children !== undefined ||\n      (shape.parentId === selectedShapes[0].parentId &&\n        selectedShapes[0].parentId !== s.appState.currentPageId)\n  )\n}\n\nconst hasSelectionSelector = (s: TDSnapshot) => {\n  const { selectedIds } = s.document.pageStates[s.appState.currentPageId]\n  return selectedIds.length > 0\n}\n\nconst hasMultipleSelectionSelector = (s: TDSnapshot) => {\n  const { selectedIds } = s.document.pageStates[s.appState.currentPageId]\n  return selectedIds.length > 1\n}\n\nexport function ActionButton() {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const isAllLocked = app.useStore(isAllLockedSelector)\n\n  const isAllAspectLocked = app.useStore(isAllAspectLockedSelector)\n\n  const isAllGrouped = app.useStore(isAllGroupedSelector)\n\n  const hasSelection = app.useStore(hasSelectionSelector)\n\n  const hasMultipleSelection = app.useStore(hasMultipleSelectionSelector)\n\n  const selectedShapesCount = app.useStore(selectedShapesCountSelector)\n\n  const dockPosition = app.useStore(dockPositionState)\n\n  const hasTwoOrMore = selectedShapesCount > 1\n\n  const hasThreeOrMore = selectedShapesCount > 2\n\n  const handleRotate = React.useCallback(() => {\n    app.rotate()\n  }, [app])\n\n  const handleDuplicate = React.useCallback(() => {\n    app.duplicate()\n  }, [app])\n\n  const handleToggleLocked = React.useCallback(() => {\n    app.toggleLocked()\n  }, [app])\n\n  const handleToggleAspectRatio = React.useCallback(() => {\n    app.toggleAspectRatioLocked()\n  }, [app])\n\n  const handleGroup = React.useCallback(() => {\n    app.group()\n  }, [app])\n\n  const handleMoveToBack = React.useCallback(() => {\n    app.moveToBack()\n  }, [app])\n\n  const handleMoveBackward = React.useCallback(() => {\n    app.moveBackward()\n  }, [app])\n\n  const handleMoveForward = React.useCallback(() => {\n    app.moveForward()\n  }, [app])\n\n  const handleMoveToFront = React.useCallback(() => {\n    app.moveToFront()\n  }, [app])\n\n  const handleResetAngle = React.useCallback(() => {\n    app.setShapeProps({ rotation: 0 })\n  }, [app])\n\n  const alignTop = React.useCallback(() => {\n    app.align(AlignType.Top)\n  }, [app])\n\n  const alignCenterVertical = React.useCallback(() => {\n    app.align(AlignType.CenterVertical)\n  }, [app])\n\n  const alignBottom = React.useCallback(() => {\n    app.align(AlignType.Bottom)\n  }, [app])\n\n  const stretchVertically = React.useCallback(() => {\n    app.stretch(StretchType.Vertical)\n  }, [app])\n\n  const distributeVertically = React.useCallback(() => {\n    app.distribute(DistributeType.Vertical)\n  }, [app])\n\n  const alignLeft = React.useCallback(() => {\n    app.align(AlignType.Left)\n  }, [app])\n\n  const alignCenterHorizontal = React.useCallback(() => {\n    app.align(AlignType.CenterHorizontal)\n  }, [app])\n\n  const alignRight = React.useCallback(() => {\n    app.align(AlignType.Right)\n  }, [app])\n\n  const stretchHorizontally = React.useCallback(() => {\n    app.stretch(StretchType.Horizontal)\n  }, [app])\n\n  const distributeHorizontally = React.useCallback(() => {\n    app.distribute(DistributeType.Horizontal)\n  }, [app])\n\n  const handleMenuOpenChange = React.useCallback(\n    (open: boolean) => {\n      app.setMenuOpen(open)\n    },\n    [app]\n  )\n\n  const contentSide = dockPosition === 'bottom' || dockPosition === 'top' ? 'top' : dockPosition\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\" onOpenChange={handleMenuOpenChange}>\n      <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-Tools-Dots\">\n        <ToolButton variant=\"circle\">\n          <DotsHorizontalIcon />\n        </ToolButton>\n      </DropdownMenu.Trigger>\n      <DMContent sideOffset={16} side={contentSide}>\n        <>\n          <ButtonsRow>\n            <ToolButton variant=\"icon\" disabled={!hasSelection} onClick={handleDuplicate}>\n              <Tooltip\n                label={intl.formatMessage({ id: 'duplicate' })}\n                kbd={`#D`}\n                id=\"TD-Tools-Copy\"\n              >\n                <CopyIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleRotate}>\n              <Tooltip label={intl.formatMessage({ id: 'rotate' })} id=\"TD-Tools-Rotate\">\n                <RotateCounterClockwiseIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleToggleLocked}>\n              <Tooltip\n                label={intl.formatMessage({ id: isAllLocked ? 'unlock' : 'lock' })}\n                kbd={`#L`}\n                id=\"TD-Tools-Lock\"\n              >\n                {isAllLocked ? <LockClosedIcon /> : <LockOpen1Icon />}\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleToggleAspectRatio}>\n              <Tooltip\n                label={intl.formatMessage({\n                  id: isAllAspectLocked ? 'unlock.aspect.ratio' : 'lock.aspect.ratio',\n                })}\n                id=\"TD-Tools-AspectRatio\"\n              >\n                {isAllAspectLocked ? <AspectRatioIcon /> : <BoxIcon />}\n              </Tooltip>\n            </ToolButton>\n            <ToolButton\n              disabled={!hasSelection || (!isAllGrouped && !hasMultipleSelection)}\n              onClick={handleGroup}\n            >\n              <Tooltip label={intl.formatMessage({ id: 'group' })} kbd={`#G`} id=\"TD-Tools-Group\">\n                <GroupIcon />\n              </Tooltip>\n            </ToolButton>\n          </ButtonsRow>\n          <ButtonsRow>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveToBack}>\n              <Tooltip\n                label={intl.formatMessage({ id: 'move.to.back' })}\n                kbd={`#\u21E7[`}\n                id=\"TD-Tools-PinBottom\"\n              >\n                <PinBottomIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveBackward}>\n              <Tooltip\n                label={intl.formatMessage({ id: 'move.backward' })}\n                kbd={`#[`}\n                id=\"TD-Tools-ArrowDown\"\n              >\n                <ArrowDownIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveForward}>\n              <Tooltip\n                label={intl.formatMessage({ id: 'move.forward' })}\n                kbd={`#]`}\n                id=\"TD-Tools-ArrowUp\"\n              >\n                <ArrowUpIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveToFront}>\n              <Tooltip\n                label={intl.formatMessage({ id: 'move.to.front' })}\n                kbd={`#\u21E7]`}\n                id=\"TD-Tools-PinTop\"\n              >\n                <PinTopIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleResetAngle}>\n              <Tooltip label={intl.formatMessage({ id: 'reset.angle' })} id=\"TD-Tools-ResetAngle\">\n                <AngleIcon />\n              </Tooltip>\n            </ToolButton>\n          </ButtonsRow>\n          <Divider />\n          <ButtonsRow>\n            <ToolButton disabled={!hasTwoOrMore} onClick={alignLeft} id=\"TD-Tools-AlignLeft\">\n              <AlignLeftIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasTwoOrMore}\n              onClick={alignCenterHorizontal}\n              id=\"TD-Tools-AlignCenterHorizontal\"\n            >\n              <AlignCenterHorizontallyIcon />\n            </ToolButton>\n            <ToolButton disabled={!hasTwoOrMore} onClick={alignRight} id=\"TD-Tools-AlignRight\">\n              <AlignRightIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasTwoOrMore}\n              onClick={stretchHorizontally}\n              id=\"TD-Tools-StretchHorizontal\"\n            >\n              <StretchHorizontallyIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasThreeOrMore}\n              onClick={distributeHorizontally}\n              id=\"TD-Tools-SpaceEvenlyHorizontal\"\n            >\n              <SpaceEvenlyHorizontallyIcon />\n            </ToolButton>\n          </ButtonsRow>\n          <ButtonsRow>\n            <ToolButton disabled={!hasTwoOrMore} onClick={alignTop} id=\"TD-Tools-AlignTop\">\n              <AlignTopIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasTwoOrMore}\n              onClick={alignCenterVertical}\n              id=\"TD-Tools-AlignCenterVertical\"\n            >\n              <AlignCenterVerticallyIcon />\n            </ToolButton>\n            <ToolButton disabled={!hasTwoOrMore} onClick={alignBottom} id=\"TD-Tools-AlignBottom\">\n              <AlignBottomIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasTwoOrMore}\n              onClick={stretchVertically}\n              id=\"TD-Tools-tretchVertical\"\n            >\n              <StretchVerticallyIcon />\n            </ToolButton>\n            <ToolButton\n              disabled={!hasThreeOrMore}\n              onClick={distributeVertically}\n              id=\"TD-Tools-SpaceEvenlyVertical\"\n            >\n              <SpaceEvenlyVerticallyIcon />\n            </ToolButton>\n          </ButtonsRow>\n        </>\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n}\n\nexport const ButtonsRow = styled('div', {\n  position: 'relative',\n  display: 'flex',\n  width: '100%',\n  background: 'none',\n  border: 'none',\n  cursor: 'pointer',\n  outline: 'none',\n  alignItems: 'center',\n  justifyContent: 'flex-start',\n  padding: 0,\n})\n", "import * as React from 'react'\nimport { Item } from '@radix-ui/react-dropdown-menu'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\n\nexport function DMItem({\n  onSelect,\n  id,\n  ...rest\n}: RowButtonProps & { onSelect?: (event: Event) => void; id?: string }) {\n  return (\n    <Item dir=\"ltr\" asChild onSelect={onSelect} id={id}>\n      <RowButton {...rest} />\n    </Item>\n  )\n}\n", "import * as React from 'react'\nimport { CheckboxItem } from '@radix-ui/react-dropdown-menu'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { preventEvent } from '~components/preventEvent'\n\ninterface DMCheckboxItemProps {\n  checked: boolean\n  disabled?: boolean\n  onCheckedChange: (isChecked: boolean) => void\n  children: React.ReactNode\n  variant?: RowButtonProps['variant']\n  kbd?: string\n  id?: string\n}\n\nexport function DMCheckboxItem({\n  checked,\n  disabled = false,\n  variant,\n  onCheckedChange,\n  kbd,\n  id,\n  children,\n}: DMCheckboxItemProps) {\n  return (\n    <CheckboxItem\n      dir=\"ltr\"\n      onSelect={preventEvent}\n      onCheckedChange={onCheckedChange}\n      checked={checked}\n      disabled={disabled}\n      asChild\n      id={id}\n    >\n      <RowButton kbd={kbd} variant={variant} hasIndicator>\n        {children}\n      </RowButton>\n    </CheckboxItem>\n  )\n}\n", "export const preventEvent = (e: Event) => e.preventDefault()\n", "import * as React from 'react'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { styled } from '~styles/stitches.config'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { stopPropagation } from '~components/stopPropagation'\n\nexport interface DMContentProps {\n  variant?: 'menu' | 'horizontal'\n  align?: 'start' | 'center' | 'end'\n  sideOffset?: number\n  children: React.ReactNode\n  overflow?: boolean\n  id?: string\n  side?: 'top' | 'left' | 'right' | 'bottom' | undefined\n}\n\nexport function DMContent({\n  sideOffset = 8,\n  children,\n  align,\n  variant,\n  id,\n  overflow = false,\n  side = 'bottom',\n}: DMContentProps) {\n  return (\n    <DropdownMenu.Content\n      dir=\"ltr\"\n      align={align}\n      sideOffset={sideOffset}\n      onEscapeKeyDown={stopPropagation}\n      asChild\n      id={id}\n      side={side}\n    >\n      <StyledContent variant={variant} overflow={overflow}>\n        {children}\n      </StyledContent>\n    </DropdownMenu.Content>\n  )\n}\n\nexport const StyledContent = styled(MenuContent, {\n  width: 'fit-content',\n  height: 'fit-content',\n  minWidth: 0,\n  maxHeight: '100vh',\n  overflowY: 'auto',\n  overflowX: 'hidden',\n  '&::webkit-scrollbar': {\n    display: 'none',\n  },\n  '-ms-overflow-style': 'none' /* for Internet Explorer, Edge */,\n  scrollbarWidth: 'none',\n  variants: {\n    variant: {\n      horizontal: {\n        flexDirection: 'row',\n      },\n      menu: {\n        minWidth: 128,\n      },\n    },\n    overflow: {\n      true: {\n        maxHeight: '60vh',\n      },\n    },\n  },\n})\n", "import { Separator } from '@radix-ui/react-dropdown-menu'\nimport { styled } from '~styles/stitches.config'\n\nexport const DMDivider = styled(Separator, {\n  backgroundColor: '$hover',\n  height: 1,\n  marginTop: '$2',\n  marginRight: '-$2',\n  marginBottom: '$2',\n  marginLeft: '-$2',\n})\n", "import { RadioItem } from '@radix-ui/react-dropdown-menu'\nimport { styled } from '~styles/stitches.config'\n\nexport const DMRadioItem = styled(RadioItem, {\n  height: '32px',\n  width: '32px',\n  backgroundColor: '$panel',\n  borderRadius: '4px',\n  padding: '0',\n  margin: '0',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  outline: 'none',\n  border: 'none',\n  pointerEvents: 'all',\n  cursor: 'pointer',\n\n  variants: {\n    isActive: {\n      true: {\n        backgroundColor: '$selected',\n        color: 'white',\n      },\n      false: {},\n    },\n    bp: {\n      mobile: {},\n      small: {},\n    },\n  },\n\n  compoundVariants: [\n    {\n      isActive: false,\n      bp: 'small',\n      css: {\n        '&:focus': {\n          backgroundColor: '$hover',\n        },\n        '&:hover:not(:disabled)': {\n          backgroundColor: '$hover',\n        },\n      },\n    },\n  ],\n})\n", "import * as React from 'react'\nimport { Root, TriggerItem, Content, Arrow } from '@radix-ui/react-dropdown-menu'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { MenuContent } from '~components/Primitives/MenuContent'\n\nexport interface DMSubMenuProps {\n  label: string\n  size?: 'small'\n  disabled?: boolean\n  children: React.ReactNode\n  overflow?: boolean\n  id?: string\n}\n\nexport function DMSubMenu({\n  children,\n  size,\n  overflow = false,\n  disabled = false,\n  label,\n  id,\n}: DMSubMenuProps) {\n  return (\n    <span id={id}>\n      <Root dir=\"ltr\">\n        <TriggerItem dir=\"ltr\" asChild>\n          <RowButton disabled={disabled} hasArrow>\n            {label}\n          </RowButton>\n        </TriggerItem>\n        <Content dir=\"ltr\" asChild sideOffset={2} alignOffset={-2} align=\"start\">\n          <MenuContent size={size} overflow={overflow}>\n            {children}\n            <Arrow offset={13} />\n          </MenuContent>\n        </Content>\n      </Root>\n    </span>\n  )\n}\n", "import * as React from 'react'\nimport { Trigger } from '@radix-ui/react-dropdown-menu'\nimport { ToolButton, ToolButtonProps } from '~components/Primitives/ToolButton'\n\ninterface DMTriggerIconProps extends ToolButtonProps {\n  children: React.ReactNode\n  id?: string\n}\n\nexport function DMTriggerIcon({ id, children, ...rest }: DMTriggerIconProps) {\n  return (\n    <Trigger asChild id={id}>\n      <ToolButton {...rest}>{children}</ToolButton>\n    </Trigger>\n  )\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\n\nexport const Divider = styled('hr', {\n  height: 0,\n  paddingTop: 1,\n  width: 'calc(100%+8px)',\n  backgroundColor: '$hover',\n  border: 'none',\n  margin: '$2 -4px',\n})\n", "import * as React from 'react'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { useTldrawApp } from '~hooks'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { TrashIcon } from '~components/Primitives/icons'\nimport { useIntl } from 'react-intl'\n\nexport function DeleteButton() {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const handleDelete = React.useCallback(() => {\n    app.delete()\n  }, [app])\n\n  const hasSelection = app.useStore(\n    (s) =>\n      s.appState.status === 'idle' &&\n      s.document.pageStates[s.appState.currentPageId].selectedIds.length > 0\n  )\n\n  return (\n    <Tooltip label={intl.formatMessage({ id: 'delete' })} kbd=\"\u232B\" id=\"TD-Delete\">\n      <ToolButton variant=\"circle\" disabled={!hasSelection} onSelect={handleDelete}>\n        <TrashIcon />\n      </ToolButton>\n    </Tooltip>\n  )\n}\n", "import * as React from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { FormattedMessage } from 'react-intl'\nimport { styled } from '~styles'\nimport { useTldrawApp } from '~hooks'\nimport { TDSnapshot } from '~types'\nimport { breakpoints } from '~components/breakpoints'\nimport {\n  GitHubLogoIcon,\n  HeartFilledIcon,\n  QuestionMarkIcon,\n  TwitterLogoIcon,\n} from '@radix-ui/react-icons'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { DiscordIcon } from '~components/Primitives/icons'\nimport { LanguageMenu } from '~components/TopPanel/LanguageMenu/LanguageMenu'\nimport { KeyboardShortcutDialog } from './keyboardShortcutDialog'\nimport { Divider } from '~components/Primitives/Divider'\n\nconst isDebugModeSelector = (s: TDSnapshot) => s.settings.isDebugMode\nconst dockPositionState = (s: TDSnapshot) => s.settings.dockPosition\n\nexport function HelpPanel() {\n  const app = useTldrawApp()\n  const isDebugMode = app.useStore(isDebugModeSelector)\n  const side = app.useStore(dockPositionState)\n\n  const [isKeyboardShortcutsOpen, setIsKeyboardShortcutsOpen] = React.useState(false)\n\n  return (\n    <Popover.Root>\n      <PopoverAnchor dir=\"ltr\">\n        <Popover.Trigger dir=\"ltr\" asChild>\n          <HelpButton side={side} debug={isDebugMode} bp={breakpoints}>\n            <QuestionMarkIcon />\n          </HelpButton>\n        </Popover.Trigger>\n      </PopoverAnchor>\n      <Popover.Content dir=\"ltr\" asChild>\n        <StyledContent style={{ visibility: isKeyboardShortcutsOpen ? 'hidden' : 'visible' }}>\n          <LanguageMenuDropdown />\n          <KeyboardShortcutDialog onOpenChange={setIsKeyboardShortcutsOpen} />\n          <Divider />\n          <Links />\n        </StyledContent>\n      </Popover.Content>\n    </Popover.Root>\n  )\n}\n\nconst LanguageMenuDropdown = () => {\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DropdownMenu.Trigger asChild>\n        <RowButton variant=\"wide\" hasArrow>\n          <FormattedMessage id=\"language\" />\n        </RowButton>\n      </DropdownMenu.Trigger>\n      <LanguageMenu />\n    </DropdownMenu.Root>\n  )\n}\n\nconst linksData = [\n  { id: 'github', icon: GitHubLogoIcon, url: 'https://github.com/tldraw/tldraw' },\n  { id: 'twitter', icon: TwitterLogoIcon, url: 'https://twitter.com/tldraw' },\n  { id: 'discord', icon: DiscordIcon, url: 'https://discord.gg/SBBEVCA4PG' },\n  {\n    id: 'become.a.sponsor',\n    icon: HeartFilledIcon,\n    url: 'https://github.com/sponsors/steveruizok',\n  },\n]\n\nconst Links = () => {\n  return (\n    <>\n      {linksData.map((item) => (\n        <a key={item.id} href={item.url} target=\"_blank\" rel=\"nofollow\">\n          <RowButton id={`TD-Link-${item.id}`} variant=\"wide\">\n            <FormattedMessage id={item.id} />\n            <SmallIcon>\n              <item.icon />\n            </SmallIcon>\n          </RowButton>\n        </a>\n      ))}\n    </>\n  )\n}\n\nconst HelpButton = styled('button', {\n  width: 28,\n  height: 28,\n  borderRadius: '100%',\n  position: 'fixed',\n  right: 10,\n  padding: 0,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  backgroundColor: '$panel',\n  cursor: 'pointer',\n  boxShadow: '$panel',\n  border: '1px solid $panelContrast',\n  bottom: 10,\n  color: '$text',\n  variants: {\n    debug: {\n      true: {},\n      false: {},\n    },\n    bp: {\n      mobile: {},\n      small: {},\n      medium: {},\n      large: {},\n    },\n    side: {\n      top: {},\n      left: {},\n      right: {},\n      bottom: {},\n    },\n  },\n  compoundVariants: [\n    {\n      bp: 'mobile',\n      side: 'bottom',\n      debug: false,\n      css: {\n        bottom: 70,\n      },\n    },\n    {\n      bp: 'mobile',\n      debug: true,\n      css: {\n        bottom: 50, // 40 + 10\n      },\n    },\n    {\n      bp: 'mobile',\n      side: 'bottom',\n      debug: true,\n      css: {\n        bottom: 110,\n      },\n    },\n    {\n      bp: 'small',\n      side: 'bottom',\n      debug: true,\n      css: {\n        bottom: 50,\n      },\n    },\n    {\n      bp: 'small',\n      debug: false,\n      css: {\n        bottom: 10,\n      },\n    },\n  ],\n})\n\nexport const StyledContent = styled(MenuContent, {\n  width: 'fit-content',\n  height: 'fit-content',\n  minWidth: 200,\n  maxHeight: 380,\n  overflowY: 'auto',\n  '& *': {\n    boxSizing: 'border-box',\n  },\n  variants: {\n    variant: {\n      horizontal: {\n        flexDirection: 'row',\n      },\n      menu: {\n        minWidth: 128,\n      },\n    },\n  },\n})\n\nconst PopoverAnchor = styled(Popover.Anchor, {\n  position: 'absolute',\n  right: 10,\n  zIndex: 999,\n  bottom: 50,\n})\n", "import * as React from 'react'\nimport { ExternalLinkIcon } from '@radix-ui/react-icons'\nimport { FormattedMessage } from 'react-intl'\nimport { DMCheckboxItem, DMContent, DMDivider, DMItem } from '~components/Primitives/DropdownMenu'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { useTldrawApp } from '~hooks'\nimport { TDLanguage, TRANSLATIONS } from '~translations'\nimport { TDSnapshot } from '~types'\nimport { Divider } from '~components/Primitives/Divider'\n\nconst languageSelector = (s: TDSnapshot) => s.settings.language\n\nexport function LanguageMenu() {\n  const app = useTldrawApp()\n  const language = app.useStore(languageSelector)\n\n  const handleChangeLanguage = React.useCallback(\n    (locale: TDLanguage) => {\n      app.setSetting('language', locale)\n    },\n    [app]\n  )\n\n  return (\n    <DMContent variant=\"menu\" overflow={true} id=\"language-menu\" side=\"left\" sideOffset={8}>\n      {TRANSLATIONS.map(({ locale, label }) => (\n        <DMCheckboxItem\n          key={locale}\n          checked={language === locale}\n          onCheckedChange={() => handleChangeLanguage(locale)}\n          id={`TD-MenuItem-Language-${locale}`}\n        >\n          {label}\n        </DMCheckboxItem>\n      ))}\n      <Divider />\n      <a\n        href=\"https://github.com/tldraw/tldraw/blob/main/guides/translation.md\"\n        target=\"_blank\"\n        rel=\"nofollow\"\n      >\n        <DMItem id=\"TD-MenuItem-Translation-Link\">\n          <FormattedMessage id=\"translation.link\" />\n          <SmallIcon>\n            <ExternalLinkIcon />\n          </SmallIcon>\n        </DMItem>\n      </a>\n    </DMContent>\n  )\n}\n", "import * as React from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { Cross2Icon } from '@radix-ui/react-icons'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { IconButton } from '~components/Primitives/IconButton'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { styled } from '~styles'\nimport { breakpoints } from '~components/breakpoints'\nimport { Kbd } from '~components/Primitives/Kbd'\n\nexport function KeyboardShortcutDialog({\n  onOpenChange,\n}: {\n  onOpenChange?: (open: boolean) => void\n}) {\n  const intl = useIntl()\n\n  const shortcuts = {\n    Tools: [\n      { label: intl.formatMessage({ id: 'select' }), kbd: '1' },\n      { label: intl.formatMessage({ id: 'draw' }), kbd: '2' },\n      { label: intl.formatMessage({ id: 'eraser' }), kbd: '3' },\n      { label: intl.formatMessage({ id: 'rectangle' }), kbd: '4' },\n      { label: intl.formatMessage({ id: 'ellipse' }), kbd: '5' },\n      { label: intl.formatMessage({ id: 'triangle' }), kbd: '6' },\n      { label: intl.formatMessage({ id: 'line' }), kbd: '7' },\n      { label: intl.formatMessage({ id: 'arrow' }), kbd: '8' },\n      { label: intl.formatMessage({ id: 'text' }), kbd: '9' },\n      { label: intl.formatMessage({ id: 'sticky' }), kbd: '0' },\n    ],\n    View: [\n      { label: intl.formatMessage({ id: 'zoom.in' }), kbd: '#+' },\n      { label: intl.formatMessage({ id: 'zoom.out' }), kbd: '#-' },\n      { label: `${intl.formatMessage({ id: 'zoom.to' })} 100%`, kbd: '\u21E7+0' },\n      { label: intl.formatMessage({ id: 'zoom.to.fit' }), kbd: '\u21E7+1' },\n      { label: intl.formatMessage({ id: 'zoom.to.selection' }), kbd: '\u21E7+2' },\n      { label: intl.formatMessage({ id: 'preferences.dark.mode' }), kbd: '#\u21E7D' },\n      { label: intl.formatMessage({ id: 'preferences.focus.mode' }), kbd: '#.' },\n      { label: intl.formatMessage({ id: 'preferences.show.grid' }), kbd: '#\u21E7G' },\n    ],\n    Transform: [\n      { label: intl.formatMessage({ id: 'flip.horizontal' }), kbd: '\u21E7H' },\n      { label: intl.formatMessage({ id: 'flip.vertical' }), kbd: '\u21E7V' },\n      {\n        label: `${intl.formatMessage({ id: 'lock' })} / ${intl.formatMessage({ id: 'unlock' })}`,\n        kbd: '#\u21E7L',\n      },\n      {\n        label: `${intl.formatMessage({ id: 'move' })} ${intl.formatMessage({ id: 'to.front' })}`,\n        kbd: '\u21E7]',\n      },\n      {\n        label: `${intl.formatMessage({ id: 'move' })} ${intl.formatMessage({ id: 'forward' })}`,\n        kbd: ']',\n      },\n      {\n        label: `${intl.formatMessage({ id: 'move' })} ${intl.formatMessage({ id: 'backward' })}`,\n        kbd: '[',\n      },\n      {\n        label: `${intl.formatMessage({ id: 'move' })} ${intl.formatMessage({ id: 'back' })}`,\n        kbd: '\u21E7[',\n      },\n    ],\n    File: [\n      { label: intl.formatMessage({ id: 'new.project' }), kbd: '#N' },\n      { label: intl.formatMessage({ id: 'open' }), kbd: '#O' },\n      { label: intl.formatMessage({ id: 'save' }), kbd: '#S' },\n      { label: intl.formatMessage({ id: 'save.as' }), kbd: '#\u21E7S' },\n      { label: intl.formatMessage({ id: 'upload.media' }), kbd: '#U' },\n    ],\n    Edit: [\n      { label: intl.formatMessage({ id: 'undo' }), kbd: '#Z' },\n      { label: intl.formatMessage({ id: 'redo' }), kbd: '#\u21E7Z' },\n      { label: intl.formatMessage({ id: 'cut' }), kbd: '#X' },\n      { label: intl.formatMessage({ id: 'copy' }), kbd: '#C' },\n      { label: intl.formatMessage({ id: 'paste' }), kbd: '#V' },\n      { label: intl.formatMessage({ id: 'select.all' }), kbd: '#A' },\n      { label: intl.formatMessage({ id: 'delete' }), kbd: '\u232B' },\n      { label: intl.formatMessage({ id: 'duplicate' }), kbd: '#D' },\n    ],\n  }\n\n  return (\n    <Dialog.Root onOpenChange={onOpenChange}>\n      {/* // todo: hide if no keyboard is attached */}\n      <Dialog.Trigger asChild>\n        <RowButton id=\"TD-HelpItem-Keyboard\" variant=\"wide\">\n          <FormattedMessage id=\"keyboard.shortcuts\" />\n        </RowButton>\n      </Dialog.Trigger>\n      <Dialog.Portal>\n        <DialogOverlay />\n        <DialogContent>\n          <DialogTitle>\n            <FormattedMessage id=\"keyboard.shortcuts\" />\n            <Dialog.Close asChild>\n              <DialogIconButton>\n                <Cross2Icon />\n              </DialogIconButton>\n            </Dialog.Close>\n          </DialogTitle>\n          <StyledColumns bp={breakpoints}>\n            {Object.entries(shortcuts).map(([key, value]) => (\n              <StyledSection key={key}>\n                <Label>\n                  <FormattedMessage id={`menu.${key.toLocaleLowerCase()}`} />\n                </Label>\n                <ContentItem>\n                  {value.map((shortcut) => (\n                    <StyledItem key={shortcut.label}>\n                      {shortcut.label}\n                      <Kbd variant=\"menu\">{shortcut.kbd}</Kbd>\n                    </StyledItem>\n                  ))}\n                </ContentItem>\n              </StyledSection>\n            ))}\n          </StyledColumns>\n        </DialogContent>\n      </Dialog.Portal>\n    </Dialog.Root>\n  )\n}\n\nconst Label = styled('h3', {\n  fontSize: '$2',\n  color: '$text',\n  fontFamily: '$ui',\n  margin: 0,\n  paddingBottom: '$5',\n})\n\nconst StyledSection = styled('div', {\n  breakInside: 'avoid',\n  paddingBottom: 24,\n})\n\nconst ContentItem = styled('ul', {\n  listStyleType: 'none',\n  width: '100%',\n  padding: 0,\n  margin: 0,\n})\n\nconst StyledItem = styled('li', {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n  height: 32,\n  minHeight: 32,\n  width: '100%',\n  outline: 'none',\n  color: '$text',\n  fontFamily: '$ui',\n  fontWeight: 400,\n  fontSize: '$1',\n  borderRadius: 4,\n  userSelect: 'none',\n  margin: 0,\n  padding: '0 0',\n})\n\nconst DialogContent = styled(Dialog.Content, {\n  backgroundColor: 'white',\n  borderRadius: 6,\n  boxShadow: 'hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px',\n  position: 'fixed',\n  top: '50%',\n  left: '50%',\n  transform: 'translate(-50%, -50%)',\n  width: 'fit-content',\n  maxWidth: '90vw',\n  maxHeight: '74vh',\n  overflowY: 'auto',\n  padding: 25,\n  '&:focus': { outline: 'none' },\n})\n\nconst StyledColumns = styled('div', {\n  maxWidth: '100%',\n  width: 'fit-content',\n  height: 'fit-content',\n  overflowY: 'auto',\n  columnGap: 64,\n  variants: {\n    bp: {\n      mobile: {\n        columns: 1,\n        [`& ${StyledSection}`]: {\n          minWidth: '0px',\n        },\n      },\n      small: {\n        columns: 2,\n        [`& ${StyledSection}`]: {\n          minWidth: '200px',\n        },\n      },\n      medium: {\n        columns: 3,\n      },\n      large: {\n        columns: 3,\n      },\n    },\n  },\n})\n\nconst DialogOverlay = styled(Dialog.Overlay, {\n  backgroundColor: '$overlay',\n  position: 'fixed',\n  inset: 0,\n})\n\nconst DialogIconButton = styled(IconButton, {\n  fontFamily: 'inherit',\n  borderRadius: '100%',\n  height: 25,\n  width: 25,\n  display: 'inline-flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: '$text',\n  cursor: 'pointer',\n  '&:hover': { backgroundColor: '$hover' },\n})\n\nconst DialogTitle = styled(Dialog.Title, {\n  fontFamily: '$body',\n  fontSize: '$3',\n  color: '$text',\n  paddingBottom: 32,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n  margin: 0,\n})\n", "import { styled } from '~styles'\n\nexport const IconButton = styled('button', {\n  position: 'relative',\n  height: '32px',\n  width: '32px',\n  backgroundColor: '$panel',\n  borderRadius: '4px',\n  padding: '0',\n  margin: '0',\n  outline: 'none',\n  border: 'none',\n  pointerEvents: 'all',\n  fontSize: '$0',\n  color: '$text',\n  cursor: 'pointer',\n  display: 'grid',\n  alignItems: 'center',\n  justifyContent: 'center',\n\n  '& > *': {\n    gridRow: 1,\n    gridColumn: 1,\n  },\n\n  '&:disabled': {\n    opacity: '0.5',\n  },\n\n  '& > span': {\n    width: '100%',\n    height: '100%',\n    display: 'flex',\n    alignItems: 'center',\n  },\n\n  variants: {\n    bp: {\n      mobile: {\n        backgroundColor: 'transparent',\n      },\n      small: {\n        '&:hover:not(:disabled)': {\n          backgroundColor: '$hover',\n        },\n      },\n    },\n    size: {\n      small: {\n        height: 32,\n        width: 32,\n        '& svg:nth-of-type(1)': {\n          height: '16px',\n          width: '16px',\n        },\n      },\n      medium: {\n        height: 44,\n        width: 44,\n        '& svg:nth-of-type(1)': {\n          height: '18px',\n          width: '18px',\n        },\n      },\n      large: {\n        height: 44,\n        width: 44,\n        '& svg:nth-of-type(1)': {\n          height: '20px',\n          width: '20px',\n        },\n      },\n    },\n    isActive: {\n      true: {\n        color: '$selected',\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { HamburgerMenuIcon } from '@radix-ui/react-icons'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { useTldrawApp } from '~hooks'\nimport { PreferencesMenu } from '../PreferencesMenu'\nimport {\n  DMItem,\n  DMContent,\n  DMDivider,\n  DMSubMenu,\n  DMTriggerIcon,\n} from '~components/Primitives/DropdownMenu'\nimport { useFileSystemHandlers } from '~hooks'\nimport { preventEvent } from '~components/preventEvent'\nimport { TDExportType, TDSnapshot } from '~types'\nimport { Divider } from '~components/Primitives/Divider'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\ninterface MenuProps {\n  readOnly: boolean\n}\n\nconst numberOfSelectedIdsSelector = (s: TDSnapshot) => {\n  return s.document.pageStates[s.appState.currentPageId].selectedIds.length\n}\n\nconst disableAssetsSelector = (s: TDSnapshot) => {\n  return s.appState.disableAssets\n}\n\nexport const Menu = React.memo(function Menu({ readOnly }: MenuProps) {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const numberOfSelectedIds = app.useStore(numberOfSelectedIdsSelector)\n\n  const disableAssets = app.useStore(disableAssetsSelector)\n\n  const [_, setForce] = React.useState(0)\n\n  React.useEffect(() => setForce(1), [])\n\n  const { onNewProject, onOpenProject, onSaveProject, onSaveProjectAs } = useFileSystemHandlers()\n\n  const handleDelete = React.useCallback(() => {\n    app.delete()\n  }, [app])\n\n  const handleCopySVG = React.useCallback(() => {\n    app.copyImage(TDExportType.SVG, { scale: 1, quality: 1, transparentBackground: false })\n  }, [app])\n\n  const handleCopyPNG = React.useCallback(() => {\n    app.copyImage(TDExportType.PNG, { scale: 2, quality: 1, transparentBackground: true })\n  }, [app])\n\n  const handleExportPNG = React.useCallback(async () => {\n    app.exportImage(TDExportType.PNG, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportJPG = React.useCallback(async () => {\n    app.exportImage(TDExportType.JPG, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportWEBP = React.useCallback(async () => {\n    app.exportImage(TDExportType.WEBP, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportSVG = React.useCallback(async () => {\n    app.exportImage(TDExportType.SVG, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleCopyJSON = React.useCallback(async () => {\n    app.copyJson()\n  }, [app])\n\n  const handleExportJSON = React.useCallback(async () => {\n    app.exportJson()\n  }, [app])\n\n  const handleCut = React.useCallback(() => {\n    app.cut()\n  }, [app])\n\n  const handleCopy = React.useCallback(() => {\n    app.copy()\n  }, [app])\n\n  const handlePaste = React.useCallback(() => {\n    app.paste()\n  }, [app])\n\n  const handleSelectAll = React.useCallback(() => {\n    app.selectAll()\n  }, [app])\n\n  const handleSelectNone = React.useCallback(() => {\n    app.selectNone()\n  }, [app])\n\n  const handleUploadMedia = React.useCallback(() => {\n    app.openAsset()\n  }, [app])\n\n  const handleZoomTo100 = React.useCallback(() => {\n    app.zoomTo(1)\n  }, [app])\n\n  const showFileMenu =\n    app.callbacks.onNewProject ||\n    app.callbacks.onOpenProject ||\n    app.callbacks.onSaveProject ||\n    app.callbacks.onSaveProjectAs ||\n    app.callbacks.onExport\n\n  const hasSelection = numberOfSelectedIds > 0\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DMTriggerIcon id=\"TD-MenuIcon\">\n        <HamburgerMenuIcon />\n      </DMTriggerIcon>\n      <DMContent variant=\"menu\" id=\"TD-Menu\">\n        {showFileMenu && (\n          <DMSubMenu label={`${intl.formatMessage({ id: 'menu.file' })}...`} id=\"TD-MenuItem-File\">\n            {app.callbacks.onNewProject && (\n              <DMItem onClick={onNewProject} kbd=\"#N\" id=\"TD-MenuItem-File-New_Project\">\n                <FormattedMessage id=\"new.project\" />\n              </DMItem>\n            )}\n            {app.callbacks.onOpenProject && (\n              <DMItem onClick={onOpenProject} kbd=\"#O\" id=\"TD-MenuItem-File-Open\">\n                <FormattedMessage id=\"open\" />\n                ...\n              </DMItem>\n            )}\n            {app.callbacks.onSaveProject && (\n              <DMItem onClick={onSaveProject} kbd=\"#S\" id=\"TD-MenuItem-File-Save\">\n                <FormattedMessage id=\"save\" />\n              </DMItem>\n            )}\n            {app.callbacks.onSaveProjectAs && (\n              <DMItem onClick={onSaveProjectAs} kbd=\"#\u21E7S\" id=\"TD-MenuItem-File-Save_As\">\n                <FormattedMessage id=\"save.as\" />\n                ...\n              </DMItem>\n            )}\n            {!disableAssets && (\n              <>\n                <Divider />\n                <DMItem onClick={handleUploadMedia} kbd=\"#U\" id=\"TD-MenuItem-File-Upload_Media\">\n                  <FormattedMessage id=\"upload.media\" />\n                </DMItem>\n              </>\n            )}\n          </DMSubMenu>\n        )}\n        <DMSubMenu label={`${intl.formatMessage({ id: 'menu.edit' })}...`} id=\"TD-MenuItem-Edit\">\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.undo}\n            disabled={readOnly}\n            kbd=\"#Z\"\n            id=\"TD-MenuItem-Edit-Undo\"\n          >\n            <FormattedMessage id=\"undo\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.redo}\n            disabled={readOnly}\n            kbd=\"#\u21E7Z\"\n            id=\"TD-MenuItem-Edit-Redo\"\n          >\n            <FormattedMessage id=\"redo\" />\n          </DMItem>\n          <Divider />\n          <DMItem\n            onSelect={preventEvent}\n            disabled={!hasSelection || readOnly}\n            onClick={handleCut}\n            kbd=\"#X\"\n            id=\"TD-MenuItem-Edit-Cut\"\n          >\n            <FormattedMessage id=\"cut\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            disabled={!hasSelection}\n            onClick={handleCopy}\n            kbd=\"#C\"\n            id=\"TD-MenuItem-Edit-Copy\"\n          >\n            <FormattedMessage id=\"copy\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={handlePaste}\n            kbd=\"#V\"\n            id=\"TD-MenuItem-Edit-Paste\"\n          >\n            <FormattedMessage id=\"paste\" />\n          </DMItem>\n          <Divider />\n          <DMSubMenu\n            label={`${intl.formatMessage({ id: 'copy.as' })}...`}\n            size=\"small\"\n            id=\"TD-MenuItem-Copy-As\"\n          >\n            <DMItem onClick={handleCopySVG} id=\"TD-MenuItem-Copy-as-SVG\">\n              SVG\n            </DMItem>\n            <DMItem onClick={handleCopyPNG} id=\"TD-MenuItem-Copy-As-PNG\">\n              PNG\n            </DMItem>\n            <DMItem onClick={handleCopyJSON} id=\"TD-MenuItem-Copy_as_JSON\">\n              JSON\n            </DMItem>\n          </DMSubMenu>\n          <DMSubMenu\n            label={`${intl.formatMessage({ id: 'export.as' })}...`}\n            size=\"small\"\n            id=\"TD-MenuItem-Export\"\n          >\n            <DMItem onClick={handleExportSVG} id=\"TD-MenuItem-Export-SVG\">\n              SVG\n            </DMItem>\n            <DMItem onClick={handleExportPNG} id=\"TD-MenuItem-Export-PNG\">\n              PNG\n            </DMItem>\n            <DMItem onClick={handleExportJPG} id=\"TD-MenuItem-Export-JPG\">\n              JPG\n            </DMItem>\n            <DMItem onClick={handleExportWEBP} id=\"TD-MenuItem-Export-WEBP\">\n              WEBP\n            </DMItem>\n            <DMItem onClick={handleExportJSON} id=\"TD-MenuItem-Export-JSON\">\n              JSON\n            </DMItem>\n          </DMSubMenu>\n\n          <Divider />\n          <DMItem\n            onSelect={preventEvent}\n            onClick={handleSelectAll}\n            kbd=\"#A\"\n            id=\"TD-MenuItem-Select_All\"\n          >\n            <FormattedMessage id=\"select.all\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            disabled={!hasSelection}\n            onClick={handleSelectNone}\n            id=\"TD-MenuItem-Select_None\"\n          >\n            <FormattedMessage id=\"select.none\" />\n          </DMItem>\n          <Divider />\n          <DMItem onSelect={handleDelete} disabled={!hasSelection} kbd=\"\u232B\" id=\"TD-MenuItem-Delete\">\n            <FormattedMessage id=\"delete\" />\n          </DMItem>\n        </DMSubMenu>\n        <DMSubMenu label={intl.formatMessage({ id: 'menu.view' })} id=\"TD-MenuItem-Edit\">\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomIn}\n            kbd=\"#+\"\n            id=\"TD-MenuItem-View-ZoomIn\"\n          >\n            <FormattedMessage id=\"zoom.in\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomOut}\n            kbd=\"#-\"\n            id=\"TD-MenuItem-View-ZoomOut\"\n          >\n            <FormattedMessage id=\"zoom.out\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={handleZoomTo100}\n            kbd=\"\u21E7+0\"\n            id=\"TD-MenuItem-View-ZoomTo100\"\n          >\n            <FormattedMessage id=\"zoom.to\" /> 100%\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomToFit}\n            kbd=\"\u21E7+1\"\n            id=\"TD-MenuItem-View-ZoomToFit\"\n          >\n            <FormattedMessage id=\"zoom.to.fit\" />\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomToSelection}\n            kbd=\"\u21E7+2\"\n            id=\"TD-MenuItem-View-ZoomToSelection\"\n          >\n            <FormattedMessage id=\"zoom.to.selection\" />\n          </DMItem>\n        </DMSubMenu>\n        <Divider />\n        <PreferencesMenu />\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n", "import * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { DMCheckboxItem, DMDivider, DMSubMenu } from '~components/Primitives/DropdownMenu'\nimport { useTldrawApp } from '~hooks'\nimport { TDDockPosition, TDExportBackground, TDSnapshot } from '~types'\nimport { styled } from '~styles'\nimport { Divider } from '~components/Primitives/Divider'\n\nconst settingsSelector = (s: TDSnapshot) => s.settings\n\nconst DockPosition = ['bottom', 'left', 'right', 'top']\n\nexport function PreferencesMenu() {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const settings = app.useStore(settingsSelector)\n\n  const toggleDebugMode = React.useCallback(() => {\n    app.setSetting('isDebugMode', (v) => !v)\n  }, [app])\n\n  const toggleDarkMode = React.useCallback(() => {\n    app.setSetting('isDarkMode', (v) => !v)\n  }, [app])\n\n  const toggleFocusMode = React.useCallback(() => {\n    app.setSetting('isFocusMode', (v) => !v)\n  }, [app])\n\n  const toggleRotateHandle = React.useCallback(() => {\n    app.setSetting('showRotateHandles', (v) => !v)\n  }, [app])\n\n  const toggleGrid = React.useCallback(() => {\n    app.setSetting('showGrid', (v) => !v)\n  }, [app])\n\n  const toggleBoundShapesHandle = React.useCallback(() => {\n    app.setSetting('showBindingHandles', (v) => !v)\n  }, [app])\n\n  const toggleisSnapping = React.useCallback(() => {\n    app.setSetting('isSnapping', (v) => !v)\n  }, [app])\n\n  const toggleKeepStyleMenuOpen = React.useCallback(() => {\n    app.setSetting('keepStyleMenuOpen', (v) => !v)\n  }, [app])\n\n  const toggleCloneControls = React.useCallback(() => {\n    app.setSetting('showCloneHandles', (v) => !v)\n  }, [app])\n\n  const toggleCadSelectMode = React.useCallback(() => {\n    app.setSetting('isCadSelectMode', (v) => !v)\n  }, [app])\n\n  const handleChangeDockPosition = React.useCallback(\n    (position: TDDockPosition) => {\n      app.setSetting('dockPosition', position)\n    },\n    [app]\n  )\n\n  const selectExportBackground = React.useCallback(\n    (background: TDExportBackground) => {\n      app.setSetting('exportBackground', background)\n    },\n    [app]\n  )\n\n  return (\n    <DMSubMenu label={intl.formatMessage({ id: 'menu.preferences' })} id=\"TD-MenuItem-Preferences\">\n      <DMCheckboxItem\n        checked={settings.isDarkMode}\n        onCheckedChange={toggleDarkMode}\n        kbd=\"#\u21E7D\"\n        id=\"TD-MenuItem-Preferences-Dark_Mode\"\n      >\n        <FormattedMessage id=\"preferences.dark.mode\" />\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isFocusMode}\n        onCheckedChange={toggleFocusMode}\n        kbd=\"#.\"\n        id=\"TD-MenuItem-Preferences-Focus_Mode\"\n      >\n        <FormattedMessage id=\"preferences.focus.mode\" />\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isDebugMode}\n        onCheckedChange={toggleDebugMode}\n        id=\"TD-MenuItem-Preferences-Debug_Mode\"\n      >\n        <FormattedMessage id=\"preferences.debug.mode\" />\n      </DMCheckboxItem>\n      <Divider />\n      <DMCheckboxItem\n        checked={settings.showGrid}\n        onCheckedChange={toggleGrid}\n        kbd=\"#\u21E7G\"\n        id=\"TD-MenuItem-Preferences-Grid\"\n      >\n        <FormattedMessage id=\"preferences.show.grid\" />\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isCadSelectMode}\n        onCheckedChange={toggleCadSelectMode}\n        id=\"TD-MenuItem-Preferences-Cad_Selection\"\n      >\n        <FormattedMessage id=\"preferences.use.cad.selection\" />\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.keepStyleMenuOpen}\n        onCheckedChange={toggleKeepStyleMenuOpen}\n        id=\"TD-MenuItem-Preferences-Style_menu\"\n      >\n        <FormattedMessage id=\"preferences.keep.stylemenu.open\" />\n      </DMCheckboxItem>\n      <DMSubMenu label={intl.formatMessage({ id: 'dock.position' })} overflow={false}>\n        {DockPosition.map((position) => (\n          <DMCheckboxItem\n            key={position}\n            checked={settings.dockPosition === position}\n            onCheckedChange={() => handleChangeDockPosition(position as TDDockPosition)}\n            id={`TD-MenuItem-DockPosition-${position}`}\n          >\n            <StyledText>\n              <FormattedMessage id={position} />\n            </StyledText>\n          </DMCheckboxItem>\n        ))}\n      </DMSubMenu>\n      <DMSubMenu label={intl.formatMessage({ id: 'export.background' })} overflow={false}>\n        {Object.values(TDExportBackground).map((exportBackground) => (\n          <DMCheckboxItem\n            key={exportBackground}\n            checked={settings.exportBackground === exportBackground}\n            onCheckedChange={() => selectExportBackground(exportBackground as TDExportBackground)}\n            id={`TD-MenuItem-ExportBackground-${exportBackground}`}\n          >\n            <StyledText>\n              <FormattedMessage id={exportBackground as string} />\n            </StyledText>\n          </DMCheckboxItem>\n        ))}\n      </DMSubMenu>\n    </DMSubMenu>\n  )\n}\n\nconst StyledText = styled('span', {\n  textTransform: 'capitalize',\n})\n", "import * as React from 'react'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { PlusIcon, CheckIcon } from '@radix-ui/react-icons'\nimport { PageOptionsDialog } from '../PageOptionsDialog'\nimport { styled } from '~styles'\nimport { useTldrawApp } from '~hooks'\nimport type { TDSnapshot } from '~types'\nimport { DMContent, DMDivider } from '~components/Primitives/DropdownMenu'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\n\nconst sortedSelector = (s: TDSnapshot) =>\n  Object.values(s.document.pages).sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n\nconst currentPageNameSelector = (s: TDSnapshot) => s.document.pages[s.appState.currentPageId].name\n\nconst currentPageIdSelector = (s: TDSnapshot) => s.document.pages[s.appState.currentPageId].id\n\nexport function PageMenu() {\n  const app = useTldrawApp()\n\n  const rIsOpen = React.useRef(false)\n\n  const [isOpen, setIsOpen] = React.useState(false)\n\n  React.useEffect(() => {\n    if (rIsOpen.current !== isOpen) {\n      rIsOpen.current = isOpen\n    }\n  }, [isOpen])\n\n  const handleClose = React.useCallback(() => {\n    setIsOpen(false)\n  }, [setIsOpen])\n\n  const handleOpenChange = React.useCallback(\n    (isOpen: boolean) => {\n      if (rIsOpen.current !== isOpen) {\n        setIsOpen(isOpen)\n      }\n    },\n    [setIsOpen]\n  )\n  const currentPageName = app.useStore(currentPageNameSelector)\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\" open={isOpen} onOpenChange={handleOpenChange}>\n      <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-Page\">\n        <ToolButton variant=\"text\">{currentPageName || 'Page'}</ToolButton>\n      </DropdownMenu.Trigger>\n      <DMContent variant=\"menu\" align=\"start\">\n        {isOpen && <PageMenuContent onClose={handleClose} />}\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n}\n\nfunction PageMenuContent({ onClose }: { onClose: () => void }) {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const sortedPages = app.useStore(sortedSelector)\n\n  const currentPageId = app.useStore(currentPageIdSelector)\n\n  const handleCreatePage = React.useCallback(() => {\n    const pageName =\n      intl.formatMessage({ id: 'page' }) + ' ' + (Object.keys(app.document.pages).length + 1)\n    app.createPage(undefined, pageName)\n  }, [app])\n\n  const handleChangePage = React.useCallback(\n    (id: string) => {\n      onClose()\n      app.changePage(id)\n    },\n    [app]\n  )\n\n  const [dragId, setDragId] = React.useState<null | string>(null)\n\n  const [dropIndex, setDropIndex] = React.useState<null | number>(null)\n\n  const handleDragStart = React.useCallback((ev: React.DragEvent<HTMLDivElement>) => {\n    setDragId(ev.currentTarget.id)\n    setDropIndex(sortedPages.findIndex((p) => p.id === ev.currentTarget.id))\n    ev.dataTransfer.effectAllowed = 'move'\n  }, [])\n\n  const handleDrag = React.useCallback(\n    (ev: React.DragEvent<HTMLDivElement>) => {\n      ev.preventDefault()\n\n      let dropIndex = sortedPages.findIndex((p) => p.id === ev.currentTarget.id)\n\n      const rect = ev.currentTarget.getBoundingClientRect()\n      const ny = (ev.clientY - rect.top) / rect.height\n\n      dropIndex = ny < 0.5 ? dropIndex : dropIndex + 1\n\n      setDropIndex(dropIndex)\n    },\n    [dragId, sortedPages]\n  )\n\n  const handleDrop = React.useCallback(() => {\n    if (dragId !== null && dropIndex !== null) {\n      app.movePage(dragId, dropIndex)\n    }\n\n    setDragId(null)\n    setDropIndex(null)\n  }, [dragId, dropIndex])\n\n  return (\n    <>\n      <DropdownMenu.RadioGroup dir=\"ltr\" value={currentPageId} onValueChange={handleChangePage}>\n        {sortedPages.map((page, i) => (\n          <ButtonWithOptions\n            key={page.id}\n            isDropAbove={i === dropIndex && i === 0}\n            isDropBelow={dropIndex !== null && i === dropIndex - 1}\n          >\n            <DropdownMenu.RadioItem\n              title={page.name || 'Page'}\n              value={page.id}\n              key={page.id}\n              id={page.id}\n              asChild\n              onDragOver={handleDrag}\n              onDragStart={handleDragStart}\n              // onDrag={handleDrag}\n              onDrop={handleDrop}\n              draggable={true}\n            >\n              <PageButton>\n                <span id={page.id}>{page.name || 'Page'}</span>\n                <DropdownMenu.ItemIndicator>\n                  <SmallIcon>\n                    <CheckIcon />\n                  </SmallIcon>\n                </DropdownMenu.ItemIndicator>\n              </PageButton>\n            </DropdownMenu.RadioItem>\n            <PageOptionsDialog page={page} onClose={onClose} />\n          </ButtonWithOptions>\n        ))}\n      </DropdownMenu.RadioGroup>\n      <Divider />\n      <DropdownMenu.Item onSelect={handleCreatePage} asChild>\n        <RowButton>\n          <span>\n            <FormattedMessage id=\"create.page\" />\n          </span>\n          <SmallIcon>\n            <PlusIcon />\n          </SmallIcon>\n        </RowButton>\n      </DropdownMenu.Item>\n    </>\n  )\n}\n\nconst ButtonWithOptions = styled('div', {\n  position: 'relative',\n  display: 'grid',\n  gridTemplateColumns: '1fr auto',\n  gridAutoFlow: 'column',\n  margin: 0,\n\n  '& > *[data-shy=\"true\"]': {\n    opacity: 0,\n  },\n\n  '&:hover > *[data-shy=\"true\"]': {\n    opacity: 1,\n  },\n\n  variants: {\n    isDropAbove: {\n      true: {\n        '&::after': {\n          content: '',\n          display: 'block',\n          position: 'absolute',\n          top: 0,\n          width: '100%',\n          height: '1px',\n          backgroundColor: '$selected',\n          zIndex: 999,\n          pointerEvents: 'none',\n        },\n      },\n    },\n    isDropBelow: {\n      true: {\n        '&::after': {\n          content: '',\n          display: 'block',\n          position: 'absolute',\n          width: '100%',\n          height: '1px',\n          top: '100%',\n          backgroundColor: '$selected',\n          zIndex: 999,\n          pointerEvents: 'none',\n        },\n      },\n    },\n  },\n})\n\nexport const PageButton = styled(RowButton, {\n  minWidth: 128,\n})\n", "import * as React from 'react'\nimport * as Dialog from '@radix-ui/react-alert-dialog'\nimport { MixerVerticalIcon, Pencil1Icon } from '@radix-ui/react-icons'\nimport type { TDSnapshot, TDPage } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { styled } from '~styles'\nimport { Divider } from '~components/Primitives/Divider'\nimport { IconButton } from '~components/Primitives/IconButton/IconButton'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { breakpoints } from '~components/breakpoints'\nimport { TextField } from '~components/Primitives/TextField'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nconst canDeleteSelector = (s: TDSnapshot) => {\n  return Object.keys(s.document.pages).length > 1\n}\n\ninterface PageOptionsDialogProps {\n  page: TDPage\n  onOpen?: () => void\n  onClose?: () => void\n}\n\nexport function PageOptionsDialog({ page, onOpen, onClose }: PageOptionsDialogProps) {\n  const app = useTldrawApp()\n  const intl = useIntl()\n\n  const [isOpen, setIsOpen] = React.useState(false)\n  const [pageName, setPageName] = React.useState(page.name || 'Page')\n\n  const canDelete = app.useStore(canDeleteSelector)\n\n  const rInput = React.useRef<HTMLInputElement>(null)\n\n  const handleClose = React.useCallback(() => {\n    setIsOpen(false)\n  }, [])\n\n  const handleDuplicate = React.useCallback(() => {\n    app.duplicatePage(page.id)\n  }, [app])\n\n  const handleDelete = React.useCallback(() => {\n    if (window.confirm(`Are you sure you want to delete this page?`)) {\n      app.deletePage(page.id)\n    }\n  }, [app])\n\n  const handleOpenChange = React.useCallback(\n    (isOpen: boolean) => {\n      setIsOpen(isOpen)\n\n      if (isOpen) {\n        onOpen?.()\n        return\n      }\n    },\n    [app]\n  )\n\n  function stopPropagation(e: React.KeyboardEvent<HTMLDivElement>) {\n    e.stopPropagation()\n  }\n\n  const rInitialName = React.useRef(page.name || 'Page')\n  const rCurrentName = React.useRef(rInitialName.current)\n\n  const handleTextFieldChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n    const value = event.target.value.trimStart()\n    rCurrentName.current = value\n    setPageName(value)\n  }, [])\n\n  const handleTextFieldKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n    switch (e.key) {\n      case 'Enter': {\n        if (rCurrentName.current === rInitialName.current) {\n          setIsOpen(false)\n        } else {\n          rInitialName.current = rCurrentName.current\n          app.renamePage(page.id, rCurrentName.current.trim())\n        }\n\n        break\n      }\n      case 'Escape': {\n        // If the name hasn't changed, close the menu\n        if (rCurrentName.current === rInitialName.current) {\n          setIsOpen(false)\n          return\n        }\n\n        // If the name has changed, revert the change\n        rCurrentName.current = rInitialName.current\n        setPageName(rInitialName.current)\n\n        // ...and refocus the input\n        requestAnimationFrame(() => {\n          const elm = rInput.current\n          if (elm) {\n            elm.focus()\n            elm.setSelectionRange(0, elm.value.length)\n          }\n        })\n        break\n      }\n    }\n  }, [])\n\n  const rWasOpen = React.useRef(false)\n\n  React.useEffect(() => {\n    if (isOpen) {\n      rWasOpen.current = true\n      rInitialName.current = page.name || 'Page'\n      rCurrentName.current = rInitialName.current\n\n      requestAnimationFrame(() => {\n        const elm = rInput.current\n        if (elm) {\n          elm.focus()\n          elm.setSelectionRange(0, elm.value.length)\n        }\n      })\n    } else if (rWasOpen.current) {\n      onClose?.()\n    }\n\n    return () => {\n      if (rCurrentName.current !== rInitialName.current) {\n        rInitialName.current = rCurrentName.current\n        app.renamePage(page.id, rCurrentName.current)\n      }\n    }\n  }, [isOpen])\n\n  return (\n    <Dialog.Root open={isOpen} onOpenChange={handleOpenChange}>\n      <Dialog.Trigger asChild data-shy=\"true\">\n        <IconButton bp={breakpoints}>\n          <SmallIcon>\n            <MixerVerticalIcon />\n          </SmallIcon>\n        </IconButton>\n      </Dialog.Trigger>\n      <Dialog.Portal\n      // container={the current app's tl-container}\n      >\n        <StyledDialogOverlay onPointerDown={handleClose} />\n        <StyledDialogContent dir=\"ltr\" onKeyDown={stopPropagation} onKeyUp={stopPropagation}>\n          <TextField\n            ref={rInput}\n            placeholder={intl.formatMessage({ id: 'page.name' })}\n            value={pageName}\n            onChange={handleTextFieldChange}\n            onKeyDown={handleTextFieldKeyDown}\n            icon={<Pencil1Icon />}\n          />\n          <Divider />\n          <DialogAction onSelect={handleDuplicate}>\n            <FormattedMessage id=\"duplicate\" />\n          </DialogAction>\n          <DialogAction disabled={!canDelete} onSelect={handleDelete}>\n            <FormattedMessage id=\"delete\" />\n          </DialogAction>\n          <Divider />\n          <Dialog.Cancel asChild>\n            <RowButton>\n              <FormattedMessage id=\"cancel\" />\n            </RowButton>\n          </Dialog.Cancel>\n        </StyledDialogContent>\n      </Dialog.Portal>\n    </Dialog.Root>\n  )\n}\n\n/* -------------------------------------------------- */\n/*                       Dialog                       */\n/* -------------------------------------------------- */\n\nexport const StyledDialogContent = styled(Dialog.Content, {\n  position: 'fixed',\n  top: '50%',\n  left: '50%',\n  transform: 'translate(-50%, -50%)',\n  minWidth: 240,\n  maxWidth: 'fit-content',\n  maxHeight: '85vh',\n  marginTop: '-5vh',\n  pointerEvents: 'all',\n  backgroundColor: '$panel',\n  padding: '$1',\n  borderRadius: '$2',\n  font: '$ui',\n  '&:focus': {\n    outline: 'none',\n  },\n})\n\nexport const StyledDialogOverlay = styled(Dialog.Overlay, {\n  backgroundColor: 'rgba(0, 0, 0, .15)',\n  position: 'fixed',\n  pointerEvents: 'all',\n  inset: 0,\n})\n\nfunction DialogAction({\n  onSelect,\n  ...rest\n}: RowButtonProps & { onSelect: (e: React.SyntheticEvent<HTMLButtonElement, Event>) => void }) {\n  return (\n    <Dialog.Action asChild onClick={onSelect} onSelect={onSelect}>\n      <RowButton {...rest} />\n    </Dialog.Action>\n  )\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { SmallIcon } from '../SmallIcon'\n\nexport interface TextFieldProps extends React.HTMLProps<HTMLInputElement> {\n  icon?: React.ReactElement\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n  ({ icon, ...rest }, ref) => {\n    return (\n      <StyledInputWrapper>\n        <StyledInput {...rest} ref={ref} />\n        {icon ? <StyledInputIcon>{icon}</StyledInputIcon> : null}\n      </StyledInputWrapper>\n    )\n  }\n)\n\nconst StyledInputWrapper = styled('div', {\n  position: 'relative',\n  width: '100%',\n  height: 'min-content',\n})\n\nconst StyledInput = styled('input', {\n  color: '$text',\n  border: 'none',\n  textAlign: 'left',\n  width: '100%',\n  paddingLeft: '$3',\n  paddingRight: '$6',\n  backgroundColor: '$background',\n\n  height: '32px',\n  outline: 'none',\n  fontFamily: '$ui',\n  fontSize: '$1',\n  '&:focus': {\n    backgroundColor: '$hover',\n  },\n  borderRadius: '$2',\n})\n\nconst StyledInputIcon = styled(SmallIcon, {\n  top: 0,\n  right: 0,\n  position: 'absolute',\n  paddingLeft: '$3',\n  paddingRight: '$3',\n  pointerEvents: 'none',\n  color: '$text',\n})\n", "import * as React from 'react'\nimport { useTldrawApp } from '~hooks'\nimport type { TDSnapshot } from '~types'\nimport { styled } from '~styles'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { DMItem, DMContent } from '~components/Primitives/DropdownMenu'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { preventEvent } from '~components/preventEvent'\nimport { FormattedMessage } from 'react-intl'\n\nconst zoomSelector = (s: TDSnapshot) => s.document.pageStates[s.appState.currentPageId].camera.zoom\n\nexport const ZoomMenu = React.memo(function ZoomMenu() {\n  const app = useTldrawApp()\n\n  const zoom = app.useStore(zoomSelector)\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-Zoom\">\n        <FixedWidthToolButton onDoubleClick={app.resetZoom} variant=\"text\">\n          {Math.round(zoom * 100)}%\n        </FixedWidthToolButton>\n      </DropdownMenu.Trigger>\n      <DMContent align=\"end\">\n        <DMItem onSelect={preventEvent} onClick={app.zoomIn} kbd=\"#+\" id=\"TD-Zoom-Zoom_In\">\n          <FormattedMessage id=\"zoom.in\" />\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.zoomOut} kbd=\"#\u2212\" id=\"TD-Zoom-Zoom_Out\">\n          <FormattedMessage id=\"zoom.out\" />\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.resetZoom} kbd=\"\u21E70\" id=\"TD-Zoom-Zoom_To_100%\">\n          <FormattedMessage id=\"zoom.to\" /> 100%\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.zoomToFit} kbd=\"\u21E71\" id=\"TD-Zoom-To_Fit\">\n          <FormattedMessage id=\"zoom.to.fit\" />\n        </DMItem>\n        <DMItem\n          onSelect={preventEvent}\n          onClick={app.zoomToSelection}\n          kbd=\"\u21E72\"\n          id=\"TD-Zoom-To_Selection\"\n        >\n          <FormattedMessage id=\"zoom.to.selection\" />\n        </DMItem>\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n\nconst FixedWidthToolButton = styled(ToolButton, {\n  minWidth: 56,\n})\n", "import * as React from 'react'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { strokes, fills, defaultTextStyle } from '~state/shapes/shared/shape-styles'\nimport { FormattedMessage } from 'react-intl'\nimport { useTldrawApp } from '~hooks'\nimport {\n  DMCheckboxItem,\n  DMContent,\n  DMDivider,\n  DMRadioItem,\n} from '~components/Primitives/DropdownMenu'\nimport {\n  CircleIcon,\n  DashDashedIcon,\n  DashDottedIcon,\n  DashDrawIcon,\n  DashSolidIcon,\n  SizeLargeIcon,\n  SizeMediumIcon,\n  SizeSmallIcon,\n} from '~components/Primitives/icons'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport {\n  TDSnapshot,\n  ColorStyle,\n  DashStyle,\n  SizeStyle,\n  ShapeStyles,\n  FontStyle,\n  AlignStyle,\n  TDShapeType,\n} from '~types'\nimport { styled } from '~styles'\nimport { breakpoints } from '~components/breakpoints'\nimport { Divider } from '~components/Primitives/Divider'\nimport { preventEvent } from '~components/preventEvent'\nimport {\n  TextAlignCenterIcon,\n  TextAlignJustifyIcon,\n  TextAlignLeftIcon,\n  TextAlignRightIcon,\n} from '@radix-ui/react-icons'\n\nconst currentStyleSelector = (s: TDSnapshot) => s.appState.currentStyle\nconst selectedIdsSelector = (s: TDSnapshot) =>\n  s.document.pageStates[s.appState.currentPageId].selectedIds\n\nconst STYLE_KEYS = Object.keys(defaultTextStyle) as (keyof ShapeStyles)[]\n\nconst DASH_ICONS = {\n  [DashStyle.Draw]: <DashDrawIcon />,\n  [DashStyle.Solid]: <DashSolidIcon />,\n  [DashStyle.Dashed]: <DashDashedIcon />,\n  [DashStyle.Dotted]: <DashDottedIcon />,\n}\n\nconst SIZE_ICONS = {\n  [SizeStyle.Small]: <SizeSmallIcon />,\n  [SizeStyle.Medium]: <SizeMediumIcon />,\n  [SizeStyle.Large]: <SizeLargeIcon />,\n}\n\nconst ALIGN_ICONS = {\n  [AlignStyle.Start]: <TextAlignLeftIcon />,\n  [AlignStyle.Middle]: <TextAlignCenterIcon />,\n  [AlignStyle.End]: <TextAlignRightIcon />,\n  [AlignStyle.Justify]: <TextAlignJustifyIcon />,\n}\n\nconst themeSelector = (s: TDSnapshot) => (s.settings.isDarkMode ? 'dark' : 'light')\n\nconst keepOpenSelector = (s: TDSnapshot) => s.settings.keepStyleMenuOpen\n\nconst optionsSelector = (s: TDSnapshot) => {\n  const { activeTool, currentPageId: pageId } = s.appState\n  switch (activeTool) {\n    case 'select': {\n      const page = s.document.pages[pageId]\n      let hasText = false\n      let hasLabel = false\n      for (const id of s.document.pageStates[pageId].selectedIds) {\n        if ('text' in page.shapes[id]) hasText = true\n        if ('label' in page.shapes[id]) hasLabel = true\n      }\n      return hasText ? 'text' : hasLabel ? 'label' : ''\n    }\n    case TDShapeType.Text: {\n      return 'text'\n    }\n    case TDShapeType.Rectangle: {\n      return 'label'\n    }\n    case TDShapeType.Ellipse: {\n      return 'label'\n    }\n    case TDShapeType.Triangle: {\n      return 'label'\n    }\n    case TDShapeType.Arrow: {\n      return 'label'\n    }\n    case TDShapeType.Line: {\n      return 'label'\n    }\n  }\n\n  return false\n}\n\nexport const StyleMenu = React.memo(function ColorMenu() {\n  const app = useTldrawApp()\n\n  const theme = app.useStore(themeSelector)\n\n  const keepOpen = app.useStore(keepOpenSelector)\n\n  const options = app.useStore(optionsSelector)\n\n  const currentStyle = app.useStore(currentStyleSelector)\n\n  const selectedIds = app.useStore(selectedIdsSelector)\n\n  const [displayedStyle, setDisplayedStyle] = React.useState(currentStyle)\n\n  const rDisplayedStyle = React.useRef(currentStyle)\n\n  React.useEffect(() => {\n    const {\n      appState: { currentStyle },\n      page,\n      selectedIds,\n    } = app\n    let commonStyle = {} as ShapeStyles\n    if (selectedIds.length <= 0) {\n      commonStyle = currentStyle\n    } else {\n      const overrides = new Set<string>([])\n      app.selectedIds\n        .map((id) => page.shapes[id])\n        .forEach((shape) => {\n          STYLE_KEYS.forEach((key) => {\n            if (overrides.has(key)) return\n            if (commonStyle[key] === undefined) {\n              // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n              // @ts-ignore\n              commonStyle[key] = shape.style[key]\n            } else {\n              if (commonStyle[key] === shape.style[key]) return\n              // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n              // @ts-ignore\n              commonStyle[key] = shape.style[key]\n              overrides.add(key)\n            }\n          })\n        })\n    }\n    // Until we can work out the correct logic for deciding whether or not to\n    // update the selected style, do a string comparison. Yuck!\n    if (JSON.stringify(commonStyle) !== JSON.stringify(rDisplayedStyle.current)) {\n      rDisplayedStyle.current = commonStyle\n      setDisplayedStyle(commonStyle)\n    }\n  }, [currentStyle, selectedIds])\n\n  const handleToggleKeepOpen = React.useCallback((checked: boolean) => {\n    app.setSetting('keepStyleMenuOpen', checked)\n  }, [])\n\n  const handleToggleFilled = React.useCallback((checked: boolean) => {\n    app.style({ isFilled: checked })\n  }, [])\n\n  const handleDashChange = React.useCallback((value: string) => {\n    app.style({ dash: value as DashStyle })\n  }, [])\n\n  const handleSizeChange = React.useCallback((value: string) => {\n    app.style({ size: value as SizeStyle })\n  }, [])\n\n  const handleFontChange = React.useCallback((value: string) => {\n    app.style({ font: value as FontStyle })\n  }, [])\n\n  const handleTextAlignChange = React.useCallback((value: string) => {\n    app.style({ textAlign: value as AlignStyle })\n  }, [])\n\n  const handleMenuOpenChange = React.useCallback(\n    (open: boolean) => {\n      app.setMenuOpen(open)\n    },\n    [app]\n  )\n\n  return (\n    <DropdownMenu.Root\n      dir=\"ltr\"\n      onOpenChange={handleMenuOpenChange}\n      open={keepOpen ? true : undefined}\n      modal={false}\n    >\n      <DropdownMenu.Trigger asChild id=\"TD-Styles\">\n        <ToolButton variant=\"text\">\n          <FormattedMessage id=\"styles\" />\n          <OverlapIcons\n            style={{\n              color: strokes[theme][displayedStyle.color as ColorStyle],\n            }}\n          >\n            {displayedStyle.isFilled && (\n              <CircleIcon\n                size={16}\n                stroke=\"none\"\n                fill={fills[theme][displayedStyle.color as ColorStyle]}\n              />\n            )}\n            {DASH_ICONS[displayedStyle.dash]}\n          </OverlapIcons>\n        </ToolButton>\n      </DropdownMenu.Trigger>\n      <DMContent>\n        <StyledRow variant=\"tall\" id=\"TD-Styles-Color-Container\">\n          <span>\n            <FormattedMessage id=\"style.menu.color\" />\n          </span>\n          <ColorGrid>\n            {Object.keys(strokes.light).map((style: string) => (\n              <DropdownMenu.Item\n                key={style}\n                onSelect={preventEvent}\n                asChild\n                id={`TD-Styles-Color-Swatch-${style}`}\n              >\n                <ToolButton\n                  variant=\"icon\"\n                  isActive={displayedStyle.color === style}\n                  onClick={() => app.style({ color: style as ColorStyle })}\n                >\n                  <CircleIcon\n                    size={18}\n                    strokeWidth={2.5}\n                    fill={\n                      displayedStyle.isFilled ? fills[theme][style as ColorStyle] : 'transparent'\n                    }\n                    stroke={strokes.light[style as ColorStyle]}\n                  />\n                </ToolButton>\n              </DropdownMenu.Item>\n            ))}\n          </ColorGrid>\n        </StyledRow>\n        <DMCheckboxItem\n          variant=\"styleMenu\"\n          checked={!!displayedStyle.isFilled}\n          onCheckedChange={handleToggleFilled}\n          id=\"TD-Styles-Fill\"\n        >\n          <FormattedMessage id=\"style.menu.fill\" />\n        </DMCheckboxItem>\n        <StyledRow id=\"TD-Styles-Dash-Container\">\n          <FormattedMessage id=\"style.menu.dash\" />\n          <StyledGroup dir=\"ltr\" value={displayedStyle.dash} onValueChange={handleDashChange}>\n            {Object.values(DashStyle).map((style) => (\n              <DMRadioItem\n                key={style}\n                isActive={style === displayedStyle.dash}\n                value={style}\n                onSelect={preventEvent}\n                bp={breakpoints}\n                id={`TD-Styles-Dash-${style}`}\n              >\n                {DASH_ICONS[style as DashStyle]}\n              </DMRadioItem>\n            ))}\n          </StyledGroup>\n        </StyledRow>\n        <StyledRow id=\"TD-Styles-Size-Container\">\n          <FormattedMessage id=\"style.menu.size\" />\n          <StyledGroup dir=\"ltr\" value={displayedStyle.size} onValueChange={handleSizeChange}>\n            {Object.values(SizeStyle).map((sizeStyle) => (\n              <DMRadioItem\n                key={sizeStyle}\n                isActive={sizeStyle === displayedStyle.size}\n                value={sizeStyle}\n                onSelect={preventEvent}\n                bp={breakpoints}\n                id={`TD-Styles-Dash-${sizeStyle}`}\n              >\n                {SIZE_ICONS[sizeStyle as SizeStyle]}\n              </DMRadioItem>\n            ))}\n          </StyledGroup>\n        </StyledRow>\n        {(options === 'text' || options === 'label') && (\n          <>\n            <Divider />\n            <StyledRow id=\"TD-Styles-Font-Container\">\n              <FormattedMessage id=\"style.menu.font\" />\n              <StyledGroup dir=\"ltr\" value={displayedStyle.font} onValueChange={handleFontChange}>\n                {Object.values(FontStyle).map((fontStyle) => (\n                  <DMRadioItem\n                    key={fontStyle}\n                    isActive={fontStyle === displayedStyle.font}\n                    value={fontStyle}\n                    onSelect={preventEvent}\n                    bp={breakpoints}\n                    id={`TD-Styles-Font-${fontStyle}`}\n                  >\n                    <FontIcon fontStyle={fontStyle}>Aa</FontIcon>\n                  </DMRadioItem>\n                ))}\n              </StyledGroup>\n            </StyledRow>\n            {options === 'text' && (\n              <StyledRow id=\"TD-Styles-Align-Container\">\n                <FormattedMessage id=\"style.menu.align\" />\n                <StyledGroup\n                  dir=\"ltr\"\n                  value={displayedStyle.textAlign}\n                  onValueChange={handleTextAlignChange}\n                >\n                  {Object.values(AlignStyle).map((style) => (\n                    <DMRadioItem\n                      key={style}\n                      isActive={style === displayedStyle.textAlign}\n                      value={style}\n                      onSelect={preventEvent}\n                      bp={breakpoints}\n                      id={`TD-Styles-Align-${style}`}\n                    >\n                      {ALIGN_ICONS[style]}\n                    </DMRadioItem>\n                  ))}\n                </StyledGroup>\n              </StyledRow>\n            )}\n          </>\n        )}\n        <Divider />\n        <DMCheckboxItem\n          variant=\"styleMenu\"\n          checked={keepOpen}\n          onCheckedChange={handleToggleKeepOpen}\n          id=\"TD-Styles-Keep-Open\"\n        >\n          <FormattedMessage id=\"style.menu.keep.open\" />\n        </DMCheckboxItem>\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n\nconst ColorGrid = styled('div', {\n  display: 'grid',\n  gridTemplateColumns: 'repeat(4, auto)',\n  gap: 0,\n})\n\nexport const StyledRow = styled('div', {\n  position: 'relative',\n  width: '100%',\n  background: 'none',\n  border: 'none',\n  cursor: 'pointer',\n  minHeight: '32px',\n  outline: 'none',\n  color: '$text',\n  fontFamily: '$ui',\n  fontWeight: 400,\n  fontSize: '$1',\n  padding: '$2 0 $2 $3',\n  borderRadius: 4,\n  userSelect: 'none',\n  margin: 0,\n  display: 'flex',\n  gap: '$3',\n  flexDirection: 'row',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n  variants: {\n    variant: {\n      tall: {\n        alignItems: 'flex-start',\n        padding: '0 0 0 $3',\n        '& > span': {\n          paddingTop: '$4',\n        },\n      },\n    },\n  },\n})\n\nconst StyledGroup = styled(DropdownMenu.DropdownMenuRadioGroup, {\n  display: 'flex',\n  flexDirection: 'row',\n  gap: '$1',\n})\n\nconst OverlapIcons = styled('div', {\n  display: 'grid',\n  '& > *': {\n    gridColumn: 1,\n    gridRow: 1,\n  },\n})\n\nconst FontIcon = styled('div', {\n  width: 32,\n  height: 32,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  fontSize: '$3',\n  variants: {\n    fontStyle: {\n      [FontStyle.Script]: {\n        fontFamily: 'Caveat Brush',\n      },\n      [FontStyle.Sans]: {\n        fontFamily: 'Recursive',\n      },\n      [FontStyle.Serif]: {\n        fontFamily: 'Georgia',\n      },\n      [FontStyle.Mono]: {\n        fontFamily: 'Recursive Mono',\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { CheckIcon, ClipboardIcon } from '@radix-ui/react-icons'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { useTldrawApp } from '~hooks'\nimport { DMItem, DMContent, DMDivider, DMTriggerIcon } from '~components/Primitives/DropdownMenu'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { TDAssetType, TDSnapshot } from '~types'\nimport { TLDR } from '~state/TLDR'\nimport { Utils } from '@tldraw/core'\nimport { FormattedMessage } from 'react-intl'\nimport { MultiplayerIcon2 } from '~components/Primitives/icons/MultiplayerIcon2'\nimport { Divider } from '~components/Primitives/Divider'\n\nconst roomSelector = (state: TDSnapshot) => state.room\n\nexport const MultiplayerMenu = React.memo(function MultiplayerMenu() {\n  const app = useTldrawApp()\n\n  const room = app.useStore(roomSelector)\n\n  const [copied, setCopied] = React.useState(false)\n\n  const rTimeout = React.useRef<any>(0)\n\n  const handleCopySelect = React.useCallback(() => {\n    setCopied(true)\n    TLDR.copyStringToClipboard(window.location.href)\n    clearTimeout(rTimeout.current)\n    rTimeout.current = setTimeout(() => setCopied(false), 1200)\n  }, [])\n\n  const handleCopyReadOnlySelect = React.useCallback(() => {\n    setCopied(true)\n    const segs = window.location.href.split('/')\n    segs[segs.length - 2] = 'v'\n    segs[segs.length - 1] = Utils.lns(segs[segs.length - 1])\n    TLDR.copyStringToClipboard(segs.join('/'))\n    clearTimeout(rTimeout.current)\n    rTimeout.current = setTimeout(() => setCopied(false), 1200)\n  }, [])\n\n  const handleCreateMultiplayerProject = React.useCallback(async () => {\n    if (app.isDirty) {\n      if (app.fileSystemHandle) {\n        if (window.confirm('Do you want to save changes to your current project?')) {\n          await app.saveProject()\n        }\n      } else {\n        if (window.confirm('Do you want to save your current project?')) {\n          await app.saveProject()\n        }\n      }\n    } else if (!app.fileSystemHandle) {\n      if (window.confirm('Do you want to save your current project?')) {\n        await app.saveProject()\n      }\n    }\n  }, [])\n\n  const handleCopyToMultiplayerProject = React.useCallback(async () => {\n    const nextDocument = Utils.deepClone(app.document)\n\n    app.setIsLoading(true)\n\n    try {\n      if (app.callbacks.onAssetUpload) {\n        for (const id in nextDocument.assets) {\n          const asset = nextDocument.assets[id]\n          if (asset.src.includes('base64')) {\n            const file = dataURLtoFile(\n              asset.src,\n              asset.fileName ?? asset.type === TDAssetType.Video ? 'image.png' : 'image.mp4'\n            )\n            const newSrc = await app.callbacks.onAssetUpload(app, file, id)\n            if (newSrc) {\n              asset.src = newSrc\n            } else {\n              asset.src = ''\n            }\n          }\n        }\n      }\n\n      const result = await fetch(`/api/create`, {\n        method: 'POST',\n        mode: 'no-cors',\n        headers: {\n          'Access-Control-Allow-Origin': '*',\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          roomId: Utils.uniqueId(),\n          pageId: app.currentPageId,\n          document: nextDocument,\n        }),\n      }).then((d) => d.json())\n\n      if (result?.url) {\n        window.location.href = result.url\n      } else {\n        TLDR.warn(result?.message)\n      }\n    } catch (e) {\n      TLDR.warn((e as any).message)\n    }\n\n    app.setIsLoading(false)\n  }, [])\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DMTriggerIcon id=\"TD-MultiplayerMenuIcon\" isActive={!!room}>\n        <MultiplayerIcon2 />\n      </DMTriggerIcon>\n      <DMContent variant=\"menu\" align=\"start\" id=\"TD-MultiplayerMenu\">\n        <DMItem id=\"TD-Multiplayer-CopyInviteLink\" onClick={handleCopySelect} disabled={!room}>\n          <FormattedMessage id=\"copy.invite.link\" />\n          <SmallIcon>{copied ? <CheckIcon /> : <ClipboardIcon />}</SmallIcon>\n        </DMItem>\n        <DMItem\n          id=\"TD-Multiplayer-CopyReadOnlyLink\"\n          onClick={handleCopyReadOnlySelect}\n          disabled={!room}\n        >\n          <FormattedMessage id=\"copy.readonly.link\" />\n          <SmallIcon>{copied ? <CheckIcon /> : <ClipboardIcon />}</SmallIcon>\n        </DMItem>\n        <Divider />\n        <DMItem\n          id=\"TD-Multiplayer-CreateMultiplayerProject\"\n          onClick={handleCreateMultiplayerProject}\n        >\n          <a href=\"https://tldraw.com/r\">\n            <FormattedMessage id=\"create.multiplayer.project\" />\n          </a>\n        </DMItem>\n        <DMItem\n          id=\"TD-Multiplayer-CopyToMultiplayerProject\"\n          onClick={handleCopyToMultiplayerProject}\n        >\n          <FormattedMessage id=\"copy.multiplayer.project\" />\n        </DMItem>\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n\nfunction dataURLtoFile(dataurl: string, filename: string) {\n  const arr = dataurl.split(',')\n  const mime = arr[0]?.match(/:(.*?);/)?.[1]\n  const bstr = window.atob(arr[1])\n  let n = bstr.length\n  const u8arr = new Uint8Array(n)\n\n  while (n--) {\n    u8arr[n] = bstr.charCodeAt(n)\n  }\n\n  return new File([u8arr], filename, { type: mime })\n}\n", "import * as React from 'react'\n\nexport function MultiplayerIcon2() {\n  return (\n    <svg\n      width=\"15\"\n      height=\"15\"\n      viewBox=\"0 0 15 15\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n    >\n      <path d=\"M1.36482 4.71089C1.36482 3.21371 2.57853 2 4.07572 2C5.5729 2 6.78661 3.21371 6.78661 4.71089C6.78661 5.76842 6.18106 6.68452 5.29779 7.13136C5.80465 7.24611 6.26407 7.44186 6.66028 7.73182C7.18674 8.11711 7.57215 8.64722 7.81073 9.30983C7.81452 9.30606 7.81832 9.3023 7.82212 9.29855C8.30448 8.82317 8.91325 8.52463 9.60905 8.37275C8.68812 7.922 8.05394 6.97569 8.05394 5.88126C8.05394 4.35017 9.29513 3.10898 10.8262 3.10898C12.3573 3.10898 13.5985 4.35017 13.5985 5.88126C13.5985 6.97561 12.9644 7.92186 12.0436 8.37265C12.7396 8.52449 13.3486 8.82306 13.831 9.29854C14.5795 10.0361 14.9481 11.1249 14.9481 12.5176C14.9481 12.7799 14.7354 12.9926 14.473 12.9926C14.2107 12.9926 13.9981 12.7799 13.9981 12.5175C13.9981 11.2848 13.6738 10.4774 13.1642 9.97518C12.6532 9.4716 11.8802 9.20024 10.8266 9.20024C9.77294 9.20024 8.99993 9.4716 8.48896 9.97518C7.97939 10.4774 7.65513 11.2848 7.65513 12.5176C7.65513 12.7799 7.44247 12.9926 7.18013 12.9926C6.9178 12.9926 6.70513 12.7799 6.70513 12.5176C6.70513 11.6734 6.84053 10.941 7.11384 10.3307C7.0922 10.2895 7.0763 10.2444 7.06737 10.1962C6.91739 9.38749 6.57392 8.84586 6.09923 8.49845C5.61626 8.14499 4.94481 7.95427 4.07574 7.95427C3.05232 7.95427 2.30368 8.21784 1.80952 8.70485C1.31675 9.19047 1.00176 9.97257 1.00176 11.1702C1.00176 11.4326 0.789093 11.6452 0.526758 11.6452C0.264423 11.6452 0.0517578 11.4326 0.0517578 11.1702C0.0517578 9.81263 0.411052 8.74925 1.14268 8.02821C1.60624 7.57137 2.18892 7.28191 2.85378 7.13142C1.97043 6.68461 1.36482 5.76848 1.36482 4.71089ZM4.07572 2.95C3.1032 2.95 2.31482 3.73838 2.31482 4.71089C2.31482 5.68341 3.1032 6.47178 4.07572 6.47178C5.04823 6.47178 5.83661 5.68341 5.83661 4.71089C5.83661 3.73838 5.04823 2.95 4.07572 2.95ZM10.8262 4.05898C9.8198 4.05898 9.00394 4.87484 9.00394 5.88126C9.00394 6.88768 9.8198 7.70355 10.8262 7.70355C11.8326 7.70355 12.6485 6.88768 12.6485 5.88126C12.6485 4.87484 11.8326 4.05898 10.8262 4.05898Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\nimport { Menu } from './Menu/Menu'\nimport { styled } from '~styles'\nimport { PageMenu } from './PageMenu'\nimport { ZoomMenu } from './ZoomMenu'\nimport { StyleMenu } from './StyleMenu'\nimport { Panel } from '~components/Primitives/Panel'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { UndoIcon } from '~components/Primitives/icons'\nimport { useTldrawApp } from '~hooks'\nimport { MultiplayerMenu } from './MultiplayerMenu'\n\ninterface TopPanelProps {\n  readOnly: boolean\n  showPages: boolean\n  showMenu: boolean\n  showStyles: boolean\n  showZoom: boolean\n  showMultiplayerMenu: boolean\n}\n\nexport function TopPanel({\n  readOnly,\n  showPages,\n  showMenu,\n  showStyles,\n  showZoom,\n  showMultiplayerMenu,\n}: TopPanelProps) {\n  const app = useTldrawApp()\n\n  return (\n    <StyledTopPanel>\n      {(showMenu || showPages) && (\n        <Panel side=\"left\" id=\"TD-MenuPanel\">\n          {showMenu && <Menu readOnly={readOnly} />}\n          {showMultiplayerMenu && <MultiplayerMenu />}\n          {showPages && <PageMenu />}\n        </Panel>\n      )}\n      <StyledSpacer />\n      {(showStyles || showZoom) && (\n        <Panel side=\"right\">\n          {app.readOnly ? (\n            <ReadOnlyLabel>Read Only</ReadOnlyLabel>\n          ) : (\n            <>\n              <ToolButton>\n                <UndoIcon onClick={app.undo} />\n              </ToolButton>\n              <ToolButton>\n                <UndoIcon onClick={app.redo} flipHorizontal />\n              </ToolButton>\n            </>\n          )}\n          {showZoom && <ZoomMenu />}\n          {showStyles && !readOnly && <StyleMenu />}\n        </Panel>\n      )}\n    </StyledTopPanel>\n  )\n}\n\nconst StyledTopPanel = styled('div', {\n  width: '100%',\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  right: 0,\n  display: 'flex',\n  flexDirection: 'row',\n  pointerEvents: 'none',\n  '& > *': {\n    pointerEvents: 'all',\n  },\n})\n\nconst StyledSpacer = styled('div', {\n  flexGrow: 2,\n  pointerEvents: 'none',\n})\n\nconst ReadOnlyLabel = styled('div', {\n  width: '100%',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  fontFamily: '$ui',\n  fontSize: '$1',\n  paddingLeft: '$4',\n  paddingRight: '$1',\n  userSelect: 'none',\n})\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport * as RadixContextMenu from '@radix-ui/react-context-menu'\nimport { useTldrawApp } from '~hooks'\nimport { TDSnapshot, AlignType, DistributeType, StretchType, TDExportType } from '~types'\nimport {\n  AlignBottomIcon,\n  AlignCenterHorizontallyIcon,\n  AlignCenterVerticallyIcon,\n  AlignLeftIcon,\n  AlignRightIcon,\n  AlignTopIcon,\n  SpaceEvenlyHorizontallyIcon,\n  SpaceEvenlyVerticallyIcon,\n  StretchHorizontallyIcon,\n  StretchVerticallyIcon,\n} from '@radix-ui/react-icons'\nimport { Divider } from '~components/Primitives/Divider'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { ToolButton, ToolButtonProps } from '~components/Primitives/ToolButton'\nimport { FormattedMessage, useIntl } from 'react-intl'\n\nconst numberOfSelectedIdsSelector = (s: TDSnapshot) => {\n  return s.document.pageStates[s.appState.currentPageId].selectedIds.length\n}\n\nconst isDebugModeSelector = (s: TDSnapshot) => {\n  return s.settings.isDebugMode\n}\n\nconst hasGroupSelectedSelector = (s: TDSnapshot) => {\n  return s.document.pageStates[s.appState.currentPageId].selectedIds.some(\n    (id) => s.document.pages[s.appState.currentPageId].shapes[id].children !== undefined\n  )\n}\n\nconst preventDefault = (e: Event) => e.stopPropagation()\n\ninterface ContextMenuProps {\n  onBlur?: React.FocusEventHandler\n  children: React.ReactNode\n}\n\nexport const ContextMenu = ({ onBlur, children }: ContextMenuProps) => {\n  return (\n    <RadixContextMenu.Root dir=\"ltr\">\n      <RadixContextMenu.Trigger dir=\"ltr\">{children}</RadixContextMenu.Trigger>\n      <InnerMenu onBlur={onBlur} />\n    </RadixContextMenu.Root>\n  )\n}\n\ninterface InnerContextMenuProps {\n  onBlur?: React.FocusEventHandler\n}\n\nconst InnerMenu = React.memo(function InnerMenu({ onBlur }: InnerContextMenuProps) {\n  const app = useTldrawApp()\n  const intl = useIntl()\n  const numberOfSelectedIds = app.useStore(numberOfSelectedIdsSelector)\n  const isDebugMode = app.useStore(isDebugModeSelector)\n  const hasGroupSelected = app.useStore(hasGroupSelectedSelector)\n\n  const rContent = React.useRef<HTMLDivElement>(null)\n\n  const handleFlipHorizontal = React.useCallback(() => {\n    app.flipHorizontal()\n  }, [app])\n\n  const handleFlipVertical = React.useCallback(() => {\n    app.flipVertical()\n  }, [app])\n\n  const handleDuplicate = React.useCallback(() => {\n    app.duplicate()\n  }, [app])\n\n  const handleLock = React.useCallback(() => {\n    app.toggleLocked()\n  }, [app])\n\n  const handleGroup = React.useCallback(() => {\n    app.group()\n  }, [app])\n\n  const handleMoveToBack = React.useCallback(() => {\n    app.moveToBack()\n  }, [app])\n\n  const handleMoveBackward = React.useCallback(() => {\n    app.moveBackward()\n  }, [app])\n\n  const handleMoveForward = React.useCallback(() => {\n    app.moveForward()\n  }, [app])\n\n  const handleMoveToFront = React.useCallback(() => {\n    app.moveToFront()\n  }, [app])\n\n  const handleDelete = React.useCallback(() => {\n    app.delete()\n  }, [app])\n\n  const handleCut = React.useCallback(() => {\n    app.cut()\n  }, [app])\n\n  const handleCopy = React.useCallback(() => {\n    app.copy()\n  }, [app])\n\n  const handlePaste = React.useCallback(() => {\n    app.paste()\n  }, [app])\n\n  const handleCopySVG = React.useCallback(() => {\n    app.copyImage(TDExportType.SVG, { scale: 1, quality: 1, transparentBackground: false })\n  }, [app])\n\n  const handleCopyPNG = React.useCallback(() => {\n    app.copyImage(TDExportType.PNG, { scale: 2, quality: 1, transparentBackground: true })\n  }, [app])\n\n  const handleUndo = React.useCallback(() => {\n    app.undo()\n  }, [app])\n\n  const handleRedo = React.useCallback(() => {\n    app.redo()\n  }, [app])\n\n  const handleExportPNG = React.useCallback(async () => {\n    app.exportImage(TDExportType.PNG, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportJPG = React.useCallback(async () => {\n    app.exportImage(TDExportType.JPG, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportWEBP = React.useCallback(async () => {\n    app.exportImage(TDExportType.WEBP, { scale: 2, quality: 1 })\n  }, [app])\n\n  const handleExportSVG = React.useCallback(async () => {\n    app.exportImage(TDExportType.SVG, { scale: 1, quality: 1 })\n  }, [app])\n\n  const handleCopyJSON = React.useCallback(async () => {\n    app.copyJson()\n  }, [app])\n\n  const handleExportJSON = React.useCallback(async () => {\n    app.exportJson()\n  }, [app])\n\n  const hasSelection = numberOfSelectedIds > 0\n  const hasTwoOrMore = numberOfSelectedIds > 1\n  const hasThreeOrMore = numberOfSelectedIds > 2\n\n  return (\n    <RadixContextMenu.Content\n      dir=\"ltr\"\n      ref={rContent}\n      onEscapeKeyDown={preventDefault}\n      asChild\n      tabIndex={-1}\n      onBlur={onBlur}\n    >\n      <MenuContent id=\"TD-ContextMenu\">\n        {hasSelection ? (\n          <>\n            <CMRowButton onClick={handleDuplicate} kbd=\"#D\" id=\"TD-ContextMenu-Duplicate\">\n              <FormattedMessage id=\"duplicate\" />\n            </CMRowButton>\n            <CMRowButton\n              onClick={handleFlipHorizontal}\n              kbd=\"\u21E7H\"\n              id=\"TD-ContextMenu-Flip_Horizontal\"\n            >\n              <FormattedMessage id=\"flip.horizontal\" />\n            </CMRowButton>\n            <CMRowButton onClick={handleFlipVertical} kbd=\"\u21E7V\" id=\"TD-ContextMenu-Flip_Vertical\">\n              <FormattedMessage id=\"flip.vertical\" />\n            </CMRowButton>\n            <CMRowButton onClick={handleLock} kbd=\"#\u21E7L\" id=\"TD-ContextMenu- Lock_Unlock\">\n              <FormattedMessage id=\"lock\" /> / <FormattedMessage id=\"unlock\" />\n            </CMRowButton>\n            {(hasTwoOrMore || hasGroupSelected) && <Divider />}\n            {hasTwoOrMore && (\n              <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Group\">\n                <FormattedMessage id=\"group\" />\n              </CMRowButton>\n            )}\n            {hasGroupSelected && (\n              <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Ungroup\">\n                <FormattedMessage id=\"ungroup\" />\n              </CMRowButton>\n            )}\n            <Divider />\n            <ContextMenuSubMenu label={intl.formatMessage({ id: 'move' })} id=\"TD-ContextMenu-Move\">\n              <CMRowButton onClick={handleMoveToFront} kbd=\"\u21E7]\" id=\"TD-ContextMenu-Move-To_Front\">\n                <FormattedMessage id=\"to.front\" />\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveForward} kbd=\"]\" id=\"TD-ContextMenu-Move-Forward\">\n                <FormattedMessage id=\"forward\" />\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveBackward} kbd=\"[\" id=\"TD-ContextMenu-Move-Backward\">\n                <FormattedMessage id=\"backward\" />\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveToBack} kbd=\"\u21E7[\" id=\"TD-ContextMenu-Move-To_Back\">\n                <FormattedMessage id=\"back\" />\n              </CMRowButton>\n            </ContextMenuSubMenu>\n            <MoveToPageMenu />\n            {hasTwoOrMore && (\n              <AlignDistributeSubMenu hasTwoOrMore={hasTwoOrMore} hasThreeOrMore={hasThreeOrMore} />\n            )}\n            <Divider />\n            <CMRowButton onClick={handleCut} kbd=\"#X\" id=\"TD-ContextMenu-Cut\">\n              <FormattedMessage id=\"cut\" />\n            </CMRowButton>\n            <CMRowButton onClick={handleCopy} kbd=\"#C\" id=\"TD-ContextMenu-Copy\">\n              <FormattedMessage id=\"copy\" />\n            </CMRowButton>\n            <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n              <FormattedMessage id=\"paste\" />\n            </CMRowButton>\n            <Divider />\n            <ContextMenuSubMenu\n              label={`${intl.formatMessage({ id: 'copy.as' })}...`}\n              size=\"small\"\n              id=\"TD-ContextMenu-Copy-As\"\n            >\n              <CMRowButton onClick={handleCopySVG} id=\"TD-ContextMenu-Copy-as-SVG\">\n                SVG\n              </CMRowButton>\n              <CMRowButton onClick={handleCopyPNG} id=\"TD-ContextMenu-Copy-As-PNG\">\n                PNG\n              </CMRowButton>\n              {isDebugMode && (\n                <CMRowButton onClick={handleCopyJSON} id=\"TD-ContextMenu-Copy_as_JSON\">\n                  JSON\n                </CMRowButton>\n              )}\n            </ContextMenuSubMenu>\n            <ContextMenuSubMenu\n              label={`${intl.formatMessage({ id: 'export.as' })}...`}\n              size=\"small\"\n              id=\"TD-ContextMenu-Export\"\n            >\n              <CMRowButton onClick={handleExportSVG} id=\"TD-ContextMenu-Export-SVG\">\n                SVG\n              </CMRowButton>\n              <CMRowButton onClick={handleExportPNG} id=\"TD-ContextMenu-Export-PNG\">\n                PNG\n              </CMRowButton>\n              <CMRowButton onClick={handleExportJPG} id=\"TD-ContextMenu-Export-JPG\">\n                JPG\n              </CMRowButton>\n              <CMRowButton onClick={handleExportWEBP} id=\"TD-ContextMenu-Export-WEBP\">\n                WEBP\n              </CMRowButton>\n              {isDebugMode && (\n                <CMRowButton onClick={handleExportJSON} id=\"TD-ContextMenu-Export-JSON\">\n                  JSON\n                </CMRowButton>\n              )}\n            </ContextMenuSubMenu>\n            <Divider />\n            <CMRowButton onClick={handleDelete} kbd=\"\u232B\" id=\"TD-ContextMenu-Delete\">\n              <FormattedMessage id=\"delete\" />\n            </CMRowButton>\n          </>\n        ) : (\n          <>\n            <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n              <FormattedMessage id=\"paste\" />\n            </CMRowButton>\n            <CMRowButton onClick={handleUndo} kbd=\"#Z\" id=\"TD-ContextMenu-Undo\">\n              <FormattedMessage id=\"undo\" />\n            </CMRowButton>\n            <CMRowButton onClick={handleRedo} kbd=\"#\u21E7Z\" id=\"TD-ContextMenu-Redo\">\n              <FormattedMessage id=\"redo\" />\n            </CMRowButton>\n          </>\n        )}\n      </MenuContent>\n    </RadixContextMenu.Content>\n  )\n})\n\n/* ---------- Align and Distribute Sub Menu --------- */\n\nfunction AlignDistributeSubMenu({\n  hasThreeOrMore,\n}: {\n  hasTwoOrMore: boolean\n  hasThreeOrMore: boolean\n}) {\n  const app = useTldrawApp()\n\n  const alignTop = React.useCallback(() => {\n    app.align(AlignType.Top)\n  }, [app])\n\n  const alignCenterVertical = React.useCallback(() => {\n    app.align(AlignType.CenterVertical)\n  }, [app])\n\n  const alignBottom = React.useCallback(() => {\n    app.align(AlignType.Bottom)\n  }, [app])\n\n  const stretchVertically = React.useCallback(() => {\n    app.stretch(StretchType.Vertical)\n  }, [app])\n\n  const distributeVertically = React.useCallback(() => {\n    app.distribute(DistributeType.Vertical)\n  }, [app])\n\n  const alignLeft = React.useCallback(() => {\n    app.align(AlignType.Left)\n  }, [app])\n\n  const alignCenterHorizontal = React.useCallback(() => {\n    app.align(AlignType.CenterHorizontal)\n  }, [app])\n\n  const alignRight = React.useCallback(() => {\n    app.align(AlignType.Right)\n  }, [app])\n\n  const stretchHorizontally = React.useCallback(() => {\n    app.stretch(StretchType.Horizontal)\n  }, [app])\n\n  const distributeHorizontally = React.useCallback(() => {\n    app.distribute(DistributeType.Horizontal)\n  }, [app])\n\n  return (\n    <span id=\"TD-ContextMenu-Align_Duplicate\">\n      <RadixContextMenu.Root dir=\"ltr\">\n        <CMTriggerButton isSubmenu>Align / Distribute</CMTriggerButton>\n        <RadixContextMenu.Content asChild sideOffset={2} alignOffset={-2}>\n          <StyledGridContent numberOfSelected={hasThreeOrMore ? 'threeOrMore' : 'twoOrMore'}>\n            <CMIconButton onClick={alignLeft} id=\"TD-ContextMenu-Align_Duplicate-AlignLeft\">\n              <AlignLeftIcon />\n            </CMIconButton>\n            <CMIconButton\n              onClick={alignCenterHorizontal}\n              id=\"TD-ContextMenu-Align_Duplicate-AlignCenterHorizontal\"\n            >\n              <AlignCenterHorizontallyIcon />\n            </CMIconButton>\n            <CMIconButton onClick={alignRight} id=\"TD-ContextMenu-Align_Duplicate-AlignRight\">\n              <AlignRightIcon />\n            </CMIconButton>\n            <CMIconButton\n              onClick={stretchHorizontally}\n              id=\"TD-ContextMenu-Align_Duplicate-StretchHorizontal\"\n            >\n              <StretchHorizontallyIcon />\n            </CMIconButton>\n            {hasThreeOrMore && (\n              <CMIconButton\n                onClick={distributeHorizontally}\n                id=\"TD-ContextMenu-Align_Duplicate-SpaceEvenlyHorizontal\"\n              >\n                <SpaceEvenlyHorizontallyIcon />\n              </CMIconButton>\n            )}\n            <CMIconButton onClick={alignTop} id=\"TD-ContextMenu-Align_Duplicate-AlignTop\">\n              <AlignTopIcon />\n            </CMIconButton>\n            <CMIconButton\n              onClick={alignCenterVertical}\n              id=\"TD-ContextMenu-Align_Duplicate-AlignCenterVertical\"\n            >\n              <AlignCenterVerticallyIcon />\n            </CMIconButton>\n            <CMIconButton onClick={alignBottom} id=\"TD-ContextMenu-Align_Duplicate-AlignBottom\">\n              <AlignBottomIcon />\n            </CMIconButton>\n            <CMIconButton\n              onClick={stretchVertically}\n              id=\"TD-ContextMenu-Align_Duplicate-StretchVertical\"\n            >\n              <StretchVerticallyIcon />\n            </CMIconButton>\n            {hasThreeOrMore && (\n              <CMIconButton\n                onClick={distributeVertically}\n                id=\"TD-ContextMenu-Align_Duplicate-SpaceEvenlyVertical\"\n              >\n                <SpaceEvenlyVerticallyIcon />\n              </CMIconButton>\n            )}\n            <CMArrow offset={13} />\n          </StyledGridContent>\n        </RadixContextMenu.Content>\n      </RadixContextMenu.Root>\n    </span>\n  )\n}\n\nconst StyledGridContent = styled(MenuContent, {\n  display: 'grid',\n  variants: {\n    numberOfSelected: {\n      threeOrMore: {\n        gridTemplateColumns: 'repeat(5, auto)',\n      },\n      twoOrMore: {\n        gridTemplateColumns: 'repeat(4, auto)',\n      },\n    },\n  },\n})\n\n/* -------------- Move to Page Sub Menu ------------- */\n\nconst currentPageIdSelector = (s: TDSnapshot) => s.appState.currentPageId\nconst documentPagesSelector = (s: TDSnapshot) => s.document.pages\n\nfunction MoveToPageMenu() {\n  const app = useTldrawApp()\n  const currentPageId = app.useStore(currentPageIdSelector)\n  const documentPages = app.useStore(documentPagesSelector)\n\n  const sorted = Object.values(documentPages)\n    .sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n    .filter((a) => a.id !== currentPageId)\n\n  if (sorted.length === 0) return null\n\n  return (\n    <RadixContextMenu.Root dir=\"ltr\">\n      <CMTriggerButton isSubmenu>\n        <FormattedMessage id=\"move.to.page\" />\n      </CMTriggerButton>\n      <RadixContextMenu.Content dir=\"ltr\" sideOffset={2} alignOffset={-2} asChild>\n        <MenuContent>\n          {sorted.map(({ id, name }, i) => (\n            <CMRowButton\n              key={id}\n              disabled={id === currentPageId}\n              onClick={() => app.moveToPage(id)}\n            >\n              {name || `Page ${i}`}\n            </CMRowButton>\n          ))}\n          <CMArrow offset={13} />\n        </MenuContent>\n      </RadixContextMenu.Content>\n    </RadixContextMenu.Root>\n  )\n}\n\n/* --------------------- Submenu -------------------- */\n\nexport interface ContextMenuSubMenuProps {\n  label: string\n  size?: 'small'\n  children: React.ReactNode\n  id?: string\n}\n\nexport function ContextMenuSubMenu({ children, label, size, id }: ContextMenuSubMenuProps) {\n  return (\n    <span id={id}>\n      <RadixContextMenu.Root dir=\"ltr\">\n        <CMTriggerButton isSubmenu>{label}</CMTriggerButton>\n        <RadixContextMenu.Content dir=\"ltr\" sideOffset={2} alignOffset={-2} asChild>\n          <MenuContent size={size}>\n            {children}\n            <CMArrow offset={13} />\n          </MenuContent>\n        </RadixContextMenu.Content>\n      </RadixContextMenu.Root>\n    </span>\n  )\n}\n\n/* ---------------------- Arrow --------------------- */\n\nconst CMArrow = styled(RadixContextMenu.ContextMenuArrow, {\n  fill: '$panel',\n})\n\n/* ------------------- IconButton ------------------- */\n\nfunction CMIconButton({ onSelect, ...rest }: ToolButtonProps) {\n  return (\n    <RadixContextMenu.ContextMenuItem dir=\"ltr\" onSelect={onSelect} asChild>\n      <ToolButton {...rest} />\n    </RadixContextMenu.ContextMenuItem>\n  )\n}\n\n/* -------------------- RowButton ------------------- */\n\nconst CMRowButton = ({ id, ...rest }: RowButtonProps) => {\n  return (\n    <RadixContextMenu.ContextMenuItem asChild id={id}>\n      <RowButton {...rest} />\n    </RadixContextMenu.ContextMenuItem>\n  )\n}\n\n/* ----------------- Trigger Button ----------------- */\n\ninterface CMTriggerButtonProps extends RowButtonProps {\n  isSubmenu?: boolean\n}\n\nexport const CMTriggerButton = ({ isSubmenu, ...rest }: CMTriggerButtonProps) => {\n  return (\n    <RadixContextMenu.ContextMenuTriggerItem asChild>\n      <RowButton hasArrow={isSubmenu} {...rest} />\n    </RadixContextMenu.ContextMenuTriggerItem>\n  )\n}\n", "import { DotFilledIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { IconButton } from '~components/Primitives/IconButton/IconButton'\nimport { styled } from '~styles'\n\ninterface FocusButtonProps {\n  onSelect: () => void\n}\n\nexport function FocusButton({ onSelect }: FocusButtonProps) {\n  return (\n    <StyledButtonContainer>\n      <IconButton onClick={onSelect}>\n        <DotFilledIcon />\n      </IconButton>\n    </StyledButtonContainer>\n  )\n}\n\nconst StyledButtonContainer = styled('div', {\n  opacity: 1,\n  zIndex: 100,\n  backgroundColor: 'transparent',\n\n  '& svg': {\n    color: '$text',\n  },\n\n  '&:hover svg': {\n    color: '$text',\n  },\n})\n", "import * as React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { Panel } from '~components/Primitives/Panel'\nimport { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\nimport type { TDSnapshot } from '~types'\n\nconst loadingSelector = (s: TDSnapshot) => s.appState.isLoading\n\nexport function Loading() {\n  const app = useTldrawApp()\n  const isLoading = app.useStore(loadingSelector)\n\n  return (\n    <StyledLoadingPanelContainer hidden={!isLoading}>\n      <FormattedMessage id=\"loading\" values={{ dots: '...' }} />\n    </StyledLoadingPanelContainer>\n  )\n}\n\nconst StyledLoadingPanelContainer = styled('div', {\n  position: 'absolute',\n  top: 0,\n  left: '50%',\n  transform: `translate(-50%, 0)`,\n  borderBottomLeftRadius: '12px',\n  borderBottomRightRadius: '12px',\n  padding: '8px 16px',\n  fontFamily: 'var(--fonts-ui)',\n  fontSize: 'var(--fontSizes-1)',\n  boxShadow: 'var(--shadows-panel)',\n  backgroundColor: 'white',\n  zIndex: 200,\n  pointerEvents: 'none',\n  '& > div > *': {\n    pointerEvents: 'all',\n  },\n  variants: {\n    transform: {\n      hidden: {\n        transform: `translate(-50%, 100%)`,\n      },\n      visible: {\n        transform: `translate(-50%, 0%)`,\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { FallbackProps } from 'react-error-boundary'\nimport { Divider } from '~components/Primitives/Divider'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\n\nexport function ErrorFallback({ error, resetErrorBoundary }: FallbackProps): any {\n  const app = useTldrawApp()\n\n  const refreshPage = () => {\n    window.location.reload()\n    resetErrorBoundary()\n  }\n\n  const copyError = () => {\n    const textarea = document.createElement('textarea')\n    textarea.value = error.message\n    document.body.appendChild(textarea)\n    textarea.select()\n    document.execCommand('copy')\n    textarea.remove()\n  }\n\n  const downloadBackup = () => {\n    app.saveProjectAs()\n  }\n\n  const resetDocument = () => {\n    app.resetDocument()\n    resetErrorBoundary()\n  }\n\n  return (\n    <Container>\n      <InnerContainer>\n        <div>We've encountered an error!</div>\n        <pre>\n          <code>{error.message}</code>\n        </pre>\n        <Buttons>\n          <RowButton onClick={copyError}>Copy Error</RowButton>\n          <RowButton onClick={refreshPage}>Refresh Page</RowButton>\n        </Buttons>\n        <Divider />\n        <p>\n          Keep getting this error?{' '}\n          <a onClick={downloadBackup} title=\"Download your project\">\n            Download your project\n          </a>{' '}\n          as a backup and then{' '}\n          <a onClick={resetDocument} title=\"Reset the document\">\n            reset the document\n          </a>\n          .\n        </p>\n      </InnerContainer>\n    </Container>\n  )\n}\n\nconst Container = styled('div', {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  backgroundColor: '$canvas',\n})\n\nconst InnerContainer = styled('div', {\n  backgroundColor: '$panel',\n  border: '1px solid $panelContrast',\n  padding: '$5',\n  borderRadius: 8,\n  boxShadow: '$panel',\n  maxWidth: 320,\n  color: '$text',\n  fontFamily: '$ui',\n  fontSize: '$2',\n  textAlign: 'center',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '$3',\n  '& > pre': {\n    marginTop: '$3',\n    marginBottom: '$3',\n    textAlign: 'left',\n    whiteSpace: 'pre-wrap',\n    backgroundColor: '$hover',\n    padding: '$4',\n    borderRadius: '$2',\n    fontFamily: '\"Menlo\", \"Monaco\", monospace',\n    fontWeight: 500,\n  },\n  '& p': {\n    fontFamily: '$body',\n    lineHeight: 1.7,\n    padding: '$5',\n    margin: 0,\n  },\n  '& a': {\n    color: '$text',\n    cursor: 'pointer',\n    textDecoration: 'underline',\n  },\n  '& hr': {\n    marginLeft: '-$5',\n    marginRight: '-$5',\n  },\n})\n\nconst Buttons = styled('div', {\n  display: 'flex',\n  '& > button > div': {\n    justifyContent: 'center',\n    textAlign: 'center',\n  },\n})\n"],
  "mappings": "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F,EAAI,sBAAgC,CACtC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,oBAA8B,CACpC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,qBAA+B,CACrC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,iBAA2B,CACjC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,kBAA4B,CAClC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,iBAA2B,CACjC,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,MACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,mBAA6B,CACnC,EACA,OACA,CAACA,CAAG,CACN,EAMAS,EACE,8BACCH,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,eAAe,EACnBM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAIAS,EACE,kBACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,gBAAgB,CACtB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,8BACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,EAIA,GAAM,CAAE,aAAAU,EAAc,cAAAC,EAAe,cAAAC,EAAe,gBAAAC,EAAiB,YAAAC,CAAY,EAC/EC,GAAsB,EAExBN,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,GAEpBQ,EAAaJ,CAAC,CAChB,EACA,OACA,CAACN,CAAG,CACN,EACAS,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,GAEpBU,EAAcN,CAAC,CACjB,EACA,OACA,CAACN,CAAG,CACN,EAEAS,EACE,8BACCH,GAAM,CACD,CAACJ,EAAe,GAEpBW,EAAgBP,CAAC,CACnB,EACA,OACA,CAACN,CAAG,CACN,EACAS,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,GAEpBS,EAAcL,CAAC,CACjB,EACA,OACA,CAACN,CAAG,CACN,EACAS,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,GACpBY,EAAYR,CAAC,CACf,EACA,OACA,CAACN,CAAG,CACN,EAIAS,EACE,kBACCH,GAAM,CACLA,EAAE,eAAe,EACZJ,EAAe,EAAI,IAEpBF,EAAI,QACNA,EAAI,cAAc,EAElBA,EAAI,KAAK,EAEb,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,8BACA,IAAM,CACA,CAACP,EAAe,EAAI,IAEpBF,EAAI,QACNA,EAAI,cAAc,EAElBA,EAAI,KAAK,EAEb,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,kBACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,8BACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,EAMAS,EACE,wDACCH,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,OAAO,EACXM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAEAS,EACE,8CACCH,GAAM,CACD,CAACJ,EAAe,EAAI,IAExBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAEAS,EACE,wCACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,gBAAgB,CACtB,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,UAAU,EACdM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAIAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,eAAe,CACrB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,SACA,IAAM,CACA,CAACP,EAAe,EAAI,GAExBF,EAAI,OAAO,CACb,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,gBACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,OAAO,CACb,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,kBACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,EAIAS,EACE,KACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,EAAE,EAAG,EAAK,CAC1B,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,QACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAK,CACzB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,OACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAK,CACzB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,OACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,GAAI,CAAC,EAAG,EAAK,CAC1B,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,WACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,EAAE,EAAG,EAAI,CACzB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,cACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAI,CACxB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,aACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAI,CACxB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,aACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,MAAM,CAAC,GAAI,CAAC,EAAG,EAAI,CACzB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,8BACA,IAAM,CACA,CAACP,EAAe,GACpBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,EAcAS,EACE,8BACCH,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAyBAS,EACE,kBACCH,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,MAAM,EACVM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAEAS,EACE,8BACCH,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAIAS,EACE,IACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,IACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,YAAY,CAClB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,UACA,IAAM,CACA,CAACP,EAAe,EAAI,GACxBF,EAAI,YAAY,CAClB,EACA,OACA,CAACA,CAAG,CACN,EAEAS,EACE,8CACCH,GAAM,CACD,CAACJ,EAAe,IAChBF,EAAI,SAAS,aACfA,EAAI,cAAc,EAEpBM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EAIAS,EACE,2BACCH,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,MAAM,CAAE,iBAA4B,CAAC,EACzCM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,EA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",
  "names": ["supported", "supported_default", "init_supported", "__esmMin", "e", "file_open_exports", "__export", "file_open_default", "init_file_open", "__esmMin", "_0", "__async", "options", "resolve", "reject", "input", "accept", "option", "_reject", "cleanupListenersAndMaybeReject", "_resolve", "value", "file_open_exports", "__export", "file_open_default", "getFileWithHandle", "init_file_open", "__esmMin", "handle", "__async", "file", "_0", "options", "types", "option", "mimeType", "handleOrHandles", "files", "fileOpen", "args", "__async", "implementation", "init_file_open", "__esmMin", "init_supported", "supported_default", "directory_open_exports", "__export", "directory_open_default", "init_directory_open", "__esmMin", "_0", "__async", "options", "resolve", "reject", "input", "_reject", "cleanupListenersAndMaybeReject", "_resolve", "value", "files", "file", "directoryName", "directory_open_exports", "__export", "directory_open_default", "getFiles", "init_directory_open", "__esmMin", "_0", "_1", "_2", "__async", "dirHandle", "recursive", "path", "skipDirectory", "dirs", "files", "entry", "nestedPath", "file", "options", "handle", "directoryOpen", "args", "__async", "implementation", "init_directory_open", "__esmMin", "init_supported", "supported_default", "file_save_exports", "__export", "file_save_default", "streamToBlob", "stream", "type", "__async", "reader", "pumpedStream", "controller", "pump", "done", "value", "res", "init_file_save", "__esmMin", "_0", "_1", "blobOrResponse", "options", "a", "data", "_reject", "cleanupListenersAndMaybeReject", "_resolve", "file_save_exports", "__export", "file_save_default", "init_file_save", "__esmMin", "_0", "_1", "__async", "blobOrResponse", "options", "existingHandle", "throwIfExistingHandleNotGood", "types", "option", "i", "mimeType", "err", "handle", "writable", "fileSave", "args", "__async", "implementation", "init_file_save", "__esmMin", "init_supported", "supported_default", "browser_fs_access_exports", "__export", "directoryOpen", "fileOpen", "fileSave", "supported_default", "init_browser_fs_access", "__esmMin", "init_file_open", "init_directory_open", "init_file_save", "init_supported", "React", "Renderer", "IntlProvider", "createStitches", "defaultThemeMap", "styled", "createTheme", "createStitches", "__spreadValues", "defaultThemeMap", "value", "dark", "TDEventHandler", "__publicField", "TDUserStatus", "SessionType", "TDStatus", "MoveType", "AlignType", "StretchType", "DistributeType", "FlipType", "TDShapeType", "Decoration", "ColorStyle", "SizeStyle", "DashStyle", "FontSize", "AlignStyle", "FontStyle", "TDAssetType", "TDExportType", "TDExportBackground", "Vec", "Utils", "migrate", "state", "newVersion", "document", "settings", "version", "assetIdsInUse", "page", "shape", "parentId", "children", "assetId", "childId", "binding", "id", "style", "decoration", "__spreadProps", "__spreadValues", "pageState", "getFromIdb", "setToIdb", "LETTER_SPACING", "LABEL_POINT", "PI2", "EASINGS", "t", "USER_COLORS", "isSafari", "IMAGE_EXTENSIONS", "VIDEO_EXTENSIONS", "options", "checkPermissions", "handle", "__async", "loadFileHandle", "fileHandle", "getFromIdb", "saveFileHandle", "setToIdb", "saveToFileSystem", "document", "file", "json", "blob", "fileSave", "newFileHandle", "openFromFileSystem", "_a", "fileOpen", "resolve", "reader", "openAssetsFromFileSystem", "IMAGE_EXTENSIONS", "VIDEO_EXTENSIONS", "fileToBase64", "reject", "error", "fileToText", "getImageSizeFromSrc", "src", "img", "getVideoSizeFromSrc", "video", "init_browser_fs_access", "Utils", "Vec", "React", "Utils", "SVGContainer", "Utils", "TLShapeUtil", "intersectLineSegmentBounds", "intersectLineSegmentPolyline", "intersectRayBounds", "Vec", "React", "Utils", "canvasLight", "canvasDark", "colors", "stickyFills", "__spreadProps", "__spreadValues", "k", "v", "Utils", "strokes", "fills", "strokeWidths", "fontSizes", "fontFaces", "fontSizeModifiers", "stickyFontSizes", "getStrokeWidth", "size", "getFontSize", "fontStyle", "getFontFace", "font", "getStickyFontSize", "getFontStyle", "style", "fontSize", "fontFace", "scale", "getStickyFontStyle", "getStickyShapeStyle", "isDarkMode", "color", "theme", "adjustedColor", "getShapeStyle", "isFilled", "strokeWidth", "defaultStyle", "defaultTextStyle", "ALIGN_VALUES", "getTextAlign", "alignStyle", "getTextSvgElement", "text", "style", "bounds", "_a", "fontSize", "getFontSize", "g", "scale", "textLines", "line", "i", "textElm", "getFontFace", "getTextAlign", "melm", "getMeasurementDiv", "_a", "pre", "LETTER_SPACING", "prevText", "prevFont", "prevSize", "clearPrevSize", "getTextLabelSize", "text", "font", "width", "height", "Utils", "getBoundsRectangle", "shape", "boundsCache", "bounds", "width", "height", "Vec", "transformRectangle", "shape", "bounds", "initialShape", "transformOrigin", "scaleX", "scaleY", "size", "point", "rotation", "Vec", "transformSingleRectangle", "shape", "bounds", "INDENT", "TextAreaUtils", "field", "text", "document", "initialFocus", "selectionStart", "selectionEnd", "wrap", "wrapEnd", "selection", "searchValue", "replacer", "drift", "args", "matchStart", "matchLength", "replacement", "value", "currentEnd", "lastLineStart", "element", "_a", "selectedContrast", "lineBreakCount", "firstLineStart", "newSelection", "indentedText", "replacementsCount", "minimumSelectionEnd", "firstLineIndentation", "difference", "newSelectionStart", "React", "stopPropagation", "e", "TextLabel", "font", "text", "color", "offsetX", "offsetY", "scale", "isEditing", "onBlur", "onChange", "rInput", "rIsMounted", "handleChange", "e", "TLDR", "handleKeyDown", "TextAreaUtils", "handleBlur", "handleFocus", "handlePointerDown", "elm", "rInnerWrapper", "size", "getTextLabelSize", "TextWrapper", "InnerWrapper", "TextArea", "stopPropagation", "styled", "commonTextWrapping", "__spreadValues", "LETTER_SPACING", "__spreadProps", "TDShapeUtil", "TLShapeUtil", "__publicField", "shape", "point", "Utils", "A", "B", "box", "bounds", "intersectLineSegmentPolyline", "intersectLineSegmentBounds", "props", "fromShape", "origin", "direction", "bindAnywhere", "expandedBounds", "intersections", "intersectRayBounds", "int", "center", "intersection", "a", "b", "Vec", "middlePoint", "anchor", "distance", "side", "bindingPoint", "info", "__spreadProps", "__spreadValues", "isDarkMode", "_a", "elm", "s", "g", "labelElm", "getTextSvgElement", "getShapeStyle", "font", "getFontStyle", "size", "getTextLabelSize", "Utils", "Vec", "getStroke", "getStrokePoints", "getRectangleDrawPoints", "id", "style", "size", "styles", "getShapeStyle", "getRandom", "Utils", "sw", "w", "h", "offsets", "tl", "Vec", "tr", "br", "bl", "rm", "rx", "ry", "px", "py", "lines", "getDrawStrokeInfo", "points", "strokeWidth", "getRectanglePath", "options", "stroke", "getStroke", "getRectangleIndicatorPathTDSnapshot", "strokePoints", "getStrokePoints", "pt", "React", "DrawRectangle", "id", "style", "size", "isSelected", "isDarkMode", "isFilled", "stroke", "strokeWidth", "fill", "getShapeStyle", "pathTDSnapshot", "getRectanglePath", "innerPath", "getRectangleIndicatorPathTDSnapshot", "React", "Utils", "DashedRectangle", "id", "style", "size", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "sw", "w", "h", "paths", "start", "end", "length", "i", "strokeDasharray", "strokeDashoffset", "Utils", "BindingIndicator", "strokeWidth", "size", "RectangleUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "isEditing", "isBinding", "isSelected", "isGhost", "meta", "bounds", "events", "onShapeBlur", "onShapeChange", "ref", "id", "size", "style", "label", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "Component", "DrawRectangle", "DashedRectangle", "handleLabelChange", "FullWrapper", "TextLabel", "SVGContainer", "BindingIndicator", "sw", "getRectangleIndicatorPathTDSnapshot", "getBoundsRectangle", "prev", "next", "transformRectangle", "transformSingleRectangle", "styled", "React", "Utils", "SVGContainer", "intersectBoundsPolygon", "intersectLineSegmentPolyline", "intersectRayLineSegment", "Vec", "Utils", "Vec", "getStroke", "getStrokePoints", "intersectLineLine", "Vec", "PI2", "_PolygonUtils", "edge", "delta", "Vec", "len", "polygon", "index", "v0", "v1", "v2", "vertices", "vert", "i", "A1", "A2", "B1", "B2", "den", "ua", "ub", "center", "radius", "startVertex", "endVertex", "isPaddingBoundary", "startAngle", "endAngle", "arcSegmentCount", "angle", "angle5", "offset", "edges", "offsetEdges", "thisEdge", "prevEdge", "vertex", "shapePadding", "PolygonUtils", "__publicField", "getOffsetPolygon", "points", "point", "A", "B", "offsetVector", "intersection", "intersectLineLine", "getTrianglePoints", "size", "offset", "rotation", "w", "h", "points", "getOffsetPolygon", "pt", "Vec", "getTriangleCentroid", "getTriangleDrawPoints", "id", "strokeWidth", "getRandom", "Utils", "offsets", "corners", "rm", "lines", "getDrawStrokeInfo", "style", "getShapeStyle", "getTrianglePath", "options", "stroke", "getStroke", "getTriangleIndicatorPathTDSnapshot", "strokePoints", "getStrokePoints", "React", "DrawTriangle", "id", "size", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "pathTDSnapshot", "getTrianglePath", "indicatorPath", "getTriangleIndicatorPathTDSnapshot", "React", "Utils", "Vec", "DashedTriangle", "id", "size", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "sw", "points", "getTrianglePoints", "paths", "Utils", "start", "end", "i", "strokeDasharray", "strokeDashoffset", "bgPath", "TriangleBindingIndicator", "size", "trianglePoints", "getTrianglePoints", "TriangleUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "bounds", "isBinding", "isEditing", "isSelected", "isGhost", "meta", "events", "onShapeChange", "onShapeBlur", "ref", "id", "label", "size", "style", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "Component", "DrawTriangle", "DashedTriangle", "handleLabelChange", "offsetY", "center", "Vec", "getTriangleCentroid", "FullWrapper", "TextLabel", "SVGContainer", "TriangleBindingIndicator", "getTrianglePoints", "prev", "next", "getBoundsRectangle", "pt", "A", "B", "intersectLineSegmentPolyline", "intersectBoundsPolygon", "fromShape", "point", "origin", "direction", "bindAnywhere", "expandedBounds", "points", "expandedPoints", "closestDistanceToEdge", "a", "b", "intersections", "segment", "intersectRayLineSegment", "intersection", "middlePoint", "anchor", "distance", "bindingPoint", "transformRectangle", "transformSingleRectangle", "rotation", "x", "y", "w", "h", "styled", "React", "Utils", "SVGContainer", "Vec", "intersectEllipseBounds", "intersectLineSegmentEllipse", "intersectRayEllipse", "Utils", "getStrokeOutlinePoints", "getStrokePoints", "getEllipseStrokePoints", "id", "radius", "style", "strokeWidth", "getShapeStyle", "getRandom", "Utils", "rx", "ry", "perimeter", "points", "start", "extra", "count", "i", "t", "EASINGS", "rads", "c", "s", "getStrokePoints", "getEllipsePath", "getStrokeOutlinePoints", "getEllipseIndicatorPath", "pt", "React", "DrawEllipse", "id", "radius", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "innerPath", "getEllipsePath", "getEllipseIndicatorPath", "React", "Utils", "DashedEllipse", "radius", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "sw", "rx", "ry", "perimeter", "Utils", "strokeDasharray", "strokeDashoffset", "EllipseUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "isGhost", "isSelected", "isBinding", "isEditing", "meta", "bounds", "events", "onShapeChange", "onShapeBlur", "ref", "id", "radius", "style", "label", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "strokeWidth", "sw", "rx", "ry", "Component", "DrawEllipse", "DashedEllipse", "handleLabelChange", "FullWrapper", "TextLabel", "SVGContainer", "getEllipseIndicatorPath", "point", "A", "B", "intersectLineSegmentEllipse", "shapeBounds", "intersectEllipseBounds", "prev", "next", "Vec", "fromShape", "origin", "direction", "bindAnywhere", "expandedBounds", "center", "bindingPoint", "distance", "intersection", "intersectRayEllipse", "a", "b", "anchor", "innerIntersection", "scaleX", "scaleY", "initialShape", "rotation", "styled", "React", "Utils", "SVGContainer", "Vec", "intersectArcBounds", "intersectLineSegmentBounds", "intersectLineSegmentLineSegment", "Utils", "intersectCircleCircle", "intersectCircleLineSegment", "Vec", "getStroke", "getArrowArcPath", "start", "end", "circle", "bend", "getBendPoint", "handles", "dist", "Vec", "midPoint", "bendDist", "u", "renderFreehandArrowShaft", "id", "style", "decorationStart", "decorationEnd", "getRandom", "Utils", "strokeWidth", "getShapeStyle", "startPoint", "endPoint", "stroke", "getStroke", "EASINGS", "renderCurvedFreehandArrowShaft", "center", "radius", "length", "easing", "startAngle", "endAngle", "points", "count", "i", "t", "angle", "getCtp", "getCurvedArrowHeadPoints", "A", "r1", "C", "r2", "sweep", "ints", "intersectCircleCircle", "TLDR", "int", "left", "right", "getStraightArrowHeadPoints", "B", "r", "intersectCircleLineSegment", "getCurvedArrowHeadPath", "getStraightArrowHeadPath", "getArrowPath", "arrowDist", "arrowHeadLength", "path", "getArcLength", "getArcPoints", "isAngleBetween", "a", "b", "c", "PI2", "AB", "AC", "Utils", "Vec", "React", "Arrowhead", "left", "middle", "right", "stroke", "strokeWidth", "StraightArrow", "id", "style", "start", "end", "decorationStart", "decorationEnd", "isDraw", "isDarkMode", "arrowDist", "Vec", "styles", "getShapeStyle", "strokeWidth", "sw", "path", "renderFreehandArrowShaft", "strokeDasharray", "strokeDashoffset", "Utils", "arrowHeadLength", "startArrowHead", "getStraightArrowHeadPoints", "endArrowHead", "Arrowhead", "Utils", "Vec", "React", "CurvedArrow", "id", "style", "start", "bend", "end", "arrowBend", "decorationStart", "decorationEnd", "isDraw", "isDarkMode", "arrowDist", "Vec", "styles", "getShapeStyle", "strokeWidth", "sw", "circle", "getCtp", "center", "radius", "length", "getArcLength", "getRandom", "Utils", "easing", "EASINGS", "path", "renderCurvedFreehandArrowShaft", "getArrowArcPath", "strokeDasharray", "strokeDashoffset", "arrowHeadLength", "startArrowHead", "getCurvedArrowHeadPoints", "endArrowHead", "Arrowhead", "LabelMask", "id", "bounds", "labelSize", "offset", "scale", "ArrowUtil", "TDShapeUtil", "__publicField", "props", "_a", "_b", "_c", "_d", "__spreadValues", "__spreadProps", "defaultStyle", "shape", "isEditing", "isGhost", "meta", "events", "onShapeChange", "onShapeBlur", "ref", "id", "label", "start", "bend", "end", "decorations", "style", "hasLabel", "isStraightLine", "Vec", "font", "getFontStyle", "styles", "getShapeStyle", "labelSize", "getTextLabelSize", "bounds", "dist", "circle", "getCtp", "center", "radius", "length", "getArcLength", "scale", "offset", "handleLabelChange", "Component", "StraightArrow", "CurvedArrow", "FullWrapper", "TextLabel", "SVGContainer", "LabelMask", "getArrowPath", "Utils", "getArcPoints", "points", "minX", "minY", "maxX", "maxY", "pt", "prev", "next", "point", "i", "A", "B", "ptA", "ptB", "intersectLineSegmentLineSegment", "sp", "ep", "intersectLineSegmentBounds", "cx", "cy", "r", "cp", "intersectArcBounds", "initialShape", "scaleX", "scaleY", "initialShapeBounds", "handles", "nextHandles", "handle", "x", "y", "nw", "nh", "midPoint", "bendDist", "u", "getBendPoint", "nextBend", "distance", "angle", "ap", "bp", "bendPoint", "realBend", "angleToBend", "isAngleBetween", "nextShape", "topLeft", "nextBounds", "styled", "Utils", "SVGContainer", "GroupUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "isBinding", "isGhost", "isHovered", "isSelected", "events", "ref", "id", "size", "sw", "w", "h", "paths", "start", "end", "i", "SVGContainer", "ScaledLines", "getBoundsRectangle", "prev", "next", "styled", "React", "Utils", "HTMLContainer", "Vec", "StickyUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultTextStyle", "shape", "meta", "events", "isGhost", "isBinding", "isEditing", "onShapeBlur", "onShapeChange", "ref", "font", "getStickyFontStyle", "color", "fill", "getStickyShapeStyle", "rContainer", "rTextArea", "rText", "rIsMounted", "handlePointerDown", "e", "onChange", "text", "TLDR", "handleTextChange", "handleKeyDown", "TextAreaUtils", "__spreadProps", "__spreadValues", "handleBlur", "handleFocus", "elm", "size", "currTextHeight", "minTextHeight", "MIN_CONTAINER_HEIGHT", "PADDING", "prevTextHeight", "textarea", "style", "HTMLContainer", "StyledStickyContainer", "StyledText", "StyledTextArea", "stopPropagation", "width", "height", "getBoundsRectangle", "prev", "next", "bounds", "scaleX", "scaleY", "transformOrigin", "Vec", "isDarkMode", "textBounds", "textElm", "getTextSvgElement", "g", "rect", "styled", "commonTextWrapping", "React", "Utils", "HTMLContainer", "Vec", "TextUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultTextStyle", "shape", "isBinding", "isGhost", "isEditing", "onShapeBlur", "onShapeChange", "meta", "events", "ref", "text", "style", "styles", "getShapeStyle", "font", "getFontStyle", "rInput", "rIsMounted", "rEditedText", "delta", "currentBounds", "nextBounds", "Vec", "__spreadProps", "__spreadValues", "handleChange", "e", "newText", "TLDR", "handleKeyDown", "TextAreaUtils", "handleBlur", "handleFocus", "handlePointerDown", "elm", "HTMLContainer", "Wrapper", "InnerWrapper", "getTextAlign", "TextArea", "stopPropagation", "width", "height", "bounds", "_a", "melm", "prev", "next", "initialShape", "scaleX", "scaleY", "rotation", "scale", "nextScale", "center", "newCenter", "isDarkMode", "getTextSvgElement", "getMeasurementDiv", "pre", "LETTER_SPACING", "styled", "commonTextWrapping", "React", "Utils", "SVGContainer", "Vec", "intersectBoundsBounds", "intersectBoundsPolyline", "intersectLineSegmentBounds", "intersectLineSegmentLineSegment", "Utils", "Vec", "getStrokeOutlinePoints", "getStrokePoints", "simulatePressureSettings", "t", "realPressureSettings", "getFreehandOptions", "shape", "styles", "getShapeStyle", "__spreadProps", "__spreadValues", "getFillPath", "Utils", "getStrokePoints", "pt", "getDrawStrokePoints", "options", "getDrawStrokePathTDSnapshot", "strokePoints", "getStrokeOutlinePoints", "getSolidStrokePathTDSnapshot", "points", "last", "Vec", "DrawUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "meta", "isSelected", "isGhost", "events", "ref", "points", "style", "isComplete", "polygonPathTDSnapshot", "getFillPath", "pathTDSnapshot", "getDrawStrokePathTDSnapshot", "getSolidStrokePathTDSnapshot", "styles", "getShapeStyle", "stroke", "fill", "strokeWidth", "bounds", "sw", "SVGContainer", "shouldFill", "Vec", "strokeDasharray", "strokeDashoffset", "initialShape", "scaleX", "scaleY", "initialShapeBounds", "x", "y", "r", "newBounds", "point", "pointsHaveChanged", "pointHasChanged", "prev", "next", "ptA", "A", "B", "ptB", "intersectLineSegmentBounds", "i", "intersectLineSegmentLineSegment", "shapeBounds", "intersectBoundsBounds", "intersectBoundsPolyline", "rBounds", "rotatedBounds", "c", "pt", "React", "Utils", "HTMLContainer", "styled", "ImageUtil", "TDShapeUtil", "__publicField", "props", "Utils", "__spreadProps", "__spreadValues", "defaultStyle", "shape", "asset", "isBinding", "isGhost", "meta", "events", "onShapeChange", "ref", "size", "style", "bindingDistance", "rImage", "rWrapper", "wrapper", "width", "height", "HTMLContainer", "Wrapper", "ImageElement", "getBoundsRectangle", "prev", "next", "transformRectangle", "transformSingleRectangle", "bounds", "elm", "styled", "React", "Utils", "HTMLContainer", "styled", "VideoUtil", "TDShapeUtil", "__publicField", "props", "Utils", "defaultStyle", "shape", "asset", "isBinding", "isEditing", "isGhost", "meta", "events", "onShapeChange", "ref", "rVideo", "rWrapper", "currentTime", "size", "isPlaying", "style", "wrapper", "width", "height", "video", "handlePlay", "handlePause", "handleSetCurrentTime", "HTMLContainer", "Wrapper", "VideoElement", "getBoundsRectangle", "prev", "next", "bounds", "elm", "transformRectangle", "transformSingleRectangle", "styled", "Rectangle", "RectangleUtil", "Triangle", "TriangleUtil", "Ellipse", "EllipseUtil", "Draw", "DrawUtil", "Arrow", "ArrowUtil", "Text", "TextUtil", "Group", "GroupUtil", "Sticky", "StickyUtil", "Image", "ImageUtil", "Video", "VideoUtil", "shapeUtils", "getShapeUtil", "shape", "deepCopy", "target", "cp", "arrayMember", "targetKeys", "key", "intersectRayBounds", "intersectRayEllipse", "intersectRayLineSegment", "isDev", "_TLDR", "shape", "getShapeUtil", "data", "pageId", "page", "id", "point", "camera", "Vec", "zoom", "Utils", "shapeId", "childId", "fn", "copies", "__spreadValues", "ids", "visited", "collectDescendants", "collectAscendants", "parentId", "binding", "direction", "includeArrows", "selectedIds", "linkedIds", "checkedIds", "idsToCheck", "arrows", "_a", "arrow", "_b", "startBindingId", "endBindingId", "startBinding", "endBinding", "hit", "siblings", "a", "b", "parent", "index", "nextSibling", "change", "k", "beforeShapes", "afterShapes", "i", "dataWithMutations", "shapes", "before", "results", "after", "shapeIds", "delta", "arrowShape", "_c", "_d", "_e", "_f", "result", "deepCopy", "start", "end", "hasDecoration", "handle", "target", "util", "bounds", "expandedBounds", "intersectBounds", "minX", "minY", "width", "height", "anchorPoint", "ID", "A", "B", "hits", "intersectRayEllipse", "targetPoint", "points", "getTrianglePoints", "pt", "p0", "p1", "intersectRayLineSegment", "intersection", "intersectRayBounds", "int", "bHit", "shortArrowDirection", "shortArrowHits", "__spreadProps", "info", "center", "origin", "relativeCenter", "rotatedCenter", "nextPoint", "handleId", "nextRotation", "changedShapeIds", "parentToUpdateIds", "bindingsArr", "bindingsToUpdate", "prevSize", "fromId", "otherBinding", "text", "x", "prop", "e", "svg", "scale", "clone", "svgString", "_0", "__async", "type", "opts", "quality", "canvas", "resolve", "image", "dataUrl", "context", "blob", "TLDR", "__publicField", "string", "textarea", "range", "sel", "err", "acc", "Vec", "Utils", "alignShapes", "app", "ids", "type", "currentPageId", "initialShapes", "id", "boundsForShapes", "shape", "TLDR", "commonBounds", "Utils", "bounds", "midX", "midY", "deltaMap", "point", "before", "after", "delta", "Vec", "child", "changePage", "app", "pageId", "Utils", "getIncrementedName", "name", "others", "_a", "result", "set", "m", "createPage", "app", "center", "pageId", "Utils", "pageName", "currentPageId", "pages", "a", "b", "_a", "_b", "topPage", "nextChildIndex", "page", "getIncrementedName", "pageState", "createShapes", "app", "shapes", "bindings", "currentPageId", "beforeShapes", "afterShapes", "shape", "beforeBindings", "afterBindings", "binding", "deletePage", "app", "pageId", "currentPageId", "pages", "pageStates", "pagesArr", "b", "currentIndex", "page", "nextCurrentPageId", "__spreadValues", "removeShapesFromPage", "data", "ids", "pageId", "before", "after", "parentsToUpdate", "deletedIds", "assetsToRemove", "id", "TLDR", "shape", "childId", "child", "parent", "_a", "page", "binding", "handle", "_b", "_c", "_d", "_e", "_f", "__spreadProps", "__spreadValues", "removeAssetsFromDocument", "assets", "idsToRemove", "afterAssets", "__spreadValues", "id", "deleteShapes", "app", "ids", "pageId", "pageState", "selectedIds", "beforeAssets", "before", "after", "assetsToRemove", "removeShapesFromPage", "Utils", "Vec", "distributeShapes", "app", "ids", "type", "currentPageId", "initialShapes", "id", "deltaMap", "getDistributions", "d", "before", "after", "TLDR", "shape", "delta", "child", "entries", "utils", "len", "commonBounds", "Utils", "bounds", "results", "span", "a", "c", "left", "b", "right", "entriesToMove", "step", "x", "point", "i", "top", "bottom", "y", "Utils", "duplicatePage", "app", "pageId", "newId", "Utils", "currentPageId", "page", "camera", "nextPage", "__spreadProps", "__spreadValues", "id", "shape", "Utils", "Vec", "duplicateShapes", "app", "ids", "point", "selectedIds", "currentPageId", "page", "shapes", "before", "after", "duplicateMap", "shapesToDuplicate", "id", "shape", "duplicatedId", "Utils", "__spreadProps", "__spreadValues", "TLDR", "parent", "childId", "_a", "_b", "child", "duplicatedParentId", "dupedShapeIds", "binding", "duplicatedBindingId", "duplicatedBinding", "boundShape", "handle", "shapesToMove", "commonBounds", "center", "Vec", "offset", "TLBoundsCorner", "Utils", "flipShapes", "app", "ids", "type", "selectedIds", "currentPageId", "shapes", "boundsForShapes", "id", "TLDR", "commonBounds", "Utils", "before", "after", "shape", "shapeBounds", "newShapeBounds", "TLBoundsCorner", "Utils", "groupShapes", "app", "ids", "groupId", "pageId", "_a", "_b", "beforeShapes", "afterShapes", "beforeBindings", "afterBindings", "idsToGroup", "shapesToGroup", "deletedGroupIds", "otherEffectedGroups", "id", "shape", "childIds", "flattenedShapes", "TLDR", "shapeIndexMap", "sortedShapes", "a", "b", "groupParentId", "groupChildIndex", "groupBounds", "Utils", "index", "parentShape", "__spreadProps", "__spreadValues", "nextChildren", "childId", "bindings", "deletedGroupIdsSet", "binding", "handle", "Utils", "Vec", "moveShapesToPage", "app", "ids", "viewportBounds", "fromPageId", "toPageId", "page", "fromPage", "toPage", "movingShapeIds", "shapesToMove", "id", "shape", "childId", "startingChildIndex", "TLDR", "movingShapes", "i", "__spreadProps", "__spreadValues", "parent", "binding", "fromBoundShape", "fromShape", "handleId", "handle", "toPageShape", "toPageState", "bounds", "Utils", "zoom", "mx", "my", "point", "Vec", "movePage", "app", "pageId", "index", "pages", "movingPage", "beforePages", "b", "_a", "_b", "fromIndex", "afterPages", "p", "childIndex", "reorderShapes", "app", "ids", "type", "currentPageId", "page", "parentIds", "id", "result", "startIndex", "startChildIndex", "step", "parentId", "sortedChildren", "a", "b", "parent", "childId", "sortedChildIds", "shape", "sortedIndicesToMove", "i", "TLDR", "_shape", "indexMap", "j", "endChildIndex", "k", "renamePage", "app", "pageId", "name", "page", "resetBounds", "app", "ids", "pageId", "currentPageId", "before", "after", "TLDR", "shape", "_a", "_b", "Utils", "PI2", "rotateShapes", "app", "ids", "delta", "currentPageId", "before", "after", "shapesToRotate", "id", "shape", "childId", "origin", "Utils", "TLDR", "change", "TLBoundsCorner", "Utils", "stretchShapes", "app", "ids", "type", "currentPageId", "selectedIds", "initialShapes", "id", "boundsForShapes", "shape", "TLDR", "commonBounds", "Utils", "idsToMutate", "before", "after", "bounds", "newBounds", "__spreadProps", "__spreadValues", "TLBoundsCorner", "Vec", "styleShapes", "app", "ids", "changes", "currentPageId", "selectedIds", "shapeIdsToMutate", "id", "TLDR", "beforeShapes", "afterShapes", "shape", "__spreadValues", "key", "Vec", "__spreadProps", "toggleShapesDecoration", "app", "ids", "decorationId", "currentPageId", "selectedIds", "beforeShapes", "id", "_a", "afterShapes", "toggleShapeProp", "app", "ids", "prop", "currentPageId", "initialShapes", "id", "shape", "isAllToggled", "before", "after", "Vec", "translateShapes", "app", "ids", "delta", "currentPageId", "selectedIds", "before", "after", "idsToMutate", "id", "shape", "change", "TLDR", "Vec", "binding", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "ungroupShapes", "app", "selectedIds", "groupShapes", "pageId", "bindings", "beforeShapes", "afterShapes", "beforeBindings", "afterBindings", "beforeSelectedIds", "afterSelectedIds", "id", "shape", "groupShape", "shapesToReparent", "deletedGroupIds", "startingChildIndex", "step", "TLDR", "a", "b", "index", "binding", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "updateShapes", "app", "updates", "pageId", "ids", "update", "change", "TLDR", "id", "_shape", "setShapesProps", "app", "ids", "partial", "currentPageId", "selectedIds", "initialShapes", "id", "shape", "before", "after", "keys", "key", "Utils", "Vec", "insertContent", "app", "content", "opts", "currentPageId", "point", "select", "overwrite", "page", "before", "afterAssets", "after", "shape", "binding", "asset", "oldToNewIds", "nextIndex", "TLDR", "shapesToInsert", "a", "b", "newShapeId", "Utils", "__spreadProps", "__spreadValues", "visited", "parent", "newBindingId", "toId", "fromId", "handles", "handle", "fromHandles", "newBinding", "shapesToMove", "commonBounds", "center", "Vec", "centeredBounds", "delta", "elm", "Vec", "BaseSession", "app", "Utils", "ArrowSession", "BaseSession", "app", "shapeId", "handleId", "isCreate", "_a", "_b", "_c", "__publicField", "Utils", "initialShape", "currentPoint", "shiftKey", "altKey", "metaKey", "currentGrid", "showGrid", "shape", "handles", "delta", "Vec", "A", "B", "C", "angle", "adjusted", "nextPoint", "handleChanges", "__spreadProps", "__spreadValues", "utils", "shapeUtils", "handleChange", "next", "draggedBinding", "draggingHandle", "oppositeHandle", "nextStartBinding", "startTarget", "startTargetUtils", "TLDR", "center", "startHandle", "endHandle", "rayPoint", "rayOrigin", "isInsideShape", "rayDirection", "hasStartBinding", "startPoint", "endPoint", "targets", "id", "a", "b", "point", "target", "currentBindingId", "change", "initialBinding", "newStartBindingId", "draggedBindingId", "currentShape", "isDeleting", "afterBindings", "startBindingShapeId", "length", "beforeBindings", "bindingId", "origin", "direction", "bindAnywhere", "bindingPoint", "currentPageId", "page", "deepCopy", "oppositeHandleBindingId", "oppositeToId", "originPoint", "initialBindingId", "Utils", "BrushSession", "BaseSession", "app", "__publicField", "initialSelectedIds", "shapesToTest", "metaKey", "settings", "originPoint", "currentPoint", "brush", "Utils", "selectByContain", "hits", "selectedIds", "id", "selectId", "shape", "util", "currentSelectedIds", "didChange", "afterSelectedIds", "currentPageId", "Utils", "Vec", "DrawSession", "BaseSession", "app", "id", "_a", "__publicField", "currentPoint", "newAdjustedPoint", "topLeft", "delta", "Vec", "pt", "shapeId", "originPoint", "shiftKey", "bounds", "Utils", "returning", "change", "pageId", "shape", "__spreadProps", "__spreadValues", "prevTopLeft", "points", "initialPoints", "newPoints", "prevPoint", "len", "i", "t", "Vec", "HandleSession", "BaseSession", "app", "shapeId", "handleId", "commandId", "__publicField", "_a", "_b", "initialShape", "currentPageId", "currentPoint", "shape", "handles", "delta", "Vec", "handleChanges", "__spreadProps", "__spreadValues", "change", "TLDR", "originPoint", "Utils", "Vec", "RotateSession", "BaseSession", "app", "__publicField", "commonBoundsCenter", "initialShapes", "currentPageId", "currentPoint", "shiftKey", "shapes", "directionDelta", "Vec", "Utils", "center", "shape", "rotation", "shapeDelta", "change", "TLDR", "beforeShapes", "afterShapes", "id", "point", "handles", "pageState", "originPoint", "TLBoundsCorner", "Utils", "Vec", "TransformSession", "BaseSession", "app", "transformType", "TLBoundsCorner", "isCreate", "__publicField", "shape", "Utils", "TLDR", "shapeBounds", "initialCommonBounds", "isAllAspectRatioLocked", "currentPageId", "camera", "viewport", "currentPoint", "previousPoint", "originPoint", "shiftKey", "altKey", "metaKey", "currentGrid", "isSnapping", "showGrid", "shapes", "delta", "Vec", "newBounds", "__spreadValues", "speedChange", "snapLines", "snapResult", "bounds", "initialShape", "initialShapeBounds", "transformOrigin", "newShapeBounds", "afterShape", "hasUnlockedShapes", "beforeShapes", "afterShapes", "beforeSelectedIds", "afterSelectedIds", "shapesBounds", "boundsArr", "initialInnerBounds", "ic", "ix", "iy", "Utils", "Vec", "TransformSingleSession", "BaseSession", "app", "id", "transformType", "isCreate", "__publicField", "shape", "Utils", "TLDR", "initialShape", "initialShapeBounds", "isSnapping", "showGrid", "currentPageId", "camera", "viewport", "currentPoint", "previousPoint", "originPoint", "currentGrid", "shiftKey", "altKey", "metaKey", "shapes", "delta", "Vec", "utils", "newBounds", "__spreadValues", "speedChange", "snapLines", "snapResult", "bounds", "afterShape", "beforeShapes", "afterShapes", "Utils", "Vec", "TranslateSession", "BaseSession", "app", "isCreate", "link", "__publicField", "bindingsToDelete", "initialIds", "currentPageId", "page", "allBounds", "otherBounds", "shape", "bounds", "Utils", "TLDR", "nextBindings", "binding", "initialParentChildren", "initialShapes", "initialCommonBounds", "camera", "isSnapping", "showGrid", "viewport", "selectedIds", "currentPoint", "previousPoint", "originPoint", "altKey", "shiftKey", "metaKey", "currentGrid", "nextShapes", "nextPageState", "delta", "Vec", "didChangeCloning", "change", "snapResult", "clones", "clonedBindings", "clone", "_a", "__spreadValues", "children", "__spreadProps", "initialSelectedIds", "id", "point", "beforeBindings", "beforeShapes", "afterBindings", "afterShapes", "handle", "cloneMap", "clonedBindingsMap", "newId", "element", "childId", "clonedShapeIds", "cloneId", "cloneBinding", "selectedShapes", "selectedShapeIds", "s", "Vec", "EraseSession", "BaseSession", "app", "__publicField", "now", "elapsed1", "elapsed2", "eraseLine", "next", "didUpdate", "page", "shiftKey", "originPoint", "currentPoint", "zoom", "Vec", "delta", "newPoint", "deletedShapeIds", "shape", "childId", "binding", "id", "erasedShapes", "erasedBindings", "erasedShapeIds", "erasedBindingIds", "before", "after", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "Utils", "Vec", "GridSession", "BaseSession", "app", "id", "_a", "__publicField", "currentPageId", "altKey", "shiftKey", "currentPoint", "nextShapes", "nextPageState", "center", "Utils", "offset", "Vec", "gapX", "gapY", "columns", "rows", "minX", "minY", "maxX", "maxY", "inGrid", "isCopying", "x", "y", "position", "clone", "__spreadProps", "__spreadValues", "beforeShapes", "afterShapes", "afterSelectedIds", "point", "copy", "EditSession", "BaseSession", "app", "id", "isCreating", "__publicField", "shape", "sessions", "ArrowSession", "BrushSession", "DrawSession", "EraseSession", "HandleSession", "RotateSession", "TransformSession", "TransformSingleSession", "TranslateSession", "GridSession", "EditSession", "getSession", "type", "Utils", "Utils", "BaseTool", "TDEventHandler", "app", "__publicField", "status", "shapes", "currentPageId", "shape", "a", "b", "Utils", "info", "e", "_a", "key", "isToolLocked", "Vec", "SelectTool", "BaseTool", "__publicField", "point", "shapes", "id", "bounds", "Utils", "TLDR", "center", "size", "gridPoint", "centeredBounds", "shape", "side", "utils", "newCenter", "Vec", "rotatedCenter", "clone", "__spreadProps", "__spreadValues", "key", "info", "e", "selectedId", "clonedShape", "pageState", "originPoint", "currentPoint", "idsToTransform", "selectedShape", "_a", "editingId", "hoveredId", "parentId", "shapeIdToSelect", "oldCurrentPageId", "selectedIds", "selectedShapeId", "oid", "Vec", "EraseTool", "BaseTool", "__publicField", "info", "Vec", "shapeIdsAtPoint", "shape", "Vec", "TextTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "Vec", "info", "shape", "Utils", "DrawTool", "BaseTool", "__publicField", "info", "currentPoint", "currentPageId", "currentStyle", "previous", "childIndex", "id", "Utils", "newShape", "Draw", "__spreadValues", "Utils", "TLBoundsCorner", "Vec", "EllipseTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Ellipse", "Vec", "__spreadValues", "TLBoundsCorner", "Utils", "TLBoundsCorner", "Vec", "RectangleTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Rectangle", "Vec", "__spreadValues", "TLBoundsCorner", "Utils", "TLBoundsCorner", "Vec", "TriangleTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Triangle", "Vec", "__spreadValues", "TLBoundsCorner", "Utils", "Vec", "LineTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Arrow", "Vec", "__spreadValues", "Utils", "Vec", "ArrowTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Arrow", "Vec", "__spreadValues", "Vec", "Utils", "StickyTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "Utils", "newShape", "Sticky", "Vec", "__spreadValues", "bounds", "createVanilla", "create", "idb", "Utils", "StateManager", "initialState", "id", "version", "update", "__publicField", "patch", "e", "prev", "next", "Utils", "final", "nextState", "_prevState", "_patch", "_id", "state", "command", "__spreadProps", "__spreadValues", "history", "pointer", "deepCopy", "createVanilla", "create", "resolve", "message", "saved", "__async", "savedVersion", "prevEmpty", "get", "set", "del", "ID", "getClipboard", "__async", "get", "setClipboard", "item", "set", "uuid", "Utils", "_TldrawApp", "StateManager", "id", "callbacks", "prev", "next", "prevVersion", "migrate", "__spreadProps", "__spreadValues", "__publicField", "SelectTool", "EraseTool", "TextTool", "DrawTool", "EllipseTool", "RectangleTool", "TriangleTool", "LineTool", "ArrowTool", "StickyTool", "state", "_a", "_b", "loadFileHandle", "fileHandle", "e", "pageId", "page", "prevPage", "changedShapes", "groupsToUpdate", "shape", "parentId", "bindingsToUpdate", "TLDR", "visitedShapes", "binding", "toShape", "fromShape", "fromDelta", "nextShape", "group", "children", "commonBounds", "nextPageState", "currentPageId", "currentPageState", "room", "user", "patch", "addToHistory", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "changedBindings", "changedAssets", "shapes", "bindings", "assets", "command", "_state", "coreReservedIds", "reservedShapes", "reservedBindings", "bindingsArr", "boundTos", "boundFroms", "bindingMaps", "reservedShapeIds", "strongReservedShapeIds", "visited", "map", "current", "hoveredId", "editingId", "bindingId", "selectedIds", "editingShape", "reservedShape", "incomingShape", "nextShapes", "nextBindings", "nextAssets", "bounds", "point", "zoom", "width", "height", "minX", "minY", "Vec", "maxX", "maxY", "isCreating", "name", "value", "isOpen", "isLoading", "disableAssets", "type", "tool", "doc", "users", "isOwnUpdate", "userId", "document", "currentPageStates", "nextAppState", "i", "pageState", "reason", "prevState", "nextState", "nextPage", "keysToCheck", "key", "roomId", "USER_COLORS", "__async", "saveToFileSystem", "result", "openFromFileSystem", "file", "openAssetsFromFileSystem", "camera", "createPage", "changePage", "index", "movePage", "renamePage", "duplicatePage", "deletePage", "ids", "tldrawString", "setClipboard", "shapesToCreate", "filesToPaste", "clipboardData", "getSvgFromText", "text", "div", "svg", "imageBlob", "getShapeFromText", "pagePoint", "isMultiline", "getShapeFromHtml", "html", "maybeJson", "json", "items", "item", "kind", "str", "resolve", "currentPoint", "getClipboard", "_0", "opts", "defs", "style", "fonts", "d", "a", "b", "getSvgElementForShape", "util", "elm", "g", "childId", "exportBackground", "darkBackground", "lightBackground", "svgString", "deepCopy", "idsSet", "s", "handles", "handle", "content", "blob", "url", "link", "insertContent", "format", "delta", "nextPoint", "nextZoom", "p0", "p1", "center", "rendererBounds", "mx", "my", "selectedBounds", "push", "nextIds", "args", "Session", "getSession", "session", "pageShapes", "shapesToUpdate", "updateShapes", "createShapes", "drawCommand", "deleteShapes", "beforeAssetIds", "k", "afterAssetIds", "x", "styleShapes", "alignShapes", "direction", "distributeShapes", "stretchShapes", "flipShapes", "toPageId", "fromPageId", "moveShapesToPage", "reorderShapes", "isMajor", "size", "translateShapes", "duplicateShapes", "resetBounds", "toggleShapeProp", "handleId", "toggleShapesDecoration", "props", "setShapesProps", "change", "rotateShapes", "groupId", "groupShapes", "groups", "ungroupShapes", "_1", "files", "extension", "isImage", "IMAGE_EXTENSIONS", "isVideo", "VIDEO_EXTENSIONS", "shapeType", "assetType", "src", "fileToBase64", "viewBox", "fileToText", "viewBoxAttribute", "getImageSizeFromSrc", "getVideoSizeFromSrc", "match", "asset", "assetId", "error", "svgStr", "viewBoxRegex", "matches", "info", "shiftKey", "metaKey", "altKey", "ctrlKey", "spaceKey", "force", "restore", "clearPrevSize", "centerA", "centerB", "shapeToUpdate", "isToolLocked", "appState", "status", "commands", "currentStyle", "childIndex", "Text", "shapeUtils", "newShape", "Shape", "r", "video", "canvas", "image", "TldrawApp", "defaultStyle", "tools", "SelectTool", "EraseTool", "TextTool", "DrawTool", "EllipseTool", "RectangleTool", "TriangleTool", "LineTool", "ArrowTool", "StickyTool", "React", "useHotkeys", "useKeyboardShortcuts", "ref", "app", "useTldrawApp", "canHandleEvent", "ignoreMenus", "elm", "handleCut", "e", "handleCopy", "handlePaste", "useHotkeys", "onNewProject", "onOpenProject", "onSaveProject", "onSaveProjectAs", "onOpenMedia", "useFileSystemHandlers", "React", "TldrawContext", "useTldrawApp", "React", "styles", "UID", "CSS", "useStylesheet", "style", "React", "useFileSystemHandlers", "app", "useTldrawApp", "onNewProject", "e", "__async", "_a", "_b", "onSaveProject", "onSaveProjectAs", "onOpenProject", "onOpenMedia", "React", "useFileSystem", "promptSaveBeforeChange", "app", "__async", "onNewProject", "onSaveProject", "onSaveProjectAs", "onOpenProject", "onOpenMedia", "_a", "React", "TRANSLATIONS", "ar_default", "da_default", "de_default", "en_default", "es_default", "fa_default", "fr_default", "he_default", "it_default", "ja_default", "ko_kr_default", "ne_default", "no_default", "pl_default", "pt_br_default", "ru_default", "tr_default", "uk_default", "zh_cn_default", "zh_tw_default", "a", "b", "getTranslation", "locale", "_a", "translation", "__spreadValues", "main_default", "useTranslation", "locale", "getTranslation", "React", "breakpoints", "statusSelector", "s", "activeToolSelector", "StatusBar", "app", "useTldrawApp", "status", "activeTool", "StyledStatusBar", "breakpoints", "StyledSection", "styled", "React", "FormattedMessage", "ItemIndicator", "ChevronRightIcon", "CheckIcon", "React", "Utils", "commandKey", "Kbd", "variant", "children", "StyledKbd", "k", "i", "styled", "SmallIcon", "styled", "RowButton", "_a", "ref", "_b", "onClick", "isActive", "isWarning", "hasIndicator", "hasArrow", "disabled", "variant", "kbd", "children", "rest", "__objRest", "StyledRowButton", "breakpoints", "StyledRowButtonInner", "Kbd", "ItemIndicator", "SmallIcon", "CheckIcon", "ChevronRightIcon", "styled", "MenuContent", "styled", "isEmptyCanvasSelector", "s", "isDebugModeSelector", "dockPositionState", "BackToContent", "app", "useTldrawApp", "isEmptyCanvas", "dockPosition", "isDebugMode", "style", "BackToContentContainer", "__spreadValues", "RowButton", "FormattedMessage", "styled", "MenuContent", "React", "useIntl", "ArrowTopRightIcon", "CursorArrowIcon", "ImageIcon", "Pencil1Icon", "Pencil2Icon", "TextIcon", "React", "RadixTooltip", "Tooltip", "children", "label", "kbdProp", "id", "side", "StyledContent", "Kbd", "StyledArrow", "styled", "ToolButton", "_a", "ref", "_b", "onSelect", "onClick", "onDoubleClick", "variant", "children", "isToolLocked", "disabled", "isActive", "onKeyDown", "id", "rest", "__objRest", "StyledToolButton", "breakpoints", "StyledToolButtonInner", "ToolLockIndicator", "ToolButtonWithTooltip", "label", "kbd", "isLocked", "app", "useTldrawApp", "handleDoubleClick", "handleKeyDown", "e", "Tooltip", "styled", "Panel", "styled", "React", "DropdownMenu", "SquareIcon", "CircleIcon", "VercelLogoIcon", "CircleIcon", "props", "_a", "size", "rest", "__objRest", "DashDashedIcon", "dottedDasharray", "DashDottedIcon", "DashDrawIcon", "DashSolidIcon", "TrashIcon", "props", "UndoIcon", "_a", "_b", "flipHorizontal", "props", "__objRest", "SizeSmallIcon", "props", "SizeMediumIcon", "props", "SizeLargeIcon", "props", "EraserIcon", "DiscordIcon", "LineIcon", "useIntl", "shapeShapes", "shapeShapeIcons", "SquareIcon", "CircleIcon", "VercelLogoIcon", "LineIcon", "dockPositionState", "s", "ShapesMenu", "activeTool", "isToolLocked", "app", "useTldrawApp", "intl", "useIntl", "dockPosition", "lastActiveTool", "setLastActiveTool", "shapeShapes", "selectShapeTool", "handleDoubleClick", "handleKeyDown", "e", "isActive", "contentSide", "panelStyle", "ToolButton", "shapeShapeIcons", "Panel", "shape", "i", "Tooltip", "activeToolSelector", "s", "toolLockedSelector", "dockPositionState", "PrimaryTools", "app", "useTldrawApp", "intl", "useIntl", "activeTool", "isToolLocked", "dockPosition", "selectSelectTool", "selectEraseTool", "selectDrawTool", "selectArrowTool", "selectTextTool", "selectStickyTool", "uploadMedias", "__async", "panelStyle", "StyledPanel", "breakpoints", "ToolButtonWithTooltip", "CursorArrowIcon", "Pencil1Icon", "EraserIcon", "ShapesMenu", "ArrowTopRightIcon", "TextIcon", "Pencil2Icon", "ImageIcon", "styled", "Panel", "React", "DropdownMenu", "ArrowDownIcon", "ArrowUpIcon", "AspectRatioIcon", "CopyIcon", "DotsHorizontalIcon", "GroupIcon", "LockClosedIcon", "LockOpen1Icon", "PinBottomIcon", "PinTopIcon", "RotateCounterClockwiseIcon", "AlignBottomIcon", "AlignCenterHorizontallyIcon", "AlignCenterVerticallyIcon", "AlignLeftIcon", "AlignRightIcon", "AlignTopIcon", "SpaceEvenlyHorizontallyIcon", "SpaceEvenlyVerticallyIcon", "StretchHorizontallyIcon", "StretchVerticallyIcon", "BoxIcon", "AngleIcon", "Item", "DMItem", "_a", "_b", "onSelect", "id", "rest", "__objRest", "Item", "RowButton", "CheckboxItem", "preventEvent", "e", "DMCheckboxItem", "checked", "disabled", "variant", "onCheckedChange", "kbd", "id", "children", "CheckboxItem", "preventEvent", "RowButton", "DropdownMenu", "DMContent", "sideOffset", "children", "align", "variant", "id", "overflow", "side", "stopPropagation", "StyledContent", "styled", "MenuContent", "Separator", "DMDivider", "styled", "Separator", "RadioItem", "DMRadioItem", "styled", "RadioItem", "Root", "TriggerItem", "Content", "Arrow", "DMSubMenu", "children", "size", "overflow", "disabled", "label", "id", "Root", "TriggerItem", "RowButton", "Content", "MenuContent", "Arrow", "Trigger", "DMTriggerIcon", "_a", "_b", "id", "children", "rest", "__objRest", "Trigger", "ToolButton", "Divider", "styled", "useIntl", "dockPositionState", "s", "selectedShapesCountSelector", "isAllLockedSelector", "page", "selectedIds", "id", "isAllAspectLockedSelector", "isAllGroupedSelector", "selectedShapes", "shape", "hasSelectionSelector", "hasMultipleSelectionSelector", "ActionButton", "app", "useTldrawApp", "intl", "isAllLocked", "isAllAspectLocked", "isAllGrouped", "hasSelection", "hasMultipleSelection", "selectedShapesCount", "dockPosition", "hasTwoOrMore", "hasThreeOrMore", "handleRotate", "handleDuplicate", "handleToggleLocked", "handleToggleAspectRatio", "handleGroup", "handleMoveToBack", "handleMoveBackward", "handleMoveForward", "handleMoveToFront", "handleResetAngle", "alignTop", "alignCenterVertical", "alignBottom", "stretchVertically", "distributeVertically", "alignLeft", "alignCenterHorizontal", "alignRight", "stretchHorizontally", "distributeHorizontally", "handleMenuOpenChange", "open", "contentSide", "ToolButton", "DotsHorizontalIcon", "DMContent", "ButtonsRow", "Tooltip", "CopyIcon", "RotateCounterClockwiseIcon", "LockClosedIcon", "LockOpen1Icon", "AspectRatioIcon", "BoxIcon", "GroupIcon", "PinBottomIcon", "ArrowDownIcon", "ArrowUpIcon", "PinTopIcon", "AngleIcon", "Divider", "AlignLeftIcon", "AlignCenterHorizontallyIcon", "AlignRightIcon", "StretchHorizontallyIcon", "SpaceEvenlyHorizontallyIcon", "AlignTopIcon", "AlignCenterVerticallyIcon", "AlignBottomIcon", "StretchVerticallyIcon", "SpaceEvenlyVerticallyIcon", "styled", "React", "useIntl", "DeleteButton", "app", "useTldrawApp", "intl", "handleDelete", "hasSelection", "s", "Tooltip", "ToolButton", "TrashIcon", "React", "Popover", "DropdownMenu", "FormattedMessage", "GitHubLogoIcon", "HeartFilledIcon", "QuestionMarkIcon", "TwitterLogoIcon", "React", "ExternalLinkIcon", "FormattedMessage", "languageSelector", "s", "LanguageMenu", "app", "useTldrawApp", "language", "handleChangeLanguage", "locale", "DMContent", "TRANSLATIONS", "label", "DMCheckboxItem", "Divider", "DMItem", "FormattedMessage", "SmallIcon", "ExternalLinkIcon", "Dialog", "Cross2Icon", "FormattedMessage", "useIntl", "IconButton", "styled", "KeyboardShortcutDialog", "onOpenChange", "intl", "useIntl", "shortcuts", "RowButton", "FormattedMessage", "DialogOverlay", "DialogContent", "DialogTitle", "DialogIconButton", "Cross2Icon", "StyledColumns", "breakpoints", "key", "value", "StyledSection", "Label", "ContentItem", "shortcut", "StyledItem", "Kbd", "styled", "IconButton", "isDebugModeSelector", "s", "dockPositionState", "HelpPanel", "app", "useTldrawApp", "isDebugMode", "side", "isKeyboardShortcutsOpen", "setIsKeyboardShortcutsOpen", "PopoverAnchor", "HelpButton", "breakpoints", "QuestionMarkIcon", "StyledContent", "LanguageMenuDropdown", "KeyboardShortcutDialog", "Divider", "Links", "RowButton", "FormattedMessage", "LanguageMenu", "linksData", "GitHubLogoIcon", "TwitterLogoIcon", "DiscordIcon", "HeartFilledIcon", "item", "SmallIcon", "styled", "MenuContent", "isDebugModeSelector", "s", "dockPositionState", "ToolsPanel", "onBlur", "app", "useTldrawApp", "side", "isDebugMode", "StyledToolsPanelContainer", "breakpoints", "StyledCenterWrap", "BackToContent", "StyledPrimaryTools", "ActionButton", "PrimaryTools", "DeleteButton", "HelpPanel", "StyledStatusWrap", "StatusBar", "styled", "React", "HamburgerMenuIcon", "DropdownMenu", "React", "FormattedMessage", "useIntl", "settingsSelector", "s", "DockPosition", "PreferencesMenu", "app", "useTldrawApp", "intl", "useIntl", "settings", "toggleDebugMode", "v", "toggleDarkMode", "toggleFocusMode", "toggleRotateHandle", "toggleGrid", "toggleBoundShapesHandle", "toggleisSnapping", "toggleKeepStyleMenuOpen", "toggleCloneControls", "toggleCadSelectMode", "handleChangeDockPosition", "position", "selectExportBackground", "background", "DMSubMenu", "DMCheckboxItem", "FormattedMessage", "Divider", "StyledText", "TDExportBackground", "exportBackground", "styled", "FormattedMessage", "useIntl", "numberOfSelectedIdsSelector", "s", "disableAssetsSelector", "Menu", "readOnly", "app", "useTldrawApp", "intl", "useIntl", "numberOfSelectedIds", "disableAssets", "_", "setForce", "onNewProject", "onOpenProject", "onSaveProject", "onSaveProjectAs", "useFileSystemHandlers", "handleDelete", "handleCopySVG", "handleCopyPNG", "handleExportPNG", "__async", "handleExportJPG", "handleExportWEBP", "handleExportSVG", "handleCopyJSON", "handleExportJSON", "handleCut", "handleCopy", "handlePaste", "handleSelectAll", "handleSelectNone", "handleUploadMedia", "handleZoomTo100", "showFileMenu", "hasSelection", "DMTriggerIcon", "HamburgerMenuIcon", "DMContent", "DMSubMenu", "DMItem", "FormattedMessage", "Divider", "preventEvent", "PreferencesMenu", "React", "DropdownMenu", "PlusIcon", "CheckIcon", "React", "Dialog", "MixerVerticalIcon", "Pencil1Icon", "React", "TextField", "_a", "ref", "_b", "icon", "rest", "__objRest", "StyledInputWrapper", "StyledInput", "StyledInputIcon", "styled", "SmallIcon", "FormattedMessage", "useIntl", "canDeleteSelector", "s", "PageOptionsDialog", "page", "onOpen", "onClose", "app", "useTldrawApp", "intl", "useIntl", "isOpen", "setIsOpen", "pageName", "setPageName", "canDelete", "rInput", "handleClose", "handleDuplicate", "handleDelete", "handleOpenChange", "stopPropagation", "e", "rInitialName", "rCurrentName", "handleTextFieldChange", "event", "value", "handleTextFieldKeyDown", "elm", "rWasOpen", "IconButton", "breakpoints", "SmallIcon", "MixerVerticalIcon", "StyledDialogOverlay", "StyledDialogContent", "TextField", "Pencil1Icon", "Divider", "DialogAction", "FormattedMessage", "RowButton", "styled", "_a", "_b", "onSelect", "rest", "__objRest", "FormattedMessage", "useIntl", "sortedSelector", "s", "a", "b", "currentPageNameSelector", "currentPageIdSelector", "PageMenu", "app", "useTldrawApp", "rIsOpen", "isOpen", "setIsOpen", "handleClose", "handleOpenChange", "currentPageName", "ToolButton", "DMContent", "PageMenuContent", "onClose", "intl", "useIntl", "sortedPages", "currentPageId", "handleCreatePage", "pageName", "handleChangePage", "id", "dragId", "setDragId", "dropIndex", "setDropIndex", "handleDragStart", "ev", "p", "handleDrag", "rect", "handleDrop", "page", "i", "ButtonWithOptions", "PageButton", "SmallIcon", "CheckIcon", "PageOptionsDialog", "Divider", "RowButton", "FormattedMessage", "PlusIcon", "styled", "React", "DropdownMenu", "FormattedMessage", "zoomSelector", "s", "ZoomMenu", "app", "useTldrawApp", "zoom", "FixedWidthToolButton", "DMContent", "DMItem", "preventEvent", "styled", "ToolButton", "React", "DropdownMenu", "FormattedMessage", "TextAlignCenterIcon", "TextAlignJustifyIcon", "TextAlignLeftIcon", "TextAlignRightIcon", "currentStyleSelector", "s", "selectedIdsSelector", "STYLE_KEYS", "defaultTextStyle", "DASH_ICONS", "DashDrawIcon", "DashSolidIcon", "DashDashedIcon", "DashDottedIcon", "SIZE_ICONS", "SizeSmallIcon", "SizeMediumIcon", "SizeLargeIcon", "ALIGN_ICONS", "themeSelector", "keepOpenSelector", "optionsSelector", "activeTool", "pageId", "page", "hasText", "hasLabel", "id", "StyleMenu", "app", "useTldrawApp", "theme", "keepOpen", "options", "currentStyle", "selectedIds", "displayedStyle", "setDisplayedStyle", "rDisplayedStyle", "commonStyle", "overrides", "shape", "key", "handleToggleKeepOpen", "checked", "handleToggleFilled", "handleDashChange", "value", "handleSizeChange", "handleFontChange", "handleTextAlignChange", "handleMenuOpenChange", "open", "ToolButton", "FormattedMessage", "OverlapIcons", "strokes", "CircleIcon", "fills", "DMContent", "StyledRow", "ColorGrid", "style", "preventEvent", "DMCheckboxItem", "StyledGroup", "DashStyle", "DMRadioItem", "breakpoints", "SizeStyle", "sizeStyle", "Divider", "FontStyle", "fontStyle", "FontIcon", "AlignStyle", "styled", "React", "CheckIcon", "ClipboardIcon", "DropdownMenu", "Utils", "FormattedMessage", "MultiplayerIcon2", "roomSelector", "state", "MultiplayerMenu", "app", "useTldrawApp", "room", "copied", "setCopied", "rTimeout", "handleCopySelect", "TLDR", "handleCopyReadOnlySelect", "segs", "Utils", "handleCreateMultiplayerProject", "__async", "handleCopyToMultiplayerProject", "_a", "nextDocument", "id", "asset", "file", "dataURLtoFile", "newSrc", "result", "d", "e", "DMTriggerIcon", "MultiplayerIcon2", "DMContent", "DMItem", "FormattedMessage", "SmallIcon", "CheckIcon", "ClipboardIcon", "Divider", "dataurl", "filename", "_b", "arr", "mime", "bstr", "n", "u8arr", "TopPanel", "readOnly", "showPages", "showMenu", "showStyles", "showZoom", "showMultiplayerMenu", "app", "useTldrawApp", "StyledTopPanel", "Panel", "Menu", "MultiplayerMenu", "PageMenu", "StyledSpacer", "ReadOnlyLabel", "ToolButton", "UndoIcon", "ZoomMenu", "StyleMenu", "styled", "React", "RadixContextMenu", "AlignBottomIcon", "AlignCenterHorizontallyIcon", "AlignCenterVerticallyIcon", "AlignLeftIcon", "AlignRightIcon", "AlignTopIcon", "SpaceEvenlyHorizontallyIcon", "SpaceEvenlyVerticallyIcon", "StretchHorizontallyIcon", "StretchVerticallyIcon", "FormattedMessage", "useIntl", "numberOfSelectedIdsSelector", "s", "isDebugModeSelector", "hasGroupSelectedSelector", "id", "preventDefault", "e", "ContextMenu", "onBlur", "children", "InnerMenu", "app", "useTldrawApp", "intl", "useIntl", "numberOfSelectedIds", "isDebugMode", "hasGroupSelected", "rContent", "handleFlipHorizontal", "handleFlipVertical", "handleDuplicate", "handleLock", "handleGroup", "handleMoveToBack", "handleMoveBackward", "handleMoveForward", "handleMoveToFront", "handleDelete", "handleCut", "handleCopy", "handlePaste", "handleCopySVG", "handleCopyPNG", "handleUndo", "handleRedo", "handleExportPNG", "__async", "handleExportJPG", "handleExportWEBP", "handleExportSVG", "handleCopyJSON", "handleExportJSON", "hasSelection", "hasTwoOrMore", "hasThreeOrMore", "MenuContent", "CMRowButton", "FormattedMessage", "Divider", "ContextMenuSubMenu", "MoveToPageMenu", "AlignDistributeSubMenu", "alignTop", "alignCenterVertical", "alignBottom", "stretchVertically", "distributeVertically", "alignLeft", "alignCenterHorizontal", "alignRight", "stretchHorizontally", "distributeHorizontally", "CMTriggerButton", "StyledGridContent", "CMIconButton", "AlignLeftIcon", "AlignCenterHorizontallyIcon", "AlignRightIcon", "StretchHorizontallyIcon", "SpaceEvenlyHorizontallyIcon", "AlignTopIcon", "AlignCenterVerticallyIcon", "AlignBottomIcon", "StretchVerticallyIcon", "SpaceEvenlyVerticallyIcon", "CMArrow", "styled", "currentPageIdSelector", "documentPagesSelector", "currentPageId", "documentPages", "sorted", "a", "b", "name", "label", "size", "_a", "_b", "onSelect", "rest", "__objRest", "ToolButton", "RowButton", "isSubmenu", "DotFilledIcon", "FocusButton", "onSelect", "StyledButtonContainer", "IconButton", "DotFilledIcon", "styled", "FormattedMessage", "loadingSelector", "s", "Loading", "isLoading", "useTldrawApp", "StyledLoadingPanelContainer", "FormattedMessage", "styled", "_Errorboundary", "ErrorFallback", "error", "resetErrorBoundary", "app", "useTldrawApp", "refreshPage", "copyError", "textarea", "downloadBackup", "resetDocument", "Container", "InnerContainer", "Buttons", "RowButton", "Divider", "styled", "ErrorBoundary", "_Errorboundary", "Tldraw", "id", "document", "currentPageId", "autofocus", "showMenu", "showMultiplayerMenu", "showPages", "showTools", "showZoom", "showStyles", "showUI", "readOnly", "disableAssets", "darkMode", "onMount", "onChange", "onChangePresence", "onNewProject", "onSaveProject", "onSaveProjectAs", "onOpenProject", "onOpenMedia", "onUndo", "onRedo", "onPersist", "onPatch", "onCommand", "onChangePage", "onAssetCreate", "onAssetDelete", "onAssetUpload", "onSessionStart", "onSessionEnd", "onExport", "sId", "setSId", "app", "setApp", "TldrawApp", "newApp", "_a", "refreshBoundingBoxes", "TldrawContext", "InnerTldraw", "_b", "useTldrawApp", "rWrapper", "state", "settings", "appState", "room", "isSelecting", "page", "pageState", "assets", "selectedIds", "isHideBoundsShape", "TLDR", "isHideResizeHandlesShape", "meta", "showDashedBrush", "theme", "selectByContain", "isDarkMode", "isCadSelectMode", "brushBase", "isInSession", "hideBounds", "hideHandles", "hideIndicators", "hideCloneHandles", "translation", "useTranslation", "dark", "IntlProvider", "StyledLayout", "Loading", "OneOff", "ContextMenu", "ErrorFallback", "Renderer", "shapeUtils", "StyledUI", "FocusButton", "TopPanel", "StyledSpacer", "ToolsPanel", "focusableRef", "useKeyboardShortcuts", "useStylesheet", "styled"]
}
