{
  "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/PolygonUtils.ts", "../src/state/shapes/shared/TextAreaUtils.ts", "../src/state/shapes/shared/transformRectangle.ts", "../src/state/shapes/shared/transformSingleRectangle.ts", "../src/state/shapes/shared/useTextKeyboardEvents.ts", "../src/state/shapes/shared/LabelMask.tsx", "../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/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/GroupUtil/GroupUtil.tsx", "../src/state/shapes/StickyUtil/StickyUtil.tsx", "../src/hooks/useKeyboardShortcuts.tsx", "../src/hooks/useTldrawApp.tsx", "../src/hooks/useTheme.ts", "../src/hooks/useStylesheet.ts", "../src/hooks/useFileSystemHandlers.ts", "../src/hooks/useFileSystem.ts", "../src/state/shapes/TextUtil/TextUtil.tsx", "../src/state/shapes/shared/getTextWeight.ts", "../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/StickerUtil/StickerUtil.tsx", "../src/state/shapes/LinkUtil/LinkUtil.tsx", "../src/state/shapes/EmbedUtil/EmbedUtil.tsx", "../src/state/shapes/SectionUtil/SectionUtil.tsx", "../src/state/shapes/SectionUtil/rectangleHelpers.ts", "../src/state/shapes/SectionUtil/components/DashedRectangle.tsx", "../src/state/shapes/SectionUtil/components/BindingIndicator.tsx", "../src/state/shapes/SectionUtil/components/SectionHeader.tsx", "../src/state/sessions/ArrowSession/ArrowSession.ts", "../src/state/sessions/BaseSession.ts", "../src/state/StateManager/copy.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/ConnectorSession/ConnectorSession.ts", "../src/state/sessions/index.ts", "../src/state/commands/alignShapes/alignShapes.ts", "../src/state/commands/changePage/changePage.ts", "../src/state/commands/createPage/createPage.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/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/tools/ArrowTool/ArrowTool.ts", "../src/state/tools/BaseTool.ts", "../src/state/tools/LineTool/LineTool.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/SelectTool/SelectTool.ts", "../src/state/tools/StickyTool/StickyTool.ts", "../src/state/tools/TextTool/TextTool.ts", "../src/state/tools/EraseTool/EraseTool.ts", "../src/state/tools/StickerTool/StickerTool.ts", "../src/state/tools/SectionTool/SectionTool.ts", "../src/state/tools/HighlighterTool/HighlighterTool.ts", "../src/state/tools/ConnectorTool/ConnectorTool.ts", "../src/state/tools/CommentTool/CommentTool.ts", "../src/state/tools/MoveTool/MoveTool.tsx", "../src/state/tools/index.ts", "../src/state/shapes/FileUtil/FileUtil.tsx", "../src/state/shapes/HighlighterUtil/HighlighterUtil.tsx", "../src/state/shapes/HighlighterUtil/drawHelpers.ts", "../src/state/shapes/LessonUtil/LessonUtil.tsx", "../src/state/shapes/ConnectorUtil/ConnectorUtil.tsx", "../src/state/shapes/ConnectorUtil/connectorHelpers.ts", "../src/state/shapes/ConnectorUtil/components/ConnectorArrow.tsx", "../src/state/shapes/ConnectorUtil/components/ArrowHead.tsx", "../src/state/shapes/CommentUtil/CommentUtil.tsx", "../src/state/shapes/CommentUtil/mentionInputStyle.ts", "../src/state/shapes/CommentUtil/components/comment.tsx", "../src/state/shapes/index.ts", "../src/state/StateManager/StateManager.ts", "../src/components/ToolsPanel/ToolsPanel.tsx", "../src/components/ToolsPanel/StatusBar.tsx", "../src/components/ToolsPanel/BackToContent.tsx", "../src/components/Primitives/RowButton/RowButton.tsx", "../src/components/breakpoints.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/Panel/Panel.tsx", "../src/components/ToolsPanel/ShapesMenu.tsx", "../src/components/Primitives/Tooltip/Tooltip.tsx", "../src/components/Primitives/icons/BoxIcon.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/IsFilledIcon.tsx", "../src/components/Primitives/icons/RedoIcon.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/MultiplayerIcon.tsx", "../src/components/Primitives/icons/DiscordIcon.tsx", "../src/components/Primitives/icons/LineIcon.tsx", "../src/templates/template2.ts", "../src/components/ToolsPanel/ActionButton.tsx", "../src/components/Primitives/DropdownMenu/DMArrow.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/LockButton.tsx", "../src/components/ToolsPanel/PenMenu.tsx", "../src/components/ToolsPanel/SelectedPanel.tsx", "../src/components/ToolsPanel/SelectionTools.tsx", "../src/components/TopPanel/TopPanel.tsx", "../src/components/TopPanel/Menu/Menu.tsx", "../src/components/TopPanel/PreferencesMenu/PreferencesMenu.tsx", "../src/components/Primitives/icons/HeartIcon.tsx", "../src/components/TopPanel/PageMenu/PageMenu.tsx", "../src/components/TopPanel/PageOptionsDialog/PageOptionsDialog.tsx", "../src/components/Primitives/IconButton/IconButton.tsx", "../src/components/TopPanel/ZoomMenu/ZoomMenu.tsx", "../src/components/TopPanel/StyleMenu/StyleMenu.tsx", "../src/components/TopPanel/MultiplayerMenu/MultiplayerMenu.tsx", "../src/components/ContextMenu/ContextMenu.tsx", "../src/components/FocusButton/FocusButton.tsx", "../src/components/Loading/Loading.tsx", "../src/components/ToolsPanel/CursorSvg.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 { styled, dark } from '~styles'\nimport { TDDocument, TDStatus } from '~types'\nimport { TldrawApp, TDCallbacks } from '~state'\nimport { TldrawContext, useStylesheet, useKeyboardShortcuts, useTldrawApp } 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 { SelectedPanel } from '~components/ToolsPanel/SelectedPanel'\nimport { CursorSVG } from '~components/ToolsPanel/CursorSvg'\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 a sponsor link for Tldraw.\n   */\n  showSponsorLink?: 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  showSponsorLink = false,\n  disableAssets = false,\n  onMount,\n  onChange,\n  onChangePresence,\n  onNewProject,\n  onSaveProject,\n  onSaveProjectAs,\n  onOpenProject,\n  onOpenMedia,\n  onSignOut,\n  onSignIn,\n  onUndo,\n  onRedo,\n  onPersist,\n  onPatch,\n  onCommand,\n  onChangePage,\n  onAssetCreate,\n  onAssetDelete,\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      onSignOut,\n      onSignIn,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\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      onSignOut,\n      onSignIn,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\n      onExport,\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\n  React.useEffect(() => {\n    if (!document) return\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  }, [app, readOnly])\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      onSignOut,\n      onSignIn,\n      onUndo,\n      onRedo,\n      onPersist,\n      onPatch,\n      onCommand,\n      onChangePage,\n      onAssetDelete,\n      onAssetCreate,\n      onExport,\n    }\n  }, [\n    onMount,\n    onChange,\n    onChangePresence,\n    onNewProject,\n    onSaveProject,\n    onSaveProjectAs,\n    onOpenProject,\n    onOpenMedia,\n    onSignOut,\n    onSignIn,\n    onUndo,\n    onRedo,\n    onPersist,\n    onPatch,\n    onCommand,\n    onChangePage,\n    onAssetDelete,\n    onAssetCreate,\n    onExport,\n  ])\n\n  React.useLayoutEffect(() => {\n    app.setMembers([\n      {\n        id: '1232415',\n        display: 'issac newton',\n        avatar: \"https://lh3.googleusercontent.com/a/AItbvmkxSDlPkw8aevUuUYOqVJBBf9QYo4MEugPtpdCx=s96-c\",\n        role: 'member',\n        email: 'issac@gmail.com'\n      },\n      {\n        id: 's41415',\n        display: 'Sam Victor',\n        avatar: \"https://lh3.googleusercontent.com/a/AItbvmkxSDlPkw8aevUuUYOqVJBBf9QYo4MEugPtpdCx=s96-c\",\n        role: 'member',\n        email:'asfa@aga.com'\n      },\n      {\n        id: 'emmanuel',\n        display: 'emmanuel stones',\n        avatar: \"https://lh3.googleusercontent.com/a/AItbvmkxSDlPkw8aevUuUYOqVJBBf9QYo4MEugPtpdCx=s96-c\",\n        role: 'member'\n      }, {\n        id: 'Watson',\n        display: 'Watson Lvandoski',\n        avatar: \"https://lh3.googleusercontent.com/a/AItbvmkxSDlPkw8aevUuUYOqVJBBf9QYo4MEugPtpdCx=s96-c\",\n        role: 'member'\n      }\n    ]\n    )\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        showSponsorLink={showSponsorLink}\n        readOnly={readOnly}\n      />\n    </TldrawContext.Provider>\n  )\n}\n\ninterface InnerTldrawProps {\n  id?: string\n  autofocus: boolean\n  showPages: boolean\n  showMenu: boolean\n  showMultiplayerMenu: boolean\n  showZoom: boolean\n  showStyles: boolean\n  showUI: boolean\n  showTools: boolean\n  showSponsorLink: boolean\n  readOnly: 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  showSponsorLink,\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  const activeTool = state.appState.activeTool\n  const selectedSticker = state.appState.selectedSticker\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 =\n    isInSession || !isSelecting || !settings.showCloneHandles || pageState.camera.zoom < 0.2\n  \n    const setPreviewFalse= () => {\n      if(app.appState.isPreview)\n      app.setPreview(false)\n    }\n\n  return (\n    <StyledLayout\n      ref={rWrapper}\n      tabIndex={-0}\n      className={settings.isDarkMode ? dark : ''}\n    >\n      <Loading />\n      <OneOff focusableRef={rWrapper} autofocus={autofocus} />\n      <ContextMenu>\n        <div style={{\n          opacity: app.appState.isPreview ? '43%' : '100%'\n        }} onClick={setPreviewFalse}>\n        <Renderer\n          id={id}\n          containerRef={rWrapper}\n          shapeUtils={shapeUtils}\n          page={page}\n          status={appState.status}\n          pageState={pageState}\n          assets={assets}\n          snapLines={appState.snapLines}\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          activeUsers={[]}\n        />\n        </div>\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                showSponsorLink={showSponsorLink}\n              />\n              <StyledSpacer />\n              {showTools && !readOnly && <ToolsPanel />}\n              {selectedIds.length > 0 && <SelectedPanel selectedIds={selectedIds} />}\n              {activeTool === 'sticker' && <CursorSVG sticker={selectedSticker} />}\n            </>\n          )}\n        </StyledUI>\n      )}\n    </StyledLayout>\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\nexport const 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\nexport const 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\nexport const 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(238, 241, 252, 1)',\n      selectedContrast: 'rgba(37, 77, 218, 1)',\n      sponsor: '#ec6cb9',\n      sponsorContrast: '#ec6cb944',\n      text: '#333333',\n      tooltip: '#1d1d1d',\n      tooltipContrast: '#ffffff',\n      warn: 'rgba(255, 100, 100, 1)',\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    },\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  },\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 'sn-wb-tldraw-core'\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\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    nudgeDistanceSmall: number\n    nudgeDistanceLarge: number\n    isFocusMode: boolean\n    isSnapping: boolean\n    showRotateHandles: boolean\n    showBindingHandles: boolean\n    showCloneHandles: boolean\n    showGrid: boolean\n  }\n  appState: {\n    currentStyle: TextShapeStyles\n    currentStickyStyle: ShapeStyles\n    currentShapeStyle: ShapeStyles\n    currentDrawStyle: ShapeStyles\n    currentHighlighterStyle: ShapeStyles\n    currentSectionStyle: 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    isLoading: boolean\n    disableAssets: boolean\n    selectByContain?: boolean\n    selectedSticker: string\n    currentStickerPoint: number[]\n    user: any\n    isOpen: {\n      [key:string]: boolean\n    },\n    defaultOpen: boolean,\n    isTemplateLibrary: boolean,\n    showTimer:boolean,\n    selectedStickyText: string,\n    currentTemplate: string\n    isTemplateEditMode: boolean\n    stashForEditing: string,\n    currentEditingTemplate: any,\n    isPreview: Boolean\n    members: any,\n    hasMention: boolean,\n    mentionedUsers: any,\n    commentMessage: string\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, any>\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  sections: Patch<TDPage['sections']>\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}\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  Connector = 'connector',\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  | 'move'\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  | TDShapeType.Sticker\n  | TDShapeType.Section\n  | TDShapeType.Highlighter\n  | TDShapeType.Connector\n  | TDShapeType.Comment\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  Sticker = 'sticker',\n  Link = 'link',\n  Embed = 'embed',\n  Section = 'section',\n  File = 'file',\n  Highlighter = 'highlighter',\n  Lesson = 'lesson',\n  Connector = 'connector',\n  Comment = 'comment',\n}\n\nexport enum Decoration {\n  Arrow = 'arrow',\n}\n\nexport interface TDBaseShape extends TLShape {\n  style: TextShapeStyles\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}\nexport interface HighlighterShape extends TDBaseShape {\n  type: TDShapeType.Highlighter\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 ConnectorShape extends TDBaseShape {\n  type: TDShapeType.Connector\n  handles: {\n    start: TDHandle\n    end: TDHandle\n    // startConnector: TDHandle\n    // endConnector: 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 interface ConnectorBinding extends TLBinding {\n  handleId: keyof ConnectorShape['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 StickerShape extends TDBaseShape {\n  type: TDShapeType.Sticker\n  size: number[]\n  assetId: string\n  svg: 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  user: string\n}\nexport interface CommentShape extends TDBaseShape {\n  type: TDShapeType.Comment\n  size: number[]\n  user: any\n  comments: any[]\n  currentComment: string\n  isOpen: boolean\n}\nexport interface LinkShape extends TDBaseShape {\n  type: TDShapeType.Link\n  size: number[]\n  url: string\n  title: string | undefined\n  imageUrl: string | undefined\n  description: string | undefined\n}\n\nexport interface FileShape extends TDBaseShape {\n  type: TDShapeType.File\n  size: number[]\n  url: string\n  title: string\n  icon: string\n  avatarUrl: any[]\n  firstName: string\n  time: string\n  fileType: string\n  fileIcon: string\n}\n\nexport interface LessonShape extends TDBaseShape {\n  type: TDShapeType.Lesson\n  size: number[]\n  title: string\n  imageUrl: string\n  description: string\n  url: string\n}\n\nexport interface EmbedShape extends TDBaseShape {\n  type: TDShapeType.Embed\n  size: number[]\n  src: string\n  faviconSrc: string\n}\n\nexport interface SectionShape extends TDBaseShape {\n  type: TDShapeType.Section\n  size: number[]\n  children: string[]\n  label?: string\n  labelPoint?: number[]\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  | StickerShape\n  | LinkShape\n  | EmbedShape\n  | SectionShape\n  | FileShape\n  | HighlighterShape\n  | LessonShape\n  | ConnectorShape\n  | CommentShape\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  Pink = 'pink',\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 TextWeight {\n  Normal = 'normal',\n  Bold = 'bold',\n}\n\nexport enum ListType {\n  None = 'none',\n  Bullet = 'bullet',\n  Numbered = 'numbered',\n}\n\nexport enum FontStyle {\n  Script = 'script',\n  Sans = 'sans',\n  Serif = 'erif',\n  Mono = 'mono',\n  Graphik = 'Graphik Web',\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 type TextShapeStyles = {\n  color: ColorStyle\n  size: SizeStyle\n  dash: DashStyle\n  font?: FontStyle\n  textAlign?: AlignStyle\n  isFilled?: boolean\n  scale?: number\n  textWeight: TextWeight\n  listType: ListType\n  textDecoration: string\n  fontStyle: string\n  bounds: number[]\n}\n\nexport enum TDAssetType {\n  Image = 'image',\n  Video = 'video',\n}\n\nexport interface TDImageAsset extends TLAsset {\n  type: TDAssetType.Image\n  src: string\n  size: number[]\n}\n\nexport interface TDVideoAsset extends TLAsset {\n  type: TDAssetType.Video\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 TDExportTypes {\n  PNG = 'png',\n  JPG = 'jpeg',\n  WEBP = 'webp',\n  PDF = 'pdf',\n  SVG = 'svg',\n  JSON = 'json',\n}\n\nexport interface TDExport {\n  currentPageId: string\n  name: string\n  shapes: TDShape[]\n  assets: TDAssets\n  type: TDExportTypes\n  size: number[]\n  serialized?: string\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 'sn-wb-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  TDExportTypes,\n  TDAssets,\n  TDExport,\n  ImageShape,\n  ArrowShape,\n  TextShapeStyles,\n  ConnectorShape,\n} from '~types'\nimport {\n  migrate,\n  FileSystemHandle,\n  loadFileHandle,\n  openFromFileSystem,\n  saveToFileSystem,\n  openAssetFromFileSystem,\n  fileToBase64,\n  fileToText,\n  getImageSizeFromSrc,\n  getVideoSizeFromSrc,\n} from './data'\nimport { TLDR } from './TLDR'\nimport { shapeUtils } from '~state/shapes'\nimport {\n  defaultHighlighterStyle,\n  defaultSectionStyle,\n  defaultStickyStyle,\n  defaultStyle,\n  defaultTextStyle,\n  defaultUser,\n} 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 { StickerTool } from './tools/StickerTool'\nimport { SectionTool } from './tools/SectionTool'\nimport { HighlighterTool } from './tools/HighlighterTool'\nimport { ConnectorTool } from './tools/ConnectorTool'\nimport { CommentTool } from './tools/CommentTool'\nimport { MoveTool } from './tools/MoveTool/MoveTool'\n\nconst uuid = Utils.uniqueId()\n\nexport interface TDCallbacks {\n  /**\n   * (optional) A callback to run when the component mounts.\n   */\n  onMount?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the component's state changes.\n   */\n  onChange?: (state: 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?: (state: 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?: (state: 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?: (state: 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?: (state: TldrawApp, e?: KeyboardEvent) => void\n  /**\n   * (optional) A callback to run when the opens a file to upload.\n   */\n  onOpenMedia?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user signs in via the menu.\n   */\n  onSignIn?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user signs out via the menu.\n   */\n  onSignOut?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the state is patched.\n   */\n  onPatch?: (state: TldrawApp, reason?: string) => void\n  /**\n   * (optional) A callback to run when the state is changed with a command.\n   */\n  onCommand?: (state: TldrawApp, reason?: string) => void\n  /**\n   * (optional) A callback to run when the state is persisted.\n   */\n  onPersist?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user undos.\n   */\n  onUndo?: (state: TldrawApp) => void\n  /**\n   * (optional) A callback to run when the user redos.\n   */\n  onRedo?: (state: 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    sections: Record<string, string[] | undefined>\n  ) => void\n  /**\n   * (optional) A callback to run when the user creates a new project.\n   */\n  onChangePresence?: (state: TldrawApp, user: TDUser) => void\n  /**\n   * (optional) A callback to run when an asset will be deleted.\n   */\n  onAssetDelete?: (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?: (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?: (info: TDExport) => Promise<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    move: new MoveTool(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    [TDShapeType.Sticker]: new StickerTool(this),\n    [TDShapeType.Section]: new SectionTool(this),\n    [TDShapeType.Highlighter]: new HighlighterTool(this),\n    [TDShapeType.Connector]: new ConnectorTool(this),\n    [TDShapeType.Comment]: new CommentTool(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    sections: any\n  }\n\n  rotationInfo = {\n    selectedIds: [] as string[],\n    center: [0, 0],\n  }\n\n  pasteInfo = {\n    center: [0, 0],\n    offset: [0, 0],\n  }\n\n  constructor(id?: string, callbacks = {} as TDCallbacks) {\n    super(TldrawApp.defaultState, id, TldrawApp.version, (prev, next, prevVersion) => {\n      return {\n        ...next,\n        document: migrate(\n          { ...next.document, ...prev.document, version: prevVersion },\n          TldrawApp.version\n        ),\n      }\n    })\n\n    this.callbacks = callbacks\n  }\n\n  changeCursorStickerPosition = () => {\n    this.patchState({\n      appState: {\n        currentStickerPoint: this.currentPoint,\n      },\n    })\n  }\n\n  initializeUser = (user: any) => {\n    this.patchState({\n      appState: {\n        user,\n      },\n    })\n  }\n\n  setDropDown = (id: string, status = !this.appState.isOpen[id]) => {\n    this.patchState({\n      appState: {\n        isOpen: {\n          [id]: status,\n        },\n      },\n    })\n  }\n\n\n  setPreview = (isPreview: boolean) => {\n    this.patchState({\n      appState: {\n        isPreview\n      },\n    })\n  }\n\n  restoreStashedShapes = () => {\n    const shapes = JSON.parse(this.appState.stashForEditing)\n    if (Object.keys(shapes).length) this.createTemplateAtPoint(shapes)\n    this.patchState({\n      appState: {\n        stashForEditing: '{}',\n      },\n    })\n  }\n\n  storeCurrentTemplate = () => {\n    const ids = Object.values(this.document.pages[this.currentPageId].shapes)\n      .filter((shape) => shape.parentId === this.currentPageId)\n      .map((shape) => shape.id)\n    const copyingShapeIds = ids.flatMap((id) =>\n      TLDR.getDocumentBranch(this.state, id, this.currentPageId)\n    )\n    const copyingShapes = copyingShapeIds.map((id) =>\n      Utils.deepClone(this.getShape(id, this.currentPageId))\n    )\n    if (copyingShapes.length === 0) return this\n    const copyingBindings: TDBinding[] = Object.values(this.page.bindings).filter(\n      (binding) =>\n        copyingShapeIds.includes(binding.fromId) && copyingShapeIds.includes(binding.toId)\n    )\n    const copyingAssets = copyingShapes\n      .map((shape) => {\n        if (!shape.assetId) return\n\n        return this.document.assets[shape.assetId]\n      })\n      .filter(Boolean) as TDAsset[]\n\n    try {\n      const stashedShapes = JSON.stringify({\n        type: 'tldr/clipboard',\n        shapes: copyingShapes,\n        bindings: copyingBindings,\n        assets: copyingAssets,\n        zoom: this.pageState.camera.zoom,\n        sections: this.page.sections \n      })\n\n      this.patchState({\n        appState: {\n          stashForEditing: stashedShapes,\n        },\n      })\n\n      // navigator.clipboard.writeText(text).then(\n      //   () => {\n      //     // success\n      //   },\n      //   () => {\n      //     // failure\n      //   }\n      // )\n    } catch (e) {\n      // Browser does not support copying to clipboard\n    }\n    this.pasteInfo.offset = [0, 0]\n    this.pasteInfo.center = [0, 0]\n    return this\n  }\n\n  storeTemplateData = (values: any) => {\n    this.patchState({\n      appState: {\n        currentEditingTemplate: values,\n      },\n    })\n  }\n\n  setTemplateLibrary = (status: boolean) => {\n    this.patchState({\n      appState: {\n        isTemplateLibrary: status,\n      },\n    })\n  }\n\n\n  setTemplateEditMode = (status: boolean) => {\n    this.patchState({\n      appState: {\n        isTemplateEditMode: status,\n      },\n    })\n  }\n\n  setForcepanningTrue = () => {\n    this.isForcePanning = true\n    return this\n  }\n\n  setMention = (status: boolean) => {\n    this.patchState({\n      appState: {\n        hasMention: status,\n      },\n    })\n  }\n\n  setMessage = (message: string) => {\n    this.patchState({\n      appState: {\n        commentMessage: message,\n      },\n    })\n  }\n\n  setMentionedUsers = (users: any) => {\n    this.patchState({\n      appState: {\n        mentionedUsers: users,\n      },\n    })\n  }\n\n  setMembers = (members:any) => {\n    this.patchState({\n      appState: {\n        members: members,\n      },\n    })\n  }\n\n  setTimer = (status: boolean) => {\n    this.patchState({\n      appState: {\n        showTimer: status,\n      },\n    })\n  }\n\n  setSelectedText = (text: string) => {\n    this.patchState({\n      appState: {\n        selectedStickyText: text,\n      },\n    })\n  }\n\n  setDefaultOpen = (status: boolean) => {\n    this.patchState({\n      appState: {\n        defaultOpen: status,\n      },\n    })\n  }\n\n  removeEditing = () => {\n    this.patchState(\n      {\n        document: {\n          pageStates: {\n            [this.currentPageId]: {\n              editingId: undefined,\n            },\n          },\n        },\n      },\n      `set_editing_id`\n    )\n  }\n\n  checkIfInsideSectionandReturnState = (id: string) => {\n    let sections = this.document.pages.page?.sections\n    if (sections && Object.keys(sections).length > 0) {\n      const bounds = this.getShapeUtil(this.getShape(id)).getBounds(this.getShape(id))\n      Object.keys(sections).forEach((section) => {\n        if (sections[section]) {\n          const sectionShape = this.getShapeUtil(this.getShape(section)).getBounds(\n            this.getShape(section)\n          )\n          if (\n            bounds.minX > sectionShape.minX &&\n            bounds.maxX < sectionShape.maxX &&\n            bounds.minY > sectionShape.minY &&\n            bounds.maxY < sectionShape.maxY\n          ) {\n            if (!sections[section].includes(id)) {\n              sections = {\n                ...sections,\n                [section]: [...sections[section], id],\n              }\n            }\n          } else {\n            if (sections[section].includes(id)) {\n              sections = {\n                ...sections,\n                [section]: [...sections[section].filter((id2: string) => id2 !== id)],\n              }\n            }\n          }\n        }\n      })\n    }\n\n    if (this.getShape(id).name === 'Section') {\n      const sectionShape = this.getShapeUtil(this.getShape(id)).getBounds(this.getShape(id))\n      const shapesToTest = this.shapes\n        .filter(\n          (shape) =>\n            shape.isLocked ||\n            shape.isHidden ||\n            shape.parentId === this.currentPageId ||\n            id !== shape.id\n        )\n        .map((shape) => ({\n          id: shape.id,\n          bounds: this.getShapeUtil(shape).getBounds(shape),\n          selectId: shape.id, //TLDR.getTopParentId(data, shape.id, currentPageId),\n        }))\n\n      shapesToTest.forEach((shape) => {\n        const bounds = this.getShapeUtil(this.getShape(shape.id)).getBounds(this.getShape(shape.id))\n        if (sections && Object.keys(sections).length) {\n          if (\n            bounds.minX > sectionShape.minX &&\n            bounds.maxX < sectionShape.maxX &&\n            bounds.minY > sectionShape.minY &&\n            bounds.maxY < sectionShape.maxY\n          ) {\n            const uniqueIds = [...sections[id], shape.id]\n            sections = {\n              [id]: [...new Set(uniqueIds)],\n            }\n          } else if (sections[id] && sections[id].includes(shape.id)) {\n            sections = {\n              [id]: [...sections[id].filter((id2) => id2 !== shape.id)],\n            }\n          }\n          const toBeSelectedIds = [...sections[id], id, ...this.selectedIds]\n          this.select(...toBeSelectedIds)\n        }\n      })\n    }\n    return sections\n  }\n  /* -------------------- Internal -------------------- */\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        appState: {\n          status: TDStatus.Idle,\n        },\n        document: migrate(this.document, TldrawApp.version),\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    // delete next.appState.sections\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          if (next.document.pages[pageId].sections) {\n            next.document.pages[pageId].sections = Object.keys(next.document.pages[pageId].sections)\n              .filter((key) => next.document.pages[pageId].sections[key])\n              .reduce(\n                (res, key) =>\n                  Object.assign(res, { [key]: next.document.pages[pageId].sections[key] }),\n                {}\n              )\n          }\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            const fromShapeConnector = page.shapes[binding.fromId] as ConnectorShape\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\n            const fromDelta = TLDR.updateArrowBindings(page, fromShape)\n            TLDR.connectConnectorToShape(page, fromShapeConnector)\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  onPatch = (state: TDSnapshot, id?: string) => {\n    this.callbacks.onPatch?.(this, id)\n  }\n\n  onCommand = (state: TDSnapshot, id?: string) => {\n    this.clearSelectHistory()\n    this.isDirty = true\n    this.callbacks.onCommand?.(this, 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 = () => {\n    // If we are part of a room, send our changes to the server\n    if (this.callbacks.onChangePage) {\n      this.broadcastPageChanges()\n    }\n    this.callbacks.onPersist?.(this)\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      })\n      this.prevSelectedIds = this.selectedIds\n    }\n  }\n\n  /* ----------- Managing Multiplayer State ----------- */\n\n  private justSent = false\n  private prevShapes = this.page.shapes\n  private prevBindings = this.page.bindings\n  private prevAssets = this.document.assets\n  private prevSections = this.page.sections\n\n  private broadcastPageChanges = () => {\n    const visited = new Set<string>()\n\n    const changedShapes: Record<string, TDShape | undefined> = {}\n    const changedBindings: Record<string, TDBinding | undefined> = {}\n    const changedAssets: Record<string, TDAsset | undefined> = {}\n    const changedSections: Record<string, string[] | undefined> = {}\n\n    this.shapes.forEach((shape) => {\n      visited.add(shape.id)\n      if (this.prevShapes[shape.id] !== shape) {\n        changedShapes[shape.id] = shape\n      }\n    })\n\n    Object.keys(this.prevShapes)\n      .filter((id) => !visited.has(id))\n      .forEach((id) => {\n        // After visiting all the current shapes, if we haven't visited a\n        // previously present shape, then it was deleted\n        changedShapes[id] = undefined\n      })\n\n    this.bindings.forEach((binding) => {\n      visited.add(binding.id)\n      if (this.prevBindings[binding.id] !== binding) {\n        changedBindings[binding.id] = binding\n      }\n    })\n\n    Object.keys(this.prevBindings)\n      .filter((id) => !visited.has(id))\n      .forEach((id) => {\n        // After visiting all the current bindings, if we haven't visited a\n        // previously present shape, then it was deleted\n        changedBindings[id] = undefined\n      })\n\n    this.assets.forEach((asset) => {\n      visited.add(asset.id)\n      if (this.prevAssets[asset.id] !== asset) {\n        changedAssets[asset.id] = asset\n      }\n    })\n\n    Object.keys(this.prevAssets)\n      .filter((id) => !visited.has(id))\n      .forEach((id) => {\n        changedAssets[id] = undefined\n      })\n    \n    Object.keys(this.sections).forEach((section) => {\n      visited.add(section)\n      if (this.prevSections[section] !== section) {\n        changedSections[section] = this.sections[section]\n      }\n    })\n    \n    Object.keys(this.prevSections)\n    .filter((id) => !visited.has(id))\n    .forEach((id) => {\n      // After visiting all the current shapes, if we haven't visited a\n      // previously present shape, then it was deleted\n      changedSections[id] = undefined\n    })\n\n    // Only trigger update if shapes or bindings have changed\n    if (\n      Object.keys(changedBindings).length > 0 ||\n      Object.keys(changedShapes).length > 0 ||\n      Object.keys(changedAssets).length > 0 ||\n      Object.keys(changedSections).length > 0 \n      \n    ) {\n      this.justSent = true\n      this.callbacks.onChangePage?.(this, changedShapes, changedBindings, changedAssets, changedSections)\n      this.prevShapes = this.page.shapes\n      this.prevBindings = this.page.bindings\n      this.prevSections = this.page.sections\n      this.prevAssets = this.document.assets\n    }\n  }\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    sections: Record<string, string[]>,\n    pageId = this.currentPageId,\n    isInitial= false,\n  ): this => {\n\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    const page = this.document.pages[this.currentPageId]\n\n    Object.values(shapes).forEach((shape) => {\n      if(shape.type===TDShapeType.Text){\n        if(!shape.hasOwnProperty('textAreaWidth'))\n          {\n            shape.textAreaWidth = 100;\n            shape.hasResized = false;\n            shape.style.bounds = [1,1]\n          }\n      }\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      if(isInitial){\n        this.zoomToFit()\n      }\n    })\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      this.prevShapes = shapes\n      this.prevBindings = bindings\n      this.prevAssets = assets\n      this.prevSections = sections\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 nextSections = {\n        ...sections\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              sections: nextSections\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        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      // this.prevShapes = nextShapes\n      // this.prevBindings = nextBindings\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.pageState.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) => {\n    if (this.readOnly) return\n\n    this.editingStartTime = performance.now()\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    this.patchState(\n      {\n        settings: {\n          [name]: typeof value === 'function' ? value(this.settings[name] as V) : value,\n        },\n      },\n      `settings:${name}`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggle pen mode.\n   */\n  toggleFocusMode = (): this => {\n    if (this.session) return this\n    this.patchState(\n      {\n        settings: {\n          isFocusMode: !this.settings.isFocusMode,\n        },\n      },\n      `settings:toggled_focus_mode`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggle pen mode.\n   */\n  togglePenMode = (): this => {\n    if (this.session) return this\n    this.patchState(\n      {\n        settings: {\n          isPenMode: !this.settings.isPenMode,\n        },\n      },\n      `settings:toggled_pen_mode`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggle dark mode.\n   */\n  toggleDarkMode = (): this => {\n    if (this.session) return this\n    this.patchState(\n      { settings: { isDarkMode: !this.settings.isDarkMode } },\n      `settings:toggled_dark_mode`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggle zoom snap.\n   */\n  toggleZoomSnap = () => {\n    if (this.session) return this\n    this.patchState(\n      { settings: { isZoomSnap: !this.settings.isZoomSnap } },\n      `settings:toggled_zoom_snap`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggle debug mode.\n   */\n  toggleDebugMode = () => {\n    if (this.session) return this\n    this.patchState(\n      { settings: { isDebugMode: !this.settings.isDebugMode } },\n      `settings:toggled_debug`\n    )\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggles the state if menu is opened\n   */\n  setMenuOpen = (isOpen: boolean): this => {\n    this.patchState({ appState: { isMenuOpen: isOpen } }, 'ui:toggled_menu_opened')\n    this.persist()\n    return this\n  }\n\n  /**\n   * Toggles the state if something is loading\n   */\n  setIsLoading = (isLoading: boolean): this => {\n    this.patchState({ appState: { isLoading } }, 'ui:toggled_is_loading')\n    this.persist()\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    this.patchState({ settings: { showGrid: !this.settings.showGrid } }, 'settings:toggled_grid')\n    this.persist()\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  selectSticker = (svg: string): this => {\n    return this.patchState({\n      appState: {\n        selectedSticker: svg,\n      },\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.pasteInfo.offset = [0, 0]\n    this.currentTool = this.tools.select\n\n    this.resetHistory()\n      .clearSelectHistory()\n      .loadDocument(migrate(TldrawApp.defaultDocument, TldrawApp.version))\n      .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        ...this.state,\n        appState: {\n          ...this.appState,\n          currentPageId: Object.keys(document.pages)[0],\n        },\n        document: migrate(document, TldrawApp.version),\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        ...this.state,\n        appState: nextAppState,\n        document: {\n          ...migrate(document, TldrawApp.version),\n          pageStates: currentPageStates,\n        },\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    const 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    nextState.document = migrate(nextState.document, nextState.document.version || 0)\n\n    return this.replaceState(nextState, `${reason}:${document.id}`)\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    this.replaceState(\n      {\n        ...TldrawApp.defaultState,\n        settings: {\n          ...this.state.settings,\n        },\n        document: migrate(document, TldrawApp.version),\n        appState: {\n          ...TldrawApp.defaultState.appState,\n          ...this.state.appState,\n          currentPageId: Object.keys(document.pages)[0],\n          disableAssets: this.disableAssets,\n        },\n      },\n      'loaded_document'\n    )\n    const { point, zoom } = this.pageState.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.document, TldrawApp.version),\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 openAssetFromFileSystem()\n        if (!file) return\n        this.addMediaFromFile(file)\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  get sections(): any {\n    // console.log('this.page', Object.values(this.page.sections));\n    \n    return this.page.sections\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  /**\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): 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))\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   * 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   * Copy one or more shapes to the clipboard.\n   * @param ids The ids of the shapes to copy.\n   */\n  copy = (ids = this.selectedIds): this => {\n    const copyingShapeIds = ids.flatMap((id) =>\n      TLDR.getDocumentBranch(this.state, id, this.currentPageId)\n    )\n    const copyingShapes = copyingShapeIds.map((id) =>\n      Utils.deepClone(this.getShape(id, this.currentPageId))\n    )\n    if (copyingShapes.length === 0) return this\n    const copyingBindings: TDBinding[] = Object.values(this.page.bindings).filter(\n      (binding) =>\n        copyingShapeIds.includes(binding.fromId) && copyingShapeIds.includes(binding.toId)\n    )\n    const copyingAssets = copyingShapes\n      .map((shape) => {\n        if (!shape.assetId) return\n\n        return this.document.assets[shape.assetId]\n      })\n      .filter(Boolean) as TDAsset[]\n\n      const copyingSections = this.document.pages.page.sections\n      \n    this.clipboard = {\n      shapes: copyingShapes,\n      bindings: copyingBindings,\n      assets: copyingAssets,\n      sections: copyingSections\n    }\n    try {\n      const text = JSON.stringify({\n        type: 'tldr/clipboard',\n        ...this.clipboard,\n      })\n\n      navigator.clipboard.writeText(text).then(\n        () => {\n          // success\n        },\n        () => {\n          // failure\n        }\n      )\n    } catch (e) {\n      // Browser does not support copying to clipboard\n    }\n    this.pasteInfo.offset = [0, 0]\n    this.pasteInfo.center = [0, 0]\n    return this\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): this => {\n    this.copy(ids)\n    this.delete(ids)\n    return this\n  }\n\n  /**\n   * Paste shapes (or text) from clipboard to a certain point.\n   * @param point\n   */\n  paste = (point?: number[]) => {\n    if (this.readOnly) return\n    const pasteInCurrentPage = (shapes: TDShape[], bindings: TDBinding[], assets: TDAsset[], sections:any) => {\n      const idsMap: Record<string, string> = {}\n      const newAssets = assets.filter((asset) => this.document.assets[asset.id] === undefined)\n      if (newAssets.length) {\n        this.patchState({\n          document: {\n            assets: Object.fromEntries(newAssets.map((asset) => [asset.id, asset])),\n          },\n        })\n      }\n      shapes.forEach((shape) => (idsMap[shape.id] = Utils.uniqueId()))\n      bindings.forEach((binding) => (idsMap[binding.id] = Utils.uniqueId()))\n      let startIndex = TLDR.getTopChildIndex(this.state, this.currentPageId)\n      const shapesToPaste = shapes\n        .sort((a, b) => a.childIndex - b.childIndex)\n        .map((shape) => {\n          const parentShapeId = idsMap[shape.parentId]\n          const copy = {\n            ...shape,\n            id: idsMap[shape.id],\n            parentId: parentShapeId || this.currentPageId,\n          }\n          if (shape.children) {\n            copy.children = shape.children.map((id) => idsMap[id])\n          }\n          if (!parentShapeId) {\n            copy.childIndex = startIndex\n            startIndex++\n          }\n          if (copy.handles) {\n            Object.values(copy.handles).forEach((handle) => {\n              if (handle.bindingId) {\n                handle.bindingId = idsMap[handle.bindingId]\n              }\n            })\n          }\n          return copy\n        })\n      const sectionsToPaste: Record<string, string[]> = {}\n      console.log('*******)909sections', sections);\n      \n      shapes.forEach((shape) => {\n        if (shape.type === TDShapeType.Section) {\n          sectionsToPaste[idsMap[shape.id]] = sections[shape.id].map(\n            (shap) => idsMap[shap]\n          )\n        }\n      })\n      const bindingsToPaste = bindings.map((binding) => ({\n        ...binding,\n        id: idsMap[binding.id],\n        toId: idsMap[binding.toId],\n        fromId: idsMap[binding.fromId],\n      }))\n      const commonBounds = Utils.getCommonBounds(shapesToPaste.map(TLDR.getBounds))\n      let center = Vec.toFixed(this.getPagePoint(point || this.centerPoint))\n      if (\n        Vec.dist(center, this.pasteInfo.center) < 2 ||\n        Vec.dist(center, Vec.toFixed(Utils.getBoundsCenter(commonBounds))) < 2\n      ) {\n        center = Vec.add(center, this.pasteInfo.offset)\n        this.pasteInfo.offset = Vec.add(this.pasteInfo.offset, [GRID_SIZE, GRID_SIZE])\n      } else {\n        this.pasteInfo.center = center\n        this.pasteInfo.offset = [0, 0]\n      }\n      const centeredBounds = Utils.centerBounds(commonBounds, center)\n      const delta = Vec.sub(\n        Utils.getBoundsCenter(centeredBounds),\n        Utils.getBoundsCenter(commonBounds)\n      )\n      this.create(\n        shapesToPaste.map((shape) =>\n          TLDR.getShapeUtil(shape.type).create({\n            ...shape,\n            point: Vec.toFixed(Vec.add(shape.point, delta)),\n            parentId: shape.parentId || this.currentPageId,\n          })\n        ),\n        bindingsToPaste,\n        sectionsToPaste\n      )\n    }\n\n\n    if (!('clipboard' in navigator && navigator.clipboard.readText)) {\n      TLDR.warn('This browser does not support the Clipboard API!')\n      console.log('this.clipboard',this.clipboard);\n      \n      if (this.clipboard) {\n        console.log('this.clipboard.sections', this.clipboard.sections);\n        \n        pasteInCurrentPage(this.clipboard.shapes, this.clipboard.bindings, this.clipboard.assets, this.clipboard.sections)\n      }\n      return\n    }\n\n    navigator.clipboard\n      .readText()\n      .then((result) => {\n        const data: {\n          type: string\n          shapes: TDShape[]\n          bindings: TDBinding[]\n          assets: TDAsset[]\n          sections: any\n        } = JSON.parse(result)\n        if (data.type === 'tldr/clipboard') {\n          pasteInCurrentPage(data.shapes, data.bindings, data.assets, data.sections)\n        } else {\n          TLDR.warn('The selected shape was not a tldraw shape, treating as text.')\n          const shapeId = Utils.uniqueId()\n          this.createShapes({\n            id: shapeId,\n            type: TDShapeType.Text,\n            parentId: this.appState.currentPageId,\n            text: TLDR.normalizeText(result),\n            point: this.getPagePoint(this.centerPoint, this.currentPageId),\n            style: { ...this.appState.currentStyle },\n          })\n          this.select(shapeId)\n        }\n      })\n      .catch(() => {\n        TLDR.warn('Read permissions denied!')\n        if (this.clipboard) {\n          pasteInCurrentPage(this.clipboard.shapes, this.clipboard.bindings, this.clipboard.assets, this.clipboard.sections)\n        }\n      })\n    return this\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 = (ids = this.selectedIds, pageId = this.currentPageId) => {\n    if (ids.length === 0) ids = Object.keys(this.page.shapes)\n    if (ids.length === 0) return\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n    // Embed our custom fonts\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    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    defs.appendChild(style)\n    svg.appendChild(defs)\n    // Get the shapes in order\n    const shapes = ids\n      .map((id) => this.getShape(id, pageId))\n      .sort((a, b) => a.childIndex - b.childIndex)\n    // Find their common bounding box. S hapes will be positioned relative to this box\n    const commonBounds = Utils.getCommonBounds(shapes.map(TLDR.getRotatedBounds))\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)\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      // 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}, ${\n          SVG_EXPORT_PADDING + shape.point[1] - commonBounds.minY\n        }) rotate(${((shape.rotation || 0) * 180) / Math.PI}, ${bounds.width / 2}, ${\n          bounds.height / 2\n        })`\n      )\n      return elm\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        // Get the shape's children as elms and add them to the group\n        shape.children.forEach((childId) => {\n          const shape = this.getShape(childId, pageId)\n          const elm = getSvgElementForShape(shape)\n          if (elm) g.appendChild(elm)\n        })\n        // Add the group elm to the SVG\n        svg.appendChild(g)\n        return\n      }\n      // Just add the shape's element to the\n      const elm = getSvgElementForShape(shape)\n      if (elm) svg.appendChild(elm)\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    svg.setAttribute('width', String(commonBounds.width))\n    svg.setAttribute('height', String(commonBounds.height))\n    svg.setAttribute('fill', 'transparent')\n    // Clean up the SVG by removing any hidden elements\n    svg\n      .querySelectorAll('.tl-fill-hitarea, .tl-stroke-hitarea, .tl-binding-indicator')\n      .forEach((elm) => elm.remove())\n    // Serialize the SVG to a string\n    const svgString = new XMLSerializer()\n      .serializeToString(svg)\n      .replaceAll('&#10;      ', '')\n      .replaceAll(/((\\s|\")[0-9]*\\.[0-9]{2})([0-9]*)(\\b|\"|\\))/g, '$1')\n    // Copy the string to the clipboard\n    TLDR.copyStringToClipboard(svgString)\n    return svgString\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, pageId = this.currentPageId) => {\n    if (ids.length === 0) ids = Object.keys(this.page.shapes)\n    if (ids.length === 0) return\n    const shapes = ids.map((id) => this.getShape(id, pageId))\n    const json = JSON.stringify(shapes, null, 2)\n    TLDR.copyStringToClipboard(json)\n    return json\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.pageState.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.pageState.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.pageState.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 =\n      this.pageState.camera.zoom === zoom || this.pageState.camera.zoom < 1\n        ? Math.min(1, zoom)\n        : 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.pageState.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.pageState.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    const selectionIds = this.childrenOfSection([...ids])\n\n    this.setSelectedIds(selectionIds)\n    this.addToSelectHistory(selectionIds)\n    return this\n  }\n\n  childrenOfSection(ids: string[]) {\n    let selectionIds = [...ids]\n\n    ids.forEach((eachid) => {\n      if (this.getShape(eachid).name === 'Section') {\n        const sections = this.document.pages.page?.sections\n        if (sections && sections[eachid]) {\n          selectionIds = [...sections[eachid], ...ids]\n          selectionIds = [...new Set(selectionIds)]\n        }\n      }\n    })\n\n    return selectionIds\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 session The new session\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    if (this.session) {\n      TLDR.warn(`Already in a session! (${this.session.constructor.name})`)\n      this.cancelSession()\n    }\n\n    const Session = getSession(type)\n\n    // @ts-ignore\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    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  removeSectionFromState(ids: string[]) {\n    let sections = { ...this.document.pages.page?.sections }\n    if (sections) {\n      ids.forEach((id) => {\n        if (this.getShape(id).name !== 'Section') {\n          Object.keys(sections).forEach((section) => {\n            if (sections[section] && sections[section].includes(id))\n              sections = {\n                ...sections,\n                [section]: [...sections[section].filter((id2: string) => id2 !== id)],\n              }\n          })\n        } else {\n          Object.keys(sections).forEach((section) => {\n            if (section === id) {\n              sections[section] = undefined\n            }\n          })\n        }\n      })\n    }\n    return sections\n  }\n\n  removeCommentStatusfromState(ids: string[]) {\n    if (this.appState.isOpen) {\n      ids.forEach((id) => {\n        if (this.getShape(id).name === 'Comment') {\n          delete this.appState.isOpen[id]\n          this.patchState({\n            appState: {\n              isOpen: this.appState.isOpen,\n            },\n          })\n        }\n      })\n    }\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    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    this.session = undefined\n    const result = session.complete()\n\n    if (result === undefined) {\n      this.isCreating = false\n\n      return 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    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  createEmbedShapeAtPoint(\n    id: string,\n    type: TDShapeType.Embed,\n    point: number[],\n    size: number[],\n    src: string,\n    faviconSrc: string\n  ): 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 Shape = shapeUtils[type]\n\n    const newShape = Shape.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point,\n      size,\n      style: { ...currentStyle },\n      src,\n      faviconSrc,\n    })\n    const bounds = Shape.getBounds(newShape as never)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n\n    this.startSession(SessionType.Translate)\n\n    this.setStatus(TDStatus.Creating)\n    return this\n  }\n\n  createFileShapeAtPoint(\n    id: string,\n    type: TDShapeType.File,\n    point: number[],\n    size: number[],\n    url: string,\n    title: string,\n    icon: string,\n    avatarUrl: any[],\n    firstName: string,\n    time: string,\n    fileType: string,\n    fileIcon: string\n  ): this {\n    const {\n      shapes,\n      appState: { currentPageId, currentStyle },\n    } = this\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    const newShape = Shape.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point,\n      size,\n      style: { ...currentStyle },\n      url,\n      title,\n      icon,\n      avatarUrl,\n      firstName,\n      time,\n      fileType,\n      fileIcon,\n    })\n    const bounds = Shape.getBounds(newShape as never)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n\n    this.startSession(SessionType.Translate)\n\n    this.setStatus(TDStatus.Creating)\n\n    return this\n  }\n\n  createLessonShapeAtPoint(\n    id: string,\n    type: TDShapeType.Lesson,\n    point: number[],\n    size: number[],\n    imageUrl: string,\n    title: string,\n    description: string,\n    url: string\n  ): 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 Shape = shapeUtils[type]\n\n    const newShape = Shape.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point,\n      size,\n      style: { ...currentStyle },\n      title,\n      description,\n      imageUrl,\n      url,\n    })\n\n    const bounds = Shape.getBounds(newShape as never)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n\n    this.startSession(SessionType.Translate)\n\n    this.setStatus(TDStatus.Creating)\n\n    return this\n  }\n\n  createLinkShapeAtPoint(\n    id: string,\n    type: TDShapeType.Link,\n    point: number[],\n    size: number[],\n    url: string,\n    title: string,\n    description: string,\n    imageUrl: string\n  ): 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 Shape = shapeUtils[type]\n\n    const newShape = Shape.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point,\n      size,\n      style: { ...currentStyle },\n      url,\n      title,\n      description,\n      imageUrl,\n    })\n    const bounds = Shape.getBounds(newShape as never)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n\n    this.startSession(SessionType.Translate)\n\n    this.setStatus(TDStatus.Creating)\n\n    return this\n  }\n\n  createTextShapeAtPoint(point: number[], id?: string): 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: { ...defaultTextStyle },\n    })\n\n    const bounds = Text.getBounds(newShape)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n    this.setEditingId(newShape.id)\n\n    return this\n  }\n\n  createCommentShapeAtPoint(point: number[], id?: string): 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.Comment]\n\n    const newShape = Text.create({\n      id: id || Utils.uniqueId(),\n      parentId: currentPageId,\n      childIndex,\n      point,\n      user: this.appState.user,\n      style: { ...defaultTextStyle },\n    })\n\n    const bounds = Text.getBounds(newShape)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n    // this.setEditingId(newShape.id)\n\n    return this\n  }\n\n  createTemplateCopy = (ids = this.selectedIds): this => {\n    const copyingShapeIds = ids.flatMap((id) =>\n      TLDR.getDocumentBranch(this.state, id, this.currentPageId)\n    )\n    const copyingShapes = copyingShapeIds.map((id) =>\n      Utils.deepClone(this.getShape(id, this.currentPageId))\n    )\n    if (copyingShapes.length === 0) return this\n    const copyingBindings: TDBinding[] = Object.values(this.page.bindings).filter(\n      (binding) =>\n        copyingShapeIds.includes(binding.fromId) && copyingShapeIds.includes(binding.toId)\n    )\n    const copyingAssets = copyingShapes\n      .map((shape) => {\n        if (!shape.assetId) return\n\n        return this.document.assets[shape.assetId]\n      })\n      .filter(Boolean) as TDAsset[]\n\n    const copyingSections = this.document.pages.page.sections\n\n    try {\n      const text = JSON.stringify({\n        type: 'tldr/clipboard',\n        shapes: copyingShapes,\n        bindings: copyingBindings,\n        assets: copyingAssets,\n        sections: copyingSections\n      })\n\n      this.patchState({\n        appState: {\n          currentTemplate: text,\n        },\n      })\n\n      // navigator.clipboard.writeText(text).then(\n      //   () => {\n      //     // success\n      //   },\n      //   () => {\n      //     // failure\n      //   }\n      // )\n    } catch (e) {\n      // Browser does not support copying to clipboard\n    }\n    this.pasteInfo.offset = [0, 0]\n    this.pasteInfo.center = [0, 0]\n    return this\n  }\n\n  createTemplateAtPoint(templateObject: any) {\n    if (this.readOnly) return\n    const { shapes, assets, bindings, sections } = templateObject\n    const templateAssets  = assets ? Object.values(assets) : []\n    const templateShapes  = shapes ? Object.values(shapes) : []\n    const templateBindings  = bindings ? Object.values(bindings) : []\n    const templateSections  = sections ? Object.values(sections) : []\n\n    const idsMap: Record<string, string> = {}\n    const newAssets = templateAssets?.filter((asset) => this.document.assets[asset.id] === undefined)\n    if (newAssets.length) {\n      this.patchState({\n        document: {\n          assets: Object.fromEntries(newAssets.map((asset) => [asset.id, asset])),\n        },\n      })\n    }\n    templateShapes?.forEach((shape) => (idsMap[shape.id] = Utils.uniqueId()))\n    templateBindings?.forEach((binding) => (idsMap[binding.id] = Utils.uniqueId()))\n    let startIndex = TLDR.getTopChildIndex(this.state, this.currentPageId)\n    const shapesToPaste = templateShapes\n      .sort((a, b) => a.childIndex - b.childIndex)\n      .map((shape) => {\n        const parentShapeId = idsMap[shape.parentId]\n        const copy = {\n          ...shape,\n          id: idsMap[shape.id],\n          parentId: parentShapeId || this.currentPageId,\n        }\n        if (shape.children) {\n          copy.children = shape.children.map((id) => idsMap[id])\n        }\n        if (!parentShapeId) {\n          copy.childIndex = startIndex\n          startIndex++\n        }\n        if (copy.handles) {\n          Object.values(copy.handles).forEach((handle) => {\n            if (handle.bindingId) {\n              handle.bindingId = idsMap[handle.bindingId]\n            }\n          })\n        }\n        return copy\n      })\n    const sectionsToPaste: Record<string, string[]> = {}\n    templateShapes.forEach((shape:any) => {\n      if (shape && shape.type === TDShapeType.Section) {\n        sectionsToPaste[idsMap[shape.id]] = sections[shape.id].map(\n          (shap:any) => idsMap[shap]\n        )\n      }\n    })\n    const bindingsToPaste = templateBindings.map((binding) => ({\n      ...binding,\n      id: idsMap[binding.id],\n      toId: idsMap[binding.toId],\n      fromId: idsMap[binding.fromId],\n    }))\n    const commonBounds = Utils.getCommonBounds(shapesToPaste.map(TLDR.getBounds))\n    let center = Vec.toFixed(this.getPagePoint(this.centerPoint))\n    this.pasteInfo.offset = [0, 0]\n    const centeredBounds = Utils.centerBounds(commonBounds, center)\n    const delta = Vec.sub(\n      Utils.getBoundsCenter(centeredBounds),\n      Utils.getBoundsCenter(commonBounds)\n    )\n    this.create(\n      shapesToPaste.map((shape) =>\n        TLDR.getShapeUtil(shape.type).create({\n          ...shape,\n          point: Vec.toFixed(Vec.add(shape.point, delta)),\n          parentId: shape.parentId || this.currentPageId,\n        })\n      ),\n      bindingsToPaste,\n      sectionsToPaste\n    )\n  }\n\n  createImageOrVideoShapeAtPoint(\n    id: string,\n    type: TDShapeType.Image | TDShapeType.Video,\n    point: number[],\n    size: number[],\n    assetId: string\n  ): 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 Shape = shapeUtils[type]\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    const bounds = Shape.getBounds(newShape as never)\n    newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n    this.createShapes(newShape)\n\n    return this\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[] = [], sections: any = {}): this => {\n    if (shapes.length === 0) return this\n    return this.setState(Commands.createShapes(this, shapes, bindings, sections))\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    this.removeCommentStatusfromState(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!(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<TextShapeStyles>, ids = this.selectedIds): this => {\n    if (ids.some((id) => this.getShape(id).name === 'Section')) {\n      ids = ids.filter((id) => this.getShape(id).name === 'Section')\n      ids = [ids[ids.length - 1]]\n    }\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    if (!command) return this\n    return this.setState(command)\n  }\n\n  /**\n   * Cancel the current session.\n   */\n  cancel = (): this => {\n    this.currentTool.onCancel?.()\n    return this\n  }\n\n  private addMediaFromFile = async (file: File, point = this.centerPoint) => {\n    this.setIsLoading(true)\n    const id = Utils.uniqueId()\n    const pagePoint = this.getPagePoint(point)\n    const extension = file.name.match(/\\.[0-9a-z]+$/i)\n    if (!extension) throw Error('No extension')\n    const isImage = IMAGE_EXTENSIONS.includes(extension[0].toLowerCase())\n    const isVideo = VIDEO_EXTENSIONS.includes(extension[0].toLowerCase())\n    if (!(isImage || isVideo)) throw Error('Wrong extension')\n    const shapeType = isImage ? TDShapeType.Image : TDShapeType.Video\n    const assetType = isImage ? TDAssetType.Image : TDAssetType.Video\n    let src: string | ArrayBuffer | null\n\n    try {\n      if (this.callbacks.onAssetCreate) {\n        const result = await this.callbacks.onAssetCreate(file, id)\n        if (!result) throw Error('Asset creation callback returned false')\n        src = result\n      } else {\n        src = await fileToBase64(file)\n      }\n\n      if (typeof src === 'string') {\n        let size = [0, 0]\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            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        let assetId: string\n        if (!match) {\n          assetId = Utils.uniqueId()\n          const asset = {\n            id: assetId,\n            type: assetType,\n            src,\n            size,\n          }\n          this.patchState({\n            document: {\n              assets: {\n                [assetId]: asset,\n              },\n            },\n          })\n        } else assetId = match.id\n\n        this.createImageOrVideoShapeAtPoint(id, shapeType, pagePoint, size, assetId)\n      }\n    } catch (error) {\n      console.warn(error)\n      this.setIsLoading(false)\n      return this\n    }\n\n    this.setIsLoading(false)\n    return this\n  }\n\n  async createLink(preview: { url: string; title: string; description: string; images: string[] }) {\n    const id = Utils.uniqueId()\n    if (preview.images.length === 0) {\n      const [xPoint, yPoint] = this.document.pageStates.page.camera.point\n      this.createLinkShapeAtPoint(\n        id,\n        TDShapeType.Link,\n        [700 - xPoint, 350 - yPoint],\n        [303, 120],\n        preview.url,\n        preview.title,\n        preview.description,\n        preview.images[0]\n      )\n      this.setStatus(TDStatus.Idle)\n      this.completeSession()\n      this.selectTool('select')\n      return\n    }\n    const [width, height] = await getImageSizeFromSrc(preview.images[0])\n    const newHeight = height / (width / 303) + 120\n    const [xPoint, yPoint] = this.document.pageStates.page.camera.point\n    this.createLinkShapeAtPoint(\n      id,\n      TDShapeType.Link,\n      [700 - xPoint, 350 - yPoint],\n      [303, newHeight],\n      preview.url,\n      preview.title,\n      preview.description,\n      preview.images[0]\n    )\n    this.setStatus(TDStatus.Idle)\n    this.completeSession()\n    this.selectTool('select')\n    return\n  }\n\n  async createLesson(lesson: {\n    imageUrl: string\n    title: string\n    description: string\n    url: string\n  }) {\n    const id = Utils.uniqueId()\n    const [xPoint, yPoint] = this.document.pageStates.page.camera.point\n    this.createLessonShapeAtPoint(\n      id,\n      TDShapeType.Lesson,\n      [700 - xPoint, 350 - yPoint],\n      [334, 266],\n      lesson.imageUrl,\n      lesson.title,\n      lesson.description,\n      lesson.url\n    )\n    this.setStatus(TDStatus.Idle)\n    this.completeSession()\n    this.selectTool('select')\n    return\n  }\n\n  async createFile(\n    url: string,\n    title: string,\n    icon: string,\n    avatarUrl: any[],\n    name: string,\n    updatedAt: string,\n    fileType: string,\n    fileIcon: string\n  ) {\n    function timeSince(date: Date) {\n      const seconds = Math.floor((new Date() - date) / 1000)\n\n      let interval = seconds / 31536000\n\n      if (interval > 1) {\n        return Math.floor(interval) + ' y'\n      }\n      interval = seconds / 2592000\n      if (interval > 1) {\n        return Math.floor(interval) + ' mon'\n      }\n      interval = seconds / 86400\n      if (interval > 1) {\n        return Math.floor(interval) + ' d'\n      }\n      interval = seconds / 3600\n      if (interval > 1) {\n        return Math.floor(interval) + 'h'\n      }\n      interval = seconds / 60\n      if (interval > 1) {\n        return Math.floor(interval) + 'min'\n      }\n      return Math.floor(seconds) + ' s'\n    }\n    const time = timeSince(new Date(updatedAt))\n    const id = Utils.uniqueId()\n    const [xPoint, yPoint] = this.document.pageStates.page.camera.point\n    this.createFileShapeAtPoint(\n      id,\n      TDShapeType.File,\n      [700 - xPoint, 350 - yPoint],\n      [354, 94],\n      url,\n      title,\n      icon,\n      avatarUrl,\n      name,\n      time,\n      fileType,\n      fileIcon\n    )\n    this.setStatus(TDStatus.Idle)\n    this.completeSession()\n    this.selectTool('select')\n    return\n  }\n\n  async createVideoEmbed(videoSrc: { url: string; favicons: string[] }) {\n    const id = Utils.uniqueId()\n    const faviconSrc = videoSrc.favicons[0]\n    const [xPoint, yPoint] = this.document.pageStates.page.camera.point\n    this.createEmbedShapeAtPoint(\n      id,\n      TDShapeType.Embed,\n      [700 - xPoint, 350 - yPoint],\n      [301, 201],\n      videoSrc.url,\n      faviconSrc\n    )\n    this.setStatus(TDStatus.Idle)\n    this.completeSession()\n    this.selectTool('select')\n  }\n\n  private getViewboxFromSVG = (svgStr: string | ArrayBuffer | null) => {\n    const viewBoxRegex = /.*?viewBox=[\"'](-?[\\d.]+[, ]+-?[\\d.]+[, ][\\d.]+[, ][\\d.]+)[\"']/\n    if (typeof svgStr === 'string') {\n      const matches = svgStr.match(viewBoxRegex)\n      return matches && matches.length >= 2 ? matches[1] : null\n    }\n    console.warn('could not get viewbox from svg string')\n    this.setIsLoading(false)\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      const file = e.dataTransfer.files[0]\n      this.addMediaFromFile(file, [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.pageState.camera.zoom)\n    const prev = this.pageState.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\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      })\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    let text = ''\n    if (typeof window.getSelection != 'undefined') {\n      text = window.getSelection().toString()\n    } else if (typeof document.selection != 'undefined' && document.selection.type == 'Text') {\n      text = document.selection.createRange().text\n    }\n    this.setSelectedText(text)\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    // hack time to reset the size / clipping of an image\n    if (this.selectedIds.length !== 1) return\n    const shape = this.getShape(this.selectedIds[0])\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      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    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  openCommentDropDown = (id: string) => {\n    this.updateShapes({\n      id: id,\n      isOpen: true,\n    })\n\n    return this\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  async exportAllShapesAs(type: TDExportTypes) {\n    const initialSelectedIds = [...this.selectedIds]\n    this.selectAll()\n    const { width, height } = Utils.expandBounds(TLDR.getSelectedBounds(this.state), 64)\n    const idsToExport = TLDR.getAllEffectedShapeIds(\n      this.state,\n      this.selectedIds,\n      this.currentPageId\n    )\n    this.setSelectedIds(initialSelectedIds)\n    await this.exportShapesAs(idsToExport, [width, height], type)\n  }\n\n  async exportSelectedShapesAs(type: TDExportTypes) {\n    const { width, height } = Utils.expandBounds(TLDR.getSelectedBounds(this.state), 64)\n    const idsToExport = TLDR.getAllEffectedShapeIds(\n      this.state,\n      this.selectedIds,\n      this.currentPageId\n    )\n    await this.exportShapesAs(idsToExport, [width, height], type)\n  }\n\n  async exportShapesAs(shapeIds: string[], size: number[], type: TDExportTypes) {\n    if (!this.callbacks.onExport) return\n    this.setIsLoading(true)\n    try {\n      const assets: TDAssets = {}\n      const shapes: TDShape[] = shapeIds.map((id) => {\n        const shape = { ...this.getShape(id) }\n        if (shape.assetId) {\n          const asset = { ...this.document.assets[shape.assetId] }\n          // If the asset is a GIF, then serialize an image\n          if (asset.src.toLowerCase().endsWith('gif')) {\n            asset.src = this.serializeImage(shape.id)\n          }\n          // If the asset is an image, then serialize an image\n          if (shape.type === TDShapeType.Video) {\n            asset.src = this.serializeVideo(shape.id)\n            asset.type = TDAssetType.Image\n            // Cast shape to image shapes to properly display snapshots\n            ;(shape as unknown as ImageShape).type = TDShapeType.Image\n          }\n          // Patch asset table\n          assets[shape.assetId] = asset\n        }\n        return shape\n      })\n      // Create serialized data for JSON or SVGs\n      let serialized: string | undefined\n      if (type === TDExportTypes.SVG) {\n        serialized = this.copySvg(shapeIds)\n      } else if (type === TDExportTypes.JSON) {\n        serialized = this.copyJson(shapeIds)\n      }\n      const exportInfo: TDExport = {\n        currentPageId: this.currentPageId,\n        name: this.page.name ?? 'export',\n        shapes,\n        assets,\n        type,\n        serialized,\n        size: type === 'png' ? Vec.mul(size, 2) : size,\n      }\n      await this.callbacks.onExport(exportInfo)\n    } catch (error) {\n      console.error(error)\n    } finally {\n      this.setIsLoading(false)\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.pageState.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.3\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        sections: {},\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: process.env.NODE_ENV === 'development',\n      isReadonlyMode: false,\n      nudgeDistanceLarge: 16,\n      nudgeDistanceSmall: 1,\n      showRotateHandles: true,\n      showBindingHandles: true,\n      showCloneHandles: false,\n      showGrid: false,\n    },\n    appState: {\n      status: TDStatus.Idle,\n      activeTool: 'select',\n      hoveredId: undefined,\n      currentPageId: 'page',\n      currentStyle: defaultTextStyle,\n      currentStickyStyle: defaultStickyStyle,\n      currentShapeStyle: defaultStyle,\n      currentDrawStyle: defaultStyle,\n      currentSectionStyle: defaultSectionStyle,\n      currentHighlighterStyle: defaultHighlighterStyle,\n      isToolLocked: false,\n      isMenuOpen: false,\n      isEmptyCanvas: false,\n      snapLines: [],\n      isLoading: false,\n      disableAssets: false,\n      selectedSticker: '',\n      currentStickerPoint: [0, 0],\n      user: defaultUser,\n      isOpen: {},\n      defaultOpen: false,\n      isTemplateLibrary: false,\n      showTimer:false,\n      selectedStickyText: '',\n      currentTemplate: '',\n      isTemplateEditMode: false,\n      stashForEditing: '{}',\n      currentEditingTemplate: null,\n      isPreview: false,\n      members: [],\n      hasMention: false,\n      mentionedUsers:[],\n      commentMessage: ''\n    },\n    document: TldrawApp.defaultDocument,\n  }\n}\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { Decoration, FontStyle, TDDocument, TDShapeType, TextShape } from '~types'\n\nexport function migrate(document: TDDocument, newVersion: number): TDDocument {\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 (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    })\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 document\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  // 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 document\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 openAssetFromFileSystem() {\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],\n    multiple: false,\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.3\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  ConnectorShape,\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 connectConnectorToShape(page: TDPage, connectorShape: ConnectorShape) {\n    const result = {\n      start: deepCopy(connectorShape.handles.start),\n      end: deepCopy(connectorShape.handles.end),\n    }\n    if (result.end.bindingId) {\n      const binding = page.bindings[result.end.bindingId]\n      const target = page.shapes[binding.toId]\n      // console.log(target)\n    }\n    if (result.start.bindingId) {\n      const binding = page.bindings[result.start.bindingId]\n      const target = page.shapes[binding.toId]\n      // console.log(target)\n    }\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      navigator.clipboard.writeText(string)\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      } 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", "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  showCloneHandles = true\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 'sn-wb-tldraw-core'\nimport type { TLPointerInfo, TLBounds } from 'sn-wb-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    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    // 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    return {\n      point: Vec.clampV(bindingPoint, 0, 1),\n      distance,\n    }\n  }\n\n  getConnectorBindingPoint = <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  \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): 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 !== undefined) {\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).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 - size[0]) / 2}, ${(bounds.height - size[1]) / 2})`\n      )\n      g.appendChild(elm)\n      g.appendChild(labelElm)\n      return g\n    }\n    return elm\n  }\n}\n", "import { Utils } from '@tldraw/core'\nimport {\n  Theme,\n  ColorStyle,\n  DashStyle,\n  ShapeStyles,\n  SizeStyle,\n  FontStyle,\n  AlignStyle,\n  TextWeight,\n  TextShapeStyles,\n  ListType,\n} 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]: '#3DD456',\n  // [ColorStyle.Cyan]: '#0e98ad',\n  [ColorStyle.Blue]: '#254DDA',\n  [ColorStyle.Pink]: '#FF4A7B',\n  [ColorStyle.Violet]: '#E4C0FF',\n  [ColorStyle.Red]: '#F87463',\n  [ColorStyle.Orange]: '#FF9700',\n  [ColorStyle.Yellow]: '#FFDA47',\n}\n\nconst stickyColors = {\n  [ColorStyle.Green]: 'rgb(147, 210, 117)',\n  [ColorStyle.Blue]: 'rgb(108, 216, 250)',\n  [ColorStyle.Pink]: 'rgb(255, 206, 224)',\n  [ColorStyle.Violet]: 'rgb(123, 146, 255)',\n  [ColorStyle.Red]: 'rgb(241, 108, 127)',\n  [ColorStyle.Orange]: 'rgb(255, 157, 72)',\n  [ColorStyle.Yellow]: 'rgb(255, 249, 177)',\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    [ColorStyle.Black]: '#3d3d3d',\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.Graphik]: '\"Graphik Web\"',\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.Graphik]: 0.68,\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.Graphik): number {\n  return fontSizes[size] * fontSizeModifiers[fontStyle]\n}\n\nexport function getFontFace(font: FontStyle = FontStyle.Graphik): 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.Pink : color\n\n  return {\n    fill: stickyColors[adjustedColor],\n    stroke: strokes[theme][adjustedColor],\n    color: isDarkMode ? '#1d1d1d' : '#0d0d0d',\n  }\n}\n\nexport function getSectionShapeStyle(\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  const adjustedColor =\n    color === ColorStyle.White || color === ColorStyle.Black ? ColorStyle.Blue : color\n  return {\n    stroke: strokes[theme][adjustedColor],\n    fill: isFilled ? fills[theme][adjustedColor] : 'none',\n    strokeWidth,\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 defaultStickyStyle: ShapeStyles = {\n  color: ColorStyle.Black,\n  size: SizeStyle.Large,\n  isFilled: false,\n  dash: DashStyle.Draw,\n  scale: 1,\n}\n\nexport const defaultHighlighterStyle: ShapeStyles = {\n  color: ColorStyle.Yellow,\n  size: SizeStyle.Small,\n  isFilled: false,\n  dash: DashStyle.Draw,\n  scale: 1,\n}\n\nexport const defaultSectionStyle: ShapeStyles = {\n  color: ColorStyle.Blue,\n  size: SizeStyle.Small,\n  isFilled: true,\n  dash: DashStyle.Solid,\n  scale: 1,\n}\n\nexport const defaultTextStyle: TextShapeStyles = {\n  ...defaultStyle,\n  font: FontStyle.Graphik,\n  textAlign: AlignStyle.Start,\n  textWeight: TextWeight.Normal,\n  listType: ListType.None,\n  textDecoration: 'none',\n  fontStyle: 'normal',\n  bounds: [1,1]\n}\n\nexport const defaultUser = {\n  id: 2189163346,\n  point: [0, 0],\n  color: '#aa030e',\n  user: {\n    name: 'Anonymous',\n    avatar:\n      'https://lh3.googleusercontent.com/a/AItbvmkxSDlPkw8aevUuUYOqVJBBf9QYo4MEugPtpdCx=s96-c',\n  },\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 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', LINE_HEIGHT * fontSize * (0.5 + i) + '')\n    g.appendChild(textElm)\n    return textElm\n  })\n  g.setAttribute('font-size', fontSize + '')\n  g.setAttribute('font-family', getFontFace(style.font).slice(1, -1))\n  g.setAttribute('text-align', getTextAlign(style.textAlign))\n  switch (style.textAlign) {\n    case AlignStyle.Middle: {\n      g.setAttribute('text-align', 'center')\n      g.setAttribute('text-anchor', 'middle')\n      textLines.forEach((textElm) => textElm.setAttribute('x', bounds.width / 2 + ''))\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 + ''))\n      break\n    }\n    case AlignStyle.Start: {\n      g.setAttribute('text-anchor', 'start')\n      g.setAttribute('alignment-baseline', 'central')\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 'sn-wb-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 { 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", "// 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 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", "import * as React from 'react'\nimport { TLDR } from '~state/TLDR'\nimport { TextAreaUtils } from '.'\n\nexport function useTextKeyboardEvents(onChange: (text: string) => void) {\n  const handleKeyDown = React.useCallback(\n    (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n      // If this keydown was just the meta key or a shortcut\n      // that includes holding the meta key like (Command+V)\n      // then leave the event untouched. We also have to explicitly\n      // Implement undo/redo for some reason in order to get this working\n      // in the vscode extension. Without the below code the following doesn't work\n      //\n      // - You can't cut/copy/paste when when text-editing/focused\n      // - You can't undo/redo when when text-editing/focused\n      // - You can't use Command+A to select all the text, when when text-editing/focused\n      if (e.metaKey) e.stopPropagation()\n\n      switch (e.key) {\n        case 'Meta': {\n          e.stopPropagation()\n          break\n        }\n        case 'z': {\n          if (e.metaKey) {\n            if (e.shiftKey) {\n              document.execCommand('redo', false)\n            } else {\n              document.execCommand('undo', false)\n            }\n            e.preventDefault()\n          }\n          break\n        }\n        case 'Escape': {\n          e.currentTarget.blur()\n          break\n        }\n        case 'Enter': {\n          if (e.ctrlKey || e.metaKey) {\n            e.currentTarget.blur()\n          }\n          break\n        }\n        case '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          break\n        }\n      }\n    },\n    [onChange]\n  )\n\n  return handleKeyDown\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 { 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 { useTextKeyboardEvents } from './useTextKeyboardEvents'\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 rTextContent = React.useRef(text)\n\n  const handleChange = React.useCallback(\n    (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n      rTextContent.current = TLDR.normalizeText(e.currentTarget.value)\n      onChange(rTextContent.current)\n    },\n    [onChange]\n  )\n\n  const handleKeyDown = useTextKeyboardEvents(onChange)\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) => {\n      if (isEditing) {\n        e.stopPropagation()\n      }\n    },\n    [isEditing]\n  )\n\n  React.useEffect(() => {\n    if (isEditing) {\n      rTextContent.current = 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      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={rTextContent.current}\n            color={color}\n            onFocus={handleFocus}\n            onChange={handleChange}\n            onKeyDown={handleKeyDown}\n            onBlur={handleBlur}\n            onPointerDown={handlePointerDown}\n            onContextMenu={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})\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 / 2, sw * 2)\n  const ry = Math.min(h / 2, 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  showCloneHandles = 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 * 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  showCloneHandles = true\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      const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n      const font = getFontStyle(style)\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const labelSize = label || isEditing ? getTextLabelSize(label, font) : [0, 0]\n      const bounds = this.getBounds(shape)\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      const scale = Math.max(\n        0.5,\n        Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\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      const handleLabelChange = React.useCallback(\n        (label: string) => {\n          onShapeChange?.({ id, label })\n        },\n        [onShapeChange]\n      )\n      const Component = isStraightLine ? StraightArrow : CurvedArrow\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={label || 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    const font = getFontStyle(style)\n    const labelSize = label ? getTextLabelSize(label, font) : [0, 0]\n    const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\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    const scale = Math.max(\n      0.5,\n      Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\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    return (\n      <>\n        <LabelMask\n          id={shape.id}\n          scale={scale}\n          offset={offset}\n          bounds={bounds}\n          labelSize={labelSize}\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={label ? `url(#${shape.id}_clip)` : ``}\n        />\n        {label && (\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    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    // This will produce NaN values\n    if (Vec.isEqual(nextHandles.start.point, nextHandles.end.point)) return\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      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      // 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 / 2))\n      const bp = Vec.sub(midPoint, Vec.mul(Vec.per(u), distance / 2))\n      const bendPoint = Vec.nearestPointOnLineSegment(ap, bp, bend.point, true)\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      // 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      nextBend = Utils.clamp(bendDist / (distance / 2), -0.99, 0.99)\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      // If resulting bend is low enough that the handle will snap to center,\n      // then also snap the bend to center\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    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    // 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    const nextBounds = this.getBounds({ ...nextShape } as ArrowShape)\n    const offset = Vec.sub([nextBounds.minX, nextBounds.minY], topLeft)\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      if (Vec.isEqual(nextShape.point, [0, 0])) {\n        throw Error('here!')\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 * 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.Blue}\n              opacity={1 }\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 { defaultTextStyle } from '../shared/shape-styles'\nimport { AlignStyle, StickyShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { 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'\nimport { useTldrawApp } from '~hooks'\nimport ContentEditable from 'react-contenteditable'\nimport sanitizeHtml from 'sanitize-html'\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  hideCloneHandles = false\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        user:'',\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 app = useTldrawApp()\n      const font = getStickyFontStyle(shape.style)\n      const [initialString, setInitial] = React.useState<any>(true)\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 rTextContent = React.useRef(shape.text)\n\n      const rIsMounted = React.useRef(false)\n\n      const prevCharCount = React.useRef(0)\n\n\n      function getSelectedText() {\n        let text = ''\n        if (typeof window.getSelection != 'undefined') {\n          text = window.getSelection().toString()\n        } else if (typeof document.selection != 'undefined' && document.selection.type == 'Text') {\n          text = document.selection.createRange().text\n        }\n        return text\n      }\n\n      function doSomethingWithSelectedText() {\n        const selectedText = getSelectedText()\n        app.setSelectedText(selectedText)\n      }\n\n      const handleKeyUp = React.useCallback(() => {\n        doSomethingWithSelectedText()\n      }, [])\n\n      React.useEffect(()=>{\n        setInitial(shape.text)\n      }, [])\n\n      const sanitizeConf = {\n        allowedTags: ['b', 'i', 'em', 'strong', 'span', 'div'],\n        allowedStyles:{ allowedStyles: {\n          '*': {\n            'color': [/./],\n            'font-style': [/./],\n            'text-decoration-line': [/./]\n          }}\n      }}\n\n      const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n        e.stopPropagation()\n      }, [])\n\n      const sanitize = () => {\n        onShapeChange?.({\n          id: shape.id,\n          text: sanitizeHtml(rTextContent.current, sanitizeConf),\n        })\n      }\n\n      const handleTextChange = React.useCallback(\n         e => {\n          rTextContent.current = e.currentTarget.innerHTML\n          if (!rTextContent.current) {\n            onShapeChange?.({\n              id: shape.id,\n              type: shape.type,\n              text: rTextContent.current,\n              style: {\n                ...shape.style,\n                scale: 1,\n              },\n            })\n            return\n          }\n\n          onShapeChange?.({\n            id: shape.id,\n            type: shape.type,\n            text: rTextContent.current,\n          })\n        },\n        [onShapeChange]\n      )\n\n      const handlePaste = React.useCallback(\n        async e => {\n          e.preventDefault()\n          \n          let selObj = window.getSelection();\n          let selRange = selObj.getRangeAt(0);\n          selRange.deleteContents();                \n          const clipboard = await navigator.clipboard.readText()\n          selRange.insertNode(document.createTextNode(clipboard));\n    \n          rTextContent.current =  e.target.innerHTML\n          onShapeChange?.({\n            id: shape.id,\n            type: shape.type,\n            text: rTextContent.current,\n          })\n        }, []\n      )\n      \n\n      // Focus when editing changes to true\n      React.useEffect(() => {\n        if (isEditing ) {\n          rTextContent.current = shape.text\n          rIsMounted.current = true\n          rText?.current?.focus()\n        }\n      }, [isEditing])\n\n      // Resize to fit text\n      React.useEffect(() => {\n        const text = rText.current!\n\n        const { size, style } = shape\n        const scale = style.scale || 1\n        const { offsetHeight: currTextHeight, offsetWidth: currTextWidth } = text\n        \n        const minTextHeight = MIN_CONTAINER_HEIGHT - PADDING * 2\n        const minTextWidth = MIN_CONTAINER_WIDTH - PADDING * 2\n        \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 || (currTextWidth >= minTextWidth && this.getLongestLineLength(rTextContent) <= MAXIMUM_TEXT_IN_LINE)) {\n          // Snap the size to the text content if the text only when the\n          // text is larger than the minimum text height.\n          if (text.textContent?.length)\n            prevCharCount.current = text.textContent?.length\n            onShapeChange?.({\n              id: shape.id,\n              style: {\n                ...shape.style,\n                scale: scale - 0.03,\n              },\n            })\n          return\n        } else if(text.textContent && text.textContent?.length < prevCharCount.current && scale < 0.97){\n          onShapeChange?.({\n            id: shape.id,\n            style: {\n              ...shape.style,\n              scale: scale + 0.03,\n            },\n          })\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      let whiteSpace = 'nowrap'\n\n      if(this.getLongestLineLength(rTextContent) > MAXIMUM_TEXT_IN_LINE )\n        whiteSpace = 'pre-line'\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <StyledStickyContainer ref={rContainer} style={{ backgroundColor: fill, ...style }}>\n           \n            <div\n              style={{\n                position: 'absolute',\n                bottom: '-28px',\n                left: '5%',\n                width: '90%',\n                height: '10px',\n                background: 'rgba(0,0,0,0.3)',\n                borderRadius: '50%',\n                filter: 'blur(10px)',\n              }}\n            ></div>\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: 'let(--tl-selectFill)',\n                }}\n              />\n            )}\n            <div\n              contentEditable={true}\n              ref={rText}\n              onKeyUp={handleKeyUp}\n              style={{\n                outline: '0px solid transparent',\n                margin: 0,\n                padding: 0,\n                whiteSpace: 'pre-line',\n                overflow: 'hidden',\n                width: 'fit-content',\n                maxWidth: MIN_CONTAINER_WIDTH - PADDING * 2,\n                minWidth: '5px',\n                pointerEvents: isEditing?'all':'none',\n                lineHeight: 'normal'\n              }}\n              onInput={handleTextChange}\n              onPaste={handlePaste}\n              onFocus={()=>document.execCommand('selectAll',false, undefined)}\n              spellCheck={true}\n              onPointerDown={handlePointerDown} \n              dangerouslySetInnerHTML={{__html:initialString}}\n            />\n            <div\n              style={{\n                position: 'absolute',\n                bottom: '8px',\n                left: '5%',\n                fontWeight: '400',\n                fontSize: '12px',\n                lineHeight: '10px',\n                color: '#878A92',\n                pointerEvents:'none'\n              }}\n            >{shape.user}</div>\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  getLongestLineLength = (rTextContent) =>{\n    return rTextContent.current.replace(/<\\/div>/g,'').split('<div>').reduce((a, b) =>  a.length > b.length ? a : b).length\n  }\n\n\n  getSvgElement = (shape: T): 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)\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\nconst MIN_CONTAINER_WIDTH = 200\nconst MAXIMUM_TEXT_IN_LINE = 10\n\n\n\nconst StyledStickyContainer = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  backgroundColor: 'rgba(255, 220, 100)',\n  fontFamily: 'Graphik Web',\n  height: '100%',\n  width: '100%',\n  padding: PADDING + 'px',\n  borderRadius: '3px',\n  perspective: '800px',\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) return true\n      return elm && (document.activeElement === elm || elm.contains(document.activeElement))\n    },\n    [ref]\n  )\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    () => {\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      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 type { TDSnapshot, Theme } from '~types'\nimport { useTldrawApp } from './useTldrawApp'\n\nconst themeSelector = (data: TDSnapshot): Theme => (data.settings.isDarkMode ? 'dark' : 'light')\n\nexport function useTheme() {\n  const app = useTldrawApp()\n  const theme = app.useStore(themeSelector)\n\n  return {\n    theme,\n    toggle: app.toggleDarkMode,\n  }\n}\n", "import * as React from 'react'\n\nconst styles = new Map<string, HTMLStyleElement>()\n\nconst UID = `Tldraw-fonts`\nconst WEBFONT_URL =\n  'https://fonts.googleapis.com/css2?family=Caveat+Brush&family=Source+Code+Pro&family=Source+Sans+Pro&family=Crimson+Pro&display=block'\nconst CSS = `\n@import url('');\n`\n\nexport function useStylesheet() {\n  React.useLayoutEffect(() => {\n    if (styles.get(UID)) return\n    const style = document.createElement('style')\n    style.innerHTML = `@import url('${WEBFONT_URL}');`\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  }, [UID, CSS])\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", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds, TLBoundsCorner, TLBoundsEdge } from '@tldraw/core'\nimport { defaultTextStyle, getShapeStyle, getFontStyle } from '../shared/shape-styles'\nimport { TextShape, TDMeta, TDShapeType, TransformInfo, AlignStyle, ListType } 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 { getTextAlign } from '../shared/getTextAlign'\nimport { getTextSvgElement } from '../shared/getTextSvgElement'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { useTextKeyboardEvents } from '../shared/useTextKeyboardEvents'\nimport { getTextWeight } from '../shared/getTextWeight'\n\ntype T = TextShape\ntype E = HTMLDivElement\n\nexport class TextUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Text as const\n\n  isAspectRatioLocked = false\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        textAreaWidth: 100,\n        hasResized: false,\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, textAreaWidth, hasResized } = shape\n\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const font = getFontStyle(shape.style)\n      const fontStyle = font.split(' ')\n      const fontSize = fontStyle[0].split('/')[0]\n      const lineHeight = 1\n      fontStyle.shift()\n      const fontFamily = fontStyle.join(' ')\n      const weight = getTextWeight(shape.style.textWeight)\n      const rInput = React.useRef<HTMLTextAreaElement>(null)\n      const rIsMounted = React.useRef(false)\n      const isTextEmpty = text == '' || text == ' '\n      const str = text\n      let textArr = text.split('')\n      if (style.listType === ListType.Numbered) {\n        textArr = textArr[0] !== '1.' ? ['1.', ' ', ...textArr] : [...textArr]\n        let count = 3\n        let number = 2\n        for (let i = 0; i < str.length; i++) {\n          if (\n            (str[i] === '\\n' || str[i] === '\\r') &&\n            str[i + 1] !== `${number}` &&\n            str[i] != `${number}`\n          ) {\n            textArr.splice(i + count, 0, `${number}.`, ' ')\n            count += 2\n            number += 1\n          }\n        }\n      } else if (style.listType === ListType.Bullet) {\n        textArr = textArr[0] !== '\\u2022' ? ['\\u2022', ' ', ...textArr] : [...textArr]\n        let count = 3\n        for (let i = 0; i < str.length; i++) {\n          if (\n            (str[i] === '\\n' || str[i] === '\\r') &&\n            str[i + 1] !== '\\u2022' &&\n            str[i] != '\\u2022'\n          ) {\n            textArr.splice(i + count, 0, `\\u2022`, ' ')\n            count += 2\n          }\n        }\n      }\n      const newText = textArr.join('')\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          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          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 onChange = React.useCallback(\n        (text: string) => {\n          this.texts.set(shape.id, TLDR.normalizeText(text))\n          onShapeChange?.({ id: shape.id, text: this.texts.get(shape.id)! })\n        },\n        [shape.id]\n      )\n\n      const handleKeyDown = useTextKeyboardEvents(onChange)\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) => {\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                fontSize,\n                fontFamily,\n                fontWeight: weight,\n                lineHeight,\n                color: styles.stroke,\n                textAlign: getTextAlign(style.textAlign),\n                textDecoration: style.textDecoration,\n                fontStyle: style.fontStyle,\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                    fontSize,\n                    fontFamily,\n                    fontWeight: weight,\n                    lineHeight,\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                  spellCheck=\"true\"\n                  wrap=\"off\"\n                  dir=\"auto\"\n                  datatype=\"wysiwyg\"\n                  defaultValue={isTextEmpty ? '' : text}\n                  color={styles.stroke}\n                  onFocus={handleFocus}\n                  onChange={handleChange}\n                  onKeyDown={handleKeyDown}\n                  onBlur={handleBlur}\n                  onPointerDown={handlePointerDown}\n                  onContextMenu={stopPropagation}\n                  placeholder=\"Add text\"\n                />\n              ) : style.listType !== ListType.None ? (\n                newText\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      const font = getFontStyle(shape.style)\n      const fontStyle = font.split(' ')\n      const fontSize = parseInt(fontStyle[0].split('/')[0], 10)\n\n      // In tests, offsetWidth and offsetHeight will be 0\n      let height = melm.offsetHeight\n\n      // if (shape.style.textWeight === 'bold' || shape.style.fontStyle === 'italic') {\n      //   width = width + 0.1 * width\n      // }\n      // if (shape.style.listType !== ListType.None) {\n      //   width = width + 15 + 0.4 * width\n      // }\n\n      let newWidth = shape.textAreaWidth * shape.style.bounds[0]\n\n      if (!shape.hasResized && shape.text !== ' ') {\n        newWidth = melm.offsetWidth ? melm.offsetWidth + fontSize : 1\n\n        if (newWidth > 1000) newWidth = 1000\n      }\n\n      if (newWidth < 100 && newWidth < 100 * shape.style.bounds[0])\n        newWidth = 100 * shape.style.bounds[0]\n\n      if (isNaN(height)) {\n        height = 100\n      }\n\n      if (shape.style.bounds[0] < 0.5) newWidth = 50\n\n      if (shape.style.textWeight === 'bold' || shape.style.fontStyle === 'italic') {\n        newWidth = newWidth + 0.1 * newWidth\n      }\n      if (shape.style.listType !== ListType.None) {\n        newWidth = newWidth + 15 + 0.4 * newWidth\n      }\n\n      if (shape.style.bounds[1] > 1) height = height * shape.style.bounds[1]\n      // if (newWidth< 140)\n      //   newWidth = 140\n      const numberOfLines = Math.ceil(melm.offsetWidth / (newWidth - fontSize))\n\n      if (numberOfLines > 1) {\n        height = height - 5\n        height = height * numberOfLines\n\n        if (numberOfLines > 5) height = height - (numberOfLines / 5) * 20\n      }\n\n      return {\n        minX: 0,\n        maxX: newWidth,\n        minY: 0,\n        maxY: height,\n        width: newWidth,\n        // width,\n        height,\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, type }: TransformInfo<T>\n  ): Partial<T> | void => {\n    const {\n      style: { scale = 1, bounds: indicatorBounds },\n    } = initialShape\n\n    let finalScale = scale\n    let finalIndicatorBounds = indicatorBounds\n    let hasResized = shape.hasResized\n    switch (type) {\n      case TLBoundsCorner.TopLeft:\n      case TLBoundsCorner.TopRight:\n      case TLBoundsCorner.BottomRight:\n      case TLBoundsCorner.BottomLeft: {\n        finalScale = scale * Math.max(Math.abs(scaleY), Math.abs(scaleX))\n        finalIndicatorBounds = [indicatorBounds[0] * scaleX, indicatorBounds[1]]\n        break\n      }\n      case TLBoundsEdge.Bottom:\n      case TLBoundsEdge.Top:\n        // if(scaleY > 0)\n        //   finalIndicatorBounds = [indicatorBounds[0], indicatorBounds[1] * scaleY]\n        break\n      case TLBoundsEdge.Left:\n      case TLBoundsEdge.Right:\n        hasResized = true\n        if (scaleX > 0) finalIndicatorBounds = [indicatorBounds[0] * scaleX, indicatorBounds[1]]\n        break\n    }\n    let textAreaWidth = shape.textAreaWidth\n    if (!shape.hasResized)\n      if (melm.offsetWidth < 1000) textAreaWidth = melm.offsetWidth\n      else textAreaWidth = 1000\n\n    return {\n      point: Vec.toFixed([bounds.minX, bounds.minY]),\n      style: {\n        ...initialShape.style,\n        scale: finalScale,\n        bounds: finalIndicatorBounds,\n      },\n      hasResized,\n      textAreaWidth,\n    }\n  }\n\n  getTextWidth(text: string, font: string): number {\n    // re-use canvas object for better performance\n    const canvas =\n      this.getTextWidth.canvas || (this.getTextWidth.canvas = document.createElement('canvas'))\n    const context = canvas.getContext('2d')\n    context.font = font\n    const metrics = context.measureText(text)\n    return metrics.width\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): SVGElement | void => {\n    const bounds = this.getBounds(shape)\n    const elm = getTextSvgElement(shape.text, shape.style, bounds)\n    elm.setAttribute('fill', getShapeStyle(shape.style).stroke)\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  textAlign: 'inherit',\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: 'left',\n  minHeight: '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})\n", "import { TextWeight } from '~types'\n\nconst WEIGHT_VALUES = {\n  [TextWeight.Normal]: 'normal',\n  [TextWeight.Bold]: 'bold',\n} as const\n\nexport function getTextWeight(weightStyle: TextWeight = TextWeight.Normal) {\n  return WEIGHT_VALUES[weightStyle]\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 (points.length <= 2) {\n      return Vec.distanceToLineSegment(A, B, shape.point) < 4\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 = true\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\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(${-this.bindingDistance}px * var(--tl-zoom))`,\n                left: `calc(${-this.bindingDistance}px * var(--tl-zoom))`,\n                width: `calc(100% + ${this.bindingDistance * 2}px * var(--tl-zoom))`,\n                height: `calc(100% + ${this.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              // onLoad={onImageLoad}\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'\nimport Vec from '@tldraw/vec'\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 = true\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 * as React from 'react'\nimport { Utils, HTMLContainer } from '@tldraw/core'\nimport { TDShapeType, TDMeta, StickerShape, TDSnapshot } 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 = StickerShape\ntype E = HTMLDivElement\n\nexport class StickerUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Sticker 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: 'sticker',\n        type: TDShapeType.Sticker,\n        name: 'sticker',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [50, 50],\n        rotation: 0,\n        style: { ...defaultStyle, isFilled: true },\n        assetId: 'assetId',\n        svg: '',\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, isBinding, isGhost, meta, events, onShapeChange }, ref) => {\n      const { size, style } = shape\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          <Wrapper ref={rWrapper}>\n            {shape.svg.startsWith('<svg') ? (\n              <div\n                style={{\n                  display: 'flex',\n                  justifyContent: 'center',\n                  alignItems: 'center',\n                }}\n                dangerouslySetInnerHTML={{ __html: shape.svg }}\n              />\n            ) : (\n              <div\n                style={{\n                  width: '100%',\n                  height: 0,\n                  paddingBottom: '100%',\n                  position: 'relative',\n                  pointerEvents: 'none',\n                }}\n              >\n                <img\n                  src={shape.svg}\n                  style={{\n                    position: 'absolute',\n                    width: '100%',\n                    height: '100%',\n                    objectFit: 'contain',\n                    pointerEvents: 'none',\n                  }}\n                />\n              </div>\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\nconst Wrapper = styled('div', {\n  width: '45px',\n  height: '45px',\n  pointerEvents: 'all',\n})\n", "import * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { LinkShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { defaultTextStyle, getBoundsRectangle } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getStickyFontStyle, getStickyShapeStyle } from '../shared/shape-styles'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\n\ntype T = LinkShape\ntype E = HTMLDivElement\n\nexport class LinkUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Link 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.Link,\n        name: 'Link',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [70, 70],\n        rotation: 0,\n        style: defaultTextStyle,\n        url:'',\n        title:'',\n        description:'',\n        imageUrl:''\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, events, isGhost, isBinding }, ref) => {\n      const font = getStickyFontStyle(shape.style)\n\n      const { color } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n           \n          <StyledLinkContainer>\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            {shape.imageUrl && <div style={{backgroundImage:`url(${shape.imageUrl})`, width:\"303px\", height:`${shape.size[1]-120}px`, backgroundSize:\"contain\"}}></div>}\n            <StyledLinkContent>\n              \n              {shape.title  &&  <StyledTitleContainer>\n                {shape.title.length>=26? shape.title.slice(0,26) + '...' :shape.title }\n              </StyledTitleContainer>}\n             {shape.description  &&  <StyledDescription>\n                {shape.description.length>=90? shape.description.slice(0,95) + '...' :shape.description }\n              </StyledDescription>}\n              <StyledLink {...events} onClick={()=>window.open(shape.url,\"_blank\")}>\n                {shape.url.length>=26? shape.url.slice(0,26) + '...' :shape.url }\n              </StyledLink>\n            </StyledLinkContent>\n          </StyledLinkContainer>\n        </HTMLContainer>\n        \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\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 \n}\n\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\nconst StyledLinkContainer = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  border: '1px solid #E2E4E9',\n  borderRadius:'4px',\n  fontFamily:\"Graphik Web\",\n  height:\"100%\",\n  backgroundColor:'#ffffff',\n})\n\nconst StyledLinkContent = styled('div',{\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'flex-start',\n  gap: '10px',\n  padding:'16px',\n})\n\n\nconst StyledTitleContainer = styled('h2', {\n  fontWeight:'400',\n  fontSize:'16px',\n  lineHeight:'20px',\n  color:'#55585E',\n  margin:'0px',\n})\n\nconst StyledDescription = styled('p', {\n  fontWeight:'400',\n  fontSize:'10px',\n  lineHeight:'16px',\n  letterSpacing:'-0.1px',\n  margin:'0px',\n  color:'#878A92',\n})\n\nconst StyledLink = styled('p', {\n  fontWeight:'400',\n  fontSize:'10px',\n  lineHeight:'16px',\n  letterSpacing:'-0.1px',\n  margin:'0px',\n  color:'#55585E',\n  zIndex:'100000',\n  cursor:'pointer',\n  pointerEvents:\"all\"\n})\n\n", "import * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { EmbedShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { defaultTextStyle, getBoundsRectangle } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getStickyFontStyle, getStickyShapeStyle } from '../shared/shape-styles'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\nimport embed from 'embed-video'\n\ntype T = EmbedShape\ntype E = HTMLDivElement\n\nexport class EmbedUtil extends TDShapeUtil<T, E> {\n\n  type = TDShapeType.Embed 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.Embed,\n        name: 'Link',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [70, 70],\n        rotation: 0,\n        style: defaultTextStyle,\n        src:'',\n        faviconSrc:''\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, events, isGhost, isBinding }, ref) => {\n      const font = getStickyFontStyle(shape.style)\n\n      const { color } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n      const rContainer = React.useRef<HTMLDivElement>(null)\n\n      return (\n        <HTMLContainer ref={ref} {...events}>  \n          <StyledFrame>\n  \n           <div style={{display:'flex',gap:'8px', alignItems:\"center\", paddingLeft:\"3px\"}}>\n            <img src={shape.faviconSrc} alt={shape.type} height=\"50%\" width=\"50%\"/>\n            <p style={{margin:'0'}}>{embed.info(shape.src).source}</p>\n           </div>\n           <div style={{overflow:'hidden', borderRadius:\"6px\",}} dangerouslySetInnerHTML={{__html:embed(shape.src,{attr:{width:289,height:'162'}})}}>\n          \n           </div>\n            </StyledFrame>\n        \n        </HTMLContainer>\n        \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\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 \n}\n\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\nconst StyledFrame = styled('div',{\n  pointerEvents:'all',\n  borderRadius:'6px',\n  border: '0.383929px solid #C5D0D8',\n  height:'100%',\n  width:'100%',\n  display:\"flex\",\n  flexDirection:\"column\",\n  alignItems:\"start\",\n  padding:\"5px\",\n  background:'#fff'\n})\n\n", "import * as React from 'react'\nimport { Utils, SVGContainer } from '@tldraw/core'\nimport { SectionShape, DashStyle, TDShapeType, TDMeta } from '~types'\nimport { GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport {\n  defaultSectionStyle,\n  getBoundsRectangle,\n  transformRectangle,\n  getFontStyle,\n  transformSingleRectangle,\n  getSectionShapeStyle,\n} from '~state/shapes/shared'\nimport { getRectangleIndicatorPathTDSnapshot } from './rectangleHelpers'\nimport { DrawRectangle } from './components/DrawRectangle'\nimport { DashedRectangle } from './components/DashedRectangle'\nimport { BindingIndicator } from './components/BindingIndicator'\nimport { styled } from '~styles'\nimport { SectionHeader } from './components/SectionHeader'\nimport { useTldrawApp } from '~hooks'\n\ntype T = SectionShape\ntype E = HTMLDivElement\n\nexport class SectionUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Section as const\n\n  canBind = true\n\n  canClone = true\n\n  canEdit = true\n\n  children:string[] = []\n\n  getShape = (props: Partial<T>): T => {\n    return Utils.deepMerge<T>(\n      {\n        id: 'id',\n        type: TDShapeType.Section,\n        name: 'Section',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [1, 1],\n        rotation: 0,\n        style: defaultSectionStyle,\n        label: '',\n        children: []\n      },\n      props\n    )\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,  labelPoint = LABEL_POINT, label = 'section'  } = shape\n      const font = getFontStyle(style)\n     \n      const styles = getSectionShapeStyle(style, meta.isDarkMode)\n      const Component = DashedRectangle\n      const handleLabelChange = React.useCallback(\n        (label: string) => onShapeChange?.({ id, label }),\n        [onShapeChange]\n      )\n\n      // const app = useTldrawApp()\n\n      // const deleteSection = () => {\n      //   app.delete([id])\n      // }\n    \n      return (\n       \n        <FullWrapper ref={ref} {...events} >\n\n          <div style={{position:'absolute', top: '50%', right: '50%'}}  >\n              <SectionButton  {...events} style={{bottom: bounds.height/2 }} >\n                <SectionHeader\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              </SectionButton>\n          </div>\n\n          {/* <DeleteButton  {...events} style={{bottom: bounds.height/2 }} onClick={deleteSection}>\n            Remove Section\n          </DeleteButton> */}\n        \n          <SVGContainer id={shape.id + '_svg'} opacity={0.5}>\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 = getSectionShapeStyle(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  setChildren = (children:string[]) => {\n    this.children = children\n  } \n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%', position:'relative' })\nconst SectionButton = styled('div', {position:\"absolute\", height:\"42px\", left:\"5%\", zIndex:\"99\", pointerEvents:\"all\", cursor:\"pointer\"})\n// const DeleteButton = styled('div', {position:\"absolute\", height:\"42px\", width :\"42px\", right:\"5%\", top:0, zIndex:\"99\", pointerEvents:\"all\", cursor:\"pointer\"})", "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 / 2, sw * 2)\n  const ry = Math.min(h / 2, 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 { 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={2} 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 { stopPropagation } from '~components/stopPropagation'\nimport { GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { useTextKeyboardEvents } from '~state/internal'\nimport { getTextLabelSize } from '~state/internal'\nimport { TLDR } from '~state/TLDR'\nimport { styled } from '~styles'\nimport { useTldrawApp } from '~hooks'\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 SectionHeader = 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  if(!text) text=\"section\"\n\n  const app = useTldrawApp()\n  const rInput = React.useRef<HTMLTextAreaElement>(null)\n  const rIsMounted = React.useRef(false)\n\n  const rTextContent = React.useRef(text)\n\n  const handleChange = React.useCallback(\n    (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n      rTextContent.current = TLDR.normalizeText(e.currentTarget.value)\n      onChange(rTextContent.current)\n    },\n    [onChange]\n  )\n\n  const handleKeyDown = React.useCallback(\n  (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n    if(e.key===\"Enter\"){\n      app.setEditingId()\n    }\n  },\n  [isEditing]\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) => {\n      if (isEditing) {\n        e.stopPropagation()\n      }\n    },\n    [isEditing]\n  )\n\n  React.useEffect(() => {\n    if (isEditing) {\n      rTextContent.current = 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      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] + 5 + 'px'\n    \n    elm.style.height = size[1] + 1 + 'px'\n    elm.style.maxWidth = '200px'\n    elm.style.overflow = 'hidden'\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:\"#fff\",\n          border:\"none\",\n          background: color\n        }}\n      >\n        {isEditing ? (\n          <TextArea\n            ref={rInput}\n            style={{\n              font,\n              color:\"#fff\",\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={rTextContent.current}\n            color=\"#fff\"\n            onFocus={handleFocus}\n            onChange={handleChange}\n            onKeyDown={handleKeyDown}\n            onBlur={handleBlur}\n            onPointerDown={handlePointerDown}\n            onContextMenu={stopPropagation}\n          />\n        ) : (\n          text.length >= 15 ? `${text.slice(0,15)}...` : text\n        )}\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  border: \"black solid 1px\",\n  borderRadius: '10px'\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  borderRadius: '10px'\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    this.isCreate = isCreate\n    const { currentPageId } = app.state.appState\n    const page = app.state.document.pages[currentPageId]\n    this.handleId = handleId\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    // TODO: find out why this the oppositeHandleBindingId is sometimes missing\n    const oppositeHandleBindingId =\n      this.initialShape.handles[handleId === 'start' ? 'end' : 'start']?.bindingId\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    const { originPoint } = this.app\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((shape) =>\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      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      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    const shape = this.app.getShape<ArrowShape>(initialShape.id)\n    if (shape.isLocked) return\n    const handles = shape.handles\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    // First update the handle's next point\n    let delta = Vec.sub(currentPoint, handles[handleId].point)\n    if (shiftKey) {\n      const A = handles[handleId === 'start' ? 'end' : 'start'].point\n      const B = handles[handleId].point\n      const C = Vec.toFixed(Vec.sub(Vec.add(B, delta), shape.point))\n      const angle = Vec.angle(A, C)\n      const adjusted = Vec.rotWith(C, A, Utils.snapAngleToSegments(angle, 24) - angle)\n      delta = Vec.add(delta, Vec.sub(adjusted, C))\n    }\n    const nextPoint = Vec.sub(Vec.add(handles[handleId].point, delta), shape.point)\n    const draggedHandle = {\n      ...handles[handleId],\n      point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n      bindingId: undefined,\n    }\n    const utils = shapeUtils[TDShapeType.Arrow]\n    const handleChange = utils.onHandleChange?.(shape, {\n      [handleId]: draggedHandle,\n    })\n    // If the handle changed produced no change, bail here\n    if (!handleChange) return\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    let draggedBinding: ArrowBinding | undefined\n    const draggingHandle = next.shape.handles[this.handleId]\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      const startTarget = this.app.page.shapes[this.startBindingShapeId]\n      const startTargetUtils = TLDR.getShapeUtil(startTarget)\n      const center = startTargetUtils.getCenter(startTarget)\n      const startHandle = next.shape.handles.start\n      const endHandle = next.shape.handles.end\n      const rayPoint = Vec.add(startHandle.point, next.shape.point)\n      if (Vec.isEqual(rayPoint, center)) rayPoint[1]++ // Fix bug where ray and center are identical\n      const rayOrigin = center\n      const isInsideShape = startTargetUtils.hitTestPoint(startTarget, currentPoint)\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n      const hasStartBinding = this.app.getBinding(this.newStartBindingId) !== undefined\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      if (nextStartBinding && !hasStartBinding) {\n        // Bind the arrow's start handle to the start target\n        this.didBind = true\n        next.bindings[this.newStartBindingId] = nextStartBinding\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        next.bindings[this.newStartBindingId] = undefined\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      const rayPoint = Vec.add(draggingHandle.point, next.shape.point)\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n      const startPoint = Vec.add(next.shape.point!, next.shape.handles!.start.point!)\n      const endPoint = Vec.add(next.shape.point!, next.shape.handles!.end.point!)\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          const utils = TLDR.getShapeUtil(shape)\n          return ![startPoint, endPoint].every((point) => utils.hitTestPoint(shape, point))\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        if (draggedBinding) break\n      }\n    }\n    if (draggedBinding) {\n      // Create the dragged point binding\n      this.didBind = true\n      next.bindings[this.draggedBindingId] = draggedBinding\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      const currentBindingId = shape.handles[this.handleId].bindingId\n      if (currentBindingId !== undefined) {\n        next.bindings[currentBindingId] = undefined\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    const currentShape = TLDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ArrowShape\n    const currentBindingId = currentShape.handles[handleId].bindingId\n    const length = Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point)\n    if (!(currentBindingId || initialBinding) && length < 4) return this.cancel()\n    const beforeBindings: Partial<Record<string, TDBinding>> = {}\n    const afterBindings: Partial<Record<string, TDBinding>> = {}\n    if (initialBinding) {\n      beforeBindings[initialBinding.id] = this.isCreate ? undefined : initialBinding\n      afterBindings[initialBinding.id] = undefined\n    }\n    if (currentBindingId) {\n      beforeBindings[currentBindingId] = undefined\n      afterBindings[currentBindingId] = this.app.page.bindings[currentBindingId]\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", "/**\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", "import { TLBounds, Utils } from '@tldraw/core'\nimport { SessionType, TldrawPatch, TDStatus, TldrawCommand, TDShapeType } 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    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          // if(shape.name===\"Section\"){\n          //   this.app.childrenOfSection([selectId]).forEach(item => {\n          //     selectedIds.add(item)\n          //   })\n          // }\n\n\n          // When brushing a shape, select its top group parent.\n          if (!selectedIds.has(selectId) && shape.type !== TDShapeType.Section) {\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    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\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      const prevPoint = initialPoints[initialPoints.length - 1]\n      newPoints.push(prevPoint, prevPoint)\n      // Continuing with shift\n      const len = Math.ceil(Vec.dist(prevPoint, currentPoint) / 16)\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)\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    const beforeSections = this.app.document.pages.page?.sections\n\n    let afterSections = beforeSections\n    this.app.pageState.selectedIds.forEach((id) => {\n      if (id) {\n        afterSections = { ...this.app.checkIfInsideSectionandReturnState(id) }\n      }\n    })\n    return {\n      id: 'create_draw',\n      before: {\n        document: {\n          pages: {\n            [pageId]: {\n              sections: beforeSections,\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              sections: afterSections,\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'\nimport { TLPerformanceMode } from '@tldraw/core'\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, shiftKey, altKey, metaKey },\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 handle = {\n      ...handles[handleId],\n      point: Vec.sub(Vec.add(handles[handleId].point, delta), shape.point),\n    }\n\n    // First update the handle's next point\n    const change = TLDR.getShapeUtil(shape).onHandleChange?.(shape, {\n      [handleId]: handle,\n    })\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, TDShapeType } 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  selectedShapes: string[] = []\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    if(this.app.getShape(initialShape.id).type === TDShapeType.Section){\n      const zoom = camera.zoom\n     \n      const sectionBounds = this.app.getShapeUtil(initialShape).getBounds(initialShape) \n      const origin = [sectionBounds.minX, sectionBounds.minY]\n      const point = currentPoint\n      \n      \n      // const origin = [(originPoint[0]/zoom - this.app.pageState.camera.point[0]), (originPoint[1]/zoom - this.app.pageState.camera.point[1]) ]\n      // const point = [(currentPoint[0]/zoom - this.app.pageState.camera.point[0]), (currentPoint[1]/zoom - this.app.pageState.camera.point[1]) ]\n     \n      const shapesToTest = this.app.shapes\n      .filter(\n        (shape) =>\n          !(\n            shape.isLocked ||\n            shape.isHidden ||\n            shape.parentId !== currentPageId ||\n            shape.id === initialShape.id\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      \n      \n      const a = shapesToTest.filter(shape1 => \n        (shape1.bounds.minX  > Math.min(origin[0], point[0]) &&\n        shape1.bounds.maxX  < Math.max(origin[0], point[0]) &&\n        shape1.bounds.minY  > Math.min(origin[1], point[1]) &&\n        shape1.bounds.maxY  < Math.max(origin[1], point[1]))\n      )\n      \n      this.selectedShapes = a.map(a2=>a2.id);\n\n      this.app.select(...this.selectedShapes)\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 beforeSections = this.app.document.pages[currentPageId].sections\n    beforeSections[initialShape.id ] =undefined\n\n    let afterSections = beforeSections\n\n\n    this.app.pageState.selectedIds.forEach((id) => {\n      if (id) {\n        afterSections = {...this.app.checkIfInsideSectionandReturnState(id)}\n      }\n    })\n    \n    if(this.app.getShape(initialShape.id).type === TDShapeType.Section){\n        afterSections = {\n          ...afterSections,\n          [initialShape.id]: [...this.selectedShapes]\n        }\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    return {\n      id: 'transform_single',\n      before: {\n        appState: {\n          snapLines: [],\n        },\n        document: {\n          pages: {\n            [currentPageId]: {\n              shapes: beforeShapes,\n              sections: beforeSections\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              sections: afterSections\n            },\n          },\n          pageStates: {\n            [currentPageId]: {\n              selectedIds: [initialShape.id],\n              editingId: undefined,\n              hoveredId: undefined,\n            },\n          },\n        },\n      },\n    }\n  }\n}", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n  TLPageState,\n  Utils,\n  TLBoundsWithCenter,\n  TLSnapLine,\n  TLBounds,\n  TLPerformanceMode,\n} 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  private arraysEqual(a:string[], b:string[]) {\n    if (a === b) return true;\n    if (a == null || b == null) return false;\n    if (a.length !== b.length) return false;\n\n    // If you don't care about the order of the elements inside\n    // the array, you should sort both arrays here.\n    // Please note that calling sort on an array will modify that array.\n    // you might want to clone your array first.\n\n    for (let i = 0; i < a.length; ++i) {\n      if (a[i] !== b[i]) return false;\n    }\n    return true;\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const {\n      initialShapes,\n      initialParentChildren,\n      bindingsToDelete,\n      app: { currentPageId }\n    } = this\n\n    const beforeSections= this.app.document.pages[currentPageId].sections\n    const beforeBindings: Patch<Record<string, TDBinding>> = {}\n    const beforeShapes: Patch<Record<string, TDShape>> = {}\n\n    const afterSections = beforeSections\n    const afterBindings: Patch<Record<string, TDBinding>> = {}\n    const afterShapes: Patch<Record<string, TDShape>> = {}\n\n    \n    this.app.pageState.selectedIds.forEach((id) => {\n      if (id) {\n        const updatedSections = this.app.checkIfInsideSectionandReturnState(id)\n        Object.keys(updatedSections).forEach(section=>{\n          if((updatedSections[section].includes(id) || afterSections[section].includes(id) )&& !this.arraysEqual(updatedSections[section],afterSections[section]) )\n            afterSections[section]= updatedSections[section]\n        })\n      }\n    }) \n    \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              sections: beforeSections\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              sections: afterSections\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}", "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\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  }\n\n  start = (): TldrawPatch | undefined => void null\n\n  update = (): TldrawPatch | undefined => {\n    const { page, shiftKey, originPoint, currentPoint } = this.app\n\n    if (shiftKey) {\n      if (!this.isLocked && Vec.dist(originPoint, currentPoint) > 4) {\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    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    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    }\n  }\n\n  complete = (): TldrawPatch | TldrawCommand | undefined => {\n    const { page } = this.app\n    const beforeSections = this.app.document.pages.page?.sections\n\n    const erasedArray = [...this.erasedShapes].map((ele) => ele.id)\n\n    const afterSections = {...this.app.removeSectionFromState(erasedArray)}\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      sections: beforeSections\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      sections: afterSections\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      },\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      },\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 {\n  ConnectorShape,\n  TDShape,\n  TDBinding,\n  TDStatus,\n  SessionType,\n  TDShapeType,\n  TldrawPatch,\n  TldrawCommand,\n  ConnectorBinding,\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 ConnectorSession extends BaseSession {\n  type = SessionType.Connector\n  performanceMode = undefined\n  status = TDStatus.TranslatingHandle\n  newStartBindingId = Utils.uniqueId()\n  draggedBindingId = Utils.uniqueId()\n  didBind = false\n  initialShape: ConnectorShape\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    this.isCreate = isCreate\n    const { currentPageId } = app.state.appState\n    const page = app.state.document.pages[currentPageId]\n    this.handleId = handleId\n    this.initialShape = deepCopy(page.shapes[shapeId] as ConnectorShape)\n\n    this.bindableShapeIds = TLDR.getBindableShapeIds(app.state).filter(\n      (id) => !(id === this.initialShape.id || id === this.initialShape.parentId)\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    if (oppositeHandleBindingId) {\n      const oppositeToId = page.bindings[oppositeHandleBindingId]?.toId\n      if (oppositeToId) {\n        this.bindableShapeIds = this.bindableShapeIds.filter((id) => id !== oppositeToId)\n      }\n    }\n    const { originPoint } = this.app\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((shape) =>\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      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      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    \n    const {\n      currentPoint,\n      shiftKey,\n      altKey,\n      metaKey,\n      currentGrid,\n      settings: { showGrid },\n    } = this.app\n    const shape = this.app.getShape<ConnectorShape>(initialShape.id)\n    if (shape.isLocked) return\n    const handles = shape.handles\n\n    const handleId = this.handleId \n    // If the handle can bind, then we need to search bindable shapes for\n    // a binding.\n    if (!handles[handleId].canBind) return\n    // First update the handle's next point\n    let delta = Vec.sub(currentPoint, handles[handleId].point)\n    if (shiftKey) {\n      const A = handles[handleId === 'start' ? 'end' : 'start'].point\n      const B = handles[handleId].point\n      const C = Vec.toFixed(Vec.sub(Vec.add(B, delta), shape.point))\n      const angle = Vec.angle(A, C)\n      const adjusted = Vec.rotWith(C, A, Utils.snapAngleToSegments(angle, 24) - angle)\n      delta = Vec.add(delta, Vec.sub(adjusted, C))\n    }\n    const nextPoint = Vec.sub(Vec.add(handles[handleId].point, delta), shape.point)\n    const draggedHandle = {\n      ...handles[handleId],\n      point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n      bindingId: undefined,\n    }\n    const utils = shapeUtils[TDShapeType.Connector]\n    const handleChange = utils.onHandleChange?.(shape, {\n      [handleId]: draggedHandle,\n    })\n    // If the handle changed produced no change, bail here\n    if (!handleChange) return\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: ConnectorShape; bindings: Record<string, ConnectorBinding | undefined> } = {\n      shape: Utils.deepMerge(shape, handleChange),\n      bindings: {},\n    }\n\n    \n    let draggedBinding: ConnectorBinding | undefined\n    const draggingHandle = next.shape.handles[this.handleId]\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: ConnectorBinding | undefined\n      const startTarget = this.app.page.shapes[this.startBindingShapeId]\n      const startTargetUtils = TLDR.getShapeUtil(startTarget)\n      const center = startTargetUtils.getCenter(startTarget)\n      const startHandle = next.shape.handles.start\n      const endHandle = next.shape.handles.end\n      const rayPoint = Vec.add(startHandle.point, next.shape.point)\n      if (Vec.isEqual(rayPoint, center)) rayPoint[1]++ // Fix bug where ray and center are identical\n      const rayOrigin = center\n      const isInsideShape = startTargetUtils.hitTestPoint(startTarget, currentPoint)\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n      const hasStartBinding = this.app.getBinding(this.newStartBindingId) !== undefined\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        nextStartBinding = this.findConnectorBindingPoint(\n          shape,\n          startTarget,\n          'start',\n          this.newStartBindingId,\n          center,\n          rayOrigin,\n          rayDirection,\n          isInsideShape\n        )\n      }\n      if (nextStartBinding && !hasStartBinding) {\n        // Bind the arrow's start handle to the start target\n        this.didBind = true\n        next.bindings[this.newStartBindingId] = nextStartBinding\n        next.shape = Utils.deepMerge(next.shape, {\n          handles: {\n            start: {\n              bindingId: nextStartBinding.id,\n            },\n            // startConnector: {\n            //   point: [startHandle.point[0], startHandle.point[1]]\n            // }\n          },\n        })\n      } else if (!nextStartBinding && hasStartBinding) {\n        // Remove the start binding\n        this.didBind = false\n        next.bindings[this.newStartBindingId] = undefined\n        next.shape = Utils.deepMerge(initialShape, {\n          handles: {\n            start: {\n              bindingId: undefined,\n            },\n            // startConnector: {\n            //   point: [0, 0]\n            // }\n          },\n        })\n      }\n    }\n\n    // DRAGGED POINT BINDING\n    const startPoint = Vec.add(next.shape.point!, next.shape.handles!.start.point!)\n    const endPoint = Vec.add(next.shape.point!, next.shape.handles!.end.point!)\n    if (!metaKey) {\n      const rayOrigin = Vec.add(oppositeHandle.point, next.shape.point)\n      const rayPoint = Vec.add(draggingHandle.point, next.shape.point)\n      const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\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          const utils = TLDR.getShapeUtil(shape)\n          return ![startPoint, endPoint].every((point) => utils.hitTestPoint(shape, point))\n        })\n      for (const target of targets) {\n        // draggedBinding = this.findBindingPoint(\n        draggedBinding = this.findConnectorBindingPoint(\n          shape,\n          target,\n          this.handleId,\n          this.draggedBindingId,\n          rayPoint,\n          rayOrigin,\n          rayDirection,\n          altKey\n        )\n        if (draggedBinding) break\n      }\n    }\n    if (draggedBinding) {\n    \n      // const nextPoint = [next.shape.point[0], next.shape.point[1]+ 50]\n      // Create the dragged point binding\n      this.didBind = true\n      next.bindings[this.draggedBindingId] = draggedBinding\n      next.shape = Utils.deepMerge(next.shape, {\n        handles: {\n          [this.handleId]: {\n            bindingId: this.draggedBindingId,\n          },\n          // [this.handleId + 'Connector']: {\n          //   point: [endPoint[0], endPoint[1]+30]\n          // }\n        },\n      })\n    } else {\n      // Remove the dragging point binding\n      this.didBind = this.didBind || false\n      const currentBindingId = shape.handles[this.handleId].bindingId\n      if (currentBindingId !== undefined) {\n        next.bindings[currentBindingId] = undefined\n        next.shape = Utils.deepMerge(next.shape, {\n          handles: {\n            [this.handleId]: {\n              bindingId: undefined,\n            },\n            // [this.handleId + 'Connector']: {\n            //   point: [0, 0]\n            // }\n          },\n        })\n      }\n    }\n    \n    const change = TLDR.getShapeUtil<ConnectorShape>(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 ConnectorShape\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    const currentShape = TLDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ConnectorShape\n    const currentBindingId = currentShape.handles[handleId].bindingId\n    const length = Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point)\n    if (!(currentBindingId || initialBinding) && length < 4) return this.cancel()\n    const beforeBindings: Partial<Record<string, TDBinding>> = {}\n    const afterBindings: Partial<Record<string, TDBinding>> = {}\n    if (initialBinding) {\n      beforeBindings[initialBinding.id] = this.isCreate ? undefined : initialBinding\n      afterBindings[initialBinding.id] = undefined\n    }\n    if (currentBindingId) {\n      beforeBindings[currentBindingId] = undefined\n      afterBindings[currentBindingId] = this.app.page.bindings[currentBindingId]\n    }\n    if (startBindingShapeId) {\n      beforeBindings[newStartBindingId] = undefined\n      afterBindings[newStartBindingId] = this.app.page.bindings[newStartBindingId]\n    }\n\n    return {\n      id: 'connector',\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: ConnectorShape,\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: 'connector',\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  private findConnectorBindingPoint = (\n    shape: ConnectorShape,\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 connectorPoint = util.getConnectorBindingPoint(\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 (!connectorPoint) return\n\n    return {\n      id: bindingId,\n      type: 'connector',\n      fromId: shape.id,\n      toId: target.id,  \n      handleId: handleId,\n      point: Vec.toFixed(connectorPoint.point),\n      distance: connectorPoint.distance,\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 { ConnectorSession } from './ConnectorSession'\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  | ConnectorSession\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.Connector]: typeof ConnectorSession\n  \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.Connector]: ConnectorSession,\n}\n\nexport const getSession = <K extends SessionType>(type: K): SessionOfType<K> => {\n  return sessions[type]\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.CenterVertical]: [point[0], midY - bounds.height / 2],\n            [AlignType.CenterHorizontal]: [midX - bounds.width / 2, point[1]],\n            [AlignType.Top]: [point[0], commonBounds.minY],\n            [AlignType.Bottom]: [point[0], commonBounds.maxY - bounds.height],\n            [AlignType.Left]: [commonBounds.minX, 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'\n\nexport function createPage(\n  app: TldrawApp,\n  center: number[],\n  pageId = Utils.uniqueId()\n): TldrawCommand {\n  const { currentPageId } = app\n\n  const topPage = Object.values(app.state.document.pages).sort(\n    (a, b) => (b.childIndex || 0) - (a.childIndex || 0)\n  )[0]\n\n  const nextChildIndex = topPage?.childIndex ? topPage?.childIndex + 1 : 1\n\n  // TODO: Iterate the name better\n  const nextName = `New Page`\n\n  const page: TDPage = {\n    id: pageId,\n    name: nextName,\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", "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  sections: any[] = []\n): TldrawCommand {\n  const { currentPageId } = app\n  const beforeShapes: Record<string, Patch<TDShape> | undefined> = {}\n  const afterShapes: Record<string, Patch<TDShape> | undefined> = {}\n  const beforeSections: Record<string, string[] | undefined> = {}\n  const afterSections: Record<string, string[] | undefined> = {}\n\n  shapes.forEach((shape) => {\n    beforeShapes[shape.id] = undefined\n    afterShapes[shape.id] = shape\n  })\n\n  Object.keys(sections).forEach((section) => {\n    beforeSections[section] = undefined\n    afterSections[section] = sections[section]\n  })\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            sections: beforeSections\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            sections: afterSections\n          },\n        },\n        pageStates: {\n          [currentPageId]: {\n            selectedIds: shapes.map((shape) => shape.id),\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    sections: {}\n  }\n\n  const after: PagePartial = {\n    shapes: {},\n    bindings: {},\n    sections: {}\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  const beforeSections = app.document.pages.page?.sections\n  const afterSections = app.removeSectionFromState(ids)\n  before['sections'] = beforeSections\n  after['sections'] = afterSections\n\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 { selectedIds, currentPageId, shapes } = app\n\n  const boundsForShapes = shapes.map((shape) => TLDR.getBounds(shape))\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 { 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  const shapeStyle = {\n    currentShapeStyle: changes,\n  }\n\n  let appState: any = {\n    currentStyle: changes,\n  }\n\n  if (app.currentTool.type == 'draw') {\n    appState = {\n      currentDrawStyle: changes,\n    }\n  }\n  if (app.currentTool.type == 'sticky') {\n    appState = {\n      currentStickyStyle: changes,\n    }\n  }\n  if (\n    app.currentTool.type == 'rectangle' ||\n    app.currentTool.type == 'triangle' ||\n    app.currentTool.type == 'ellipse' ||\n    app.currentTool.type == 'line'\n  ) {\n    appState = { ...shapeStyle }\n  }\n\n  if (app.currentTool.type == 'section') {\n    appState = {\n      currentSectionStyle: changes,\n    }\n  }\n\n  if (app.currentTool.type == 'highlighter') {\n    appState = {\n      currentHighlighterStyle: changes,\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    },\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", "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 {\n  TLKeyboardEventHandler,\n  TLPinchEventHandler,\n  TLPointerEventHandler,\n  TLWheelEventHandler,\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 { 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.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentShapeStyle },\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: { ...currentShapeStyle },\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 { 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    const {\n      currentPoint,\n      appState: { currentPageId, currentDrawStyle },\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: { ...currentDrawStyle },\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    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}", "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.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentShapeStyle },\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: { ...currentShapeStyle },\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.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentShapeStyle },\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: { ...currentShapeStyle },\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.status !== Status.Idle) return\n\n    const {\n      currentPoint,\n      currentGrid,\n      settings: { showGrid },\n      appState: { currentPageId, currentShapeStyle },\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: { ...currentShapeStyle },\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 {\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.pageState.editingId) {\n      this.app.setEditingId()\n    } else {\n      this.selectNone()\n    }\n    this.app.cancelSession()\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 (\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        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 = (info, e) => {\n    const { originPoint, currentPoint } = this.app\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            let idsToTransform = this.app.selectedIds.flatMap((id) =>\n              TLDR.getDocumentBranch(this.app.state, id, this.app.currentPageId)\n            )\n            if (idsToTransform.some((id) => this.app.getShape(id).name === 'Section')) {\n              idsToTransform = idsToTransform.filter(\n                (id) => this.app.getShape(id).name === 'Section'\n              )\n            }\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              if (selectedShape.type == TDShapeType.Connector)\n                this.app.startSession(\n                  SessionType.Connector,\n                  selectedShape.id,\n                  this.pointedHandleId,\n                  false\n                )\n              else {\n                this.app.startSession(\n                  SessionType.Arrow,\n                  selectedShape.id,\n                  this.pointedHandleId,\n                  false\n                )\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    this.app.completeSession()\n    if (this.status === Status.Transforming) {\n      if (this.app.document.pageStates.page.selectedIds) {\n        const selectedShape = this.app.document.pageStates.page.selectedIds\n        selectedShape.forEach((shape) => {\n          const toBeSelectedShapes = this.app.document.pages.page.sections[shape]\n            ? new Set([...this.app.document.pages.page.sections[shape], shape])\n            : new Set([shape])\n          this.app.select(...toBeSelectedShapes)\n        })\n      }\n    }\n    this.setStatus(Status.Idle)\n    this.pointedBoundsHandle = undefined\n    this.pointedHandleId = undefined\n    this.pointedId = undefined\n  }\n\n  // Canvas\n\n  onDoubleClickCanvas: TLCanvasEventHandler = () => {\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    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      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 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.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, currentStickyStyle },\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: { ...currentStickyStyle },\n        user: this.app.appState.user.user.name\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.createShapes(newShape)\n\n      this.app.startSession(SessionType.Translate)\n\n      this.setStatus(Status.Creating)\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\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 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(showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint)\n      this.setStatus(Status.Creating)\n      return\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n  \n    if (this.status === Status.Creating) {\n      this.setStatus(Status.Idle)\n      this.app.completeSession()\n      this.app.selectTool('select')\n    }\n  }\n\n  onPointShape: TLPointerEventHandler = (info) => {\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    this.stopEditingShape()\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.status !== Status.Idle) return\n\n    this.setStatus(Status.Pointing)\n  }\n\n  onPointerMove: TLPointerEventHandler = (info) => {\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    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 Vec from '@tldraw/vec'\nimport type { TLPointerEventHandler } from '@tldraw/core'\nimport { Utils } from '@tldraw/core'\nimport { Sticker } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class StickerTool extends BaseTool {\n  type = TDShapeType.Sticker as const\n\n  shapeId?: string\n\n  /* ----------------- Event Handlers ----------------- */\n\n  onPointerDown: TLPointerEventHandler = () => {\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, currentStickyStyle },\n      } = this.app\n\n      const childIndex = this.getNextChildIndex()\n\n      const id = Utils.uniqueId()\n\n      this.shapeId = id\n\n      const newShape = Sticker.create({\n        id,\n        parentId: currentPageId,\n        childIndex,\n        point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n        style: { ...currentStickyStyle },\n        svg: this.app.appState.selectedSticker\n      })\n      \n      const bounds = Sticker.getBounds(newShape)\n\n      newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n\n      this.app.createShapes(newShape)\n\n      this.app.startSession(SessionType.Translate)\n\n      this.setStatus(Status.Creating)\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    if (this.status === Status.Creating) {\n      this.setStatus(Status.Idle)\n      this.app.completeSession()\n    }\n  }\n\n  onPointerMove: TLPointerEventHandler =()=>{\n    this.app.changeCursorStickerPosition()\n  }\n}\n", "import { Utils, TLPointerEventHandler, TLBoundsCorner, TLKeyboardEventHandler } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { TldrawApp } from '~state/internal'\nimport { Section } from '~state/shapes'\nimport { SectionShape, SessionType, TDShapeType } from '~types'\nimport { BaseTool } from '../BaseTool'\nimport { TLDR } from '~state/TLDR'\nimport { Children } from 'react'\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 SectionTool extends BaseTool<Status> {\n  type = TDShapeType.Section as const\n  shape: any = null\n  selectedShapes: string[] = []\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, currentSectionStyle },\n    } = this.app\n\n    const childIndex = -9999\n\n    const id = Utils.uniqueId()\n\n    const newShape = Section.create({\n      id,\n      parentId: currentPageId,\n      childIndex,\n      point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n      style: { ...currentSectionStyle },\n    })\n\n    this.shape = newShape\n    this.app.patchCreate([this.shape])\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  onPointerMove: TLPointerEventHandler = (info, e) => {\n    this.app.updateSession()\n  }\n\n  onPointerUp: TLPointerEventHandler = (info) => {\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    if (Vec.dist(this.app.originPoint, this.app.currentPoint) > 2) {\n      this.app.select(...[...this.selectedShapes, this.shape.id])\n    }\n\n    this.setStatus(Status.Idle)\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", "import { Utils, TLPointerEventHandler } from '@tldraw/core'\nimport { Highlighter } 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 HighlighterTool extends BaseTool {\n  type = TDShapeType.Highlighter 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    const {\n      currentPoint,\n      appState: { currentPageId, currentHighlighterStyle },\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() - 99;\n      const id = Utils.uniqueId()\n      const newShape = Highlighter.create({\n        id,\n        parentId: currentPageId,\n        childIndex,\n        point: currentPoint,\n        style: { ...currentHighlighterStyle },\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    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 } from '@tldraw/core'\nimport Vec from '@tldraw/vec'\nimport { Connector } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class ConnectorTool extends BaseTool {\n  type = TDShapeType.Connector 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 = Connector.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.Connector, 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 { Comment } from '~state/shapes'\nimport { SessionType, TDShapeType } from '~types'\nimport { BaseTool, Status } from '../BaseTool'\n\nexport class CommentTool extends BaseTool {\n  type = TDShapeType.Comment as const\n\n  shapeId?: string\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\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      } = this.app\n\n      this.app.createCommentShapeAtPoint(currentPoint)\n      this.setStatus(Status.Creating)\n      return\n    }\n  }\n\n  onPointerUp: TLPointerEventHandler = () => {\n    if (this.status === Status.Creating) {\n      this.setStatus(Status.Idle)\n      this.app.completeSession()\n      this.app.selectTool('select')\n    }\n  }\n}\n", "import {\n    TLPointerEventHandler,\n  } from '@tldraw/core'\n  import { BaseTool } from '../BaseTool'\n  \n  \n  export class MoveTool extends BaseTool {\n    type = 'select' as const\n  \n    onPointerDown: TLPointerEventHandler = () => {\n      this.app.setForcepanningTrue()\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'\nimport { StickerTool } from './StickerTool'\nimport { SectionTool } from './SectionTool'\nimport { HighlighterTool } from './HighlighterTool'\nimport { ConnectorTool } from './ConnectorTool'\nimport { CommentTool } from './CommentTool'\nimport { MoveTool } from './MoveTool/MoveTool'\n\nexport interface ToolsMap {\n  select: typeof SelectTool\n  erase: typeof EraseTool\n  move: typeof MoveTool\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  [TDShapeType.Sticker]: typeof StickerTool\n  [TDShapeType.Section]: typeof SectionTool\n  [TDShapeType.Highlighter]: typeof HighlighterTool\n  [TDShapeType.Connector]: typeof ConnectorTool\n  [TDShapeType.Comment]: typeof CommentTool\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  move: MoveTool,\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  [TDShapeType.Sticker]: StickerTool,\n  [TDShapeType.Section]: SectionTool,\n  [TDShapeType.Highlighter]: HighlighterTool,\n  [TDShapeType.Connector]: ConnectorTool,\n  [TDShapeType.Comment]: CommentTool\n}\n", "import * as React from 'react'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { FileShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { defaultTextStyle, getBoundsRectangle } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getStickyFontStyle, getStickyShapeStyle } from '../shared/shape-styles'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\nimport FileSvg from './FileSvg'\n\ntype T = FileShape\ntype E = HTMLDivElement\n\nexport class FileUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.File 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.File,\n        name: 'File',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [0, 0],\n        rotation: 0,\n        style: defaultTextStyle,\n        url: '',\n        title: '',\n        icon: '',\n        avatarUrl: [],\n        firstName: '',\n        time: '',\n        fileType:'',\n        fileIcon:''\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, events, isGhost, isBinding }, ref) => {\n      const font = getStickyFontStyle(shape.style)\n\n      const { color } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n      const seperator = <div style={{ borderRight: '1px solid #F0F1F5' }}></div>\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <StyledFileContainer>\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            <div\n              style={{\n                display: 'flex',\n                alignItems: 'start',\n                gap: '10px',\n                width: '100%',\n                paddingTop: '5px',\n              }}\n            >\n              <div\n                style={{\n                  width: '28px',\n                  height: '28px',\n                  background: '#F9FAFB',\n                  border: '1px solid #F6F7F9',\n                  boxShadow: '0px 1px 0px #F0F1F5',\n                  borderRadius: '4px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                  marginTop: '10px',\n                }}\n                dangerouslySetInnerHTML={{__html:shape.fileIcon}}\n              >  \n              </div>\n\n              <div style={{ display: 'flex', flexDirection: 'column' }}>\n                <StyledHeader >\n                  {shape.title?.length > 20 ? `${shape.title?.slice(0, 20)}...` : shape.title}\n                </StyledHeader>\n\n                <div style={{ display: 'flex', paddingTop: '2px', gap: '3px' }}>\n                  <div dangerouslySetInnerHTML={{__html:shape.icon}}></div>\n                  {seperator}\n                  <div\n                    style={{\n                      fontWeight: '500',\n                      fontSize: '12px',\n                      lineHeight: '16px',\n                      color: '#254DDA',\n                      cursor: 'pointer',\n                      display: 'flex',\n                      alignItems: 'center',\n                    }}\n                    {...events} onClick={() => window.open(`${shape.url}`, '_blank')}\n                  >\n                    {shape.fileType}\n                  </div>\n                  {seperator}\n                  <div\n                    style={{\n                      fontStyle: 'normal',\n                      opacity: '0.6',\n                      fontWeight: 400,\n                      fontSize: '12px',\n                      lineHeight: '16px',\n                      display: 'flex',\n                      alignItems: 'center',\n                    }}\n                  >\n                    Edited by {shape.firstName} {shape.time} ago\n                  </div>\n                </div>\n                <div style={{ display: 'flex', paddingTop: '5px' }}>\n                  {shape.avatarUrl.length === 0 ? (\n                    <div style={{ height: '24px', visibility: 'hidden' }}></div>\n                  ) : (\n                    shape.avatarUrl.map((item, i) => (\n                      <img\n                        key={item.member.memberId}\n                        src={item.avatar}\n                        alt={item.member.firstname}\n                        style={{\n                          width: '26px',\n                          objectFit: 'cover',\n                          height: '26px',\n                          borderRadius: '50%',\n                          border: '1px solid white',\n                          marginRight: '-7px',\n                          zIndex: `${shape.avatarUrl.length + 2 - i}`,\n                        }}\n                      />\n                    ))\n                  )}\n                </div>\n              </div>\n            </div>\n          </StyledFileContainer>\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\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\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\nconst StyledFileContainer = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  border: '1px solid #E2E4E9',\n  borderRadius: '6px',\n  fontFamily: 'Graphik Web',\n  height: '100%',\n  backgroundColor: '#ffffff',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '12px',\n  boxShadow: ' 0px 2px 4px rgba(0, 0, 0, 0.08)',\n})\n\nconst StyledHeader = styled('div', {\n  fontStyle: 'normal',\n  fontWeight: '600',\n  fontSize: '14px',\n  lineHeight: '21px',\n})\n", "import * as React from 'react'\nimport { Utils, SVGContainer, TLBounds } from '@tldraw/core'\nimport { Vec } from '@tldraw/vec'\nimport { defaultHighlighterStyle, getShapeStyle } from '../shared/shape-styles'\nimport { HighlighterShape, 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 = HighlighterShape\ntype E = SVGSVGElement\n\nexport class HighlighterUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Highlighter 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.Highlighter,\n        name: 'Highlighter',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        rotation: 0,\n        style: defaultHighlighterStyle,\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={20}\n              fill={stroke}\n              stroke={stroke}\n              pointerEvents=\"all\"\n              opacity={0.7}\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={0.7}>\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=\"38\"\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 (points.length <= 2) {\n      return Vec.distanceToLineSegment(A, B, shape.point) < 4\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 { HighlighterShape } 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: HighlighterShape) {\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: HighlighterShape) {\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: HighlighterShape, 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: HighlighterShape) {\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: HighlighterShape) {\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, TLBounds } from '@tldraw/core'\nimport { LessonShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { defaultTextStyle, getBoundsRectangle } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { getStickyFontStyle, getStickyShapeStyle } from '../shared/shape-styles'\nimport { styled } from '~styles'\nimport { Vec } from '@tldraw/vec'\n\ntype T = LessonShape\ntype E = HTMLDivElement\n\nconst arrow = <svg width=\"14\" height=\"12\" viewBox=\"0 0 14 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M7.17902 10.128L10.26 7.083L1.06602 7.041C0.925333 7.04047 0.786134 7.01221 0.656385 6.95783C0.526636 6.90344 0.408885 6.82401 0.309872 6.72407C0.210858 6.62412 0.132525 6.50564 0.0793567 6.37539C0.026188 6.24513 -0.000772996 6.10568 1.68656e-05 5.965C0.00067166 5.8244 0.0290302 5.6853 0.0834714 5.55567C0.137913 5.42604 0.217369 5.3084 0.317298 5.2095C0.417228 5.11059 0.535671 5.03235 0.665856 4.97924C0.796042 4.92613 0.935418 4.89921 1.07602 4.9L10.268 4.941L7.22802 1.865C7.12893 1.76523 7.05048 1.64691 6.99715 1.51681C6.94383 1.3867 6.91666 1.24736 6.91722 1.10675C6.91778 0.966143 6.94604 0.827022 7.0004 0.697344C7.05476 0.567666 7.13414 0.449974 7.23402 0.350995C7.43594 0.151199 7.70891 0.0397146 7.99297 0.0410271C8.27702 0.0423396 8.54895 0.156342 8.74902 0.357995L13.749 5.407C13.9129 5.57276 14.0042 5.79684 14.0029 6.02994C14.0016 6.26305 13.9078 6.48608 13.742 6.65L8.68902 11.65C8.48726 11.8497 8.21446 11.9612 7.93057 11.9599C7.64667 11.9586 7.37491 11.8446 7.17502 11.643C7.07577 11.5433 6.99714 11.425 6.94363 11.2949C6.89012 11.1647 6.86277 11.0254 6.86314 10.8847C6.86351 10.744 6.8916 10.6047 6.9458 10.4749C7 10.3451 7.07925 10.2272 7.17902 10.128Z\" fill=\"white\"/>\n</svg>\n\n\nexport class LessonUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Lesson 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.Lesson,\n        name: 'Lesson',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [0, 0],\n        rotation: 0,\n        style: defaultTextStyle,\n        url: '',\n        imageUrl: '',\n        title: '',\n        description:''\n      },\n      props\n    )\n  }\n\n  Component = TDShapeUtil.Component<T, E, TDMeta>(\n    ({ shape, meta, events, isGhost, isBinding }, ref) => {\n      const font = getStickyFontStyle(shape.style)\n\n      const { color } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n      const seperator = <div style={{ borderRight: '1px solid #F0F1F5' }}></div>\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <StyledFileContainer>\n            <StyledImage src={shape.imageUrl} alt={shape.title} />\n            <StyledHeader>{shape.title.length>31?shape.title.slice(0,27)+'...':shape.title}</StyledHeader>\n            <StyledParagraph>{shape.description.length>80?shape.description.slice(0,80)+'...':shape.description}</StyledParagraph>\n            <StyledButton onClick={()=>{window.open(shape.url,'_blank')} } {...events}>Open\n                <div style={{position:\"absolute\", top:\"12px\", right:\"14px\"}}>{arrow}</div>\n            </StyledButton>\n          </StyledFileContainer>\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\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\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\nconst StyledFileContainer = styled('div', {\n  pointerEvents: 'all',\n  position: 'relative',\n  border: '1px solid #E2E4E9',\n  borderRadius: '8px',\n  fontFamily: 'Graphik Web',\n  height: '100%',\n  backgroundColor: '#ffffff',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  flexDirection:'column',\n  padding: '16px',\n  boxShadow: ' 0px 2px 4px rgba(0, 0, 0, 0.08)',\n  gap:\"8px\"\n})\n\nexport const StyledHeader = styled('div', {\n  display:'flex',\n  alignItems:\"start\",\n  fontStyle: 'normal',\n  fontWeight: '700',\n  fontSize: '18px',\n  lineHeight: '24px',\n  height:'24px',\n  width:\"100%\",\n  color: '#131720'\n})\n\nconst StyledImage = styled('img', {\n    width:\"303px\",\n    height:\"106px\",\n    borderRadius:\"7px\",\n    objectFit:\"cover\",\n    pointerEvents:\"none\"\n  })\n\nexport const StyledParagraph = styled('p',{\n    height:\"40px\",\n    fontStyle: 'normal',\n    fontWeight: '400',\n    fontSize: '14px',\n    lineHeight: '20px',    \n    letterSpacing: '-0.1px',\n    verticalAlign:\"top\",\n    margin:'0px'\n})\n\nexport const StyledButton = styled('div',{\n    height:\"40px\",\n    fontStyle: 'normal',\n    fontWeight: '400',\n    fontSize: '14px',\n    lineHeight: '20px',    \n    letterSpacing: '-0.1px',\n    background: '#254DDA',\n    margin:'0px',\n    color: '#FFFFFF',\n    padding: '10px 16px',\n    width:\"100%\",\n    borderRadius:\"4px\",\n    border:\"none\",\n    cursor:\"pointer\",\n    textAlign:\"start\",\n    position:\"relative\"\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 { ConnectorShape, 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  getConnectorPath2,\n} from './connectorHelpers'\nimport { styled } from '~styles'\nimport { TextLabel, getFontStyle, getShapeStyle } from '../shared'\nimport { getTextLabelSize } from '../shared/getTextSize'\nimport { ConnectorArrow } from './components/ConnectorArrow'\nimport { LabelMask } from '../shared/LabelMask'\n\ntype T = ConnectorShape\ntype E = HTMLDivElement\n\nexport class ConnectorUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Connector 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.Connector,\n      name: 'Connector',\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\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, end, startConnector, endConnector },\n        handles: { start, end },\n\n        decorations = {},\n        style,\n      } = shape\n\n      const font = getFontStyle(style)\n      const styles = getShapeStyle(style, meta.isDarkMode)\n      const labelSize = label || isEditing ? getTextLabelSize(label, font) : [0, 0]\n      const bounds = this.getBounds(shape)\n      const dist = React.useMemo(() => {\n        const { start, end } = shape.handles\n        return Vec.dist(start.point, end.point)\n      }, [shape.handles])\n      const scale = Math.max(\n        0.5,\n        Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n      )\n      const offset = React.useMemo(() => {\n        const bounds = this.getBounds(shape)\n        const offset = \n        [bounds.width / 2, bounds.height / 2]\n        return offset\n      }, [shape, scale])\n      const handleLabelChange = React.useCallback(\n        (label: string) => {\n          onShapeChange?.({ id, label })\n        },\n        [onShapeChange]\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={label || isEditing ? `url(#${shape.id}_clip)` : ``}\n            >\n              <ConnectorArrow\n                id={id}\n                style={style}\n                start={start.point}\n                end={end.point}\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<ConnectorShape>(({ shape, bounds }) => {\n    const {\n      style,\n      decorations,\n      label,\n      handles: { start, end },\n    } = shape\n    const font = getFontStyle(style)\n    const labelSize = label ? getTextLabelSize(label, font) : [0, 0]\n    const dist = React.useMemo(() => {\n      const { start, end } = shape.handles\n      return Vec.dist(start.point, end.point)\n    }, [shape.handles])\n    const scale = Math.max(\n      0.5,\n      Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n    )\n    const offset = React.useMemo(() => {\n      const bounds = this.getBounds(shape)\n      const offset = [bounds.width / 2, bounds.height / 2]\n      return offset\n    }, [shape, scale])\n    return (\n      <>\n        <LabelMask\n          id={shape.id}\n          scale={scale}\n          offset={offset}\n          bounds={bounds}\n          labelSize={labelSize}\n        />\n        <path\n          d={getConnectorPath2(\n            shape.id,\n            style,\n            start.point,\n            end.point,\n            decorations?.start,\n            decorations?.end\n          )}\n          mask={label ? `url(#${shape.id}_clip)` : ``}\n        />\n        {label && (\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, end },\n      } = shape\n      return Utils.getBoundsFromPoints([start.point,  end.point])\n    })\n    return Utils.translateBounds(bounds, shape.point)\n  }\n\n  getRotatedBounds = (shape: T) => {\n    const {\n      handles: { start, end },\n    } = shape\n    let points = [start.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, end },\n    } = shape\n    const pt = Vec.sub(point, shape.point)\n    const points = [start.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, end },\n    } = shape\n    const ptA = Vec.sub(A, shape.point)\n    const ptB = Vec.sub(B, shape.point)\n    const points = [start.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 } = 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    \n    return intersectLineSegmentBounds(sp, ep, bounds).length > 0\n   \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\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\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<ConnectorShape['handles']>(shape.handles, handles)\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      // endConnector: {\n      //   point: [0,0],\n      // },\n      // startConnector: {\n      //   point: [0,0],\n      // },\n    })\n    // This will produce NaN values\n    if (Vec.isEqual(nextHandles.start.point, nextHandles.end.point)) return\n   \n    const nextShape = {\n      point: shape.point,\n\n      handles: {\n        ...nextHandles,\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 ConnectorShape)\n    const offset = Vec.sub([nextBounds.minX, nextBounds.minY], topLeft)\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      if (Vec.isEqual(nextShape.point, [0, 0])) {\n        throw Error('here!')\n      }\n    }\n    return nextShape\n  }\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })", "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 renderFreehandArrowShaft(\n  id: string,\n  style: ShapeStyles,\n  points: 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, mid1, strokeWidth) : start\n  // const mid1Point = decorationEnd ? Vec.nudge(mid1, mid2, strokeWidth) : mid1\n  // const mid2Point = decorationEnd ? Vec.nudge(mid2, end, strokeWidth) : mid2\n  // const endPoint = decorationEnd ? Vec.nudge(end, mid2, strokeWidth) : end\n  const stroke = getStroke(points, {\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 getSvgPathFromStrokeS(stroke)\n}\n\nfunction getSvgPathFromStrokeS(points: number[][], closed = true): string {\n  const TRIM_NUMBERS = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g\n\n  if (!points.length) {\n    return ''\n  }\n\n  const max = points.length - 1\n\n  return points\n    .reduce(\n      (acc, point, i, arr) => {\n        if (i === max) {\n          if (closed) acc.push('Z')\n        } else acc.push(point, Vec.med(point, arr[i + 1]))\n        return acc\n      },\n      ['M', points[0], 'S']\n    )\n    .join(' ')\n    .replaceAll(TRIM_NUMBERS, '$1')\n}\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\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 getCursorPath(\n  style: ShapeStyles,\n  start: 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\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  return path.join(' ')\n}\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 getConnectorPath(\n  style: ShapeStyles,\n  start: 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  \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  \n  return path.join(' ')\n}\n\nexport function getConnectorPath2(\n  id:string,\n  style:ShapeStyles,\n  start:number[],\n  end:number[],\n  decorationStart:Decoration|undefined,\n  decorationEnd:Decoration|undefined,\n  startConnector:number[] | undefined = undefined,\n  endConnector:number[] | undefined = undefined\n){\n\n  // if (startConnector && Vec.isEqual(startConnector, [0,0]))\n    startConnector = undefined\n  // if (endConnector && Vec.isEqual(endConnector, [0,0]))\n    endConnector = undefined\n\n\n  const arrowDisp = Vec.sub(start, end)\n  const horizontalConnector:boolean = Math.abs(arrowDisp[0]) > Math.abs(arrowDisp[1]) \n \n\n  let centerValue\n  let point1 = Vec.mul(Vec.add(start, end), .5)\n  let point2 = Vec.mul(Vec.add(start, end), .5)\n\n\n  // if(horizontalConnector){\n  //   if( Math.abs(start[1] -  end[1]) > 20){\n  //     centerValue = (start[0] + end[0])/2\n  //     if(startConnector)\n  //       point1 = [centerValue, startConnector[1]]\n  //     else\n  //       point1 = [centerValue, start[1]]\n      \n  //     if(endConnector)\n  //       point2 = [centerValue, endConnector[1]]\n  //     else\n  //       point2 = [centerValue, end[1]]\n  //   }\n\n  // }else{\n  //   if(Math.abs(start[0] -  end[0]) > 20){\n  //     centerValue = (start[1] + end[1])/2\n  //     if(startConnector)\n  //       point1 = [startConnector[0], centerValue]\n  //     else\n  //       point1 = [start[0], centerValue]\n        \n  //     if(endConnector)\n  //       point2 = [endConnector[0], centerValue]\n  //     else\n  //       point2 = [end[0], centerValue]\n  //   }\n  // }\n\n  if(horizontalConnector){\n    if( Math.abs(start[1] -  end[1]) > 20){\n      centerValue = (start[0] + end[0])/2\n      if(startConnector)\n        point1 = [startConnector[0], start[1]]\n      else\n        point1 = [centerValue, start[1]]\n      \n      if(endConnector)\n        point2 = [endConnector[0],  end[1]]\n      else\n        point2 = [centerValue, end[1]]\n    }\n\n  }else{\n    if(Math.abs(start[0] -  end[0]) > 20){\n      centerValue = (start[1] + end[1])/2\n      if(startConnector)\n        point1 = [start[0], startConnector[1]]\n      else\n        point1 = [start[0], centerValue]\n        \n      if(endConnector)\n        point2 = [end[0], endConnector[1]]\n    else\n        point2 = [end[0], centerValue]\n    }\n  }\n\n  let points = [start, point1, point2, end]\n  // if( startConnector && endConnector)\n  //   points = [start,startConnector,  point1, point2, endConnector, end]\n  // else if(startConnector)\n  //   points = [start,startConnector,  point1, point2, end]\n  // else if(endConnector)\n  //   points = [start, point1, point2, endConnector, end]\n    \n  const path = renderFreehandArrowShaft(id, style, points , decorationStart, decorationEnd) \n    \n\n    \n    return path\n}\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 { getConnectorPath2, getStraightArrowHeadPoints, renderFreehandArrowShaft } from '../connectorHelpers'\nimport { Arrowhead } from './ArrowHead'\n\ninterface ConnectorSVGProps {\n  id: string\n  style: ShapeStyles\n  start: number[]\n  end: number[]\n  decorationStart: Decoration | undefined\n  decorationEnd: Decoration | undefined\n  isDarkMode: boolean\n  isDraw: boolean\n  startConnector: number[]| undefined\n  endConnector: number[]| undefined\n}\n\nexport const ConnectorArrow = React.memo(function StraightArrow({\n  id,\n  style,\n  start,\n  end,\n  decorationStart,\n  decorationEnd,\n  isDraw,\n  isDarkMode,\n  startConnector = undefined,\n  endConnector = undefined\n}: ConnectorSVGProps) {\n  const arrowDist = Vec.dist(start, end)\n  if (arrowDist < 2) return null\n\n  \n\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  \n  const path =  getConnectorPath2(\n    id,\n    style,\n    start,\n    end,\n    decorationStart,\n    decorationEnd,\n    startConnector,\n    endConnector\n  )\n\n  const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n    arrowDist,\n    strokeWidth * 1.618,\n    style.dash,\n    2,\n    false\n  )\n  // Arrowheads\n\n  const arrowDisp = Vec.sub(start, end)\n  const horizontalConnector:boolean = Math.abs(arrowDisp[0]) > Math.abs(arrowDisp[1]) \n\n  let centerValue\n  let point1 = Vec.mul(Vec.add(start, end), .5)\n  let point2 = Vec.mul(Vec.add(start, end), .5)\n\n\n  if(horizontalConnector){\n    if( Math.abs(start[1] -  end[1]) > 20){\n      centerValue = (start[0] + end[0])/2\n      // if(startConnector)\n      //   point1 = [centerValue, startConnector[1]]\n      // else\n        point1 = [centerValue, start[1]]\n      \n      // if(endConnector)\n      //   point2 = [centerValue, endConnector[1]]\n      // else\n        point2 = [centerValue, end[1]]\n    }\n\n  }else{\n    if(Math.abs(start[0] -  end[0]) > 20){\n      centerValue = (start[1] + end[1])/2\n      // if(startConnector)\n      //   point1 = [startConnector[0], centerValue]\n      // else\n        point1 = [start[0], centerValue]\n        \n      // if(endConnector)\n      //   point2 = [endConnector[0], centerValue]\n      // else\n        point2 = [end[0], centerValue]\n    }\n  }\n\n  // let arrowpoint1 = point1\n  // let arrowpoint2 = point2\n  // if(startConnector)\n  //   arrowpoint1 = startConnector\n  // if(endConnector)\n  //   arrowpoint2 = endConnector\n\n  const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n  const startArrowHead = decorationStart\n    ? getStraightArrowHeadPoints(start, point1, arrowHeadLength)\n    : null\n  const endArrowHead = decorationEnd\n    ? getStraightArrowHeadPoints(end, point2, arrowHeadLength)\n    : null\n    \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=\"bevel\"\n        pointerEvents=\"stroke\"\n\n      />\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})", "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", "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport * as React from 'react'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Mention, MentionsInput } from 'react-mentions'\nimport MentionInputStyle from './mentionInputStyle'\nimport { Utils, HTMLContainer, TLBounds } from '@tldraw/core'\nimport { defaultTextStyle } from '../shared/shape-styles'\nimport { StyledHeader, StyledParagraph, StyledButton } from '../LessonUtil'\nimport { AlignStyle, CommentShape, TDMeta, TDShapeType, TransformInfo } from '~types'\nimport { getBoundsRectangle, TextAreaUtils } from '../shared'\nimport { TDShapeUtil } from '../TDShapeUtil'\nimport { 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'\nimport { useTldrawApp } from '~hooks'\nimport { Tooltip } from '~components'\nimport { Comment } from './components/comment'\nimport mentionInputStyle from './mentionInputStyle'\n\nconst defaultMentionStyle = {\n  backgroundColor: '#cee4e5',\n}\n\ntype T = CommentShape\ntype E = HTMLDivElement\n\nexport class CommentUtil extends TDShapeUtil<T, E> {\n  type = TDShapeType.Comment 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.Comment,\n        name: 'Comment',\n        parentId: 'page',\n        childIndex: 1,\n        point: [0, 0],\n        size: [32, 32],\n        user: {},\n        comments: [],\n        rotation: 0,\n        style: defaultTextStyle,\n        currentComment: '',\n        isOpen: true,\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 rContainer = React.useRef<HTMLDivElement>(null)\n\n      const rComment = React.useRef<HTMLDivElement>(null)\n\n      const style = {\n        transform: '',\n      }\n\n      const shapeStyle = {\n        borderRadius: '50%',\n        border: 'none',\n      }\n\n      const app = useTldrawApp()\n      const pageState = app.document.pageStates.page\n      const user = app.appState.user\n      const isOpen = app.useStore(s => s.appState.isOpen[shape.id])\n      const members = app.appState.members\n      const [commentValue, setCommentValue] = React.useState('')\n      // const defaultOpen = app.useStore((s) => s.appState.defaultOpen)\n      // using this will cause every comment shape to render on default open change so avoid it\n      // if needed make key value pair to store every default open for each comment\n\n      if (shape.id == pageState.hoveredId && pageState.selectedIds[0] !== shape.id) {\n        style['transform'] = 'scale(1.2)'\n      }\n\n      if (shape.id === pageState.selectedIds[0]) {\n        shapeStyle['border'] = '1px solid #254DDA'\n      }\n\n      const onChangeText = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const value = e.target.value\n        setCommentValue(value)\n      }\n\n      const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        onShapeChange?.({\n          ...shape,\n          currentComment: TLDR.normalizeText(e.currentTarget.value),\n        })\n      }\n\n      const handleKeyDown = (e: any) => {\n        if (e.key === 'Enter') addComment()\n      }\n\n      const addComment = () => {\n        if (commentValue.trim() === '') return\n        const regex = /[^{}]+(?=})/g\n        const comments = commentValue.split('}uxB)')\n\n        const mentions = commentValue.match(regex)?.filter(c => !c.includes('uxB'))\n        const mentionedUsers = members\n          .filter(member => {\n            if (mentions?.includes(member.id)) return member\n            return false\n          })\n          .map(m => m.id)\n\n        if (mentions && mentions.length) {\n          app.setMention(true)\n          const currentMessage = comments.map(comment => {\n            if (comment.includes('[@')) {\n              return ``\n            }\n            return comment\n          }).join('');\n          app.setMessage(currentMessage)\n        }\n        app.setMentionedUsers(mentionedUsers)\n        const newCommentArray = comments.map(comment => {\n          if (comment.includes('[@')) {\n            return `<span style=\"color:#254DDA;\">@${comment.split('[@')[1].split(' ')[0]}</span>`\n          }\n          return comment\n        })\n        const comment = newCommentArray.join('')\n        setCommentValue('')\n        const newComments = [\n          ...shape.comments,\n          {\n            id: Utils.uniqueId(),\n            userName: user.user.name,\n            time: getTodayDate(),\n            avatar: user.user.avatar,\n            message: comment,\n          },\n        ]\n        onShapeChange?.({\n          ...shape,\n          comments: newComments,\n          currentComment: '',\n        })\n      }\n\n      const deleteComment = (shapeId = shape.id) => app.delete([shapeId])\n      const deleteCommentbyId = (id: string) => {\n        const newComments = shape.comments.filter(comment => comment.id !== id)\n\n        onShapeChange?.({\n          ...shape,\n          comments: newComments,\n        })\n      }\n\n      const getTodayDate = () => {\n        const today = new Date()\n        const yyyy = today.getFullYear()\n        let mm = today.getMonth() + 1 // Months start at 0!\n        let dd = today.getDate()\n\n        if (dd < 10) dd = '0' + dd\n        if (mm < 10) mm = '0' + mm\n\n        const formattedToday = dd + '/' + mm + '/' + yyyy\n\n        return formattedToday\n      }\n\n      React.useEffect(() => {\n        rComment.current?.scroll({\n          top: rComment.current.scrollHeight,\n          behavior: 'smooth',\n        })\n      }, [shape])\n\n      return (\n        <HTMLContainer ref={ref} {...events}>\n          <StyledCommentContainer ref={rContainer} style={{ ...shapeStyle }}>\n            <DropdownMenu.Root\n              modal={false}\n              dir=\"ltr\"\n              open={app.appState.defaultOpen ? true : isOpen}\n            >\n              <DropdownMenu.Trigger asChild>\n                <StyledAvatar\n                  {...events}\n                  onPointerDown={() => {\n                    app.setDropDown(shape.id)\n                  }}\n                  style={{ backgroundImage: `url(${shape.user.user.avatar})`, ...style }}\n                />\n              </DropdownMenu.Trigger>\n              <DropdownMenu.Content\n                onPointerDownOutside={() => {\n                  if (!shape.comments.length && shape.currentComment == '') {\n                    deleteComment(shape.id)\n                    app.setDefaultOpen(false)\n                    return\n                  }\n                  app.setDefaultOpen(false)\n                  app.setDropDown(shape.id, false)\n                  onShapeChange?.({\n                    ...shape,\n                  })\n                }}\n                side=\"right\"\n                sideOffset={20}\n              >\n                <StyledCommentWrapper>\n                  <StyledCommentBox>\n                    <div\n                      style={{\n                        display: 'flex',\n                        gap: '8px',\n                        justifyContent: 'space-between',\n                      }}\n                    >\n                      <StyledHeader\n                        style={{\n                          fontWeight: '500',\n                          fontSize: '16px',\n                          lineHeight: '20px',\n                          height: '20px',\n                          color: 'black',\n                        }}\n                      >\n                        Add a Comment\n                      </StyledHeader>\n                      {/* <Tooltip side=\"left\" label=\"Mark as resolved\"> */}\n                      <div\n                        {...events}\n                        // onClick = {deleteComment}\n                        style={{\n                          background: '#F6F7F9',\n                          border: '2px solid #D5D7DD',\n                          borderRadius: '4px',\n                          height: '20px',\n                          width: '20px',\n                          cursor: 'pointer',\n                        }}\n                      ></div>\n                    </div>\n                    <div\n                      ref={rComment}\n                      style={{\n                        display: 'flex',\n                        flexDirection: 'column',\n                        gap: '16px',\n                        maxHeight: '400px',\n                        overflow: 'auto',\n                      }}\n                    >\n                      {shape.comments.map((comment, i) => (\n                        <Comment\n                          onPointerDown={events.onPointerDown}\n                          userName={comment.userName}\n                          time={comment.time}\n                          avatar={comment.avatar}\n                          message={comment.message}\n                          key={comment.id}\n                          deleteCommentbyId={() => deleteCommentbyId(comment.id)}\n                          style={\n                            i !== shape.comments.length - 1\n                              ? { borderBottom: '1px solid #E2E4E9', paddingBottom: '16px' }\n                              : null\n                          }\n                        />\n                      ))}\n                    </div>\n                    <StyledCommentInputWrapper {...events}>\n                      <StyledAvatar\n                        style={{ backgroundImage: `url(${user.user.avatar})` }}\n                      ></StyledAvatar>\n                      {/* <input\n                        placeholder=\"Add a Comment...\"\n                        style={{\n                          marginLeft: '2px',\n                          outline: 'none',\n                          border: 'none',\n                          flex: 'auto',\n                        }}\n                        type=\"text\"\n                        onChange={handleTextChange}\n                        value={shape.currentComment}\n                        onKeyDown={handleKeyDown}\n                      ></input> */}\n                      <MentionsInput\n                        singleLine\n                        value={commentValue}\n                        onChange={onChangeText}\n                        onKeyDown={handleKeyDown}\n                        placeholder=\"Add a Comment...\"\n                        style={MentionInputStyle}\n                        type=\"text\"\n                      >\n                        <Mention\n                          markup=\"}uxB)[@__display__]{__id__}uxB)\"\n                          trigger=\"@\"\n                          data={members}\n                          style={defaultMentionStyle}\n                          renderSuggestion={(entry:any) => {\n                            \n                            return (\n                              <div\n                                {...events}\n                                style={{\n                                  display: 'flex',\n                                  flexDirection: 'row',\n                                  gap: '10px',\n                                  alignItems: 'center',\n                                  position: 'relative',\n                                }}\n                              >\n                                <div\n                                  style={{\n                                    position: 'absolute',\n                                    fontWeight: '500',\n                                    fontSize: '12px',\n                                    lineHeight: '18px',\n                                    height: '18px',\n                                    color: '#55585E',\n                                    top:'10px',\n                                    right:'3px'\n                                  }}\n                                >{entry.role}</div>\n                                <img\n                                  style={{\n                                    height: '28px',\n                                    width: '28px',\n                                    borderRadius: '9999px',\n                                    backgroundSize: 'cover',\n                                  }}\n                                  src={entry.avatar}\n                                />\n                                <div\n                                  {...events}\n                                  style={{ display: 'flex', flexDirection: 'column' }}\n                                >\n                                  <div\n                                    style={{\n                                      fontWeight: '400',\n                                      fontSize: '14px',\n                                      lineHeight: '20px',\n                                      height: '20px',\n                                      color: '#131720',\n                                      position: 'relative',\n                                      whiteSpace: 'nowrap',\n                                    }}\n                                  >\n                                    {entry.display}\n                                  </div>\n                                  <div\n                                    style={{\n                                      fontWeight: '400',\n                                      fontSize: '10px',\n                                      lineHeight: '16px',\n                                      height: '16px',\n                                      color: '#55585E',\n                                    }}\n                                  >\n                                    {entry.email}\n                                  </div>\n                                </div>\n                                <div\n                                  style={{\n                                    fontWeight: '500',\n                                    fontSize: '12px',\n                                    lineHeight: '18px',\n                                    height: '18px',\n                                    color: '#55585E',\n                                    marginLeft: '10px',\n                                    visibility: 'hidden',\n                                  }}\n                                >\n                                  {entry.role}\n                                </div>\n                              </div>\n                            )\n                          }}\n                        />\n                      </MentionsInput>\n                      <button\n                        style={{\n                          padding: '6px 16px',\n                          height: '32px',\n                          display: 'flex',\n                          justifyContent: 'center',\n                          alignItems: 'center',\n                          background: 'transparent ',\n                          border: '1px solid #254DDA',\n                          borderRadius: '4px',\n                          cursor: 'pointer',\n                        }}\n                        {...events}\n                        onClick={addComment}\n                      >\n                        <StyledHeader\n                          style={{\n                            fontWeight: '500',\n                            fontSize: '14px',\n                            lineHeight: '20px',\n                            display: 'flex',\n                            alignItems: 'center',\n                            color: '#254DDA',\n                          }}\n                        >\n                          Send\n                        </StyledHeader>\n                      </button>\n                    </StyledCommentInputWrapper>\n                  </StyledCommentBox>\n                </StyledCommentWrapper>\n              </DropdownMenu.Content>\n            </DropdownMenu.Root>\n            {/* <InitialComment >Some Comment Here</InitialComment> */}\n          </StyledCommentContainer>\n        </HTMLContainer>\n      )\n    }\n  )\n\n  Indicator = TDShapeUtil.Indicator<T>(({ shape }) => {\n    const {\n      size: [width, height],\n    } = shape\n\n    return <></>\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.isOpen !== prev.isOpen\n  }\n\n  transformSingle = (shape: T): Partial<T> => {\n    return shape\n  }\n\n  getSvgElement = (shape: T): SVGElement | void => {\n    const bounds = this.getBounds(shape)\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('rx', '3')\n    rect.setAttribute('ry', '3')\n\n    g.appendChild(rect)\n\n    return g\n  }\n}\n\n/* -------------------------------------------------- */\n/*                       Helpers                      */\n/* -------------------------------------------------- */\n\nconst PADDING = 16\nconst MIN_CONTAINER_HEIGHT = 200\n\nconst StyledCommentContainer = styled('div', {\n  pointerEvents: 'all',\n  height: '100%',\n  width: '100%',\n  position: 'relative',\n  display: 'flex',\n  fontFamily: 'Graphik Web',\n  justifyContent: 'center',\n  alignItems: 'center',\n  perspective: '800px',\n})\n\nexport const StyledAvatar = styled('div', {\n  height: '24px',\n  width: '24px',\n  borderRadius: '9999px',\n  backgroundSize: 'cover',\n})\n\nconst StyledCommentWrapper = styled('div', {\n  display: 'flex',\n  gap: '3px',\n  flexDirection: 'column',\n  fontFamily: 'Graphik Web',\n})\n\nconst StyledCommentBox = styled('div', {\n  width: '344px',\n  padding: '15px',\n  borderRadius: '8px',\n  boxShadow: '0px 2px 12px rgba(19, 23, 32, 0.08)',\n  background: 'white',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '8px',\n})\n\nconst InitialComment = styled('div', {\n  width: '324px',\n  height: '100%',\n  position: 'absolute',\n  top: '0',\n  left: '0',\n  zIndex: '99999px',\n})\n\nconst StyledCommentInputWrapper = styled('div', {\n  display: 'flex',\n  marginTop: '16px',\n  gap: '12px',\n  alignItems: 'center',\n  // justifyContent:\"space-between\"\n})\n", "export default {\n    control: {\n      backgroundColor: '#fff',\n      fontSize: 16,\n      // fontWeight: 'normal',\n    },\n    '&multiLine': {\n      control: {\n        fontFamily: 'Graphik Web',\n        minHeight: 63,\n      },\n      highlighter: {\n        padding: 9,\n        border: 'none',\n      },\n      input: {\n        padding: 9,\n        border: 'none',\n      },\n    },\n    '&singleLine': {\n      display: 'inline-block',\n      width: 180,\n      highlighter: {\n        padding: 1,\n        border: 'none',\n        outine:'none'\n      },\n      input: {\n        padding: 1,\n        border: 'none',\n        outline: 'none'\n      },\n    },\n    suggestions: {\n      list: {\n        position:'absolute',\n        left:'-50px',\n        top:'17px',\n        backgroundColor: 'white',\n        borderRadius: '4px',\n        boxShadow: '0px 2px 12px rgba(19, 23, 32, 0.08)',\n        fontFamily:'Graphik Web',\n        overflow:'auto',\n        maxHeight:'280px',\n        pointerEvents: 'all',\n      },\n      item: {\n        pointerEvents: 'all',\n        fontFamily:'Graphik Web',\n        padding: '12px 16px',\n        '&focused': {\n          backgroundColor: '#F6F7F9',\n        },\n      },\n    },\n  }", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { StyledHeader, StyledParagraph } from '~state/shapes/LessonUtil'\nimport { StyledAvatar } from '../CommentUtil'\nimport { useTldrawApp } from '~hooks'\n\nexport interface CommentProps {\n  userName: string\n  avatar: string\n  message: string\n  time: string\n  style: any\n  deleteCommentbyId: any\n  onPointerDown: any\n}\n\nexport const Comment = React.memo(function Comment({\n  userName,\n  avatar,\n  message,\n  time,\n  style,\n  deleteCommentbyId,\n  onPointerDown,\n}: CommentProps) {\n  const app = useTldrawApp()\n  const user = app.useStore(s => s.appState.user)\n  return (\n    <StyledCommentWrapper style={{ ...style }}>\n      <div\n        style={{\n          display: 'flex',\n          gap: '10px',\n          alignItems: 'center',\n        }}\n      >\n        <StyledAvatar style={{ backgroundImage: `url(${avatar})` }} />\n        <StyledUserName>\n          <StyledHeader\n            style={{\n              fontWeight: '400',\n              fontSize: '14px',\n              lineHeight: '20px',\n              height: '20px',\n              color: 'black',\n              position: 'relative',\n            }}\n          >\n            {userName}\n            {user.user.avatar === avatar && (\n              <div\n                style={{\n                  color: '#F4381F',\n                  position: 'absolute',\n                  right: '0',\n                  top: '10px',\n                  cursor: 'pointer',\n                }}\n                onPointerDown={deleteCommentbyId}\n              >\n                Delete\n              </div>\n            )}\n          </StyledHeader>\n          <div\n            style={{\n              fontWeight: '400',\n              fontSize: '10px',\n              lineHeight: '16px',\n              height: '16px',\n              color: '#55585E',\n            }}\n          >\n            {time}\n          </div>\n        </StyledUserName>\n      </div>\n      <div\n        style={{\n          fontWeight: '400',\n          fontSize: '14px',\n          lineHeight: '20px',\n          letterSpacing: '-0.1px',\n          verticalAlign: 'top',\n          margin: '0px',\n          wordWrap: 'break-word',\n        }}\n        dangerouslySetInnerHTML={{ __html: message }}\n      ></div>\n    </StyledCommentWrapper>\n  )\n})\n\nconst StyledCommentWrapper = styled('div', {\n  width: '100%',\n  height: '100%',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '8px',\n})\n\nconst StyledUserName = styled('div', {\n  flex: 'auto',\n  display: 'flex',\n  flexDirection: 'column',\n})\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'\nimport { StickerUtil } from './StickerUtil'\nimport { LinkUtil } from './LinkUtil'\nimport { EmbedUtil } from './EmbedUtil'\nimport {SectionUtil} from './SectionUtil'\nimport { FileUtil } from './FileUtil'\nimport { HighlighterUtil } from './HighlighterUtil'\nimport { LessonUtil } from './LessonUtil'\nimport { ConnectorUtil } from './ConnectorUtil'\nimport { CommentUtil } from './CommentUtil'\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()\nexport const Sticker = new StickerUtil();\nexport const Link = new LinkUtil();\nexport const Embed = new EmbedUtil();\nexport const Section = new SectionUtil();\nexport const File = new FileUtil();\nexport const Highlighter = new HighlighterUtil();\nexport const Lesson = new LessonUtil();\nexport const Connector = new ConnectorUtil();\nexport const Comment = new CommentUtil();\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  [TDShapeType.Sticker]: Sticker,\n  [TDShapeType.Link]: Link,\n  [TDShapeType.Embed]: Embed,\n  [TDShapeType.Section]: Section,\n  [TDShapeType.File]: File,\n  [TDShapeType.Highlighter]: Highlighter,\n  [TDShapeType.Lesson]: Lesson,\n  [TDShapeType.Connector]: Connector,\n  [TDShapeType.Comment]: Comment,\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\nexport * from './shared'\nexport * from './TDShapeUtil'\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              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 = (id?: string): void | Promise<void> => {\n    if (this._status !== 'ready') return\n\n    if (this.onPersist) {\n      this.onPersist(this._state, 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)\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  /**\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  protected patchState = (patch: Patch<T>, id?: string): this => {\n    this.applyPatch(patch, id)\n    if (this.onPatch) {\n      this.onPatch(this._state, 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, id)\n    this.persist(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, id?: string) => void\n\n  /**\n   * A callback fired when a patch is applied.\n   */\n  public onCommand?: (state: T, id?: string) => void\n\n  /**\n   * A callback fired when the state is persisted.\n   */\n  public onPersist?: (state: 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('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('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 * 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'\n\nconst isDebugModeSelector = (s: TDSnapshot) => s.settings.isDebugMode\n\ninterface ToolsPanelProps {\n  onBlur?: React.FocusEventHandler\n}\n\nexport const ToolsPanel = React.memo(function ToolsPanel({ onBlur }: ToolsPanelProps): JSX.Element {\n  const app = useTldrawApp()\n  const isDebugMode = app.useStore(isDebugModeSelector)\n\n  return (\n    <StyledToolsPanelContainer onBlur={onBlur}>\n      <StyledCenterWrap id=\"TD-Tools\">\n        <BackToContent />\n        <StyledPrimaryTools>\n          <ActionButton />\n          <PrimaryTools />\n          <DeleteButton />\n        </StyledPrimaryTools>\n      </StyledCenterWrap>\n      {isDebugMode && (\n        <StyledStatusWrap>\n          <StatusBar />\n        </StyledStatusWrap>\n      )}\n    </StyledToolsPanelContainer>\n  )\n})\n\nexport const StyledToolsPanelContainer = styled('div', {\n  margin: 'auto',\n  width: '100%',\n  minWidth: 0,\n  maxWidth: '100%',\n  display: 'grid',\n  gridTemplateColumns: 'auto auto auto',\n  gridTemplateRows: 'auto auto',\n  justifyContent: 'space-between',\n  padding: '0',\n  gap: '$4',\n  zIndex: 200,\n  pointerEvents: 'none',\n  '& > div > *': {\n    pointerEvents: 'all',\n  },\n})\n\nexport const StyledCenterWrap = styled('div', {\n  position: 'absolute',\n  width: 'fit-content',\n  bottom: 0,\n  left: '50%',\n  gap: '$4',\n})\n\nexport const StyledStatusWrap = styled('div', {\n  gridRow: 2,\n  gridColumn: '1 / span 3',\n})\n\nexport const StyledPrimaryTools = styled('div', {\n  alignItems: 'center',\n  justifyContent: 'center',\n  gap: '$2',\n  paddingLeft: '18px',\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(): JSX.Element | null {\n  const app = useTldrawApp()\n  const status = app.useStore(statusSelector)\n  const activeTool = app.useStore(activeToolSelector)\n\n  return <></>\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 { 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\nexport const BackToContent = React.memo(function BackToContent() {\n  const app = useTldrawApp()\n\n  const isEmptyCanvas = app.useStore(isEmptyCanvasSelector)\n\n  if (!isEmptyCanvas) return null\n\n  return (\n    <BackToContentContainer id=\"TD-Tools-Back_to_content\">\n      <RowButton onClick={app.zoomToContent}>Back to content</RowButton>\n    </BackToContentContainer>\n  )\n})\n\nexport const BackToContentContainer = styled(MenuContent, {\n  pointerEvents: 'all',\n  width: 'fit-content',\n  minWidth: 0,\n  gridRow: 1,\n  flexGrow: 2,\n  display: 'block',\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  isSponsor?: boolean\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      isSponsor = 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        isSponsor={isSponsor}\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\nexport const StyledRowButton = styled('button', {\n  position: 'relative',\n  width: '100%',\n  background: 'none',\n  border: 'none',\n  cursor: 'pointer',\n  height: '32px',\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    isSponsor: {\n      true: {\n        color: '#eb30a2',\n      },\n      false: {},\n    },\n    isWarning: {\n      true: {\n        color: '$warn',\n      },\n    },\n    isActive: {\n      true: {\n        backgroundColor: '$hover',\n      },\n      false: {},\n    },\n  },\n  compoundVariants: [\n    {\n      isActive: false,\n      isSponsor: true,\n      bp: 'small',\n      css: {\n        [`&:hover:not(:disabled) ${StyledRowButtonInner}`]: {\n          backgroundColor: '$sponsorContrast',\n          border: '1px solid $panel',\n          '& *[data-shy=\"true\"]': {\n            opacity: 1,\n          },\n        },\n      },\n    },\n    {\n      isActive: false,\n      isSponsor: false,\n      bp: 'small',\n      css: {\n        [`&:hover:not(:disabled) ${StyledRowButtonInner}`]: {\n          backgroundColor: '$hover',\n          border: '1px solid $panel',\n          '& *[data-shy=\"true\"]': {\n            opacity: 1,\n          },\n        },\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 { 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({\n  variant,\n  children,\n}: {\n  variant: 'tooltip' | 'menu'\n  children: string\n}): JSX.Element | null {\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  boxShadow: '$panel',\n  padding: '$2 $2',\n  borderRadius: '$3',\n  font: '$ui',\n  variants: {\n    size: {\n      small: {\n        minWidth: 72,\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport ReactDOM from 'react-dom/server'\nimport {\n  ArrowTopRightIcon,\n  CursorArrowIcon,\n  Pencil1Icon,\n  Pencil2Icon,\n  TextIcon,\n  SunIcon,\n  Link1Icon,\n  SectionIcon,\n  ArrowRightIcon,\n} from '@radix-ui/react-icons'\nimport { TDSnapshot, TDShapeType, ColorStyle } 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 Vec from '@tldraw/vec'\nimport { template1, template2 } from '~templates'\nimport { PenMenu } from './PenMenu'\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\n\nconst activeToolSelector = (s: TDSnapshot) => s.appState.activeTool\nconst toolLockedSelector = (s: TDSnapshot) => s.appState.isToolLocked\n\nconst video = {\n  url: 'https://www.youtube.com/watch?v=EueeNj98E6I',\n  title: 'Seth MacFarlane Monologue: The Voices - Saturday Night Live',\n  siteName: 'YouTube',\n  description:\n    'Subscribe to SaturdayNightLive: http://j.mp/1bjU39dMonologues: http://j.mp/17rzZgvSEASON 38: http://j.mp/17rz13DSeth MacFarlane has a hard time fighting the ...',\n  mediaType: 'video.other',\n  contentType: 'text/html',\n  images: ['https://i.ytimg.com/vi/EueeNj98E6I/maxresdefault.jpg'],\n  videos: [],\n  favicons: [\n    'https://www.youtube.com/s/desktop/e06db45c/img/favicon_32x32.png',\n    'https://www.youtube.com/s/desktop/e06db45c/img/favicon_48x48.png',\n    'https://www.youtube.com/s/desktop/e06db45c/img/favicon_96x96.png',\n    'https://www.youtube.com/s/desktop/e06db45c/img/favicon_144x144.png',\n    'https://www.youtube.com/s/desktop/e06db45c/img/favicon.ico',\n  ],\n}\n\nexport const PrimaryTools = React.memo(function PrimaryTools(): JSX.Element {\n  const app = useTldrawApp()\n  const activeTool = app.useStore(activeToolSelector)\n  const isToolLocked = app.useStore(toolLockedSelector)\n  const isPreview = app.useStore(s => s.appState.isPreview)\n  //   console.log(app.useStore(s=>s.appState.mentionedUsers))\n  //   console.log(app.useStore(s=>s.appState.hasMention))\n  //   console.log(app.useStore(s=>s.appState.commentMessage))\n  //   console.log(app.useStore(s=>s.document.pages.page.shapes))\n  console.log(app.useStore(() => app.shapes))\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.Section)\n  }, [app])\n\n  const selectTextTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Text)\n  }, [app])\n\n  const selectSectionTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Sticky)\n  }, [app])\n\n  const selectLinkTool = React.useCallback(() => {\n    app.selectTool(TDShapeType.Highlighter)\n  }, [app])\n\n  const createTemplateCopy = React.useCallback(() => {\n    app.selectAll()\n    app.deleteAll()\n    app.createTemplateCopy()\n  }, [app])\n\n  const createTemplateAtPoint = () => {\n    app.selectSticker(\n      `https://res.cloudinary.com/samvibes/image/upload/whiteboard-stickers/person-green.png`\n    )\n    app.selectTool(TDShapeType.Sticker)\n    // if(isPreview){\n    //   app.deleteAll()\n    // app.createTemplateAtPoint(template1)\n    // }\n  }\n\n  const createTemplate2AtPoint = () => {\n    if (isPreview) {\n      app.deleteAll()\n      app.createTemplateAtPoint(template2)\n    }\n  }\n\n  return (\n    <Panel side=\"center\" id=\"TD-PrimaryTools\">\n      <ToolButtonWithTooltip\n        kbd={'1'}\n        label={'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={TDShapeType.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={'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={TDShapeType.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={TDShapeType.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={TDShapeType.Sticky}\n        onClick={selectSectionTool}\n        isActive={activeTool === TDShapeType.Sticky}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        <Pencil2Icon />\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={TDShapeType.Sticky}\n        isActive={activeTool === TDShapeType.Sticky}\n        onMouseEnter={createTemplateAtPoint}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        Template 1\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={TDShapeType.Sticky}\n        isActive={activeTool === TDShapeType.Sticky}\n        onMouseEnter={createTemplate2AtPoint}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        Template 2\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={TDShapeType.Comment}\n        onClick={() => app.selectTool(TDShapeType.Sticky)}\n        isActive={activeTool === TDShapeType.Comment}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        <ArrowRightIcon></ArrowRightIcon>\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={TDShapeType.Comment}\n        onClick={() => app.openAsset()}\n        isActive={activeTool === TDShapeType.Comment}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        {isPreview ? 'previewing' : 'show preview'}\n      </ToolButtonWithTooltip>\n      <ToolButtonWithTooltip\n        kbd={'0'}\n        label={TDShapeType.Comment}\n        onClick={() => {\n          app.createTemplateAtPoint(template)\n          app.zoomToFit()\n        }}\n        isActive={activeTool === TDShapeType.Comment}\n        id=\"TD-PrimaryTools-Pencil2\"\n      >\n        Replace Content\n      </ToolButtonWithTooltip>\n    </Panel>\n  )\n})\n\nconst shapes = {\n  '525583ca-9a15-4811-3368-2bd8507c2add': {\n    id: '525583ca-9a15-4811-3368-2bd8507c2add',\n    type: 'text',\n    name: 'Text',\n    parentId: 'page',\n    childIndex: 2,\n    point: [177, 169.5],\n    rotation: 0,\n    text: 'Inclusion',\n    style: {\n      color: 'black',\n      size: 'small',\n      isFilled: false,\n      dash: 'draw',\n      scale: 1,\n      font: 'Graphik Web',\n      textAlign: 'start',\n      textWeight: 'normal',\n      listType: 'none',\n      textDecoration: 'none',\n      fontStyle: 'normal',\n    },\n  },\n}\nconst shape2 = {\n  '8f60ef51-1f89-4e84-0cf9-7adf4c590f40': {\n    id: '8f60ef51-1f89-4e84-0cf9-7adf4c590f40',\n    type: 'text',\n    name: 'Text',\n    parentId: 'page',\n    childIndex: 1,\n    point: [294, 310.9],\n    rotation: 0,\n    text: 'hello',\n    style: {\n      color: 'black',\n      size: 'small',\n      isFilled: false,\n      dash: 'draw',\n      scale: 1,\n      font: 'Graphik Web',\n      textAlign: 'start',\n      textWeight: 'normal',\n      listType: 'none',\n      textDecoration: 'none',\n      fontStyle: 'normal',\n      bounds: [1, 1],\n    },\n    textAreaWidth: 100,\n    hasResized: false,\n  },\n}\n\nconst template = {\n  shapes: {\n    '8843326c-f9b1-463e-1b9a-46083d58ecc7': {\n      id: '8843326c-f9b1-463e-1b9a-46083d58ecc7',\n      type: 'image',\n      name: 'Image',\n      parentId: 'page',\n      childIndex: 5,\n      point: [2176, -256],\n      size: [6194, 3053],\n      rotation: 0,\n      style: {\n        color: 'black',\n        size: 'small',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      assetId: '6396c499-8b9f-43be-1e32-e4f13eb7331f',\n      isLocked: false,\n    },\n    '76d4a52c-fe5a-4789-074b-bafe6283a41d': {\n      id: '76d4a52c-fe5a-4789-074b-bafe6283a41d',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2432, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '762bbf7f-2a30-4c6c-2cbf-84456cf076bc': {\n      id: '762bbf7f-2a30-4c6c-2cbf-84456cf076bc',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2656, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'c2947373-7f6e-4996-2bd8-a83d993c9172': {\n      id: 'c2947373-7f6e-4996-2bd8-a83d993c9172',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2880, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'e58b7af9-029a-4de0-2f8b-3b48c081e7ce': {\n      id: 'e58b7af9-029a-4de0-2f8b-3b48c081e7ce',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2432, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '6b45bcf1-2ea0-42b6-0807-1ec342a758d3': {\n      id: '6b45bcf1-2ea0-42b6-0807-1ec342a758d3',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2432, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '17f69cf0-c695-4295-0bf1-6b67fa8485b6': {\n      id: '17f69cf0-c695-4295-0bf1-6b67fa8485b6',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2656, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '648ac288-502e-43d3-1659-be4d6254dd7a': {\n      id: '648ac288-502e-43d3-1659-be4d6254dd7a',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [2880, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'pink',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'a12350c5-c079-42f9-2db7-dcce78758605': {\n      id: 'a12350c5-c079-42f9-2db7-dcce78758605',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3200, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '8dab20ea-2b39-4c78-2489-141d6f0fb568': {\n      id: '8dab20ea-2b39-4c78-2489-141d6f0fb568',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3424, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'af61d5bf-441f-492a-2eef-870f4cba1d6a': {\n      id: 'af61d5bf-441f-492a-2eef-870f4cba1d6a',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3648, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '56f50c66-8072-4541-26c8-0231958c8bae': {\n      id: '56f50c66-8072-4541-26c8-0231958c8bae',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3200, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'ecfb4f41-f631-410c-3518-98df0cbf093d': {\n      id: 'ecfb4f41-f631-410c-3518-98df0cbf093d',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3424, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'e7aba99f-4237-4231-3eda-d561491b0950': {\n      id: 'e7aba99f-4237-4231-3eda-d561491b0950',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3648, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '143af6b9-d408-401e-3be8-d4ee0ccdc077': {\n      id: '143af6b9-d408-401e-3be8-d4ee0ccdc077',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3200, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'violet',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '799cffc0-eabb-4b35-1281-480072fae550': {\n      id: '799cffc0-eabb-4b35-1281-480072fae550',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3968, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '849a833b-a8b5-47a2-0f51-e89a2cbfc07f': {\n      id: '849a833b-a8b5-47a2-0f51-e89a2cbfc07f',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4192, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '0be3077b-f98f-42ff-0389-bc97ad6ed1cb': {\n      id: '0be3077b-f98f-42ff-0389-bc97ad6ed1cb',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4416, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '8bd6c054-baa4-4192-0f5d-b1031c47b04a': {\n      id: '8bd6c054-baa4-4192-0f5d-b1031c47b04a',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3968, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '1e8cb84b-dfde-4bd9-2ff8-5948b6121601': {\n      id: '1e8cb84b-dfde-4bd9-2ff8-5948b6121601',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4192, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'e802a5f0-da80-4f41-1d7f-39140e488e28': {\n      id: 'e802a5f0-da80-4f41-1d7f-39140e488e28',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4416, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '71a83716-0c92-40c3-15da-121171fc96a4': {\n      id: '71a83716-0c92-40c3-15da-121171fc96a4',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [3968, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'blue',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '733c3956-4796-4d63-2fed-79fde64de71d': {\n      id: '733c3956-4796-4d63-2fed-79fde64de71d',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4736, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '29440010-0a6a-4665-0f0a-6a7e032ad9a1': {\n      id: '29440010-0a6a-4665-0f0a-6a7e032ad9a1',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4960, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '109c0a7e-b26f-4a55-0946-9334486eed36': {\n      id: '109c0a7e-b26f-4a55-0946-9334486eed36',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5184, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'c79d9611-219a-4d0e-055d-ae36a74bf0b9': {\n      id: 'c79d9611-219a-4d0e-055d-ae36a74bf0b9',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4736, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '3f36d4fa-9600-4e8c-031c-5dd07ac5a2c7': {\n      id: '3f36d4fa-9600-4e8c-031c-5dd07ac5a2c7',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4736, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '92f7f34f-c606-4df3-3d1d-306830279308': {\n      id: '92f7f34f-c606-4df3-3d1d-306830279308',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [4960, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'cc6cb572-4eb6-406d-18aa-cf05d462de63': {\n      id: 'cc6cb572-4eb6-406d-18aa-cf05d462de63',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5184, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'green',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'd4fce06b-a822-460b-3d02-97ec59c1e36f': {\n      id: 'd4fce06b-a822-460b-3d02-97ec59c1e36f',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5504, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '7d3f79ee-55bd-48a4-329c-d5a7fcf43ef1': {\n      id: '7d3f79ee-55bd-48a4-329c-d5a7fcf43ef1',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5728, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'c49f1db5-a5b9-44b6-3e67-0e0fc8914c8a': {\n      id: 'c49f1db5-a5b9-44b6-3e67-0e0fc8914c8a',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5952, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '09a1634b-0f3f-4c41-0b73-07015c3e4f99': {\n      id: '09a1634b-0f3f-4c41-0b73-07015c3e4f99',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5504, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'f1a5138c-aa81-466b-27ad-78235de363e5': {\n      id: 'f1a5138c-aa81-466b-27ad-78235de363e5',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5728, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'fbc45415-f97c-4142-353d-7ababd684229': {\n      id: 'fbc45415-f97c-4142-353d-7ababd684229',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5952, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '3711eaed-1066-4530-1037-0665ae1ff34c': {\n      id: '3711eaed-1066-4530-1037-0665ae1ff34c',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [5504, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'yellow',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '5ad15975-f3c0-48a6-35e6-df22c2028109': {\n      id: '5ad15975-f3c0-48a6-35e6-df22c2028109',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6272, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '0d3525c1-b1b8-431f-089f-bbd2af7b2e25': {\n      id: '0d3525c1-b1b8-431f-089f-bbd2af7b2e25',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6496, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'f5a7d6b8-beb2-4067-0712-9cbc67835b8e': {\n      id: 'f5a7d6b8-beb2-4067-0712-9cbc67835b8e',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6720, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '3369374f-78a6-431e-314c-bbacc3359624': {\n      id: '3369374f-78a6-431e-314c-bbacc3359624',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6272, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'f75a3680-1183-4c73-3090-db174e2b1e17': {\n      id: 'f75a3680-1183-4c73-3090-db174e2b1e17',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6272, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '0e0b8c0a-0e78-4ef8-1b96-ccf63431780d': {\n      id: '0e0b8c0a-0e78-4ef8-1b96-ccf63431780d',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6496, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'f3d8c1a3-9029-482c-0896-3e7c4930a9ee': {\n      id: 'f3d8c1a3-9029-482c-0896-3e7c4930a9ee',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [6720, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'orange',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'a2013217-3c14-4f65-20b2-400e1bf2028d': {\n      id: 'a2013217-3c14-4f65-20b2-400e1bf2028d',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7008, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'ef2f9bd1-32df-47bc-0f03-7d5194826995': {\n      id: 'ef2f9bd1-32df-47bc-0f03-7d5194826995',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7232, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'bf39361f-8ac7-4941-13b2-4d7b07e2ebd5': {\n      id: 'bf39361f-8ac7-4941-13b2-4d7b07e2ebd5',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7456, 768],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '5c318224-1437-4274-05a8-4e607f062aed': {\n      id: '5c318224-1437-4274-05a8-4e607f062aed',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7008, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '17343ef4-dfd3-453f-0ca6-2a460b6ae877': {\n      id: '17343ef4-dfd3-453f-0ca6-2a460b6ae877',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7008, 1280],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    'bb51620d-5f67-4653-3152-7be5b0ce1c3f': {\n      id: 'bb51620d-5f67-4653-3152-7be5b0ce1c3f',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7232, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n    '14f36819-2198-4980-1d06-4672e2667e8f': {\n      id: '14f36819-2198-4980-1d06-4672e2667e8f',\n      type: 'sticky',\n      name: 'Sticky',\n      parentId: 'page',\n      childIndex: 6,\n      point: [7456, 1024],\n      size: [200, 200],\n      text: '',\n      rotation: 0,\n      style: {\n        color: 'red',\n        size: 'large',\n        isFilled: false,\n        dash: 'draw',\n        scale: 1,\n        font: 'Graphik Web',\n        textAlign: 'start',\n        textWeight: 'normal',\n        listType: 'none',\n        textDecoration: 'none',\n        fontStyle: 'normal',\n      },\n      user: 'Bhoomika Desai',\n    },\n  },\n  assets: {\n    '6396c499-8b9f-43be-1e32-e4f13eb7331f': {\n      id: '6396c499-8b9f-43be-1e32-e4f13eb7331f',\n      type: 'image',\n      src:\n        'https://snuserassets.s3.amazonaws.com/uploads/635fc966d7488cae017c7d7d/file-1667804202712.png',\n      size: [6194, 3053],\n    },\n  },\n  bindings: undefined,\n  sections: undefined,\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  isSponsor?: 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 PrimaryToolButton = 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      isSponsor = false,\n      onKeyDown,\n      id,\n      ...rest\n    },\n    ref\n  ) => {\n    return (\n      <PrimaryStyledToolButton\n        ref={ref}\n        isActive={isActive}\n        isSponsor={isSponsor}\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        <PrimaryStyledToolButtonInner>{children}</PrimaryStyledToolButtonInner>\n        {/* {isToolLocked && <ToolLockIndicator />} */}\n      </PrimaryStyledToolButton>\n    )\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      isSponsor = false,\n      onKeyDown,\n      id,\n      ...rest\n    },\n    ref\n  ) => {\n    return (\n      <StyledToolButton\n        ref={ref}\n        isActive={isActive}\n        isSponsor={isSponsor}\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)}>\n      <PrimaryToolButton\n        {...rest}\n        isToolLocked={isLocked && rest.isActive}\n        onDoubleClick={handleDoubleClick}\n        onKeyDown={handleKeyDown}\n      />\n    // </Tooltip>\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})\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  border: 'none',\n  height: '40px',\n  width: '40px',\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: '$2',\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    isSponsor: {\n      true: {\n        [`${StyledToolButtonInner}`]: {\n          backgroundColor: '$sponsorContrast',\n        },\n      },\n    },\n    isActive: {\n      true: {},\n      false: {},\n    },\n    bp: {\n      mobile: {},\n      small: {},\n    },\n  },\n  compoundVariants: [\n    {\n      variant: 'primary',\n      bp: 'mobile',\n      css: {\n        height: '40px',\n        width: '40px',\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      isSponsor: false,\n      css: {\n        [`${StyledToolButtonInner}`]: {\n          backgroundColor: '$selected',\n          color: '$selectedContrast',\n        },\n      },\n    },\n    {\n      isActive: false,\n      isSponsor: false,\n      bp: 'small',\n      css: {\n        [`&:hover:not(:disabled) ${StyledToolButtonInner}`]: {\n          backgroundColor: '$hover',\n          border: '1px solid $panel',\n        },\n        [`&:focus:not(:disabled) ${StyledToolButtonInner}`]: {\n          backgroundColor: '$hover',\n        },\n      },\n    },\n  ],\n})\n\n\n\nexport const PrimaryStyledToolButtonInner = 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})\n\nexport const PrimaryStyledToolButton = styled('button', {\n  position: 'relative',\n  color: '$text',\n  fontSize: '$0',\n  background: 'none',\n  margin: 0,\n  padding: 0,\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  outline: 'none',\n  cursor: 'pointer',\n  pointerEvents: 'all',\n  border: 'none',\n  // height: '40px',\n  // width: '40px',\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        [`& ${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    isSponsor: {\n      true: {\n        [`${StyledToolButtonInner}`]: {\n          backgroundColor: '$sponsorContrast',\n        },\n      },\n    },\n    isActive: {\n      true: {},\n      false: {},\n    },\n    bp: {\n      mobile: {},\n      small: {},\n    },\n  },\n  compoundVariants: [\n    {\n      variant: 'primary',\n      bp: 'mobile',\n      css: {\n        // height: '40px',\n        // width: '40px',\n        // [`& ${StyledToolButtonInner} > svg`]: {\n        //   width: 16,\n        //   height: 16,\n        // },\n      },\n    },\n    {\n      variant: 'primary',\n      bp: 'small',\n      css: {\n        // height: '28px',\n        // width: '28px',\n        // [`& ${StyledToolButtonInner} > svg`]: {\n        //   width: 20,\n        //   height: 20,\n        // },\n      },\n    },\n    {\n      isActive: true,\n      isSponsor: false,\n      css: {\n        [`${StyledToolButtonInner}`]: {\n          backgroundColor: '$selected',\n          color: '$selectedContrast',\n        },\n      },\n    },\n    {\n      isActive: false,\n      isSponsor: false,\n      bp: 'small',\n      css: {\n        [`&:hover:not(:disabled) ${StyledToolButtonInner}`]: {\n          backgroundColor: '$hover',\n          border: '1px solid $panel',\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 { styled } from '~styles/stitches.config'\n\nexport const Panel = styled('div', {\n  backgroundColor: '$panel',\n  display: 'flex',\n  flexDirection: 'column',\n  boxShadow: '$panel',\n  padding: '$2',\n  border: '1px solid $panelContrast',\n  gap: 0,\n  variants: {\n    side: {\n      center: {\n        borderRadius: '4px',\n      },\n      left: {\n        padding: 0,\n        borderTop: 0,\n        borderLeft: 0,\n        borderTopRightRadius: '$1',\n        borderBottomRightRadius: '$3',\n        borderBottomLeftRadius: '$1',\n      },\n      right: {\n        padding: 0,\n        borderTop: 0,\n        borderRight: 0,\n        borderTopLeftRadius: '$1',\n        borderBottomLeftRadius: '$3',\n        borderBottomRightRadius: '$1',\n      },\n    },\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'\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\nconst statusSelector = (s: TDSnapshot) => s.appState.status\n\nenum Status {\n  SpacePanning = 'spacePanning',\n}\n\nexport const ShapesMenu = React.memo(function ShapesMenu({\n  activeTool,\n  isToolLocked,\n}: ShapesMenuProps) {\n  const app = useTldrawApp()\n\n  const status = app.useStore(statusSelector)\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\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=\"right\" sideOffset={20}>\n        <Panel side=\"center\">\n          {shapeShapes.map((shape, i) => (\n            <Tooltip\n              key={shape}\n              label={shape[0].toUpperCase() + shape.slice(1)}\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 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({\n  children,\n  label,\n  kbd: kbdProp,\n  id,\n  side = 'top',\n}: TooltipProps): JSX.Element {\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\nexport const 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\nexport const StyledArrow = styled(RadixTooltip.Arrow, {\n  fill: '$tooltip',\n  margin: '0 8px',\n})\n", "import * as React from 'react'\n\nexport function BoxIcon({\n  fill = 'none',\n  stroke = 'currentColor',\n  strokeWidth = 2,\n}: {\n  fill?: string\n  stroke?: string\n  strokeWidth?: number\n}): JSX.Element {\n  return (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      stroke={stroke}\n      strokeWidth={strokeWidth}\n      fill={fill}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n    </svg>\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(): JSX.Element {\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(): JSX.Element {\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(): JSX.Element {\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(): JSX.Element {\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 IsFilledIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect\n        x=\"4\"\n        y=\"4\"\n        width=\"16\"\n        height=\"16\"\n        rx=\"2\"\n        strokeWidth=\"2\"\n        fill=\"currentColor\"\n        opacity=\".9\"\n      />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function RedoIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element {\n  return (\n    <svg\n      width={32}\n      height={32}\n      viewBox=\"0 0 15 15\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path d=\"M4.32978 8.5081C4.32978 10.1923 5.70009 11.5625 7.38418 11.5625H8.46539C8.64456 11.5625 8.78975 11.4173 8.78975 11.2382V11.13C8.78975 10.9508 8.64457 10.8057 8.46539 10.8057H7.38418C6.11736 10.8057 5.08662 9.77492 5.08662 8.5081C5.08662 7.24128 6.11736 6.21054 7.38418 6.21054H9.37894L8.00515 7.58433C7.8576 7.73183 7.8576 7.97195 8.00515 8.11944C8.14833 8.26251 8.39751 8.2623 8.54036 8.11944L10.56 6.09971C10.6315 6.02824 10.6709 5.93321 10.6709 5.8321C10.6709 5.73106 10.6315 5.63598 10.56 5.56454L8.54025 3.54472C8.3974 3.40176 8.14801 3.40176 8.00513 3.54472C7.85758 3.69218 7.85758 3.93234 8.00513 4.07979L9.37892 5.45368H7.38418C5.70009 5.45368 4.32978 6.82393 4.32978 8.5081Z\" />\n    </svg>\n  )\n}\n", "import * as React from 'react'\n\nexport function TrashIcon(props: React.SVGProps<SVGSVGElement>): JSX.Element {\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(props: React.SVGProps<SVGSVGElement>): JSX.Element {\n  return (\n    <svg\n      width={32}\n      height={32}\n      viewBox=\"0 0 15 15\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\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>): JSX.Element {\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>): JSX.Element {\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>): JSX.Element {\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(): JSX.Element {\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 MultiplayerIcon(): JSX.Element {\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        fill-rule=\"evenodd\"\n        clip-rule=\"evenodd\"\n        d=\"M5.73545 0.0494623C5.93029 -0.0395285 6.15915 -0.00663838 6.32104 0.133622L14.8111 7.48911C14.9804 7.63581 15.0432 7.87091 14.9696 8.08249C14.8959 8.29408 14.7007 8.4394 14.4769 8.44927L11.4564 8.58248L13.2249 12.4682C13.35 12.7431 13.2286 13.0675 12.9537 13.1927L10.9304 14.1145C10.6554 14.2397 10.331 14.1184 10.2057 13.8435L8.43441 9.95846L6.42883 12.0731L7.0482 13.434C7.17335 13.709 7.05195 14.0333 6.77702 14.1586L5.03829 14.9506C4.76335 15.0759 4.43894 14.9546 4.31361 14.6797L2.83886 11.445L1.13458 13.242C0.980476 13.4045 0.742914 13.4566 0.534904 13.3737C0.326893 13.2907 0.19043 13.0894 0.19043 12.8654V3.2218C0.19043 3.0076 0.315424 2.81309 0.510266 2.7241C0.705108 2.63511 0.933961 2.668 1.09586 2.80826L5.41561 6.55076V0.547159C5.41561 0.332956 5.54061 0.138453 5.73545 0.0494623ZM6.74741 10.147L6.50992 10.3974V10.1575V9.0621V8.94669V7.49882V1.74513L13.0561 7.41656L10.5986 7.52495C10.417 7.53296 10.2512 7.63066 10.1562 7.78567C10.1444 7.80505 10.1338 7.825 10.1245 7.84541C10.0596 7.98828 10.0589 8.15342 10.1247 8.2982V8.2982L12.0023 12.4236L10.9745 12.8919L9.09356 8.7663C9.0181 8.60079 8.86531 8.4836 8.68589 8.45361C8.50647 8.42363 8.32389 8.48478 8.19871 8.61676L8.019 8.80624L6.74741 10.147ZM5.41561 9.11037V7.99863L1.28473 4.41977V11.4934L2.60315 10.1033C2.72833 9.97131 2.91091 9.91016 3.09033 9.94014C3.26975 9.97013 3.42254 10.0873 3.498 10.2528L5.08241 13.728L5.82563 13.3895L4.24404 9.91441C4.16873 9.74894 4.18053 9.55687 4.27553 9.40186C4.37052 9.24685 4.53631 9.14915 4.71793 9.14114L5.41561 9.11037Z\"\n        fill=\"currentColor\"\n      />\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", "export const template2 = \n{\"type\":\"tldr/clipboard\",\"shapes\":[{\"id\":\"eeaf49e8-f878-4add-1d69-3174b558be6e\",\"type\":\"ellipse\",\"name\":\"Ellipse\",\"parentId\":\"page\",\"childIndex\":1,\"point\":[575.17,-1324.23],\"radius\":[204.2,163.80000000000007],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"label\":\"\",\"labelPoint\":[0.5,0.5]},{\"id\":\"198625ec-0e61-4de1-2495-2be96601083b\",\"type\":\"rectangle\",\"name\":\"Rectangle\",\"parentId\":\"page\",\"childIndex\":2,\"point\":[669.57,-1266.63],\"size\":[242.6,208.2],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"label\":\"\",\"labelPoint\":[0.5,0.5]},{\"id\":\"7c557e56-c0f0-4d15-0c7b-e2e466c14569\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":3,\"point\":[702.37,-1194.63],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,0.8,0.5],[0,0.8,0.5],[0,0,0.5],[0.8,0,0.5],[1.6,0,0.5],[2.4,0.8,0.5],[4,4,0.5],[5.6,4.8,0.5],[6.4,7.2,0.5],[7.2,10.4,0.5],[7.2,12,0.5],[8,15.2,0.5],[8,19.2,0.5],[8,21.6,0.5],[8,24.8,0.5],[7.2,27.2,0.5],[6.4,30.4,0.5],[5.6,32.8,0.5],[4,34.4,0.5],[3.2,36.8,0.5],[3.2,37.6,0.5],[3.2,38.4,0.5],[2.4,39.2,0.5],[2.4,40,0.5]],\"isComplete\":true},{\"id\":\"313b2e14-b6be-4caa-3500-d0d129e33721\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":4,\"point\":[690.37,-1226.63],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,40,0.5],[0,40,0.5],[4.8,30.4,0.5],[7.2,27.2,0.5],[10.4,22.4,0.5],[16,16.8,0.5],[20.8,13.6,0.5],[23.2,9.6,0.5],[29.6,7.2,0.5],[32.8,4,0.5],[39.2,2.4,0.5],[41.6,1.6,0.5],[42.4,0,0.5],[44.8,0,0.5],[45.6,0,0.5]],\"isComplete\":true},{\"id\":\"a393da08-f870-4d89-351b-12b44f25ef13\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":5,\"point\":[730.37,-1201.03],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[11.2,12.8,0.5],[11.2,12.8,0.5],[12,13.6,0.5],[12,14.4,0.5],[12.8,14.4,0.5],[13.6,14.4,0.5],[14.4,14.4,0.5],[15.2,14.4,0.5],[16,13.6,0.5],[17.6,12.8,0.5],[18.4,12,0.5],[18.4,11.2,0.5],[19.2,9.6,0.5],[20,8,0.5],[20,6.4,0.5],[20,5.6,0.5],[19.2,4.8,0.5],[18.4,2.4,0.5],[17.6,1.6,0.5],[16.8,0.8,0.5],[16,0.8,0.5],[15.2,0,0.5],[14.4,0,0.5],[13.6,0,0.5],[12.8,0.8,0.5],[12,2.4,0.5],[9.6,5.6,0.5],[8,8.8,0.5],[5.6,12.8,0.5],[3.2,17.6,0.5],[2.4,22.4,0.5],[0.8,26.4,0.5],[0,31.2,0.5],[0,33.6,0.5],[0,34.4,0.5],[0,36,0.5],[0.8,37.6,0.5],[1.6,38.4,0.5],[3.2,40,0.5],[4,40,0.5],[4.8,40.8,0.5],[5.6,40.8,0.5],[6.4,40.8,0.5],[8,40.8,0.5],[9.6,40,0.5],[12,39.2,0.5],[16,36,0.5],[19.2,34.4,0.5],[22.4,30.4,0.5],[24,28,0.5],[24.8,24,0.5],[27.2,20.8,0.5],[28,16.8,0.5],[30.4,13.6,0.5],[31.2,11.2,0.5],[31.2,9.6,0.5]],\"isComplete\":true},{\"id\":\"a6b0148d-1831-4c5a-17cc-6a3f01bfe855\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":6,\"point\":[762.37,-1204.23],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,10.4,0.5],[0,10.4,0.5],[0.8,10.4,0.5],[0.8,11.2,0.5],[1.6,12.8,0.5],[2.4,15.2,0.5],[3.2,17.6,0.5],[3.2,20.8,0.5],[3.2,23.2,0.5],[3.2,26.4,0.5],[3.2,28.8,0.5],[3.2,30.4,0.5],[3.2,32,0.5],[2.4,34.4,0.5],[2.4,36,0.5],[2.4,36.8,0.5],[2.4,37.6,0.5],[1.6,37.6,0.5],[1.6,38.4,0.5],[1.6,37.6,0.5],[1.6,36.8,0.5],[1.6,34.4,0.5],[1.6,29.6,0.5],[2.4,25.6,0.5],[2.4,20.8,0.5],[4,16.8,0.5],[4.8,12,0.5],[5.6,9.6,0.5],[6.4,8,0.5],[7.2,4.8,0.5],[8.8,3.2,0.5],[9.6,2.4,0.5],[10.4,1.6,0.5],[10.4,0.8,0.5],[11.2,0.8,0.5],[11.2,0,0.5],[12,0,0.5],[12.8,0.8,0.5],[13.6,2.4,0.5],[14.4,5.6,0.5],[16.8,9.6,0.5],[17.6,13.6,0.5],[17.6,16.8,0.5],[18.4,18.4,0.5],[18.4,20.8,0.5],[18.4,21.6,0.5],[19.2,22.4,0.5],[19.2,23.2,0.5],[19.2,24,0.5],[20,24,0.5],[20,23.2,0.5],[20.8,22.4,0.5],[21.6,20,0.5],[22.4,18.4,0.5],[22.4,16.8,0.5],[24,15.2,0.5],[24,14.4,0.5],[24,13.6,0.5],[24,12.8,0.5],[25.6,10.4,0.5],[26.4,7.2,0.5],[27.2,6.4,0.5],[27.2,5.6,0.5],[28,5.6,0.5],[28,4.8,0.5],[28.8,4.8,0.5],[29.6,5.6,0.5],[30.4,6.4,0.5],[31.2,8.8,0.5],[32,12,0.5],[32.8,15.2,0.5],[32.8,19.2,0.5],[32.8,23.2,0.5],[32.8,25.6,0.5],[32.8,30.4,0.5],[32.8,33.6,0.5],[32.8,36.8,0.5],[32.8,38.4,0.5],[32,39.2,0.5],[32,41.6,0.5],[32,42.4,0.5],[32,43.2,0.5],[32,42.4,0.5],[32,40,0.5],[32,37.6,0.5],[33.6,31.2,0.5],[34.4,24.8,0.5]],\"isComplete\":true},{\"id\":\"fd97d62c-f9a6-482e-3071-c73a67e1aefa\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":7,\"point\":[799.97,-1226.63],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,32,0.5],[0,32,0.5],[0.8,32,0.5],[1.6,32.8,0.5],[2.4,34.4,0.5],[3.2,39.2,0.5],[4.8,43.2,0.5],[4.8,48,0.5],[4.8,49.6,0.5],[4.8,53.6,0.5],[4.8,56,0.5],[4.8,59.2,0.5],[4.8,60.8,0.5],[4.8,61.6,0.5],[4.8,62.4,0.5],[4.8,63.2,0.5],[4,63.2,0.5],[4,62.4,0.5],[4,61.6,0.5],[3.2,60,0.5],[2.4,56.8,0.5],[2.4,52.8,0.5],[0.8,46.4,0.5],[0.8,41.6,0.5],[0.8,36,0.5],[0.8,28,0.5],[0.8,20,0.5],[0.8,12,0.5],[0.8,4.8,0.5],[1.6,2.4,0.5],[3.2,2.4,0.5],[3.2,1.6,0.5],[4,0.8,0.5],[4.8,0.8,0.5],[5.6,0,0.5],[7.2,0,0.5],[8,1.6,0.5],[9.6,3.2,0.5],[10.4,4.8,0.5],[12,8,0.5],[12,10.4,0.5],[12.8,12,0.5],[12.8,15.2,0.5],[12.8,16.8,0.5],[11.2,19.2,0.5],[10.4,20.8,0.5],[9.6,23.2,0.5],[8,24.8,0.5],[7.2,25.6,0.5],[5.6,26.4,0.5],[4.8,28,0.5],[4,28.8,0.5],[3.2,28.8,0.5],[2.4,28.8,0.5],[1.6,28.8,0.5],[0.8,28.8,0.5],[0.8,28,0.5],[0.8,26.4,0.5],[0.8,24,0.5],[1.6,21.6,0.5],[3.2,18.4,0.5]],\"isComplete\":true},{\"id\":\"1f13a0fc-3aac-4f97-35d5-02545e1bf49e\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":8,\"point\":[814.37,-1237.03],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,0.8,0.5],[0,0.8,0.5],[0.8,0,0.5],[1.6,0,0.5],[2.4,1.6,0.5],[3.2,6.4,0.5],[4.8,8,0.5],[4.8,11.2,0.5],[5.6,13.6,0.5],[5.6,15.2,0.5],[5.6,20.8,0.5],[5.6,23.2,0.5],[5.6,25.6,0.5],[5.6,27.2,0.5],[5.6,29.6,0.5],[5.6,30.4,0.5],[5.6,32,0.5],[5.6,32.8,0.5],[5.6,34.4,0.5],[5.6,35.2,0.5],[6.4,36.8,0.5],[6.4,37.6,0.5],[7.2,37.6,0.5],[8,37.6,0.5],[8.8,39.2,0.5],[9.6,40,0.5],[11.2,40,0.5],[12.8,40,0.5],[14.4,40,0.5],[16.8,38.4,0.5],[18.4,36,0.5],[20,34.4,0.5],[22.4,32.8,0.5],[23.2,30.4,0.5],[23.2,27.2,0.5],[23.2,25.6,0.5],[23.2,24,0.5],[23.2,22.4,0.5],[22.4,20,0.5],[21.6,19.2,0.5],[20.8,18.4,0.5],[20,17.6,0.5],[19.2,17.6,0.5],[18.4,16.8,0.5],[17.6,17.6,0.5],[15.2,20.8,0.5],[12.8,24,0.5],[12,27.2,0.5],[11.2,32,0.5],[11.2,35.2,0.5],[11.2,37.6,0.5],[11.2,38.4,0.5],[11.2,40,0.5],[11.2,40.8,0.5],[11.2,41.6,0.5],[12,41.6,0.5],[12.8,42.4,0.5],[13.6,42.4,0.5],[14.4,40.8,0.5],[16.8,36.8,0.5],[18.4,32,0.5],[20,26.4,0.5],[20,22.4,0.5],[20.8,18.4,0.5],[20.8,17.6,0.5],[20.8,16.8,0.5],[20.8,16,0.5],[21.6,16,0.5],[21.6,16.8,0.5],[22.4,17.6,0.5],[22.4,20,0.5],[22.4,21.6,0.5],[22.4,24,0.5],[22.4,26.4,0.5],[22.4,28,0.5],[22.4,30.4,0.5],[22.4,32,0.5],[22.4,32.8,0.5],[22.4,33.6,0.5],[22.4,32.8,0.5],[23.2,30.4,0.5],[24,25.6,0.5],[24,21.6,0.5],[25.6,14.4,0.5],[25.6,12,0.5],[26.4,6.4,0.5],[27.2,5.6,0.5],[27.2,4,0.5],[28,4,0.5],[28,3.2,0.5],[28.8,3.2,0.5],[31.2,6.4,0.5],[32.8,11.2,0.5],[35.2,17.6,0.5],[37.6,25.6,0.5],[37.6,29.6,0.5],[37.6,33.6,0.5],[37.6,39.2,0.5],[37.6,43.2,0.5],[37.6,45.6,0.5],[37.6,47.2,0.5],[37.6,48.8,0.5],[36.8,48.8,0.5],[36.8,49.6,0.5],[36,49.6,0.5],[35.2,49.6,0.5],[34.4,49.6,0.5],[33.6,48.8,0.5],[32.8,48,0.5],[32.8,46.4,0.5],[32.8,44.8,0.5],[32.8,43.2,0.5],[33.6,41.6,0.5],[35.2,40,0.5],[38.4,38.4,0.5],[40.8,36.8,0.5],[42.4,34.4,0.5],[45.6,32.8,0.5],[47.2,30.4,0.5],[48,28,0.5],[49.6,25.6,0.5],[49.6,22.4,0.5],[49.6,19.2,0.5],[47.2,16.8,0.5],[47.2,16,0.5],[46.4,15.2,0.5],[45.6,14.4,0.5],[44.8,14.4,0.5],[44,13.6,0.5],[42.4,13.6,0.5],[40.8,15.2,0.5],[37.6,20,0.5],[37.6,24,0.5],[37.6,29.6,0.5],[37.6,33.6,0.5],[39.2,35.2,0.5],[40,36,0.5],[42.4,37.6,0.5],[43.2,38.4,0.5],[44.8,38.4,0.5],[45.6,39.2,0.5],[47.2,39.2,0.5],[48.8,39.2,0.5],[51.2,38.4,0.5],[52.8,37.6,0.5],[55.2,37.6,0.5],[58.4,36.8,0.5],[61.6,36.8,0.5],[64,36.8,0.5],[65.6,36.8,0.5],[67.2,36.8,0.5],[68,36.8,0.5],[68.8,36.8,0.5]],\"isComplete\":true},{\"id\":\"b90cf52c-659e-4b6b-0a99-e884462a7a03\",\"type\":\"draw\",\"name\":\"Draw\",\"parentId\":\"page\",\"childIndex\":9,\"point\":[743.97,-1151.43],\"rotation\":0,\"style\":{\"color\":\"black\",\"size\":\"small\",\"isFilled\":false,\"dash\":\"draw\",\"scale\":1,\"hasStroke\":true},\"points\":[[0,44.8,0.5],[0,44.8,0.5],[1.6,44.8,0.5],[1.6,43.2,0.5],[4,39.2,0.5],[6.4,34.4,0.5],[8.8,29.6,0.5],[12,24.8,0.5],[16,20,0.5],[20.8,14.4,0.5],[27.2,8.8,0.5],[33.6,5.6,0.5],[38.4,3.2,0.5],[41.6,1.6,0.5],[43.2,0.8,0.5],[44,0.8,0.5],[44,0,0.5],[44.8,0,0.5],[45.6,0,0.5],[45.6,0.8,0.5],[46.4,2.4,0.5],[46.4,4.8,0.5],[46.4,13.6,0.5],[44,20,0.5],[41.6,24.8,0.5],[38.4,31.2,0.5],[32.8,39.2,0.5],[27.2,45.6,0.5],[21.6,52.8,0.5],[15.2,60.8,0.5],[11.2,65.6,0.5],[9.6,68.8,0.5],[8,69.6,0.5],[7.2,70.4,0.5],[7.2,71.2,0.5],[7.2,72,0.5],[7.2,72.8,0.5],[8,72.8,0.5],[10.4,72.8,0.5],[13.6,72.8,0.5],[20,72.8,0.5],[28,72.8,0.5],[44,71.2,0.5],[63.2,68,0.5],[75.2,64.8,0.5],[88,63.2,0.5],[101.6,60,0.5],[106.4,59.2,0.5],[108.8,57.6,0.5],[110.4,57.6,0.5],[110.4,56.8,0.5],[111.2,56.8,0.5],[112,56.8,0.5]],\"isComplete\":true}],\"bindings\":[],\"assets\":[],\"sections\":{}}  \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'\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(): JSX.Element {\n  const app = useTldrawApp()\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 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  return (\n    <DropdownMenu.Root dir=\"rtl\" 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}>\n        <>\n          <ButtonsRow>\n            <ToolButton variant=\"icon\" disabled={!hasSelection} onClick={handleDuplicate}>\n              <Tooltip label=\"Duplicate\" kbd={`#D`} id=\"TD-Tools-Copy\">\n                <CopyIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleRotate}>\n              <Tooltip label=\"Rotate\" id=\"TD-Tools-Rotate\">\n                <RotateCounterClockwiseIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleToggleLocked}>\n              <Tooltip label=\"Toggle Locked\" kbd={`#L`} id=\"TD-Tools-Lock\">\n                {isAllLocked ? <LockClosedIcon /> : <LockOpen1Icon />}\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleToggleAspectRatio}>\n              <Tooltip label=\"Toggle Aspect Ratio Lock\" id=\"TD-Tools-AspectRatio\">\n                {isAllAspectLocked ? <AspectRatioIcon /> : <BoxIcon />}\n              </Tooltip>\n            </ToolButton>\n            <ToolButton\n              disabled={!hasSelection || (!isAllGrouped && !hasMultipleSelection)}\n              onClick={handleGroup}\n            >\n              <Tooltip label=\"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 label=\"Move to Back\" kbd={`#\u21E7[`} id=\"TD-Tools-PinBottom\">\n                <PinBottomIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveBackward}>\n              <Tooltip label=\"Move Backward\" kbd={`#[`} id=\"TD-Tools-ArrowDown\">\n                <ArrowDownIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveForward}>\n              <Tooltip label=\"Move Forward\" kbd={`#]`} id=\"TD-Tools-ArrowUp\">\n                <ArrowUpIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleMoveToFront}>\n              <Tooltip label=\"Move to Front\" kbd={`#\u21E7]`} id=\"TD-Tools-PinTop\">\n                <PinTopIcon />\n              </Tooltip>\n            </ToolButton>\n            <ToolButton disabled={!hasSelection} onClick={handleResetAngle}>\n              <Tooltip label=\"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 { Arrow } from '@radix-ui/react-dropdown-menu'\nimport { breakpoints } from '~components/breakpoints'\nimport { styled } from '~styles/stitches.config'\n\nexport const DMArrow = styled(Arrow, { fill: '$panel', bp: breakpoints })\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 }): JSX.Element {\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): JSX.Element {\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 { Content } 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  id?: string\n}\n\nexport function DMContent({\n  sideOffset = 8,\n  children,\n  align,\n  variant,\n  id,\n}: DMContentProps): JSX.Element {\n  return (\n    <Content\n      dir=\"ltr\"\n      align={align}\n      sideOffset={sideOffset}\n      onEscapeKeyDown={stopPropagation}\n      asChild\n      id={id}\n    >\n      <StyledContent variant={variant}>{children}</StyledContent>\n    </Content>\n  )\n}\n\nexport const StyledContent = styled(MenuContent, {\n  width: 'fit-content',\n  height: 'fit-content',\n  minWidth: 0,\n  maxHeight: '75vh',\n  overflowY: 'scroll',\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", "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  marginLeft:'-1px',\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: '#254DDA',\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  id?: string\n}\n\nexport function DMSubMenu({\n  children,\n  size,\n  disabled = false,\n  label,\n  id,\n}: DMSubMenuProps): JSX.Element {\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}>\n          <MenuContent size={size}>\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: 1,\n  marginTop: '$1',\n  marginRight: '-$2',\n  marginBottom: '$1',\n  marginLeft: '-$2',\n  border: 'none',\n  borderBottom: '1px solid $hover',\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'\n\nexport function DeleteButton(): JSX.Element {\n  const app = useTldrawApp()\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=\"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 { LockClosedIcon, LockOpen1Icon } from '@radix-ui/react-icons'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { useTldrawApp } from '~hooks'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport type { TDSnapshot } from '~types'\n\nconst isToolLockedSelector = (s: TDSnapshot) => s.appState.isToolLocked\n\nexport function LockButton(): JSX.Element {\n  const app = useTldrawApp()\n\n  const isToolLocked = app.useStore(isToolLockedSelector)\n\n  return (\n    <Tooltip label=\"Lock Tool\" kbd=\"7\" id=\"TD-Lock\">\n      <ToolButton variant=\"circle\" isActive={isToolLocked} onSelect={app.toggleToolLock}>\n        {isToolLocked ? <LockClosedIcon /> : <LockOpen1Icon />}\n      </ToolButton>\n    </Tooltip>\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, TDToolType } from '~types'\nimport { useTldrawApp } from '~hooks'\nimport { Pencil1Icon } from '@radix-ui/react-icons'\nimport { Tooltip } from '~components/Primitives/Tooltip'\n\ninterface ShapesMenuProps {\n  activeTool: TDToolType\n}\n\ntype PenShape = TDShapeType.Draw\nconst penShapes: PenShape[] = [TDShapeType.Draw]\nconst penShapeIcons = {\n  [TDShapeType.Draw]: <Pencil1Icon />,\n}\n\nexport const PenMenu = React.memo(function PenMenu({ activeTool }: ShapesMenuProps) {\n  const app = useTldrawApp()\n\n  const [lastActiveTool, setLastActiveTool] = React.useState<PenShape>(TDShapeType.Draw)\n\n  React.useEffect(() => {\n    if (penShapes.includes(activeTool as PenShape) && lastActiveTool !== activeTool) {\n      setLastActiveTool(activeTool as PenShape)\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  }, [])\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DropdownMenu.Trigger dir=\"ltr\" asChild>\n        <ToolButton\n          variant=\"primary\"\n          onDoubleClick={handleDoubleClick}\n          onClick={selectShapeTool}\n          isActive={penShapes.includes(activeTool as PenShape)}\n          id=\"TD-Pen\"\n        >\n          {penShapeIcons[lastActiveTool]}\n        </ToolButton>\n      </DropdownMenu.Trigger>\n      <DropdownMenu.Content asChild dir=\"ltr\" side=\"right\" sideOffset={12} style={{\n        transform:\"translateY(-80px)\"\n      }}>\n        <Panel side=\"center\">\n          {penShapes.map((shape, i) => (\n            <Tooltip\n              key={shape}\n              label={shape[0].toUpperCase() + shape.slice(1)}\n              kbd={(1 + i).toString()}\n              id={`TD-Pen-${shape}`}\n            >\n              <DropdownMenu.Item asChild>\n                <ToolButton\n                  variant=\"primary\"\n                  onClick={() => {\n                    app.selectTool(shape)\n                    setLastActiveTool(shape)\n                  }}\n                >\n                  {penShapeIcons[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'\nimport { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\nimport { TDStatus } from '~types';\nimport { SelectionTools } from './SelectionTools';\n\ninterface SelectedPanelProps {\n  selectedIds: string[]\n}\n\nexport function SelectedPanel({selectedIds}:SelectedPanelProps): JSX.Element {\n  const app = useTldrawApp()\n  const zoom = app.useStore(s=>s.document.pageStates.page.camera.zoom)\n  const getShapePoints = (currentId:string) => app.getShapeUtil(app.getShape(currentId).type).getBounds(app.getShape(currentId))\n\n  const selectedShapes = selectedIds.map((id) => app.getShape(id).name)\n  const xPoints = selectedIds.map(id=>(getShapePoints(id).maxX + getShapePoints(id).minX)/2)\n  const yPoints = selectedIds.map(id=>app.getShape(id).point[1])\n  const xPoint = xPoints.reduce((a, b) => a + b, 0)/xPoints.length\n  const yPoint = Math.min(...yPoints)\n  \n  let content = <></>\n  const firstShape = app.getShape(selectedIds[0])\n  const pointX = (app.useStore(s=>s.document.pageStates.page.camera.point[0])+(xPoint)) * zoom\n  const pointY = (app.useStore(s=>s.document.pageStates.page.camera.point[1])+(yPoint)) * zoom - 40\n  const status = (app.useStore(s=>s.appState.status))\n  const selectedStickyText = app.useStore(s => s.appState.selectedStickyText)\n\n  if(selectedShapes.every( v => v === selectedShapes[0] )){\n    if (firstShape && (status!==TDStatus.Translating  && status!==TDStatus.Creating))\n    content =  \n      \n          <SelectionTools />\n       \n  }\n  \n  if(selectedStickyText !== '' &&  firstShape.name==='Sticky') \n    content = (\n     \n      <div\n        style={{\n          position: 'absolute',\n          top: '-50px',\n          right: '60%',\n          zIndex: 90,\n        }}\n      >\n        <EditButton cmd=\"strikethrough\" />\n        <EditButton cmd=\"underline\" />\n        <EditButton cmd=\"bold\" />\n        <EditButton cmd=\"italic\" />\n        <EditButton cmd=\"foreColor\" name=\"blue\" arg=\"rgb(0,0,255)\"/>\n        <EditButton cmd=\"foreColor\" name=\"red\" arg=\"rgb(255,0,0)\"/>\n        <EditButton cmd=\"foreColor\" name=\"yellow\" arg=\"rgb(255,255,0)\"/>\n\n\n\n      </div>\n    \n    )\n  return  <StyledToolsPanelContainer style={{ \n    transform: `translate(${pointX }px, ${pointY}px)`\n  }}>\n    <div style={{ \n      transform: `translate(-50%, 0)`\n    }}>{content}   </div>\n      </StyledToolsPanelContainer>\n}\n\nfunction EditButton(props) {\n  return (\n    <button\n      key={props.cmd}\n      onMouseDown={evt => {\n        evt.preventDefault() // Avoids loosing focus from the editable area\n        document.execCommand('styleWithCSS', false, true);\n        document.execCommand(props.cmd, false, props.arg) // Send the command to the browser\n      }}\n    >\n      {props.name || props.cmd}\n    </button>\n  )\n}\n\n\nconst StyledToolsPanelContainer = styled('div', {\n  length: '',\n  position: 'absolute',\n  top: '0px',\n  left: '0px',\n  transformOrigin: 'center center',\n})\n", "import * as React from 'react'\n\nimport { useTldrawApp } from '~hooks'\nimport {styled} from '~styles';\nimport { AlignStyle, ListType, TextWeight } from '~types';\n\n\nexport const SelectionTools = React.memo(function SelectionTools(): JSX.Element {\n  const app = useTldrawApp()\n  app.useStore(s=>s.appState.currentStyle)\n  const selectedId = app.useStore(s=>s.document.pageStates.page.selectedIds)\n  const scale = app.getShape(selectedId[0]).style.scale || 1\n  return ( \n   <>\n    <StyledToolBarContainer>\n      <button onClick={()=>{\n        console.log(scale)\n        app.style({scale: (scale + 0.1 * scale)})\n      }}>A+</button>\n      <button onClick={()=>{\n        console.log(scale)\n        app.style({scale: (scale - 0.1 * scale)})\n      }}>A-</button>\n      <button onClick={()=>{\n        app.style({textAlign:AlignStyle.Start})\n      }}>L</button>\n      <button onClick={()=>{\n        app.style({textAlign:AlignStyle.Middle})\n      }}>M</button>\n      <button onClick={()=>{\n        app.style({textAlign:AlignStyle.End})\n      }}>R</button>\n      <button onClick={()=>{\n        app.style({textWeight:TextWeight.Bold})\n      }}>B</button>\n      <button onClick={()=>{\n        app.style({textWeight:TextWeight.Normal})\n      }}>N</button>\n      <button onClick={()=>{\n        app.style({listType: ListType.Bullet})\n      }}>BLi</button>\n       <button onClick={()=>{\n        app.style({listType: ListType.Numbered})\n      }}>Li</button>\n        <button onClick={()=>{\n        app.style({listType: ListType.None})\n      }}>NLi</button>\n       <button onClick={()=>{\n        app.style({textDecoration:'line-through'})\n      }}>Strike</button> \n      <button onClick={()=>{\n        app.style({textDecoration:'none'})\n      }}>NS</button> \n       <button onClick={()=>{\n        app.style({textDecoration:'underline'})\n      }}>U</button> \n      <button onClick={()=>{\n        app.style({fontStyle:'italic'})\n      }}>I</button> \n      <button onClick={()=>{\n        app.style({fontStyle:'normal'})\n      }}>N</button> \n      \n\n    </StyledToolBarContainer></> \n  )\n})\n\nconst StyledToolBarContainer = styled('div',{\n  background:\"#131C39\",\n  height:'21px',\n  display:'flex',\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 { RedoIcon, UndoIcon } from '~components/Primitives/icons'\nimport { breakpoints } from '~components/breakpoints'\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  showSponsorLink: boolean\n}\n\nexport function TopPanel({\n  readOnly,\n  showPages,\n  showMenu,\n  showStyles,\n  showZoom,\n  showSponsorLink,\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 showSponsorLink={showSponsorLink} readOnly={readOnly} />}\n          {showMultiplayerMenu && <MultiplayerMenu />}\n          {showPages && <PageMenu />}\n        </Panel>\n      )}\n      <StyledSpacer />\n      {(showStyles || showZoom) && (\n        <Panel side=\"right\">\n          {showStyles && !readOnly && <StyleMenu />}\n          <MobileOnly bp={breakpoints}>\n            <ToolButton>\n              <UndoIcon onClick={app.undo} />\n            </ToolButton>\n            <ToolButton>\n              <RedoIcon onClick={app.redo} />\n            </ToolButton>\n          </MobileOnly>\n          {showZoom && <ZoomMenu />}\n        </Panel>\n      )}\n    </StyledTopPanel>\n  )\n}\n\nexport const 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\nexport const StyledSpacer = styled('div', {\n  flexGrow: 2,\n  pointerEvents: 'none',\n})\n\nexport const MobileOnly = styled('div', {\n  display: 'flex',\n  flexDirection: 'row',\n  variants: {\n    bp: {\n      small: {\n        display: 'inherit',\n      },\n      large: {\n        display: 'none',\n      },\n    },\n  },\n})\n", "import * as React from 'react'\nimport { ExitIcon, GitHubLogoIcon, HamburgerMenuIcon, TwitterLogoIcon } 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 { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { useFileSystemHandlers } from '~hooks'\nimport { HeartIcon } from '~components/Primitives/icons/HeartIcon'\nimport { preventEvent } from '~components/preventEvent'\nimport { DiscordIcon } from '~components/Primitives/icons'\nimport { TDExportTypes, TDSnapshot } from '~types'\nimport { Divider } from '~components/Primitives/Divider'\n\ninterface MenuProps {\n  showSponsorLink: boolean\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({ showSponsorLink, readOnly }: MenuProps) {\n  const app = useTldrawApp()\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 handleExportPNG = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.PNG)\n  }, [app])\n\n  const handleExportJPG = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.JPG)\n  }, [app])\n\n  const handleExportWEBP = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.WEBP)\n  }, [app])\n\n  const handleExportPDF = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.PDF)\n  }, [app])\n\n  const handleExportSVG = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.SVG)\n  }, [app])\n\n  const handleExportJSON = React.useCallback(async () => {\n    await app.exportAllShapesAs(TDExportTypes.JSON)\n  }, [app])\n\n  const handleSignIn = React.useCallback(() => {\n    app.callbacks.onSignIn?.(app)\n  }, [app])\n\n  const handleSignOut = React.useCallback(() => {\n    app.callbacks.onSignOut?.(app)\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.copySvg()\n  }, [app])\n\n  const handleCopyJson = React.useCallback(() => {\n    app.copyJson()\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 showSignInOutMenu = app.callbacks.onSignIn || app.callbacks.onSignOut || showSponsorLink\n\n  const hasSelection = numberOfSelectedIds > 0\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DMTriggerIcon isSponsor={showSponsorLink} id=\"TD-MenuIcon\">\n        <HamburgerMenuIcon />\n      </DMTriggerIcon>\n      <DMContent variant=\"menu\" id=\"TD-Menu\">\n        {showFileMenu && (\n          <DMSubMenu label=\"File...\" id=\"TD-MenuItem-File\">\n            {app.callbacks.onNewProject && (\n              <DMItem onClick={onNewProject} kbd=\"#N\" id=\"TD-MenuItem-File-New_Project\">\n                New Project\n              </DMItem>\n            )}\n            {app.callbacks.onOpenProject && (\n              <DMItem onClick={onOpenProject} kbd=\"#O\" id=\"TD-MenuItem-File-Open\">\n                Open...\n              </DMItem>\n            )}\n            {app.callbacks.onSaveProject && (\n              <DMItem onClick={onSaveProject} kbd=\"#S\" id=\"TD-MenuItem-File-Save\">\n                Save\n              </DMItem>\n            )}\n            {app.callbacks.onSaveProjectAs && (\n              <DMItem onClick={onSaveProjectAs} kbd=\"#\u21E7S\" id=\"TD-MenuItem-File-Save_As\">\n                Save As...\n              </DMItem>\n            )}\n            {app.callbacks.onExport && (\n              <>\n                <Divider />\n                <DMSubMenu label=\"Export\" size=\"small\" id=\"TD-MenuItem-File-Export\">\n                  <DMItem onClick={handleExportPNG} id=\"TD-MenuItem-File-Export-PNG\">\n                    PNG\n                  </DMItem>\n                  <DMItem onClick={handleExportJPG} id=\"TD-MenuItem-File-Export-JPG\">\n                    JPG\n                  </DMItem>\n                  <DMItem onClick={handleExportWEBP} id=\"TD-MenuItem-File-Export-WEBP\">\n                    WEBP\n                  </DMItem>\n                  <DMItem onClick={handleExportSVG} id=\"TD-MenuItem-File-Export-SVG\">\n                    SVG\n                  </DMItem>\n                  <DMItem onClick={handleExportJSON} id=\"TD-MenuItem-File-Export-JSON\">\n                    JSON\n                  </DMItem>\n                </DMSubMenu>\n              </>\n            )}\n            {!disableAssets && (\n              <>\n                <Divider />\n                <DMItem onClick={handleUploadMedia} kbd=\"#U\" id=\"TD-MenuItem-File-Upload_Media\">\n                  Upload Media\n                </DMItem>\n              </>\n            )}\n          </DMSubMenu>\n        )}\n        {!readOnly && (\n          <>\n            <DMSubMenu label=\"Edit...\" id=\"TD-MenuItem-Edit\">\n              <DMItem\n                onSelect={preventEvent}\n                onClick={app.undo}\n                kbd=\"#Z\"\n                id=\"TD-MenuItem-Edit-Undo\"\n              >\n                Undo\n              </DMItem>\n              <DMItem\n                onSelect={preventEvent}\n                onClick={app.redo}\n                kbd=\"#\u21E7Z\"\n                id=\"TD-MenuItem-Edit-Redo\"\n              >\n                Redo\n              </DMItem>\n              <DMDivider dir=\"ltr\" />\n              <DMItem\n                onSelect={preventEvent}\n                disabled={!hasSelection}\n                onClick={handleCut}\n                kbd=\"#X\"\n                id=\"TD-MenuItem-Edit-Cut\"\n              >\n                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                Copy\n              </DMItem>\n              <DMItem\n                onSelect={preventEvent}\n                onClick={handlePaste}\n                kbd=\"#V\"\n                id=\"TD-MenuItem-Edit-Paste\"\n              >\n                Paste\n              </DMItem>\n              <DMDivider dir=\"ltr\" />\n              <DMItem\n                onSelect={preventEvent}\n                disabled={!hasSelection}\n                onClick={handleCopySvg}\n                kbd=\"#\u21E7C\"\n                id=\"TD-MenuItem-Edit-Copy_as_SVG\"\n              >\n                Copy as SVG\n              </DMItem>\n              <DMItem\n                onSelect={preventEvent}\n                disabled={!hasSelection}\n                onClick={handleCopyJson}\n                id=\"TD-MenuItem-Edit-Copy_as_JSON\"\n              >\n                Copy as JSON\n              </DMItem>\n              <DMDivider dir=\"ltr\" />\n              <DMItem\n                onSelect={preventEvent}\n                onClick={handleSelectAll}\n                kbd=\"#A\"\n                id=\"TD-MenuItem-Select_All\"\n              >\n                Select All\n              </DMItem>\n              <DMItem\n                onSelect={preventEvent}\n                onClick={handleSelectNone}\n                id=\"TD-MenuItem-Select_None\"\n              >\n                Select None\n              </DMItem>\n            </DMSubMenu>\n          </>\n        )}\n        <DMSubMenu label=\"View\" id=\"TD-MenuItem-Edit\">\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomIn}\n            kbd=\"#+\"\n            id=\"TD-MenuItem-View-ZoomIn\"\n          >\n            Zoom In\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={app.zoomOut}\n            kbd=\"#-\"\n            id=\"TD-MenuItem-View-ZoomOut\"\n          >\n            Zoom Out\n          </DMItem>\n          <DMItem\n            onSelect={preventEvent}\n            onClick={handleZoomTo100}\n            kbd=\"\u21E7+0\"\n            id=\"TD-MenuItem-View-ZoomTo100\"\n          >\n            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            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            Zoom to Selection\n          </DMItem>\n        </DMSubMenu>\n        <DMDivider dir=\"ltr\" />\n        <PreferencesMenu />\n        <DMDivider dir=\"ltr\" />\n        <a href=\"https://github.com/Tldraw/Tldraw\" target=\"_blank\" rel=\"nofollow\">\n          <DMItem id=\"TD-MenuItem-Github\">\n            GitHub\n            <SmallIcon>\n              <GitHubLogoIcon />\n            </SmallIcon>\n          </DMItem>\n        </a>\n        <a href=\"https://twitter.com/Tldraw\" target=\"_blank\" rel=\"nofollow\">\n          <DMItem id=\"TD-MenuItem-Twitter\">\n            Twitter\n            <SmallIcon>\n              <TwitterLogoIcon />\n            </SmallIcon>\n          </DMItem>\n        </a>\n        <a href=\"https://discord.gg/SBBEVCA4PG\" target=\"_blank\" rel=\"nofollow\">\n          <DMItem id=\"TD-MenuItem-Discord\">\n            Discord\n            <SmallIcon>\n              <DiscordIcon />\n            </SmallIcon>\n          </DMItem>\n        </a>\n        {showSponsorLink && (\n          <a href=\"https://github.com/sponsors/steveruizok\" target=\"_blank\" rel=\"nofollow\">\n            <DMItem isSponsor id=\"TD-MenuItem-Become_a_Sponsor\">\n              Become a Sponsor{' '}\n              <SmallIcon>\n                <HeartIcon />\n              </SmallIcon>\n            </DMItem>\n          </a>\n        )}\n        {showSignInOutMenu && (\n          <>\n            <DMDivider dir=\"ltr\" />{' '}\n            {app.callbacks.onSignIn && (\n              <DMItem onSelect={handleSignIn} id=\"TD-MenuItem-Sign_in\">\n                Sign In\n              </DMItem>\n            )}\n            {app.callbacks.onSignOut && (\n              <DMItem onSelect={handleSignOut} id=\"TD-MenuItem-Sign_out\">\n                Sign Out\n                <SmallIcon>\n                  <ExitIcon />\n                </SmallIcon>\n              </DMItem>\n            )}\n          </>\n        )}\n      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n", "import * as React from 'react'\nimport { DMCheckboxItem, DMDivider, DMSubMenu } from '~components/Primitives/DropdownMenu'\nimport { useTldrawApp } from '~hooks'\nimport type { TDSnapshot } from '~types'\n\nconst settingsSelector = (s: TDSnapshot) => s.settings\n\nexport function PreferencesMenu() {\n  const app = useTldrawApp()\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 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  return (\n    <DMSubMenu label=\"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        Dark Mode\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isFocusMode}\n        onCheckedChange={toggleFocusMode}\n        kbd=\"#.\"\n        id=\"TD-MenuItem-Preferences-Focus_Mode\"\n      >\n        Focus Mode\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isDebugMode}\n        onCheckedChange={toggleDebugMode}\n        id=\"TD-MenuItem-Preferences-Debug_Mode\"\n      >\n        Debug Mode\n      </DMCheckboxItem>\n      <DMDivider />\n      <DMCheckboxItem\n        checked={settings.showGrid}\n        onCheckedChange={toggleGrid}\n        kbd=\"#\u21E7G\"\n        id=\"TD-MenuItem-Preferences-Grid\"\n      >\n        Show Grid\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isCadSelectMode}\n        onCheckedChange={toggleCadSelectMode}\n        id=\"TD-MenuItem-Preferences-Cad_Selection\"\n      >\n        Use CAD Selection\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.isSnapping}\n        onCheckedChange={toggleisSnapping}\n        id=\"TD-MenuItem-Preferences-Always_Show_Snaps\"\n      >\n        Always Show Snaps\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.showRotateHandles}\n        onCheckedChange={toggleRotateHandle}\n        id=\"TD-MenuItem-Preferences-Rotate_Handles\"\n      >\n        Rotate Handles\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.showBindingHandles}\n        onCheckedChange={toggleBoundShapesHandle}\n        id=\"TD-MenuItem-Preferences-Binding_Handles\"\n      >\n        Binding Handles\n      </DMCheckboxItem>\n      <DMCheckboxItem\n        checked={settings.showCloneHandles}\n        onCheckedChange={toggleCloneControls}\n        id=\"TD-MenuItem-Preferences-Clone_Handles\"\n      >\n        Clone Handles\n      </DMCheckboxItem>\n    </DMSubMenu>\n  )\n}\n", "import * as React from 'react'\n\nexport function HeartIcon() {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth={2}\n        d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"\n      />\n    </svg>\n  )\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'\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(): JSX.Element {\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\n  const sortedPages = app.useStore(sortedSelector)\n\n  const currentPageId = app.useStore(currentPageIdSelector)\n\n  const handleCreatePage = React.useCallback(() => {\n    app.createPage()\n  }, [app])\n\n  const handleChangePage = React.useCallback(\n    (id: string) => {\n      onClose()\n      app.changePage(id)\n    },\n    [app]\n  )\n\n  return (\n    <>\n      <DropdownMenu.RadioGroup dir=\"ltr\" value={currentPageId} onValueChange={handleChangePage}>\n        {sortedPages.map((page) => (\n          <ButtonWithOptions key={page.id}>\n            <DropdownMenu.RadioItem\n              title={page.name || 'Page'}\n              value={page.id}\n              key={page.id}\n              asChild\n            >\n              <PageButton>\n                <span>{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      <DMDivider />\n      <DropdownMenu.Item onSelect={handleCreatePage} asChild>\n        <RowButton>\n          <span>Create Page</span>\n          <SmallIcon>\n            <PlusIcon />\n          </SmallIcon>\n        </RowButton>\n      </DropdownMenu.Item>\n    </>\n  )\n}\n\nconst ButtonWithOptions = styled('div', {\n  display: 'grid',\n  gridTemplateColumns: '1fr auto',\n  gridAutoFlow: 'column',\n\n  '& > *[data-shy=\"true\"]': {\n    opacity: 0,\n  },\n\n  '&:hover > *[data-shy=\"true\"]': {\n    opacity: 1,\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 } 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 { preventEvent } from '~components/preventEvent'\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): JSX.Element {\n  const app = useTldrawApp()\n\n  const [isOpen, setIsOpen] = React.useState(false)\n\n  const canDelete = app.useStore(canDeleteSelector)\n\n  const rInput = React.useRef<HTMLInputElement>(null)\n\n  const handleDuplicate = React.useCallback(() => {\n    app.duplicatePage(page.id)\n    onClose?.()\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      onClose?.()\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  const close = React.useCallback(() => setIsOpen(false), [])\n\n  function stopPropagation(e: React.KeyboardEvent<HTMLDivElement>) {\n    e.stopPropagation()\n  }\n\n  // TODO: Replace with text input\n  function handleRename() {\n    const nextName = window.prompt('New name:', page.name)\n    app.renamePage(page.id, nextName || page.name || 'Page')\n  }\n\n  React.useEffect(() => {\n    if (isOpen) {\n      requestAnimationFrame(() => {\n        const elm = rInput.current\n        if (elm) {\n          elm.focus()\n          elm.select()\n        }\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={close} />\n        <StyledDialogContent dir=\"ltr\" onKeyDown={stopPropagation} onKeyUp={stopPropagation}>\n          <DialogAction onSelect={handleRename}>Rename</DialogAction>\n          <DialogAction onSelect={handleDuplicate}>Duplicate</DialogAction>\n          <DialogAction disabled={!canDelete} onSelect={handleDelete}>\n            Delete\n          </DialogAction>\n          <Divider />\n          <Dialog.Cancel asChild>\n            <RowButton>Cancel</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: '$0',\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 { 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 { 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'\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          Zoom In\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.zoomOut} kbd=\"#\u2212\" id=\"TD-Zoom-Zoom_Out\">\n          Zoom Out\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.resetZoom} kbd=\"\u21E70\" id=\"TD-Zoom-Zoom_To_100%\">\n          To 100%\n        </DMItem>\n        <DMItem onSelect={preventEvent} onClick={app.zoomToFit} kbd=\"\u21E71\" id=\"TD-Zoom-To_Fit\">\n          To Fit\n        </DMItem>\n        <DMItem\n          onSelect={preventEvent}\n          onClick={app.zoomToSelection}\n          kbd=\"\u21E72\"\n          id=\"TD-Zoom-To_Selection\"\n        >\n          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 { useTldrawApp } from '~hooks'\nimport { DMCheckboxItem, DMContent, DMRadioItem } 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 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(): JSX.Element {\n  const app = useTldrawApp()\n  const theme = app.useStore(themeSelector)\n  const options = app.useStore(optionsSelector)\n  const currentStyle = app.useStore(currentStyleSelector)\n  const selectedIds = app.useStore(selectedIdsSelector)\n  const [displayedStyle, setDisplayedStyle] = React.useState(currentStyle)\n  const rDisplayedStyle = React.useRef(currentStyle)\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  const handleToggleFilled = React.useCallback((checked: boolean) => {\n    app.style({ isFilled: checked })\n  }, [])\n  const handleDashChange = React.useCallback((value: string) => {\n    app.style({ dash: value as DashStyle })\n  }, [])\n  const handleSizeChange = React.useCallback((value: string) => {\n    app.style({ size: value as SizeStyle })\n  }, [])\n  const handleFontChange = React.useCallback((value: string) => {\n    app.style({ font: value as FontStyle })\n  }, [])\n  const handleTextAlignChange = React.useCallback((value: string) => {\n    app.style({ textAlign: value as AlignStyle })\n  }, [])\n  const handleMenuOpenChange = React.useCallback(\n    (open: boolean) => {\n      app.setMenuOpen(open)\n    },\n    [app]\n  )\n  return (\n    <DropdownMenu.Root dir=\"ltr\" onOpenChange={handleMenuOpenChange}>\n      <DropdownMenu.Trigger asChild id=\"TD-Styles\">\n        <ToolButton variant=\"text\">\n          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>Color</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={() => {\n                    app.style({ color: style as ColorStyle })\n                  }}\n                >\n                  <CircleIcon\n                    size={18}\n                    strokeWidth={2.5}\n                    fill={\n                      displayedStyle.isFilled ? fills.light[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          Fill\n        </DMCheckboxItem>\n        <StyledRow id=\"TD-Styles-Dash-Container\">\n          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          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              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                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      </DMContent>\n    </DropdownMenu.Root>\n  )\n})\n\nexport const 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  padding: '$2 0 $2 $3',\n  borderRadius: 4,\n  userSelect: 'none',\n  margin: 0,\n  display: 'flex',\n  gap: '$3',\n  flexDirection: 'column',\n  alignItems: 'flex-start',\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\nexport const StyledGroup = styled(DropdownMenu.DropdownMenuRadioGroup, {\n  display: 'flex',\n  flexDirection: 'row',\n  gap: '$1',\n})\n\nexport const OverlapIcons = styled('div', {\n  display: 'grid',\n  '& > *': {\n    gridColumn: 1,\n    gridRow: 1,\n  },\n})\n\nexport const 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, CursorArrowIcon } 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 { MultiplayerIcon } from '~components/Primitives/icons'\nimport type { TDSnapshot } from '~types'\nimport { TLDR } from '~state/TLDR'\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 handleCopySelect = React.useCallback(() => {\n    setCopied(true)\n    TLDR.copyStringToClipboard(window.location.href)\n    setTimeout(() => setCopied(false), 1200)\n  }, [])\n\n  const handleCreateMultiplayerRoom = 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 handleCopyToMultiplayerRoom = React.useCallback(async () => {\n    const myHeaders = new Headers({\n      'Access-Control-Allow-Origin': '*',\n      'Content-Type': 'application/json',\n    })\n\n    const res = await fetch('http://tldraw.com/api/create-multiplayer-room', {\n      headers: myHeaders,\n      method: 'POST',\n      mode: 'cors',\n      cache: 'no-cache',\n      body: JSON.stringify(app.document),\n    }).then((res) => res.json())\n\n    window.location.href = `http://tldraw.com/r/${res.roomId}`\n  }, [])\n\n  return (\n    <DropdownMenu.Root dir=\"ltr\">\n      <DMTriggerIcon id=\"TD-MultiplayerMenuIcon\">\n        {room ? <MultiplayerIcon /> : <CursorArrowIcon />}\n      </DMTriggerIcon>\n      <DMContent variant=\"menu\" align=\"start\" id=\"TD-MultiplayerMenu\">\n        <DMItem id=\"TD-Multiplayer-CopyInviteLink\" onClick={handleCopySelect} disabled={!room}>\n          Copy Invite Link<SmallIcon>{copied ? <CheckIcon /> : <ClipboardIcon />}</SmallIcon>\n        </DMItem>\n        <DMDivider id=\"TD-Multiplayer-CopyInviteLinkDivider\" />\n        <DMItem id=\"TD-Multiplayer-CreateMultiplayerRoom\" onClick={handleCreateMultiplayerRoom}>\n          <a href=\"https://tldraw.com/r\">Create a Multiplayer Project</a>\n        </DMItem>\n        {/* <DMItem id=\"TD-Multiplayer-CopyToMultiplayerRoom\" onClick={handleCopyToMultiplayerRoom}>Copy to Multiplayer Room</DMItem> */}\n      </DMContent>\n    </DropdownMenu.Root>\n  )\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, TDExportTypes } 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'\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): JSX.Element => {\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\n\n\nconst InnerMenu = React.memo(function InnerMenu({ onBlur }: InnerContextMenuProps) {\n  const app = useTldrawApp()\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 handleCopyJson = React.useCallback(() => {\n    app.copyJson()\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.copySvg()\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    await app.exportSelectedShapesAs(TDExportTypes.PNG)\n  }, [app])\n\n  const handleExportJPG = React.useCallback(async () => {\n    await app.exportSelectedShapesAs(TDExportTypes.JPG)\n  }, [app])\n\n  const handleExportWEBP = React.useCallback(async () => {\n    await app.exportSelectedShapesAs(TDExportTypes.WEBP)\n  }, [app])\n\n  const handleExportSVG = React.useCallback(async () => {\n    await app.exportSelectedShapesAs(TDExportTypes.SVG)\n  }, [app])\n\n  const handleExportJSON = React.useCallback(async () => {\n    await app.exportSelectedShapesAs(TDExportTypes.JSON)\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              Duplicate\n            </CMRowButton>\n            <CMRowButton\n              onClick={handleFlipHorizontal}\n              kbd=\"\u21E7H\"\n              id=\"TD-ContextMenu-Flip_Horizontal\"\n            >\n              Flip Horizontal\n            </CMRowButton>\n            <CMRowButton onClick={handleFlipVertical} kbd=\"\u21E7V\" id=\"TD-ContextMenu-Flip_Vertical\">\n              Flip Vertical\n            </CMRowButton>\n            <CMRowButton onClick={handleLock} kbd=\"#\u21E7L\" id=\"TD-ContextMenu- Lock_Unlock\">\n              Lock / Unlock\n            </CMRowButton>\n            {(hasTwoOrMore || hasGroupSelected) && <Divider />}\n            {hasTwoOrMore && (\n              <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Group\">\n                Group\n              </CMRowButton>\n            )}\n            {hasGroupSelected && (\n              <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Ungroup\">\n                Ungroup\n              </CMRowButton>\n            )}\n            <Divider />\n            <ContextMenuSubMenu label=\"Move\" id=\"TD-ContextMenu-Move\">\n              <CMRowButton onClick={handleMoveToFront} kbd=\"\u21E7]\" id=\"TD-ContextMenu-Move-To_Front\">\n                To Front\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveForward} kbd=\"]\" id=\"TD-ContextMenu-Move-Forward\">\n                Forward\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveBackward} kbd=\"[\" id=\"TD-ContextMenu-Move-Backward\">\n                Backward\n              </CMRowButton>\n              <CMRowButton onClick={handleMoveToBack} kbd=\"\u21E7[\" id=\"TD-ContextMenu-Move-To_Back\">\n                To Back\n              </CMRowButton>\n            </ContextMenuSubMenu>\n            <MoveToPageMenu />\n            {hasTwoOrMore && (\n              <AlignDistributeSubMenu hasTwoOrMore={hasTwoOrMore} hasThreeOrMore={hasThreeOrMore} />\n            )}\n            {app.callbacks.onExport ? (\n              <>\n                <Divider />\n                <ContextMenuSubMenu label=\"Export\" size=\"small\" id=\"TD-ContextMenu-Export\">\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                  <CMRowButton onClick={handleExportSVG} id=\"TD-ContextMenu-Export-SVG\">\n                    SVG\n                  </CMRowButton>\n                  <CMRowButton onClick={handleExportJSON} id=\"TD-ContextMenu-Export-JSON\">\n                    JSON\n                  </CMRowButton>\n                  <Divider />\n                  <CMRowButton\n                    onClick={handleCopySvg}\n                    kbd=\"#\u21E7C\"\n                    id=\"TD-ContextMenu-Export-Copy_as_SVG\"\n                  >\n                    Copy as SVG\n                  </CMRowButton>\n                  {isDebugMode && (\n                    <CMRowButton onClick={handleCopyJson} id=\"TD-ContextMenu-Export-Copy_as_JSON\">\n                      Copy as JSON\n                    </CMRowButton>\n                  )}\n                </ContextMenuSubMenu>\n              </>\n            ) : (\n              <>\n                <Divider />\n                <CMRowButton\n                  onClick={handleCopySvg}\n                  kbd=\"#\u21E7C\"\n                  id=\"TD-ContextMenu-Export-Copy_as_SVG\"\n                >\n                  Copy as SVG\n                </CMRowButton>\n                {isDebugMode && (\n                  <CMRowButton onClick={handleCopyJson} id=\"TD-ContextMenu-Export-Copy_as_JSON\">\n                    Copy as JSON\n                  </CMRowButton>\n                )}\n              </>\n            )}\n            <Divider />\n            <CMRowButton onClick={handleCut} kbd=\"#X\" id=\"TD-ContextMenu-Cut\">\n              Cut\n            </CMRowButton>\n            <CMRowButton onClick={handleCopy} kbd=\"#C\" id=\"TD-ContextMenu-Copy\">\n              Copy\n            </CMRowButton>\n            <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n              Paste\n            </CMRowButton>\n\n            <Divider />\n            <CMRowButton onClick={handleDelete} kbd=\"\u232B\" id=\"TD-ContextMenu-Delete\">\n              Delete\n            </CMRowButton>\n          </>\n        ) : (\n          <>\n            <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n              Paste\n            </CMRowButton>\n            <CMRowButton onClick={handleUndo} kbd=\"#Z\" id=\"TD-ContextMenu-Undo\">\n              Undo\n            </CMRowButton>\n            <CMRowButton onClick={handleRedo} kbd=\"#\u21E7Z\" id=\"TD-ContextMenu-Redo\">\n              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(): JSX.Element | null {\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>Move To Page</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({\n  children,\n  label,\n  size,\n  id,\n}: ContextMenuSubMenuProps): JSX.Element {\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): JSX.Element {\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 { 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 <StyledLoadingPanelContainer hidden={!isLoading}>Loading...</StyledLoadingPanelContainer>\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 { useTldrawApp } from '~hooks'\nimport { styled } from '~styles'\nimport { TDStatus } from '~types';\nimport { SelectionTools } from './SelectionTools';\n\ninterface CursorSVGProps {\n  sticker: string\n}\n\n\nexport function CursorSVG({sticker}:CursorSVGProps): JSX.Element {\n   \n    const app = useTldrawApp()\n    const points =  app.useStore(s=>s.appState.currentStickerPoint)\n    const zoom = app.useStore(s=>s.document.pageStates.page.camera.zoom)\n    const pointX = (app.useStore(s=>s.document.pageStates.page.camera.point[0])+(points[0])) * zoom -20\n    const pointY = (app.useStore(s=>s.document.pageStates.page.camera.point[1])+(points[1])) * zoom -10\n\n\n  return <StyledCursorSVGWrapper style={{ \n    transform: `translate(${pointX}px, ${pointY}px)`\n  }}>\n    <img src={sticker}/>\n  </StyledCursorSVGWrapper>\n}\n\nconst StyledCursorSVGWrapper = styled('div', {\n pointerEvents:'none',\n  length: '',\n  position: 'absolute',\n  top: '0px',\n  left: '0px',\n  transformOrigin: 'center center',\n  opacity:'0.5',\n  background: '#fff',\n  borderRadius:'50%',\n  \n})\n"],
  "mappings": "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AK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,IAAG,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,IAAG,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,GAAE,MAAK,MAAK,CAAC,KAAI,IAAG,MAAK,CAAC,KAAI,KAAI,MAAK,CAAC,KAAI,GAAE,MAAK,CAAC,KAAI,KAAI,MAAK,CAAC,KAAI,KAAI,MAAK,CAAC,KAAI,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,GAAE,MAAK,CAAC,IAAG,GAAE,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,IAAG,IAAG,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,IAAG,KAAI,MAAK,CAAC,IAAG,KAAI,MA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C,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,GAAE,MAAK,MAAK,CAAC,KAAI,MAAK,MAAK,CAAC,KAAI,IAAG,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,GAAE,MAAK,CAAC,IAAG,GAAE,MAAK,CAAC,IAAG,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,KAAI,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,IAAG,IAAG,MAAK,CAAC,MAAK,MAAK,MAAK,CAAC,MAAK,MAAK,MAAK,CAA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",
  "names": []
}
