tldraw 3.15.0-canary.ee0606e7631e → 3.15.0-canary.f6f94b895c02
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.d.ts +39 -8
- package/dist-cjs/index.js +1 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawImage.js +5 -2
- package/dist-cjs/lib/TldrawImage.js.map +3 -3
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js +15 -1
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -1
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js +1 -1
- package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
- package/dist-cjs/lib/styles.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +43 -22
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +8 -0
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
- package/dist-cjs/lib/ui/components/Spinner.js +2 -25
- package/dist-cjs/lib/ui/components/Spinner.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButtonIcon.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +35 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +2 -1
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
- package/dist-esm/index.d.mts +39 -8
- package/dist-esm/index.mjs +4 -2
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawImage.mjs +5 -2
- package/dist-esm/lib/TldrawImage.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +15 -1
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -1
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +1 -1
- package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
- package/dist-esm/lib/styles.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +43 -22
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +8 -0
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Spinner.mjs +3 -26
- package/dist-esm/lib/ui/components/Spinner.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButtonIcon.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +36 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +2 -1
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
- package/package.json +4 -3
- package/src/index.ts +5 -1
- package/src/lib/TldrawImage.tsx +6 -2
- package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
- package/src/lib/shapes/line/LineShapeUtil.tsx +19 -2
- package/src/lib/shapes/shared/PlainTextLabel.tsx +1 -1
- package/src/lib/shapes/shared/RichTextLabel.tsx +1 -1
- package/src/lib/styles.tsx +3 -1
- package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +54 -30
- package/src/lib/tools/SelectTool/childStates/Resizing.ts +12 -1
- package/src/lib/tools/SelectTool/childStates/Rotating.ts +11 -0
- package/src/lib/tools/SelectTool/childStates/Translating.ts +11 -0
- package/src/lib/ui/components/Spinner.tsx +2 -24
- package/src/lib/ui/components/primitives/Button/TldrawUiButtonIcon.tsx +2 -2
- package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +41 -3
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +2 -2
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +3 -2
- package/src/lib/ui/context/actions.tsx +1 -1
- package/src/lib/ui/hooks/useTools.tsx +2 -1
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +8 -8
- package/src/lib/utils/tldr/buildFromV1Document.ts +1 -0
- package/src/test/navigation.test.ts +254 -0
- package/src/test/shapeutils.test.ts +394 -45
- package/tldraw.css +23 -10
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/utils/tldr/buildFromV1Document.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tAssetRecordType,\n\tEditor,\n\tPageRecordType,\n\tTLArrowShape,\n\tTLArrowShapeArrowheadStyle,\n\tTLAsset,\n\tTLAssetId,\n\tTLDefaultColorStyle,\n\tTLDefaultDashStyle,\n\tTLDefaultFontStyle,\n\tTLDefaultHorizontalAlignStyle,\n\tTLDefaultSizeStyle,\n\tTLDefaultTextAlignStyle,\n\tTLDrawShape,\n\tTLGeoShape,\n\tTLImageShape,\n\tTLNoteShape,\n\tTLPageId,\n\tTLShapeId,\n\tTLTextShape,\n\tTLVideoShape,\n\tVec,\n\tVecModel,\n\tclamp,\n\tcreateShapeId,\n\tfetch,\n\tstructuredClone,\n\ttoRichText,\n} from '@tldraw/editor'\nimport { getArrowBindings } from '../../shapes/arrow/shared'\n\nconst TLDRAW_V1_VERSION = 15.5\n\n/** @internal */\nexport function buildFromV1Document(editor: Editor, _document: unknown) {\n\tlet document = _document as TLV1Document\n\teditor.run(() => {\n\t\tdocument = migrate(document, TLDRAW_V1_VERSION)\n\t\t// Cancel any interactions / states\n\t\teditor.cancel().cancel().cancel().cancel()\n\n\t\tconst firstPageId = editor.getPages()[0].id\n\n\t\t// Set the current page to the first page\n\t\teditor.setCurrentPage(firstPageId)\n\n\t\t// Delete all pages except first page\n\t\tfor (const page of editor.getPages().slice(1)) {\n\t\t\teditor.deletePage(page.id)\n\t\t}\n\n\t\t// Delete all of the shapes on the current page\n\t\teditor.selectAll()\n\t\teditor.deleteShapes(editor.getSelectedShapeIds())\n\n\t\t// Create assets\n\t\tconst v1AssetIdsToV2AssetIds = new Map<string, TLAssetId>()\n\n\t\tObject.values(document.assets ?? {}).forEach((v1Asset) => {\n\t\t\tswitch (v1Asset.type) {\n\t\t\t\tcase TLV1AssetType.Image: {\n\t\t\t\t\tconst assetId: TLAssetId = AssetRecordType.createId()\n\t\t\t\t\tv1AssetIdsToV2AssetIds.set(v1Asset.id, assetId)\n\t\t\t\t\tconst placeholderAsset: TLAsset = {\n\t\t\t\t\t\tid: assetId,\n\t\t\t\t\t\ttypeName: 'asset',\n\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tw: coerceDimension(v1Asset.size[0]),\n\t\t\t\t\t\t\th: coerceDimension(v1Asset.size[1]),\n\t\t\t\t\t\t\tname: v1Asset.fileName ?? 'Untitled',\n\t\t\t\t\t\t\tisAnimated: false,\n\t\t\t\t\t\t\tmimeType: null,\n\t\t\t\t\t\t\tsrc: v1Asset.src,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t}\n\t\t\t\t\teditor.createAssets([placeholderAsset])\n\t\t\t\t\ttryMigrateAsset(editor, placeholderAsset)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase TLV1AssetType.Video:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst assetId: TLAssetId = AssetRecordType.createId()\n\t\t\t\t\t\tv1AssetIdsToV2AssetIds.set(v1Asset.id, assetId)\n\t\t\t\t\t\teditor.createAssets([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: assetId,\n\t\t\t\t\t\t\t\ttypeName: 'asset',\n\t\t\t\t\t\t\t\ttype: 'video',\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Asset.size[0]),\n\t\t\t\t\t\t\t\t\th: coerceDimension(v1Asset.size[1]),\n\t\t\t\t\t\t\t\t\tname: v1Asset.fileName ?? 'Untitled',\n\t\t\t\t\t\t\t\t\tisAnimated: true,\n\t\t\t\t\t\t\t\t\tmimeType: null,\n\t\t\t\t\t\t\t\t\tsrc: v1Asset.src,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t})\n\n\t\t// Create pages\n\n\t\tconst v1PageIdsToV2PageIds = new Map<string, TLPageId>()\n\n\t\tObject.values(document.pages ?? {})\n\t\t\t.sort((a, b) => ((a.childIndex ?? 1) < (b.childIndex ?? 1) ? -1 : 1))\n\t\t\t.forEach((v1Page, i) => {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tv1PageIdsToV2PageIds.set(v1Page.id, editor.getCurrentPageId())\n\t\t\t\t} else {\n\t\t\t\t\tconst pageId = PageRecordType.createId()\n\t\t\t\t\tv1PageIdsToV2PageIds.set(v1Page.id, pageId)\n\t\t\t\t\teditor.createPage({ name: v1Page.name ?? 'Page', id: pageId })\n\t\t\t\t}\n\t\t\t})\n\n\t\tObject.values(document.pages ?? {})\n\t\t\t.sort((a, b) => ((a.childIndex ?? 1) < (b.childIndex ?? 1) ? -1 : 1))\n\t\t\t.forEach((v1Page) => {\n\t\t\t\t// Set the current page id to the current page\n\t\t\t\teditor.setCurrentPage(v1PageIdsToV2PageIds.get(v1Page.id)!)\n\n\t\t\t\tconst v1ShapeIdsToV2ShapeIds = new Map<string, TLShapeId>()\n\t\t\t\tconst v1GroupShapeIdsToV1ChildIds = new Map<string, string[]>()\n\n\t\t\t\tconst v1Shapes = Object.values(v1Page.shapes ?? {})\n\t\t\t\t\t.sort((a, b) => (a.childIndex < b.childIndex ? -1 : 1))\n\t\t\t\t\t.slice(0, editor.options.maxShapesPerPage)\n\n\t\t\t\t// Groups only\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\tif (v1Shape.type !== TLV1ShapeType.Group) return\n\n\t\t\t\t\tconst shapeId = createShapeId()\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.set(v1Shape.id, shapeId)\n\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.set(v1Shape.id, [])\n\t\t\t\t})\n\n\t\t\t\tfunction decideNotToCreateShape(v1Shape: TLV1Shape) {\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.delete(v1Shape.id)\n\t\t\t\t\tconst v1GroupParent = v1GroupShapeIdsToV1ChildIds.has(v1Shape.parentId)\n\t\t\t\t\tif (v1GroupParent) {\n\t\t\t\t\t\tconst ids = v1GroupShapeIdsToV1ChildIds\n\t\t\t\t\t\t\t.get(v1Shape.parentId)!\n\t\t\t\t\t\t\t.filter((id) => id !== v1Shape.id)\n\t\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.set(v1Shape.parentId, ids)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Non-groups only\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\t// Skip groups for now, we'll create groups via the app's API\n\t\t\t\t\tif (v1Shape.type === TLV1ShapeType.Group) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst shapeId = createShapeId()\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.set(v1Shape.id, shapeId)\n\n\t\t\t\t\tif (v1Shape.parentId !== v1Page.id) {\n\t\t\t\t\t\t// If the parent is a group, then add the shape to the group's children\n\t\t\t\t\t\tif (v1GroupShapeIdsToV1ChildIds.has(v1Shape.parentId)) {\n\t\t\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.get(v1Shape.parentId)!.push(v1Shape.id)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('parent does not exist', v1Shape)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// First, try to find the shape's parent among the existing groups\n\t\t\t\t\tconst parentId = v1PageIdsToV2PageIds.get(v1Page.id)!\n\n\t\t\t\t\tconst inCommon = {\n\t\t\t\t\t\tid: shapeId,\n\t\t\t\t\t\tparentId,\n\t\t\t\t\t\tx: coerceNumber(v1Shape.point[0]),\n\t\t\t\t\t\ty: coerceNumber(v1Shape.point[1]),\n\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\tisLocked: !!v1Shape.isLocked,\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (v1Shape.type) {\n\t\t\t\t\t\tcase TLV1ShapeType.Sticky: {\n\t\t\t\t\t\t\teditor.createShapes<TLNoteShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'note',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.text ?? ''),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\talign: getV2Align(v1Shape.style.textAlign),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Rectangle: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'rectangle',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Triangle: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'triangle',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Ellipse: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'ellipse',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.radius[0]) * 2,\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.radius[1]) * 2,\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Draw: {\n\t\t\t\t\t\t\tif (v1Shape.points.length === 0) {\n\t\t\t\t\t\t\t\tdecideNotToCreateShape(v1Shape)\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLDrawShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'draw',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\tisPen: false,\n\t\t\t\t\t\t\t\t\t\tisComplete: v1Shape.isComplete,\n\t\t\t\t\t\t\t\t\t\tsegments: [{ type: 'free', points: v1Shape.points.map(getV2Point) }],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Arrow: {\n\t\t\t\t\t\t\tconst v1Bend = coerceNumber(v1Shape.bend)\n\t\t\t\t\t\t\tconst v1Start = getV2Point(v1Shape.handles.start.point)\n\t\t\t\t\t\t\tconst v1End = getV2Point(v1Shape.handles.end.point)\n\t\t\t\t\t\t\tconst dist = Vec.Dist(v1Start, v1End)\n\t\t\t\t\t\t\tconst v2Bend = (dist * -v1Bend) / 2\n\n\t\t\t\t\t\t\t// Could also be a line... but we'll use it as an arrow anyway\n\t\t\t\t\t\t\teditor.createShapes<TLArrowShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'arrow',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\ttext: v1Shape.label ?? '',\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\tarrowheadStart: getV2Arrowhead(v1Shape.decorations?.start),\n\t\t\t\t\t\t\t\t\t\tarrowheadEnd: getV2Arrowhead(v1Shape.decorations?.end),\n\t\t\t\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\t\t\t\tx: coerceNumber(v1Shape.handles.start.point[0]),\n\t\t\t\t\t\t\t\t\t\t\ty: coerceNumber(v1Shape.handles.start.point[1]),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\t\t\t\tx: coerceNumber(v1Shape.handles.end.point[0]),\n\t\t\t\t\t\t\t\t\t\t\ty: coerceNumber(v1Shape.handles.end.point[1]),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tbend: v2Bend,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Text: {\n\t\t\t\t\t\t\teditor.createShapes<TLTextShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.text ?? ' '),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2TextSize(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\ttextAlign: getV2TextAlign(v1Shape.style.textAlign),\n\t\t\t\t\t\t\t\t\t\tscale: v1Shape.style.scale ?? 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Image: {\n\t\t\t\t\t\t\tconst assetId = v1AssetIdsToV2AssetIds.get(v1Shape.assetId)\n\n\t\t\t\t\t\t\tif (!assetId) {\n\t\t\t\t\t\t\t\tconsole.warn('Could not find asset id', v1Shape.assetId)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLImageShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Video: {\n\t\t\t\t\t\t\tconst assetId = v1AssetIdsToV2AssetIds.get(v1Shape.assetId)\n\n\t\t\t\t\t\t\tif (!assetId) {\n\t\t\t\t\t\t\t\tconsole.warn('Could not find asset id', v1Shape.assetId)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLVideoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'video',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rotation = coerceNumber(v1Shape.rotation)\n\n\t\t\t\t\tif (rotation !== 0) {\n\t\t\t\t\t\teditor.select(shapeId)\n\t\t\t\t\t\teditor.rotateShapesBy([shapeId], rotation)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Create groups\n\t\t\t\tv1GroupShapeIdsToV1ChildIds.forEach((v1ChildIds, v1GroupId) => {\n\t\t\t\t\tconst v2ChildShapeIds = v1ChildIds.map((id) => v1ShapeIdsToV2ShapeIds.get(id)!)\n\t\t\t\t\tconst v2GroupId = v1ShapeIdsToV2ShapeIds.get(v1GroupId)!\n\t\t\t\t\teditor.groupShapes(v2ChildShapeIds, { groupId: v2GroupId })\n\n\t\t\t\t\tconst v1Group = v1Page.shapes[v1GroupId]\n\t\t\t\t\tconst rotation = coerceNumber(v1Group.rotation)\n\n\t\t\t\t\tif (rotation !== 0) {\n\t\t\t\t\t\teditor.select(v2GroupId)\n\t\t\t\t\t\teditor.rotateShapesBy([v2GroupId], rotation)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Bind arrows to shapes\n\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\tif (v1Shape.type !== TLV1ShapeType.Arrow) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst v2ShapeId = v1ShapeIdsToV2ShapeIds.get(v1Shape.id)!\n\t\t\t\t\tconst util = editor.getShapeUtil<TLArrowShape>('arrow')\n\n\t\t\t\t\t// dumb but necessary\n\t\t\t\t\teditor.inputs.ctrlKey = false\n\n\t\t\t\t\tfor (const handleId of ['start', 'end'] as const) {\n\t\t\t\t\t\tconst bindingId = v1Shape.handles[handleId].bindingId\n\t\t\t\t\t\tif (bindingId) {\n\t\t\t\t\t\t\tconst binding = v1Page.bindings[bindingId]\n\t\t\t\t\t\t\tif (!binding) {\n\t\t\t\t\t\t\t\t// arrow has a reference to a binding that no longer exists\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst targetId = v1ShapeIdsToV2ShapeIds.get(binding.toId)!\n\n\t\t\t\t\t\t\tconst targetShape = editor.getShape(targetId)!\n\n\t\t\t\t\t\t\t// (unexpected) We didn't create the target shape\n\t\t\t\t\t\t\tif (!targetShape) continue\n\n\t\t\t\t\t\t\tif (targetId) {\n\t\t\t\t\t\t\t\tconst bounds = editor.getShapePageBounds(targetId)!\n\n\t\t\t\t\t\t\t\tconst v2ShapeFresh = editor.getShape<TLArrowShape>(v2ShapeId)!\n\n\t\t\t\t\t\t\t\tconst nx = clamp((coerceNumber(binding.point[0]) + 0.5) / 2, 0.2, 0.8)\n\t\t\t\t\t\t\t\tconst ny = clamp((coerceNumber(binding.point[1]) + 0.5) / 2, 0.2, 0.8)\n\n\t\t\t\t\t\t\t\tconst point = editor.getPointInShapeSpace(v2ShapeFresh, {\n\t\t\t\t\t\t\t\t\tx: bounds.minX + bounds.width * nx,\n\t\t\t\t\t\t\t\t\ty: bounds.minY + bounds.height * ny,\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tconst handles = editor.getShapeHandles(v2ShapeFresh)!\n\t\t\t\t\t\t\t\tconst change = util.onHandleDrag!(v2ShapeFresh, {\n\t\t\t\t\t\t\t\t\thandle: {\n\t\t\t\t\t\t\t\t\t\t...handles.find((h) => h.id === handleId)!,\n\t\t\t\t\t\t\t\t\t\tx: point.x,\n\t\t\t\t\t\t\t\t\t\ty: point.y,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tisPrecise: point.x !== 0.5 || point.y !== 0.5,\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tif (change) {\n\t\t\t\t\t\t\t\t\teditor.updateShape(change)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst freshBinding = getArrowBindings(\n\t\t\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\t\t\teditor.getShape<TLArrowShape>(v2ShapeId)!\n\t\t\t\t\t\t\t\t)[handleId]\n\t\t\t\t\t\t\t\tif (freshBinding) {\n\t\t\t\t\t\t\t\t\tconst updatedFreshBinding = structuredClone(freshBinding)\n\t\t\t\t\t\t\t\t\tif (binding.distance === 0) {\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.props.isExact = true\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (updatedFreshBinding.toId !== targetId) {\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.toId = targetId\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.props.normalizedAnchor = { x: nx, y: ny }\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\teditor.updateBinding(updatedFreshBinding)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t// Set the current page to the first page again\n\t\teditor.setCurrentPage(firstPageId)\n\n\t\teditor.clearHistory()\n\t\teditor.selectNone()\n\n\t\tconst bounds = editor.getCurrentPageBounds()\n\t\tif (bounds) {\n\t\t\teditor.zoomToBounds(bounds, { targetZoom: 1 })\n\t\t}\n\t})\n}\n\nfunction coerceNumber(n: unknown): number {\n\tif (typeof n !== 'number') return 0\n\tif (Number.isNaN(n)) return 0\n\tif (!Number.isFinite(n)) return 0\n\treturn n\n}\n\nfunction coerceDimension(d: unknown): number {\n\tconst n = coerceNumber(d)\n\tif (n <= 0) return 1\n\treturn n\n}\n\n/**\n * We want to move assets over to our new S3 bucket & extract any relevant metadata. That process is\n * async though, where the rest of our migration is synchronous.\n *\n * We'll write placeholder assets to the app using the old asset URLs, then kick off a process async\n * to try and download the real assets, extract the metadata, and upload them to our new bucket.\n * It's not a big deal if this fails though.\n */\nasync function tryMigrateAsset(editor: Editor, placeholderAsset: TLAsset) {\n\ttry {\n\t\tif (placeholderAsset.type === 'bookmark' || !placeholderAsset.props.src) return\n\n\t\tconst response = await fetch(placeholderAsset.props.src)\n\t\tif (!response.ok) return\n\n\t\tconst file = new File([await response.blob()], placeholderAsset.props.name, {\n\t\t\ttype: response.headers.get('content-type') ?? placeholderAsset.props.mimeType ?? undefined,\n\t\t})\n\n\t\tconst newAsset = await editor.getAssetForExternalContent({ type: 'file', file })\n\t\tif (!newAsset) throw new Error('Could not get asset for external content')\n\t\tif (newAsset.type === 'bookmark') return\n\n\t\teditor.updateAssets([\n\t\t\t{\n\t\t\t\tid: placeholderAsset.id,\n\t\t\t\ttype: placeholderAsset.type,\n\t\t\t\tprops: {\n\t\t\t\t\t...newAsset.props,\n\t\t\t\t\tname: placeholderAsset.props.name,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t} catch {\n\t\t// not a big deal, we'll just keep the placeholder asset\n\t}\n}\n\nfunction migrate(document: TLV1Document, newVersion: number): TLV1Document {\n\tconst { version = 0 } = document\n\n\tif (!document.assets) {\n\t\tdocument.assets = {}\n\t}\n\n\t// Remove unused assets when loading a document\n\tconst assetIdsInUse = new Set<string>()\n\n\tObject.values(document.pages).forEach((page) =>\n\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\tconst { parentId, children, assetId } = shape\n\n\t\t\tif (assetId) {\n\t\t\t\tassetIdsInUse.add(assetId)\n\t\t\t}\n\n\t\t\t// Fix missing parent bug\n\t\t\tif (parentId !== page.id && !page.shapes[parentId]) {\n\t\t\t\tconsole.warn('Encountered a shape with a missing parent!')\n\t\t\t\tshape.parentId = page.id\n\t\t\t}\n\n\t\t\tif (shape.type === TLV1ShapeType.Group && children) {\n\t\t\t\tchildren.forEach((childId) => {\n\t\t\t\t\tif (!page.shapes[childId]) {\n\t\t\t\t\t\tconsole.warn('Encountered a parent with a missing child!', shape.id, childId)\n\t\t\t\t\t\tchildren?.splice(children.indexOf(childId), 1)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// TODO: Remove the shape if it has no children\n\t\t\t}\n\t\t})\n\t)\n\n\tObject.keys(document.assets).forEach((assetId) => {\n\t\tif (!assetIdsInUse.has(assetId)) {\n\t\t\tdelete document.assets[assetId]\n\t\t}\n\t})\n\n\tif (version !== newVersion) {\n\t\tif (version < 14) {\n\t\t\tObject.values(document.pages).forEach((page) => {\n\t\t\t\tObject.values(page.shapes)\n\t\t\t\t\t.filter((shape) => shape.type === TLV1ShapeType.Text)\n\t\t\t\t\t.forEach((shape) => {\n\t\t\t\t\t\tif ((shape as TLV1TextShape).style.font === undefined) {\n\t\t\t\t\t\t\t;(shape as TLV1TextShape).style.font = TLV1FontStyle.Script\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\t// Lowercase styles, move binding meta to binding\n\t\tif (version <= 13) {\n\t\t\tObject.values(document.pages).forEach((page) => {\n\t\t\t\tObject.values(page.bindings).forEach((binding) => {\n\t\t\t\t\tObject.assign(binding, (binding as any).meta)\n\t\t\t\t})\n\n\t\t\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\t\t\tObject.entries(shape.style).forEach(([id, style]) => {\n\t\t\t\t\t\tif (typeof style === 'string') {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tshape.style[id] = style.toLowerCase()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tif (shape.type === TLV1ShapeType.Arrow) {\n\t\t\t\t\t\tif (shape.decorations) {\n\t\t\t\t\t\t\tObject.entries(shape.decorations).forEach(([id, decoration]) => {\n\t\t\t\t\t\t\t\tif ((decoration as unknown) === 'Arrow') {\n\t\t\t\t\t\t\t\t\tshape.decorations = {\n\t\t\t\t\t\t\t\t\t\t...shape.decorations,\n\t\t\t\t\t\t\t\t\t\t[id]: TLV1Decoration.Arrow,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\t// Add document name and file system handle\n\t\tif (version <= 13.1 && document.name == null) {\n\t\t\tdocument.name = 'New Document'\n\t\t}\n\n\t\tif (version < 15 && document.assets == null) {\n\t\t\tdocument.assets = {}\n\t\t}\n\n\t\tObject.values(document.pages).forEach((page) => {\n\t\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\t\tif (version < 15.2) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(shape.type === TLV1ShapeType.Image || shape.type === TLV1ShapeType.Video) &&\n\t\t\t\t\t\tshape.style.isFilled == null\n\t\t\t\t\t) {\n\t\t\t\t\t\tshape.style.isFilled = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (version < 15.3) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Rectangle ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Triangle ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Ellipse ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Arrow\n\t\t\t\t\t) {\n\t\t\t\t\t\tif ('text' in shape && typeof shape.text === 'string') {\n\t\t\t\t\t\t\tshape.label = shape.text\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shape.label) {\n\t\t\t\t\t\t\tshape.label = ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shape.labelPoint) {\n\t\t\t\t\t\t\tshape.labelPoint = [0.5, 0.5]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// Cleanup\n\tObject.values(document.pageStates).forEach((pageState) => {\n\t\tpageState.selectedIds = pageState.selectedIds.filter((id) => {\n\t\t\treturn document.pages[pageState.id].shapes[id] !== undefined\n\t\t})\n\t\tpageState.bindingId = undefined\n\t\tpageState.editingId = undefined\n\t\tpageState.hoveredId = undefined\n\t\tpageState.pointedId = undefined\n\t})\n\n\tdocument.version = newVersion\n\n\treturn document\n}\n\n/* -------------------- TLV1 Types -------------------- */\n\n/** @internal */\nexport interface TLV1Handle {\n\tid: string\n\tindex: number\n\tpoint: number[]\n\tcanBind?: boolean\n\tbindingId?: string\n}\n\n/** @internal */\nexport interface TLV1BaseBinding {\n\tid: string\n\ttoId: string\n\tfromId: string\n}\n\n/** @internal */\nexport enum TLV1ShapeType {\n\tSticky = 'sticky',\n\tEllipse = 'ellipse',\n\tRectangle = 'rectangle',\n\tTriangle = 'triangle',\n\tDraw = 'draw',\n\tArrow = 'arrow',\n\tText = 'text',\n\tGroup = 'group',\n\tImage = 'image',\n\tVideo = 'video',\n}\n\n/** @internal */\nexport enum TLV1ColorStyle {\n\tWhite = 'white',\n\tLightGray = 'lightGray',\n\tGray = 'gray',\n\tBlack = 'black',\n\tGreen = 'green',\n\tCyan = 'cyan',\n\tBlue = 'blue',\n\tIndigo = 'indigo',\n\tViolet = 'violet',\n\tRed = 'red',\n\tOrange = 'orange',\n\tYellow = 'yellow',\n}\n\n/** @internal */\nexport enum TLV1SizeStyle {\n\tSmall = 'small',\n\tMedium = 'medium',\n\tLarge = 'large',\n}\n\n/** @internal */\nexport enum TLV1DashStyle {\n\tDraw = 'draw',\n\tSolid = 'solid',\n\tDashed = 'dashed',\n\tDotted = 'dotted',\n}\n\n/** @internal */\nexport enum TLV1AlignStyle {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n\tJustify = 'justify',\n}\n\n/** @internal */\nexport enum TLV1FontStyle {\n\tScript = 'script',\n\tSans = 'sans',\n\tSerif = 'serif',\n\tMono = 'mono',\n}\n\n/** @internal */\nexport interface TLV1ShapeStyles {\n\tcolor: TLV1ColorStyle\n\tsize: TLV1SizeStyle\n\tdash: TLV1DashStyle\n\tfont?: TLV1FontStyle\n\ttextAlign?: TLV1AlignStyle\n\tisFilled?: boolean\n\tscale?: number\n}\n\n/** @internal */\nexport interface TLV1BaseShape {\n\tid: string\n\tparentId: string\n\tchildIndex: number\n\tname: string\n\tpoint: number[]\n\tassetId?: string\n\trotation?: number\n\tchildren?: string[]\n\tisGhost?: boolean\n\tisHidden?: boolean\n\tisLocked?: boolean\n\tisGenerated?: boolean\n\tisAspectRatioLocked?: boolean\n\tstyle: TLV1ShapeStyles\n\ttype: TLV1ShapeType\n\tlabel?: string\n\thandles?: Record<string, TLV1Handle>\n}\n\n/** @internal */\nexport interface TLV1DrawShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Draw\n\tpoints: number[][]\n\tisComplete: boolean\n}\n\n/** @internal */\nexport interface TLV1RectangleShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Rectangle\n\tsize: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1EllipseShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Ellipse\n\tradius: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1TriangleShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Triangle\n\tsize: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport enum TLV1Decoration {\n\tArrow = 'arrow',\n}\n\n// The shape created with the arrow tool\n/** @internal */\nexport interface TLV1ArrowShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Arrow\n\tbend: number\n\thandles: {\n\t\tstart: TLV1Handle\n\t\tbend: TLV1Handle\n\t\tend: TLV1Handle\n\t}\n\tdecorations?: {\n\t\tstart?: TLV1Decoration\n\t\tend?: TLV1Decoration\n\t\tmiddle?: TLV1Decoration\n\t}\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1ArrowBinding extends TLV1BaseBinding {\n\thandleId: keyof TLV1ArrowShape['handles']\n\tdistance: number\n\tpoint: number[]\n}\n\n/** @internal */\nexport type TLV1Binding = TLV1ArrowBinding\n\n/** @internal */\nexport interface TLV1ImageShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Image\n\tsize: number[]\n\tassetId: string\n}\n\n/** @internal */\nexport interface TLV1VideoShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Video\n\tsize: number[]\n\tassetId: string\n\tisPlaying: boolean\n\tcurrentTime: number\n}\n\n// The shape created by the text tool\n/** @internal */\nexport interface TLV1TextShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Text\n\ttext: string\n}\n\n// The shape created by the sticky tool\n/** @internal */\nexport interface TLV1StickyShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Sticky\n\tsize: number[]\n\ttext: string\n}\n\n// The shape created when multiple shapes are grouped\n/** @internal */\nexport interface TLV1GroupShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Group\n\tsize: number[]\n\tchildren: string[]\n}\n\n/** @internal */\nexport type TLV1Shape =\n\t| TLV1RectangleShape\n\t| TLV1EllipseShape\n\t| TLV1TriangleShape\n\t| TLV1DrawShape\n\t| TLV1ArrowShape\n\t| TLV1TextShape\n\t| TLV1GroupShape\n\t| TLV1StickyShape\n\t| TLV1ImageShape\n\t| TLV1VideoShape\n\n/** @internal */\nexport interface TLV1Page {\n\tid: string\n\tname?: string\n\tchildIndex?: number\n\tshapes: Record<string, TLV1Shape>\n\tbindings: Record<string, TLV1Binding>\n}\n\n/** @internal */\nexport interface TLV1Bounds {\n\tminX: number\n\tminY: number\n\tmaxX: number\n\tmaxY: number\n\twidth: number\n\theight: number\n\trotation?: number\n}\n\n/** @internal */\nexport interface TLV1PageState {\n\tid: string\n\tselectedIds: string[]\n\tcamera: {\n\t\tpoint: number[]\n\t\tzoom: number\n\t}\n\tbrush?: TLV1Bounds | null\n\tpointedId?: string | null\n\thoveredId?: string | null\n\teditingId?: string | null\n\tbindingId?: string | null\n}\n\n/** @internal */\nexport enum TLV1AssetType {\n\tImage = 'image',\n\tVideo = 'video',\n}\n\n/** @internal */\nexport interface TLV1ImageAsset extends TLV1BaseAsset {\n\ttype: TLV1AssetType.Image\n\tfileName: string\n\tsrc: string\n\tsize: number[]\n}\n\n/** @internal */\nexport interface TLV1VideoAsset extends TLV1BaseAsset {\n\ttype: TLV1AssetType.Video\n\tfileName: string\n\tsrc: string\n\tsize: number[]\n}\n\n/** @internal */\nexport interface TLV1BaseAsset {\n\tid: string\n\ttype: string\n}\n\n/** @internal */\nexport type TLV1Asset = TLV1ImageAsset | TLV1VideoAsset\n\n/** @internal */\nexport interface TLV1Document {\n\tid: string\n\tname: string\n\tversion: number\n\tpages: Record<string, TLV1Page>\n\tpageStates: Record<string, TLV1PageState>\n\tassets: Record<string, TLV1Asset>\n}\n\n/* ------------------ Translations ------------------ */\n\nconst v1ColorsToV2Colors: Record<TLV1ColorStyle, TLDefaultColorStyle> = {\n\t[TLV1ColorStyle.White]: 'black',\n\t[TLV1ColorStyle.Black]: 'black',\n\t[TLV1ColorStyle.LightGray]: 'grey',\n\t[TLV1ColorStyle.Gray]: 'grey',\n\t[TLV1ColorStyle.Green]: 'light-green',\n\t[TLV1ColorStyle.Cyan]: 'green',\n\t[TLV1ColorStyle.Blue]: 'light-blue',\n\t[TLV1ColorStyle.Indigo]: 'blue',\n\t[TLV1ColorStyle.Orange]: 'orange',\n\t[TLV1ColorStyle.Yellow]: 'yellow',\n\t[TLV1ColorStyle.Red]: 'red',\n\t[TLV1ColorStyle.Violet]: 'light-violet',\n}\n\nconst v1FontsToV2Fonts: Record<TLV1FontStyle, TLDefaultFontStyle> = {\n\t[TLV1FontStyle.Mono]: 'mono',\n\t[TLV1FontStyle.Sans]: 'sans',\n\t[TLV1FontStyle.Script]: 'draw',\n\t[TLV1FontStyle.Serif]: 'serif',\n}\n\nconst v1AlignsToV2Aligns: Record<TLV1AlignStyle, TLDefaultHorizontalAlignStyle> = {\n\t[TLV1AlignStyle.Start]: 'start',\n\t[TLV1AlignStyle.Middle]: 'middle',\n\t[TLV1AlignStyle.End]: 'end',\n\t[TLV1AlignStyle.Justify]: 'start',\n}\n\nconst v1TextAlignsToV2TextAligns: Record<TLV1AlignStyle, TLDefaultTextAlignStyle> = {\n\t[TLV1AlignStyle.Start]: 'start',\n\t[TLV1AlignStyle.Middle]: 'middle',\n\t[TLV1AlignStyle.End]: 'end',\n\t[TLV1AlignStyle.Justify]: 'start',\n}\n\nconst v1TextSizesToV2TextSizes: Record<TLV1SizeStyle, TLDefaultSizeStyle> = {\n\t[TLV1SizeStyle.Small]: 's',\n\t[TLV1SizeStyle.Medium]: 'l',\n\t[TLV1SizeStyle.Large]: 'xl',\n}\n\nconst v1SizesToV2Sizes: Record<TLV1SizeStyle, TLDefaultSizeStyle> = {\n\t[TLV1SizeStyle.Small]: 'm',\n\t[TLV1SizeStyle.Medium]: 'l',\n\t[TLV1SizeStyle.Large]: 'xl',\n}\n\nconst v1DashesToV2Dashes: Record<TLV1DashStyle, TLDefaultDashStyle> = {\n\t[TLV1DashStyle.Solid]: 'solid',\n\t[TLV1DashStyle.Dashed]: 'dashed',\n\t[TLV1DashStyle.Dotted]: 'dotted',\n\t[TLV1DashStyle.Draw]: 'draw',\n}\n\nfunction getV2Color(color: TLV1ColorStyle | undefined): TLDefaultColorStyle {\n\treturn color ? (v1ColorsToV2Colors[color] ?? 'black') : 'black'\n}\n\nfunction getV2Font(font: TLV1FontStyle | undefined): TLDefaultFontStyle {\n\treturn font ? (v1FontsToV2Fonts[font] ?? 'draw') : 'draw'\n}\n\nfunction getV2Align(align: TLV1AlignStyle | undefined): TLDefaultHorizontalAlignStyle {\n\treturn align ? (v1AlignsToV2Aligns[align] ?? 'middle') : 'middle'\n}\n\nfunction getV2TextAlign(align: TLV1AlignStyle | undefined): TLDefaultTextAlignStyle {\n\treturn align ? (v1TextAlignsToV2TextAligns[align] ?? 'middle') : 'middle'\n}\n\nfunction getV2TextSize(size: TLV1SizeStyle | undefined): TLDefaultSizeStyle {\n\treturn size ? (v1TextSizesToV2TextSizes[size] ?? 'm') : 'm'\n}\n\nfunction getV2Size(size: TLV1SizeStyle | undefined): TLDefaultSizeStyle {\n\treturn size ? (v1SizesToV2Sizes[size] ?? 'l') : 'l'\n}\n\nfunction getV2Dash(dash: TLV1DashStyle | undefined): TLDefaultDashStyle {\n\treturn dash ? (v1DashesToV2Dashes[dash] ?? 'draw') : 'draw'\n}\n\nfunction getV2Point(point: number[]): VecModel {\n\treturn {\n\t\tx: coerceNumber(point[0]),\n\t\ty: coerceNumber(point[1]),\n\t\tz: point[2] == null ? 0.5 : coerceNumber(point[2]),\n\t}\n}\n\nfunction getV2Arrowhead(decoration: TLV1Decoration | undefined): TLArrowShapeArrowheadStyle {\n\treturn decoration === TLV1Decoration.Arrow ? 'arrow' : 'none'\n}\n\nfunction getV2Fill(isFilled: boolean | undefined, color: TLV1ColorStyle) {\n\treturn isFilled\n\t\t? color === TLV1ColorStyle.Black || color === TLV1ColorStyle.White\n\t\t\t? 'semi'\n\t\t\t: 'solid'\n\t\t: 'none'\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n\tAssetRecordType,\n\tEditor,\n\tPageRecordType,\n\tTLArrowShape,\n\tTLArrowShapeArrowheadStyle,\n\tTLAsset,\n\tTLAssetId,\n\tTLDefaultColorStyle,\n\tTLDefaultDashStyle,\n\tTLDefaultFontStyle,\n\tTLDefaultHorizontalAlignStyle,\n\tTLDefaultSizeStyle,\n\tTLDefaultTextAlignStyle,\n\tTLDrawShape,\n\tTLGeoShape,\n\tTLImageShape,\n\tTLNoteShape,\n\tTLPageId,\n\tTLShapeId,\n\tTLTextShape,\n\tTLVideoShape,\n\tVec,\n\tVecModel,\n\tclamp,\n\tcreateShapeId,\n\tfetch,\n\tstructuredClone,\n\ttoRichText,\n} from '@tldraw/editor'\nimport { getArrowBindings } from '../../shapes/arrow/shared'\n\nconst TLDRAW_V1_VERSION = 15.5\n\n/** @internal */\nexport function buildFromV1Document(editor: Editor, _document: unknown) {\n\tlet document = _document as TLV1Document\n\teditor.run(() => {\n\t\tdocument = migrate(document, TLDRAW_V1_VERSION)\n\t\t// Cancel any interactions / states\n\t\teditor.cancel().cancel().cancel().cancel()\n\n\t\tconst firstPageId = editor.getPages()[0].id\n\n\t\t// Set the current page to the first page\n\t\teditor.setCurrentPage(firstPageId)\n\n\t\t// Delete all pages except first page\n\t\tfor (const page of editor.getPages().slice(1)) {\n\t\t\teditor.deletePage(page.id)\n\t\t}\n\n\t\t// Delete all of the shapes on the current page\n\t\teditor.selectAll()\n\t\teditor.deleteShapes(editor.getSelectedShapeIds())\n\n\t\t// Create assets\n\t\tconst v1AssetIdsToV2AssetIds = new Map<string, TLAssetId>()\n\n\t\tObject.values(document.assets ?? {}).forEach((v1Asset) => {\n\t\t\tswitch (v1Asset.type) {\n\t\t\t\tcase TLV1AssetType.Image: {\n\t\t\t\t\tconst assetId: TLAssetId = AssetRecordType.createId()\n\t\t\t\t\tv1AssetIdsToV2AssetIds.set(v1Asset.id, assetId)\n\t\t\t\t\tconst placeholderAsset: TLAsset = {\n\t\t\t\t\t\tid: assetId,\n\t\t\t\t\t\ttypeName: 'asset',\n\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tw: coerceDimension(v1Asset.size[0]),\n\t\t\t\t\t\t\th: coerceDimension(v1Asset.size[1]),\n\t\t\t\t\t\t\tname: v1Asset.fileName ?? 'Untitled',\n\t\t\t\t\t\t\tisAnimated: false,\n\t\t\t\t\t\t\tmimeType: null,\n\t\t\t\t\t\t\tsrc: v1Asset.src,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t}\n\t\t\t\t\teditor.createAssets([placeholderAsset])\n\t\t\t\t\ttryMigrateAsset(editor, placeholderAsset)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase TLV1AssetType.Video:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst assetId: TLAssetId = AssetRecordType.createId()\n\t\t\t\t\t\tv1AssetIdsToV2AssetIds.set(v1Asset.id, assetId)\n\t\t\t\t\t\teditor.createAssets([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: assetId,\n\t\t\t\t\t\t\t\ttypeName: 'asset',\n\t\t\t\t\t\t\t\ttype: 'video',\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Asset.size[0]),\n\t\t\t\t\t\t\t\t\th: coerceDimension(v1Asset.size[1]),\n\t\t\t\t\t\t\t\t\tname: v1Asset.fileName ?? 'Untitled',\n\t\t\t\t\t\t\t\t\tisAnimated: true,\n\t\t\t\t\t\t\t\t\tmimeType: null,\n\t\t\t\t\t\t\t\t\tsrc: v1Asset.src,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t})\n\n\t\t// Create pages\n\n\t\tconst v1PageIdsToV2PageIds = new Map<string, TLPageId>()\n\n\t\tObject.values(document.pages ?? {})\n\t\t\t.sort((a, b) => ((a.childIndex ?? 1) < (b.childIndex ?? 1) ? -1 : 1))\n\t\t\t.forEach((v1Page, i) => {\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tv1PageIdsToV2PageIds.set(v1Page.id, editor.getCurrentPageId())\n\t\t\t\t} else {\n\t\t\t\t\tconst pageId = PageRecordType.createId()\n\t\t\t\t\tv1PageIdsToV2PageIds.set(v1Page.id, pageId)\n\t\t\t\t\teditor.createPage({ name: v1Page.name ?? 'Page', id: pageId })\n\t\t\t\t}\n\t\t\t})\n\n\t\tObject.values(document.pages ?? {})\n\t\t\t.sort((a, b) => ((a.childIndex ?? 1) < (b.childIndex ?? 1) ? -1 : 1))\n\t\t\t.forEach((v1Page) => {\n\t\t\t\t// Set the current page id to the current page\n\t\t\t\teditor.setCurrentPage(v1PageIdsToV2PageIds.get(v1Page.id)!)\n\n\t\t\t\tconst v1ShapeIdsToV2ShapeIds = new Map<string, TLShapeId>()\n\t\t\t\tconst v1GroupShapeIdsToV1ChildIds = new Map<string, string[]>()\n\n\t\t\t\tconst v1Shapes = Object.values(v1Page.shapes ?? {})\n\t\t\t\t\t.sort((a, b) => (a.childIndex < b.childIndex ? -1 : 1))\n\t\t\t\t\t.slice(0, editor.options.maxShapesPerPage)\n\n\t\t\t\t// Groups only\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\tif (v1Shape.type !== TLV1ShapeType.Group) return\n\n\t\t\t\t\tconst shapeId = createShapeId()\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.set(v1Shape.id, shapeId)\n\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.set(v1Shape.id, [])\n\t\t\t\t})\n\n\t\t\t\tfunction decideNotToCreateShape(v1Shape: TLV1Shape) {\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.delete(v1Shape.id)\n\t\t\t\t\tconst v1GroupParent = v1GroupShapeIdsToV1ChildIds.has(v1Shape.parentId)\n\t\t\t\t\tif (v1GroupParent) {\n\t\t\t\t\t\tconst ids = v1GroupShapeIdsToV1ChildIds\n\t\t\t\t\t\t\t.get(v1Shape.parentId)!\n\t\t\t\t\t\t\t.filter((id) => id !== v1Shape.id)\n\t\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.set(v1Shape.parentId, ids)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Non-groups only\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\t// Skip groups for now, we'll create groups via the app's API\n\t\t\t\t\tif (v1Shape.type === TLV1ShapeType.Group) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst shapeId = createShapeId()\n\t\t\t\t\tv1ShapeIdsToV2ShapeIds.set(v1Shape.id, shapeId)\n\n\t\t\t\t\tif (v1Shape.parentId !== v1Page.id) {\n\t\t\t\t\t\t// If the parent is a group, then add the shape to the group's children\n\t\t\t\t\t\tif (v1GroupShapeIdsToV1ChildIds.has(v1Shape.parentId)) {\n\t\t\t\t\t\t\tv1GroupShapeIdsToV1ChildIds.get(v1Shape.parentId)!.push(v1Shape.id)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('parent does not exist', v1Shape)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// First, try to find the shape's parent among the existing groups\n\t\t\t\t\tconst parentId = v1PageIdsToV2PageIds.get(v1Page.id)!\n\n\t\t\t\t\tconst inCommon = {\n\t\t\t\t\t\tid: shapeId,\n\t\t\t\t\t\tparentId,\n\t\t\t\t\t\tx: coerceNumber(v1Shape.point[0]),\n\t\t\t\t\t\ty: coerceNumber(v1Shape.point[1]),\n\t\t\t\t\t\trotation: 0,\n\t\t\t\t\t\tisLocked: !!v1Shape.isLocked,\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (v1Shape.type) {\n\t\t\t\t\t\tcase TLV1ShapeType.Sticky: {\n\t\t\t\t\t\t\teditor.createShapes<TLNoteShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'note',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.text ?? ''),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\talign: getV2Align(v1Shape.style.textAlign),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Rectangle: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'rectangle',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Triangle: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'triangle',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Ellipse: {\n\t\t\t\t\t\t\teditor.createShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tgeo: 'ellipse',\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.radius[0]) * 2,\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.radius[1]) * 2,\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\talign: 'middle',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tconst pageBoundsBeforeLabel = editor.getShapePageBounds(inCommon.id)!\n\n\t\t\t\t\t\t\teditor.updateShapes<TLGeoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.label ?? ''),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tif (pageBoundsBeforeLabel.width === pageBoundsBeforeLabel.height) {\n\t\t\t\t\t\t\t\tconst shape = editor.getShape<TLGeoShape>(inCommon.id)!\n\t\t\t\t\t\t\t\tconst { growY } = shape.props\n\t\t\t\t\t\t\t\tconst w = coerceDimension(shape.props.w)\n\t\t\t\t\t\t\t\tconst h = coerceDimension(shape.props.h)\n\t\t\t\t\t\t\t\tconst newW = w + growY / 2\n\t\t\t\t\t\t\t\tconst newH = h + growY / 2\n\n\t\t\t\t\t\t\t\teditor.updateShapes([\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: inCommon.id,\n\t\t\t\t\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\t\t\t\t\tx: coerceNumber(shape.x) - (newW - w) / 2,\n\t\t\t\t\t\t\t\t\t\ty: coerceNumber(shape.y) - (newH - h) / 2,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\tw: newW,\n\t\t\t\t\t\t\t\t\t\t\th: newH,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Draw: {\n\t\t\t\t\t\t\tif (v1Shape.points.length === 0) {\n\t\t\t\t\t\t\t\tdecideNotToCreateShape(v1Shape)\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLDrawShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'draw',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tfill: getV2Fill(v1Shape.style.isFilled, v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\tisPen: false,\n\t\t\t\t\t\t\t\t\t\tisComplete: v1Shape.isComplete,\n\t\t\t\t\t\t\t\t\t\tsegments: [{ type: 'free', points: v1Shape.points.map(getV2Point) }],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Arrow: {\n\t\t\t\t\t\t\tconst v1Bend = coerceNumber(v1Shape.bend)\n\t\t\t\t\t\t\tconst v1Start = getV2Point(v1Shape.handles.start.point)\n\t\t\t\t\t\t\tconst v1End = getV2Point(v1Shape.handles.end.point)\n\t\t\t\t\t\t\tconst dist = Vec.Dist(v1Start, v1End)\n\t\t\t\t\t\t\tconst v2Bend = (dist * -v1Bend) / 2\n\n\t\t\t\t\t\t\t// Could also be a line... but we'll use it as an arrow anyway\n\t\t\t\t\t\t\teditor.createShapes<TLArrowShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'arrow',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\ttext: v1Shape.label ?? '',\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tlabelColor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2Size(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\tdash: getV2Dash(v1Shape.style.dash),\n\t\t\t\t\t\t\t\t\t\tarrowheadStart: getV2Arrowhead(v1Shape.decorations?.start),\n\t\t\t\t\t\t\t\t\t\tarrowheadEnd: getV2Arrowhead(v1Shape.decorations?.end),\n\t\t\t\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\t\t\t\tx: coerceNumber(v1Shape.handles.start.point[0]),\n\t\t\t\t\t\t\t\t\t\t\ty: coerceNumber(v1Shape.handles.start.point[1]),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tend: {\n\t\t\t\t\t\t\t\t\t\t\tx: coerceNumber(v1Shape.handles.end.point[0]),\n\t\t\t\t\t\t\t\t\t\t\ty: coerceNumber(v1Shape.handles.end.point[1]),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tbend: v2Bend,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Text: {\n\t\t\t\t\t\t\teditor.createShapes<TLTextShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trichText: toRichText(v1Shape.text ?? ' '),\n\t\t\t\t\t\t\t\t\t\tcolor: getV2Color(v1Shape.style.color),\n\t\t\t\t\t\t\t\t\t\tsize: getV2TextSize(v1Shape.style.size),\n\t\t\t\t\t\t\t\t\t\tfont: getV2Font(v1Shape.style.font),\n\t\t\t\t\t\t\t\t\t\ttextAlign: getV2TextAlign(v1Shape.style.textAlign),\n\t\t\t\t\t\t\t\t\t\tscale: v1Shape.style.scale ?? 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Image: {\n\t\t\t\t\t\t\tconst assetId = v1AssetIdsToV2AssetIds.get(v1Shape.assetId)\n\n\t\t\t\t\t\t\tif (!assetId) {\n\t\t\t\t\t\t\t\tconsole.warn('Could not find asset id', v1Shape.assetId)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLImageShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase TLV1ShapeType.Video: {\n\t\t\t\t\t\t\tconst assetId = v1AssetIdsToV2AssetIds.get(v1Shape.assetId)\n\n\t\t\t\t\t\t\tif (!assetId) {\n\t\t\t\t\t\t\t\tconsole.warn('Could not find asset id', v1Shape.assetId)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.createShapes<TLVideoShape>([\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...inCommon,\n\t\t\t\t\t\t\t\t\ttype: 'video',\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\tw: coerceDimension(v1Shape.size[0]),\n\t\t\t\t\t\t\t\t\t\th: coerceDimension(v1Shape.size[1]),\n\t\t\t\t\t\t\t\t\t\tassetId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rotation = coerceNumber(v1Shape.rotation)\n\n\t\t\t\t\tif (rotation !== 0) {\n\t\t\t\t\t\teditor.select(shapeId)\n\t\t\t\t\t\teditor.rotateShapesBy([shapeId], rotation)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Create groups\n\t\t\t\tv1GroupShapeIdsToV1ChildIds.forEach((v1ChildIds, v1GroupId) => {\n\t\t\t\t\tconst v2ChildShapeIds = v1ChildIds.map((id) => v1ShapeIdsToV2ShapeIds.get(id)!)\n\t\t\t\t\tconst v2GroupId = v1ShapeIdsToV2ShapeIds.get(v1GroupId)!\n\t\t\t\t\teditor.groupShapes(v2ChildShapeIds, { groupId: v2GroupId })\n\n\t\t\t\t\tconst v1Group = v1Page.shapes[v1GroupId]\n\t\t\t\t\tconst rotation = coerceNumber(v1Group.rotation)\n\n\t\t\t\t\tif (rotation !== 0) {\n\t\t\t\t\t\teditor.select(v2GroupId)\n\t\t\t\t\t\teditor.rotateShapesBy([v2GroupId], rotation)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Bind arrows to shapes\n\n\t\t\t\tv1Shapes.forEach((v1Shape) => {\n\t\t\t\t\tif (v1Shape.type !== TLV1ShapeType.Arrow) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst v2ShapeId = v1ShapeIdsToV2ShapeIds.get(v1Shape.id)!\n\t\t\t\t\tconst util = editor.getShapeUtil<TLArrowShape>('arrow')\n\n\t\t\t\t\t// dumb but necessary\n\t\t\t\t\teditor.inputs.ctrlKey = false\n\n\t\t\t\t\tfor (const handleId of ['start', 'end'] as const) {\n\t\t\t\t\t\tconst bindingId = v1Shape.handles[handleId].bindingId\n\t\t\t\t\t\tif (bindingId) {\n\t\t\t\t\t\t\tconst binding = v1Page.bindings[bindingId]\n\t\t\t\t\t\t\tif (!binding) {\n\t\t\t\t\t\t\t\t// arrow has a reference to a binding that no longer exists\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst targetId = v1ShapeIdsToV2ShapeIds.get(binding.toId)!\n\n\t\t\t\t\t\t\tconst targetShape = editor.getShape(targetId)!\n\n\t\t\t\t\t\t\t// (unexpected) We didn't create the target shape\n\t\t\t\t\t\t\tif (!targetShape) continue\n\n\t\t\t\t\t\t\tif (targetId) {\n\t\t\t\t\t\t\t\tconst bounds = editor.getShapePageBounds(targetId)!\n\n\t\t\t\t\t\t\t\tconst v2ShapeFresh = editor.getShape<TLArrowShape>(v2ShapeId)!\n\n\t\t\t\t\t\t\t\tconst nx = clamp((coerceNumber(binding.point[0]) + 0.5) / 2, 0.2, 0.8)\n\t\t\t\t\t\t\t\tconst ny = clamp((coerceNumber(binding.point[1]) + 0.5) / 2, 0.2, 0.8)\n\n\t\t\t\t\t\t\t\tconst point = editor.getPointInShapeSpace(v2ShapeFresh, {\n\t\t\t\t\t\t\t\t\tx: bounds.minX + bounds.width * nx,\n\t\t\t\t\t\t\t\t\ty: bounds.minY + bounds.height * ny,\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tconst handles = editor.getShapeHandles(v2ShapeFresh)!\n\t\t\t\t\t\t\t\tconst change = util.onHandleDrag!(v2ShapeFresh, {\n\t\t\t\t\t\t\t\t\thandle: {\n\t\t\t\t\t\t\t\t\t\t...handles.find((h) => h.id === handleId)!,\n\t\t\t\t\t\t\t\t\t\tx: point.x,\n\t\t\t\t\t\t\t\t\t\ty: point.y,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tisPrecise: point.x !== 0.5 || point.y !== 0.5,\n\t\t\t\t\t\t\t\t\tisCreatingShape: true,\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tif (change) {\n\t\t\t\t\t\t\t\t\teditor.updateShape(change)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst freshBinding = getArrowBindings(\n\t\t\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\t\t\teditor.getShape<TLArrowShape>(v2ShapeId)!\n\t\t\t\t\t\t\t\t)[handleId]\n\t\t\t\t\t\t\t\tif (freshBinding) {\n\t\t\t\t\t\t\t\t\tconst updatedFreshBinding = structuredClone(freshBinding)\n\t\t\t\t\t\t\t\t\tif (binding.distance === 0) {\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.props.isExact = true\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (updatedFreshBinding.toId !== targetId) {\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.toId = targetId\n\t\t\t\t\t\t\t\t\t\tupdatedFreshBinding.props.normalizedAnchor = { x: nx, y: ny }\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\teditor.updateBinding(updatedFreshBinding)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t// Set the current page to the first page again\n\t\teditor.setCurrentPage(firstPageId)\n\n\t\teditor.clearHistory()\n\t\teditor.selectNone()\n\n\t\tconst bounds = editor.getCurrentPageBounds()\n\t\tif (bounds) {\n\t\t\teditor.zoomToBounds(bounds, { targetZoom: 1 })\n\t\t}\n\t})\n}\n\nfunction coerceNumber(n: unknown): number {\n\tif (typeof n !== 'number') return 0\n\tif (Number.isNaN(n)) return 0\n\tif (!Number.isFinite(n)) return 0\n\treturn n\n}\n\nfunction coerceDimension(d: unknown): number {\n\tconst n = coerceNumber(d)\n\tif (n <= 0) return 1\n\treturn n\n}\n\n/**\n * We want to move assets over to our new S3 bucket & extract any relevant metadata. That process is\n * async though, where the rest of our migration is synchronous.\n *\n * We'll write placeholder assets to the app using the old asset URLs, then kick off a process async\n * to try and download the real assets, extract the metadata, and upload them to our new bucket.\n * It's not a big deal if this fails though.\n */\nasync function tryMigrateAsset(editor: Editor, placeholderAsset: TLAsset) {\n\ttry {\n\t\tif (placeholderAsset.type === 'bookmark' || !placeholderAsset.props.src) return\n\n\t\tconst response = await fetch(placeholderAsset.props.src)\n\t\tif (!response.ok) return\n\n\t\tconst file = new File([await response.blob()], placeholderAsset.props.name, {\n\t\t\ttype: response.headers.get('content-type') ?? placeholderAsset.props.mimeType ?? undefined,\n\t\t})\n\n\t\tconst newAsset = await editor.getAssetForExternalContent({ type: 'file', file })\n\t\tif (!newAsset) throw new Error('Could not get asset for external content')\n\t\tif (newAsset.type === 'bookmark') return\n\n\t\teditor.updateAssets([\n\t\t\t{\n\t\t\t\tid: placeholderAsset.id,\n\t\t\t\ttype: placeholderAsset.type,\n\t\t\t\tprops: {\n\t\t\t\t\t...newAsset.props,\n\t\t\t\t\tname: placeholderAsset.props.name,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t} catch {\n\t\t// not a big deal, we'll just keep the placeholder asset\n\t}\n}\n\nfunction migrate(document: TLV1Document, newVersion: number): TLV1Document {\n\tconst { version = 0 } = document\n\n\tif (!document.assets) {\n\t\tdocument.assets = {}\n\t}\n\n\t// Remove unused assets when loading a document\n\tconst assetIdsInUse = new Set<string>()\n\n\tObject.values(document.pages).forEach((page) =>\n\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\tconst { parentId, children, assetId } = shape\n\n\t\t\tif (assetId) {\n\t\t\t\tassetIdsInUse.add(assetId)\n\t\t\t}\n\n\t\t\t// Fix missing parent bug\n\t\t\tif (parentId !== page.id && !page.shapes[parentId]) {\n\t\t\t\tconsole.warn('Encountered a shape with a missing parent!')\n\t\t\t\tshape.parentId = page.id\n\t\t\t}\n\n\t\t\tif (shape.type === TLV1ShapeType.Group && children) {\n\t\t\t\tchildren.forEach((childId) => {\n\t\t\t\t\tif (!page.shapes[childId]) {\n\t\t\t\t\t\tconsole.warn('Encountered a parent with a missing child!', shape.id, childId)\n\t\t\t\t\t\tchildren?.splice(children.indexOf(childId), 1)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// TODO: Remove the shape if it has no children\n\t\t\t}\n\t\t})\n\t)\n\n\tObject.keys(document.assets).forEach((assetId) => {\n\t\tif (!assetIdsInUse.has(assetId)) {\n\t\t\tdelete document.assets[assetId]\n\t\t}\n\t})\n\n\tif (version !== newVersion) {\n\t\tif (version < 14) {\n\t\t\tObject.values(document.pages).forEach((page) => {\n\t\t\t\tObject.values(page.shapes)\n\t\t\t\t\t.filter((shape) => shape.type === TLV1ShapeType.Text)\n\t\t\t\t\t.forEach((shape) => {\n\t\t\t\t\t\tif ((shape as TLV1TextShape).style.font === undefined) {\n\t\t\t\t\t\t\t;(shape as TLV1TextShape).style.font = TLV1FontStyle.Script\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\t// Lowercase styles, move binding meta to binding\n\t\tif (version <= 13) {\n\t\t\tObject.values(document.pages).forEach((page) => {\n\t\t\t\tObject.values(page.bindings).forEach((binding) => {\n\t\t\t\t\tObject.assign(binding, (binding as any).meta)\n\t\t\t\t})\n\n\t\t\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\t\t\tObject.entries(shape.style).forEach(([id, style]) => {\n\t\t\t\t\t\tif (typeof style === 'string') {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tshape.style[id] = style.toLowerCase()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tif (shape.type === TLV1ShapeType.Arrow) {\n\t\t\t\t\t\tif (shape.decorations) {\n\t\t\t\t\t\t\tObject.entries(shape.decorations).forEach(([id, decoration]) => {\n\t\t\t\t\t\t\t\tif ((decoration as unknown) === 'Arrow') {\n\t\t\t\t\t\t\t\t\tshape.decorations = {\n\t\t\t\t\t\t\t\t\t\t...shape.decorations,\n\t\t\t\t\t\t\t\t\t\t[id]: TLV1Decoration.Arrow,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\t// Add document name and file system handle\n\t\tif (version <= 13.1 && document.name == null) {\n\t\t\tdocument.name = 'New Document'\n\t\t}\n\n\t\tif (version < 15 && document.assets == null) {\n\t\t\tdocument.assets = {}\n\t\t}\n\n\t\tObject.values(document.pages).forEach((page) => {\n\t\t\tObject.values(page.shapes).forEach((shape) => {\n\t\t\t\tif (version < 15.2) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(shape.type === TLV1ShapeType.Image || shape.type === TLV1ShapeType.Video) &&\n\t\t\t\t\t\tshape.style.isFilled == null\n\t\t\t\t\t) {\n\t\t\t\t\t\tshape.style.isFilled = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (version < 15.3) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Rectangle ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Triangle ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Ellipse ||\n\t\t\t\t\t\tshape.type === TLV1ShapeType.Arrow\n\t\t\t\t\t) {\n\t\t\t\t\t\tif ('text' in shape && typeof shape.text === 'string') {\n\t\t\t\t\t\t\tshape.label = shape.text\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shape.label) {\n\t\t\t\t\t\t\tshape.label = ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!shape.labelPoint) {\n\t\t\t\t\t\t\tshape.labelPoint = [0.5, 0.5]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// Cleanup\n\tObject.values(document.pageStates).forEach((pageState) => {\n\t\tpageState.selectedIds = pageState.selectedIds.filter((id) => {\n\t\t\treturn document.pages[pageState.id].shapes[id] !== undefined\n\t\t})\n\t\tpageState.bindingId = undefined\n\t\tpageState.editingId = undefined\n\t\tpageState.hoveredId = undefined\n\t\tpageState.pointedId = undefined\n\t})\n\n\tdocument.version = newVersion\n\n\treturn document\n}\n\n/* -------------------- TLV1 Types -------------------- */\n\n/** @internal */\nexport interface TLV1Handle {\n\tid: string\n\tindex: number\n\tpoint: number[]\n\tcanBind?: boolean\n\tbindingId?: string\n}\n\n/** @internal */\nexport interface TLV1BaseBinding {\n\tid: string\n\ttoId: string\n\tfromId: string\n}\n\n/** @internal */\nexport enum TLV1ShapeType {\n\tSticky = 'sticky',\n\tEllipse = 'ellipse',\n\tRectangle = 'rectangle',\n\tTriangle = 'triangle',\n\tDraw = 'draw',\n\tArrow = 'arrow',\n\tText = 'text',\n\tGroup = 'group',\n\tImage = 'image',\n\tVideo = 'video',\n}\n\n/** @internal */\nexport enum TLV1ColorStyle {\n\tWhite = 'white',\n\tLightGray = 'lightGray',\n\tGray = 'gray',\n\tBlack = 'black',\n\tGreen = 'green',\n\tCyan = 'cyan',\n\tBlue = 'blue',\n\tIndigo = 'indigo',\n\tViolet = 'violet',\n\tRed = 'red',\n\tOrange = 'orange',\n\tYellow = 'yellow',\n}\n\n/** @internal */\nexport enum TLV1SizeStyle {\n\tSmall = 'small',\n\tMedium = 'medium',\n\tLarge = 'large',\n}\n\n/** @internal */\nexport enum TLV1DashStyle {\n\tDraw = 'draw',\n\tSolid = 'solid',\n\tDashed = 'dashed',\n\tDotted = 'dotted',\n}\n\n/** @internal */\nexport enum TLV1AlignStyle {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n\tJustify = 'justify',\n}\n\n/** @internal */\nexport enum TLV1FontStyle {\n\tScript = 'script',\n\tSans = 'sans',\n\tSerif = 'serif',\n\tMono = 'mono',\n}\n\n/** @internal */\nexport interface TLV1ShapeStyles {\n\tcolor: TLV1ColorStyle\n\tsize: TLV1SizeStyle\n\tdash: TLV1DashStyle\n\tfont?: TLV1FontStyle\n\ttextAlign?: TLV1AlignStyle\n\tisFilled?: boolean\n\tscale?: number\n}\n\n/** @internal */\nexport interface TLV1BaseShape {\n\tid: string\n\tparentId: string\n\tchildIndex: number\n\tname: string\n\tpoint: number[]\n\tassetId?: string\n\trotation?: number\n\tchildren?: string[]\n\tisGhost?: boolean\n\tisHidden?: boolean\n\tisLocked?: boolean\n\tisGenerated?: boolean\n\tisAspectRatioLocked?: boolean\n\tstyle: TLV1ShapeStyles\n\ttype: TLV1ShapeType\n\tlabel?: string\n\thandles?: Record<string, TLV1Handle>\n}\n\n/** @internal */\nexport interface TLV1DrawShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Draw\n\tpoints: number[][]\n\tisComplete: boolean\n}\n\n/** @internal */\nexport interface TLV1RectangleShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Rectangle\n\tsize: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1EllipseShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Ellipse\n\tradius: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1TriangleShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Triangle\n\tsize: number[]\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport enum TLV1Decoration {\n\tArrow = 'arrow',\n}\n\n// The shape created with the arrow tool\n/** @internal */\nexport interface TLV1ArrowShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Arrow\n\tbend: number\n\thandles: {\n\t\tstart: TLV1Handle\n\t\tbend: TLV1Handle\n\t\tend: TLV1Handle\n\t}\n\tdecorations?: {\n\t\tstart?: TLV1Decoration\n\t\tend?: TLV1Decoration\n\t\tmiddle?: TLV1Decoration\n\t}\n\tlabel?: string\n\tlabelPoint?: number[]\n}\n\n/** @internal */\nexport interface TLV1ArrowBinding extends TLV1BaseBinding {\n\thandleId: keyof TLV1ArrowShape['handles']\n\tdistance: number\n\tpoint: number[]\n}\n\n/** @internal */\nexport type TLV1Binding = TLV1ArrowBinding\n\n/** @internal */\nexport interface TLV1ImageShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Image\n\tsize: number[]\n\tassetId: string\n}\n\n/** @internal */\nexport interface TLV1VideoShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Video\n\tsize: number[]\n\tassetId: string\n\tisPlaying: boolean\n\tcurrentTime: number\n}\n\n// The shape created by the text tool\n/** @internal */\nexport interface TLV1TextShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Text\n\ttext: string\n}\n\n// The shape created by the sticky tool\n/** @internal */\nexport interface TLV1StickyShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Sticky\n\tsize: number[]\n\ttext: string\n}\n\n// The shape created when multiple shapes are grouped\n/** @internal */\nexport interface TLV1GroupShape extends TLV1BaseShape {\n\ttype: TLV1ShapeType.Group\n\tsize: number[]\n\tchildren: string[]\n}\n\n/** @internal */\nexport type TLV1Shape =\n\t| TLV1RectangleShape\n\t| TLV1EllipseShape\n\t| TLV1TriangleShape\n\t| TLV1DrawShape\n\t| TLV1ArrowShape\n\t| TLV1TextShape\n\t| TLV1GroupShape\n\t| TLV1StickyShape\n\t| TLV1ImageShape\n\t| TLV1VideoShape\n\n/** @internal */\nexport interface TLV1Page {\n\tid: string\n\tname?: string\n\tchildIndex?: number\n\tshapes: Record<string, TLV1Shape>\n\tbindings: Record<string, TLV1Binding>\n}\n\n/** @internal */\nexport interface TLV1Bounds {\n\tminX: number\n\tminY: number\n\tmaxX: number\n\tmaxY: number\n\twidth: number\n\theight: number\n\trotation?: number\n}\n\n/** @internal */\nexport interface TLV1PageState {\n\tid: string\n\tselectedIds: string[]\n\tcamera: {\n\t\tpoint: number[]\n\t\tzoom: number\n\t}\n\tbrush?: TLV1Bounds | null\n\tpointedId?: string | null\n\thoveredId?: string | null\n\teditingId?: string | null\n\tbindingId?: string | null\n}\n\n/** @internal */\nexport enum TLV1AssetType {\n\tImage = 'image',\n\tVideo = 'video',\n}\n\n/** @internal */\nexport interface TLV1ImageAsset extends TLV1BaseAsset {\n\ttype: TLV1AssetType.Image\n\tfileName: string\n\tsrc: string\n\tsize: number[]\n}\n\n/** @internal */\nexport interface TLV1VideoAsset extends TLV1BaseAsset {\n\ttype: TLV1AssetType.Video\n\tfileName: string\n\tsrc: string\n\tsize: number[]\n}\n\n/** @internal */\nexport interface TLV1BaseAsset {\n\tid: string\n\ttype: string\n}\n\n/** @internal */\nexport type TLV1Asset = TLV1ImageAsset | TLV1VideoAsset\n\n/** @internal */\nexport interface TLV1Document {\n\tid: string\n\tname: string\n\tversion: number\n\tpages: Record<string, TLV1Page>\n\tpageStates: Record<string, TLV1PageState>\n\tassets: Record<string, TLV1Asset>\n}\n\n/* ------------------ Translations ------------------ */\n\nconst v1ColorsToV2Colors: Record<TLV1ColorStyle, TLDefaultColorStyle> = {\n\t[TLV1ColorStyle.White]: 'black',\n\t[TLV1ColorStyle.Black]: 'black',\n\t[TLV1ColorStyle.LightGray]: 'grey',\n\t[TLV1ColorStyle.Gray]: 'grey',\n\t[TLV1ColorStyle.Green]: 'light-green',\n\t[TLV1ColorStyle.Cyan]: 'green',\n\t[TLV1ColorStyle.Blue]: 'light-blue',\n\t[TLV1ColorStyle.Indigo]: 'blue',\n\t[TLV1ColorStyle.Orange]: 'orange',\n\t[TLV1ColorStyle.Yellow]: 'yellow',\n\t[TLV1ColorStyle.Red]: 'red',\n\t[TLV1ColorStyle.Violet]: 'light-violet',\n}\n\nconst v1FontsToV2Fonts: Record<TLV1FontStyle, TLDefaultFontStyle> = {\n\t[TLV1FontStyle.Mono]: 'mono',\n\t[TLV1FontStyle.Sans]: 'sans',\n\t[TLV1FontStyle.Script]: 'draw',\n\t[TLV1FontStyle.Serif]: 'serif',\n}\n\nconst v1AlignsToV2Aligns: Record<TLV1AlignStyle, TLDefaultHorizontalAlignStyle> = {\n\t[TLV1AlignStyle.Start]: 'start',\n\t[TLV1AlignStyle.Middle]: 'middle',\n\t[TLV1AlignStyle.End]: 'end',\n\t[TLV1AlignStyle.Justify]: 'start',\n}\n\nconst v1TextAlignsToV2TextAligns: Record<TLV1AlignStyle, TLDefaultTextAlignStyle> = {\n\t[TLV1AlignStyle.Start]: 'start',\n\t[TLV1AlignStyle.Middle]: 'middle',\n\t[TLV1AlignStyle.End]: 'end',\n\t[TLV1AlignStyle.Justify]: 'start',\n}\n\nconst v1TextSizesToV2TextSizes: Record<TLV1SizeStyle, TLDefaultSizeStyle> = {\n\t[TLV1SizeStyle.Small]: 's',\n\t[TLV1SizeStyle.Medium]: 'l',\n\t[TLV1SizeStyle.Large]: 'xl',\n}\n\nconst v1SizesToV2Sizes: Record<TLV1SizeStyle, TLDefaultSizeStyle> = {\n\t[TLV1SizeStyle.Small]: 'm',\n\t[TLV1SizeStyle.Medium]: 'l',\n\t[TLV1SizeStyle.Large]: 'xl',\n}\n\nconst v1DashesToV2Dashes: Record<TLV1DashStyle, TLDefaultDashStyle> = {\n\t[TLV1DashStyle.Solid]: 'solid',\n\t[TLV1DashStyle.Dashed]: 'dashed',\n\t[TLV1DashStyle.Dotted]: 'dotted',\n\t[TLV1DashStyle.Draw]: 'draw',\n}\n\nfunction getV2Color(color: TLV1ColorStyle | undefined): TLDefaultColorStyle {\n\treturn color ? (v1ColorsToV2Colors[color] ?? 'black') : 'black'\n}\n\nfunction getV2Font(font: TLV1FontStyle | undefined): TLDefaultFontStyle {\n\treturn font ? (v1FontsToV2Fonts[font] ?? 'draw') : 'draw'\n}\n\nfunction getV2Align(align: TLV1AlignStyle | undefined): TLDefaultHorizontalAlignStyle {\n\treturn align ? (v1AlignsToV2Aligns[align] ?? 'middle') : 'middle'\n}\n\nfunction getV2TextAlign(align: TLV1AlignStyle | undefined): TLDefaultTextAlignStyle {\n\treturn align ? (v1TextAlignsToV2TextAligns[align] ?? 'middle') : 'middle'\n}\n\nfunction getV2TextSize(size: TLV1SizeStyle | undefined): TLDefaultSizeStyle {\n\treturn size ? (v1TextSizesToV2TextSizes[size] ?? 'm') : 'm'\n}\n\nfunction getV2Size(size: TLV1SizeStyle | undefined): TLDefaultSizeStyle {\n\treturn size ? (v1SizesToV2Sizes[size] ?? 'l') : 'l'\n}\n\nfunction getV2Dash(dash: TLV1DashStyle | undefined): TLDefaultDashStyle {\n\treturn dash ? (v1DashesToV2Dashes[dash] ?? 'draw') : 'draw'\n}\n\nfunction getV2Point(point: number[]): VecModel {\n\treturn {\n\t\tx: coerceNumber(point[0]),\n\t\ty: coerceNumber(point[1]),\n\t\tz: point[2] == null ? 0.5 : coerceNumber(point[2]),\n\t}\n}\n\nfunction getV2Arrowhead(decoration: TLV1Decoration | undefined): TLArrowShapeArrowheadStyle {\n\treturn decoration === TLV1Decoration.Arrow ? 'arrow' : 'none'\n}\n\nfunction getV2Fill(isFilled: boolean | undefined, color: TLV1ColorStyle) {\n\treturn isFilled\n\t\t? color === TLV1ColorStyle.Black || color === TLV1ColorStyle.White\n\t\t\t? 'semi'\n\t\t\t: 'solid'\n\t\t: 'none'\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACC;AAAA,EAEA;AAAA,EAmBA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,wBAAwB;AAEjC,MAAM,oBAAoB;AAGnB,SAAS,oBAAoB,QAAgB,WAAoB;AACvE,MAAI,WAAW;AACf,SAAO,IAAI,MAAM;AAChB,eAAW,QAAQ,UAAU,iBAAiB;AAE9C,WAAO,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;AAEzC,UAAM,cAAc,OAAO,SAAS,EAAE,CAAC,EAAE;AAGzC,WAAO,eAAe,WAAW;AAGjC,eAAW,QAAQ,OAAO,SAAS,EAAE,MAAM,CAAC,GAAG;AAC9C,aAAO,WAAW,KAAK,EAAE;AAAA,IAC1B;AAGA,WAAO,UAAU;AACjB,WAAO,aAAa,OAAO,oBAAoB,CAAC;AAGhD,UAAM,yBAAyB,oBAAI,IAAuB;AAE1D,WAAO,OAAO,SAAS,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY;AACzD,cAAQ,QAAQ,MAAM;AAAA,QACrB,KAAK,qBAAqB;AACzB,gBAAM,UAAqB,gBAAgB,SAAS;AACpD,iCAAuB,IAAI,QAAQ,IAAI,OAAO;AAC9C,gBAAM,mBAA4B;AAAA,YACjC,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,cACN,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,cAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,cAClC,MAAM,QAAQ,YAAY;AAAA,cAC1B,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,KAAK,QAAQ;AAAA,YACd;AAAA,YACA,MAAM,CAAC;AAAA,UACR;AACA,iBAAO,aAAa,CAAC,gBAAgB,CAAC;AACtC,0BAAgB,QAAQ,gBAAgB;AACxC;AAAA,QACD;AAAA,QACA,KAAK;AACJ;AACC,kBAAM,UAAqB,gBAAgB,SAAS;AACpD,mCAAuB,IAAI,QAAQ,IAAI,OAAO;AAC9C,mBAAO,aAAa;AAAA,cACnB;AAAA,gBACC,IAAI;AAAA,gBACJ,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,MAAM,QAAQ,YAAY;AAAA,kBAC1B,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,KAAK,QAAQ;AAAA,gBACd;AAAA,gBACA,MAAM,CAAC;AAAA,cACR;AAAA,YACD,CAAC;AAAA,UACF;AACA;AAAA,MACF;AAAA,IACD,CAAC;AAID,UAAM,uBAAuB,oBAAI,IAAsB;AAEvD,WAAO,OAAO,SAAS,SAAS,CAAC,CAAC,EAChC,KAAK,CAAC,GAAG,OAAQ,EAAE,cAAc,MAAM,EAAE,cAAc,KAAK,KAAK,CAAE,EACnE,QAAQ,CAAC,QAAQ,MAAM;AACvB,UAAI,MAAM,GAAG;AACZ,6BAAqB,IAAI,OAAO,IAAI,OAAO,iBAAiB,CAAC;AAAA,MAC9D,OAAO;AACN,cAAM,SAAS,eAAe,SAAS;AACvC,6BAAqB,IAAI,OAAO,IAAI,MAAM;AAC1C,eAAO,WAAW,EAAE,MAAM,OAAO,QAAQ,QAAQ,IAAI,OAAO,CAAC;AAAA,MAC9D;AAAA,IACD,CAAC;AAEF,WAAO,OAAO,SAAS,SAAS,CAAC,CAAC,EAChC,KAAK,CAAC,GAAG,OAAQ,EAAE,cAAc,MAAM,EAAE,cAAc,KAAK,KAAK,CAAE,EACnE,QAAQ,CAAC,WAAW;AAEpB,aAAO,eAAe,qBAAqB,IAAI,OAAO,EAAE,CAAE;AAE1D,YAAM,yBAAyB,oBAAI,IAAuB;AAC1D,YAAM,8BAA8B,oBAAI,IAAsB;AAE9D,YAAM,WAAW,OAAO,OAAO,OAAO,UAAU,CAAC,CAAC,EAChD,KAAK,CAAC,GAAG,MAAO,EAAE,aAAa,EAAE,aAAa,KAAK,CAAE,EACrD,MAAM,GAAG,OAAO,QAAQ,gBAAgB;AAG1C,eAAS,QAAQ,CAAC,YAAY;AAC7B,YAAI,QAAQ,SAAS,oBAAqB;AAE1C,cAAM,UAAU,cAAc;AAC9B,+BAAuB,IAAI,QAAQ,IAAI,OAAO;AAC9C,oCAA4B,IAAI,QAAQ,IAAI,CAAC,CAAC;AAAA,MAC/C,CAAC;AAED,eAAS,uBAAuB,SAAoB;AACnD,+BAAuB,OAAO,QAAQ,EAAE;AACxC,cAAM,gBAAgB,4BAA4B,IAAI,QAAQ,QAAQ;AACtE,YAAI,eAAe;AAClB,gBAAM,MAAM,4BACV,IAAI,QAAQ,QAAQ,EACpB,OAAO,CAAC,OAAO,OAAO,QAAQ,EAAE;AAClC,sCAA4B,IAAI,QAAQ,UAAU,GAAG;AAAA,QACtD;AAAA,MACD;AAGA,eAAS,QAAQ,CAAC,YAAY;AAE7B,YAAI,QAAQ,SAAS,qBAAqB;AACzC;AAAA,QACD;AAEA,cAAM,UAAU,cAAc;AAC9B,+BAAuB,IAAI,QAAQ,IAAI,OAAO;AAE9C,YAAI,QAAQ,aAAa,OAAO,IAAI;AAEnC,cAAI,4BAA4B,IAAI,QAAQ,QAAQ,GAAG;AACtD,wCAA4B,IAAI,QAAQ,QAAQ,EAAG,KAAK,QAAQ,EAAE;AAAA,UACnE,OAAO;AACN,oBAAQ,KAAK,yBAAyB,OAAO;AAAA,UAC9C;AAAA,QACD;AAGA,cAAM,WAAW,qBAAqB,IAAI,OAAO,EAAE;AAEnD,cAAM,WAAW;AAAA,UAChB,IAAI;AAAA,UACJ;AAAA,UACA,GAAG,aAAa,QAAQ,MAAM,CAAC,CAAC;AAAA,UAChC,GAAG,aAAa,QAAQ,MAAM,CAAC,CAAC;AAAA,UAChC,UAAU;AAAA,UACV,UAAU,CAAC,CAAC,QAAQ;AAAA,QACrB;AAEA,gBAAQ,QAAQ,MAAM;AAAA,UACrB,KAAK,uBAAsB;AAC1B,mBAAO,aAA0B;AAAA,cAChC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,UAAU,WAAW,QAAQ,QAAQ,EAAE;AAAA,kBACvC,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,OAAO,WAAW,QAAQ,MAAM,SAAS;AAAA,gBAC1C;AAAA,cACD;AAAA,YACD,CAAC;AACD;AAAA,UACD;AAAA,UACA,KAAK,6BAAyB;AAC7B,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,KAAK;AAAA,kBACL,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,UAAU,WAAW,QAAQ,SAAS,EAAE;AAAA,kBACxC,MAAM,UAAU,QAAQ,MAAM,UAAU,QAAQ,MAAM,KAAK;AAAA,kBAC3D,YAAY,WAAW,QAAQ,MAAM,KAAK;AAAA,kBAC1C,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,OAAO;AAAA,gBACR;AAAA,cACD;AAAA,YACD,CAAC;AAED,kBAAM,wBAAwB,OAAO,mBAAmB,SAAS,EAAE;AAEnE,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,IAAI,SAAS;AAAA,gBACb,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,UAAU,WAAW,QAAQ,SAAS,EAAE;AAAA,gBACzC;AAAA,cACD;AAAA,YACD,CAAC;AAED,gBAAI,sBAAsB,UAAU,sBAAsB,QAAQ;AACjE,oBAAM,QAAQ,OAAO,SAAqB,SAAS,EAAE;AACrD,oBAAM,EAAE,MAAM,IAAI,MAAM;AACxB,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,OAAO,IAAI,QAAQ;AACzB,oBAAM,OAAO,IAAI,QAAQ;AAEzB,qBAAO,aAAa;AAAA,gBACnB;AAAA,kBACC,IAAI,SAAS;AAAA,kBACb,MAAM;AAAA,kBACN,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,OAAO;AAAA,oBACN,GAAG;AAAA,oBACH,GAAG;AAAA,kBACJ;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AACA;AAAA,UACD;AAAA,UACA,KAAK,2BAAwB;AAC5B,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,KAAK;AAAA,kBACL,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,UAAU,QAAQ,MAAM,KAAK;AAAA,kBAC3D,YAAY,WAAW,QAAQ,MAAM,KAAK;AAAA,kBAC1C,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,OAAO;AAAA,gBACR;AAAA,cACD;AAAA,YACD,CAAC;AAED,kBAAM,wBAAwB,OAAO,mBAAmB,SAAS,EAAE;AAEnE,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,IAAI,SAAS;AAAA,gBACb,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,UAAU,WAAW,QAAQ,SAAS,EAAE;AAAA,gBACzC;AAAA,cACD;AAAA,YACD,CAAC;AAED,gBAAI,sBAAsB,UAAU,sBAAsB,QAAQ;AACjE,oBAAM,QAAQ,OAAO,SAAqB,SAAS,EAAE;AACrD,oBAAM,EAAE,MAAM,IAAI,MAAM;AACxB,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,OAAO,IAAI,QAAQ;AACzB,oBAAM,OAAO,IAAI,QAAQ;AAEzB,qBAAO,aAAa;AAAA,gBACnB;AAAA,kBACC,IAAI,SAAS;AAAA,kBACb,MAAM;AAAA,kBACN,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,OAAO;AAAA,oBACN,GAAG;AAAA,oBACH,GAAG;AAAA,kBACJ;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AACA;AAAA,UACD;AAAA,UACA,KAAK,yBAAuB;AAC3B,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,KAAK;AAAA,kBACL,GAAG,gBAAgB,QAAQ,OAAO,CAAC,CAAC,IAAI;AAAA,kBACxC,GAAG,gBAAgB,QAAQ,OAAO,CAAC,CAAC,IAAI;AAAA,kBACxC,MAAM,UAAU,QAAQ,MAAM,UAAU,QAAQ,MAAM,KAAK;AAAA,kBAC3D,YAAY,WAAW,QAAQ,MAAM,KAAK;AAAA,kBAC1C,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,OAAO;AAAA,gBACR;AAAA,cACD;AAAA,YACD,CAAC;AAED,kBAAM,wBAAwB,OAAO,mBAAmB,SAAS,EAAE;AAEnE,mBAAO,aAAyB;AAAA,cAC/B;AAAA,gBACC,IAAI,SAAS;AAAA,gBACb,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,UAAU,WAAW,QAAQ,SAAS,EAAE;AAAA,gBACzC;AAAA,cACD;AAAA,YACD,CAAC;AAED,gBAAI,sBAAsB,UAAU,sBAAsB,QAAQ;AACjE,oBAAM,QAAQ,OAAO,SAAqB,SAAS,EAAE;AACrD,oBAAM,EAAE,MAAM,IAAI,MAAM;AACxB,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,IAAI,gBAAgB,MAAM,MAAM,CAAC;AACvC,oBAAM,OAAO,IAAI,QAAQ;AACzB,oBAAM,OAAO,IAAI,QAAQ;AAEzB,qBAAO,aAAa;AAAA,gBACnB;AAAA,kBACC,IAAI,SAAS;AAAA,kBACb,MAAM;AAAA,kBACN,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,GAAG,aAAa,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,kBACxC,OAAO;AAAA,oBACN,GAAG;AAAA,oBACH,GAAG;AAAA,kBACJ;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AAEA;AAAA,UACD;AAAA,UACA,KAAK,mBAAoB;AACxB,gBAAI,QAAQ,OAAO,WAAW,GAAG;AAChC,qCAAuB,OAAO;AAC9B;AAAA,YACD;AAEA,mBAAO,aAA0B;AAAA,cAChC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,MAAM,UAAU,QAAQ,MAAM,UAAU,QAAQ,MAAM,KAAK;AAAA,kBAC3D,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,OAAO;AAAA,kBACP,YAAY,QAAQ;AAAA,kBACpB,UAAU,CAAC,EAAE,MAAM,QAAQ,QAAQ,QAAQ,OAAO,IAAI,UAAU,EAAE,CAAC;AAAA,gBACpE;AAAA,cACD;AAAA,YACD,CAAC;AACD;AAAA,UACD;AAAA,UACA,KAAK,qBAAqB;AACzB,kBAAM,SAAS,aAAa,QAAQ,IAAI;AACxC,kBAAM,UAAU,WAAW,QAAQ,QAAQ,MAAM,KAAK;AACtD,kBAAM,QAAQ,WAAW,QAAQ,QAAQ,IAAI,KAAK;AAClD,kBAAM,OAAO,IAAI,KAAK,SAAS,KAAK;AACpC,kBAAM,SAAU,OAAO,CAAC,SAAU;AAGlC,mBAAO,aAA2B;AAAA,cACjC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,MAAM,QAAQ,SAAS;AAAA,kBACvB,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,YAAY,WAAW,QAAQ,MAAM,KAAK;AAAA,kBAC1C,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,gBAAgB,eAAe,QAAQ,aAAa,KAAK;AAAA,kBACzD,cAAc,eAAe,QAAQ,aAAa,GAAG;AAAA,kBACrD,OAAO;AAAA,oBACN,GAAG,aAAa,QAAQ,QAAQ,MAAM,MAAM,CAAC,CAAC;AAAA,oBAC9C,GAAG,aAAa,QAAQ,QAAQ,MAAM,MAAM,CAAC,CAAC;AAAA,kBAC/C;AAAA,kBACA,KAAK;AAAA,oBACJ,GAAG,aAAa,QAAQ,QAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,oBAC5C,GAAG,aAAa,QAAQ,QAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,kBAC7C;AAAA,kBACA,MAAM;AAAA,gBACP;AAAA,cACD;AAAA,YACD,CAAC;AAED;AAAA,UACD;AAAA,UACA,KAAK,mBAAoB;AACxB,mBAAO,aAA0B;AAAA,cAChC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,UAAU,WAAW,QAAQ,QAAQ,GAAG;AAAA,kBACxC,OAAO,WAAW,QAAQ,MAAM,KAAK;AAAA,kBACrC,MAAM,cAAc,QAAQ,MAAM,IAAI;AAAA,kBACtC,MAAM,UAAU,QAAQ,MAAM,IAAI;AAAA,kBAClC,WAAW,eAAe,QAAQ,MAAM,SAAS;AAAA,kBACjD,OAAO,QAAQ,MAAM,SAAS;AAAA,gBAC/B;AAAA,cACD;AAAA,YACD,CAAC;AACD;AAAA,UACD;AAAA,UACA,KAAK,qBAAqB;AACzB,kBAAM,UAAU,uBAAuB,IAAI,QAAQ,OAAO;AAE1D,gBAAI,CAAC,SAAS;AACb,sBAAQ,KAAK,2BAA2B,QAAQ,OAAO;AACvD;AAAA,YACD;AAEA,mBAAO,aAA2B;AAAA,cACjC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC;AAAA,gBACD;AAAA,cACD;AAAA,YACD,CAAC;AACD;AAAA,UACD;AAAA,UACA,KAAK,qBAAqB;AACzB,kBAAM,UAAU,uBAAuB,IAAI,QAAQ,OAAO;AAE1D,gBAAI,CAAC,SAAS;AACb,sBAAQ,KAAK,2BAA2B,QAAQ,OAAO;AACvD;AAAA,YACD;AAEA,mBAAO,aAA2B;AAAA,cACjC;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM;AAAA,gBACN,OAAO;AAAA,kBACN,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAAA,kBAClC;AAAA,gBACD;AAAA,cACD;AAAA,YACD,CAAC;AACD;AAAA,UACD;AAAA,QACD;AAEA,cAAM,WAAW,aAAa,QAAQ,QAAQ;AAE9C,YAAI,aAAa,GAAG;AACnB,iBAAO,OAAO,OAAO;AACrB,iBAAO,eAAe,CAAC,OAAO,GAAG,QAAQ;AAAA,QAC1C;AAAA,MACD,CAAC;AAGD,kCAA4B,QAAQ,CAAC,YAAY,cAAc;AAC9D,cAAM,kBAAkB,WAAW,IAAI,CAAC,OAAO,uBAAuB,IAAI,EAAE,CAAE;AAC9E,cAAM,YAAY,uBAAuB,IAAI,SAAS;AACtD,eAAO,YAAY,iBAAiB,EAAE,SAAS,UAAU,CAAC;AAE1D,cAAM,UAAU,OAAO,OAAO,SAAS;AACvC,cAAM,WAAW,aAAa,QAAQ,QAAQ;AAE9C,YAAI,aAAa,GAAG;AACnB,iBAAO,OAAO,SAAS;AACvB,iBAAO,eAAe,CAAC,SAAS,GAAG,QAAQ;AAAA,QAC5C;AAAA,MACD,CAAC;AAID,eAAS,QAAQ,CAAC,YAAY;AAC7B,YAAI,QAAQ,SAAS,qBAAqB;AACzC;AAAA,QACD;AAEA,cAAM,YAAY,uBAAuB,IAAI,QAAQ,EAAE;AACvD,cAAM,OAAO,OAAO,aAA2B,OAAO;AAGtD,eAAO,OAAO,UAAU;AAExB,mBAAW,YAAY,CAAC,SAAS,KAAK,GAAY;AACjD,gBAAM,YAAY,QAAQ,QAAQ,QAAQ,EAAE;AAC5C,cAAI,WAAW;AACd,kBAAM,UAAU,OAAO,SAAS,SAAS;AACzC,gBAAI,CAAC,SAAS;AAEb;AAAA,YACD;AAEA,kBAAM,WAAW,uBAAuB,IAAI,QAAQ,IAAI;AAExD,kBAAM,cAAc,OAAO,SAAS,QAAQ;AAG5C,gBAAI,CAAC,YAAa;AAElB,gBAAI,UAAU;AACb,oBAAMA,UAAS,OAAO,mBAAmB,QAAQ;AAEjD,oBAAM,eAAe,OAAO,SAAuB,SAAS;AAE5D,oBAAM,KAAK,OAAO,aAAa,QAAQ,MAAM,CAAC,CAAC,IAAI,OAAO,GAAG,KAAK,GAAG;AACrE,oBAAM,KAAK,OAAO,aAAa,QAAQ,MAAM,CAAC,CAAC,IAAI,OAAO,GAAG,KAAK,GAAG;AAErE,oBAAM,QAAQ,OAAO,qBAAqB,cAAc;AAAA,gBACvD,GAAGA,QAAO,OAAOA,QAAO,QAAQ;AAAA,gBAChC,GAAGA,QAAO,OAAOA,QAAO,SAAS;AAAA,cAClC,CAAC;AAED,oBAAM,UAAU,OAAO,gBAAgB,YAAY;AACnD,oBAAM,SAAS,KAAK,aAAc,cAAc;AAAA,gBAC/C,QAAQ;AAAA,kBACP,GAAG,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA,kBACxC,GAAG,MAAM;AAAA,kBACT,GAAG,MAAM;AAAA,gBACV;AAAA,gBACA,WAAW,MAAM,MAAM,OAAO,MAAM,MAAM;AAAA,gBAC1C,iBAAiB;AAAA,cAClB,CAAC;AAED,kBAAI,QAAQ;AACX,uBAAO,YAAY,MAAM;AAAA,cAC1B;AAEA,oBAAM,eAAe;AAAA,gBACpB;AAAA,gBACA,OAAO,SAAuB,SAAS;AAAA,cACxC,EAAE,QAAQ;AACV,kBAAI,cAAc;AACjB,sBAAM,sBAAsB,gBAAgB,YAAY;AACxD,oBAAI,QAAQ,aAAa,GAAG;AAC3B,sCAAoB,MAAM,UAAU;AAAA,gBACrC;AACA,oBAAI,oBAAoB,SAAS,UAAU;AAC1C,sCAAoB,OAAO;AAC3B,sCAAoB,MAAM,mBAAmB,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,gBAC7D;AAEA,uBAAO,cAAc,mBAAmB;AAAA,cACzC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAGF,WAAO,eAAe,WAAW;AAEjC,WAAO,aAAa;AACpB,WAAO,WAAW;AAElB,UAAM,SAAS,OAAO,qBAAqB;AAC3C,QAAI,QAAQ;AACX,aAAO,aAAa,QAAQ,EAAE,YAAY,EAAE,CAAC;AAAA,IAC9C;AAAA,EACD,CAAC;AACF;AAEA,SAAS,aAAa,GAAoB;AACzC,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,SAAO;AACR;AAEA,SAAS,gBAAgB,GAAoB;AAC5C,QAAM,IAAI,aAAa,CAAC;AACxB,MAAI,KAAK,EAAG,QAAO;AACnB,SAAO;AACR;AAUA,eAAe,gBAAgB,QAAgB,kBAA2B;AACzE,MAAI;AACH,QAAI,iBAAiB,SAAS,cAAc,CAAC,iBAAiB,MAAM,IAAK;AAEzE,UAAM,WAAW,MAAM,MAAM,iBAAiB,MAAM,GAAG;AACvD,QAAI,CAAC,SAAS,GAAI;AAElB,UAAM,OAAO,IAAI,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,GAAG,iBAAiB,MAAM,MAAM;AAAA,MAC3E,MAAM,SAAS,QAAQ,IAAI,cAAc,KAAK,iBAAiB,MAAM,YAAY;AAAA,IAClF,CAAC;AAED,UAAM,WAAW,MAAM,OAAO,2BAA2B,EAAE,MAAM,QAAQ,KAAK,CAAC;AAC/E,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,0CAA0C;AACzE,QAAI,SAAS,SAAS,WAAY;AAElC,WAAO,aAAa;AAAA,MACnB;AAAA,QACC,IAAI,iBAAiB;AAAA,QACrB,MAAM,iBAAiB;AAAA,QACvB,OAAO;AAAA,UACN,GAAG,SAAS;AAAA,UACZ,MAAM,iBAAiB,MAAM;AAAA,QAC9B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF,QAAQ;AAAA,EAER;AACD;AAEA,SAAS,QAAQ,UAAwB,YAAkC;AAC1E,QAAM,EAAE,UAAU,EAAE,IAAI;AAExB,MAAI,CAAC,SAAS,QAAQ;AACrB,aAAS,SAAS,CAAC;AAAA,EACpB;AAGA,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,SAAO,OAAO,SAAS,KAAK,EAAE;AAAA,IAAQ,CAAC,SACtC,OAAO,OAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC7C,YAAM,EAAE,UAAU,UAAU,QAAQ,IAAI;AAExC,UAAI,SAAS;AACZ,sBAAc,IAAI,OAAO;AAAA,MAC1B;AAGA,UAAI,aAAa,KAAK,MAAM,CAAC,KAAK,OAAO,QAAQ,GAAG;AACnD,gBAAQ,KAAK,4CAA4C;AACzD,cAAM,WAAW,KAAK;AAAA,MACvB;AAEA,UAAI,MAAM,SAAS,uBAAuB,UAAU;AACnD,iBAAS,QAAQ,CAAC,YAAY;AAC7B,cAAI,CAAC,KAAK,OAAO,OAAO,GAAG;AAC1B,oBAAQ,KAAK,8CAA8C,MAAM,IAAI,OAAO;AAC5E,sBAAU,OAAO,SAAS,QAAQ,OAAO,GAAG,CAAC;AAAA,UAC9C;AAAA,QACD,CAAC;AAAA,MAGF;AAAA,IACD,CAAC;AAAA,EACF;AAEA,SAAO,KAAK,SAAS,MAAM,EAAE,QAAQ,CAAC,YAAY;AACjD,QAAI,CAAC,cAAc,IAAI,OAAO,GAAG;AAChC,aAAO,SAAS,OAAO,OAAO;AAAA,IAC/B;AAAA,EACD,CAAC;AAED,MAAI,YAAY,YAAY;AAC3B,QAAI,UAAU,IAAI;AACjB,aAAO,OAAO,SAAS,KAAK,EAAE,QAAQ,CAAC,SAAS;AAC/C,eAAO,OAAO,KAAK,MAAM,EACvB,OAAO,CAAC,UAAU,MAAM,SAAS,iBAAkB,EACnD,QAAQ,CAAC,UAAU;AACnB,cAAK,MAAwB,MAAM,SAAS,QAAW;AACtD;AAAC,YAAC,MAAwB,MAAM,OAAO;AAAA,UACxC;AAAA,QACD,CAAC;AAAA,MACH,CAAC;AAAA,IACF;AAGA,QAAI,WAAW,IAAI;AAClB,aAAO,OAAO,SAAS,KAAK,EAAE,QAAQ,CAAC,SAAS;AAC/C,eAAO,OAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,YAAY;AACjD,iBAAO,OAAO,SAAU,QAAgB,IAAI;AAAA,QAC7C,CAAC;AAED,eAAO,OAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC7C,iBAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM;AACpD,gBAAI,OAAO,UAAU,UAAU;AAE9B,oBAAM,MAAM,EAAE,IAAI,MAAM,YAAY;AAAA,YACrC;AAAA,UACD,CAAC;AAED,cAAI,MAAM,SAAS,qBAAqB;AACvC,gBAAI,MAAM,aAAa;AACtB,qBAAO,QAAQ,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,MAAM;AAC/D,oBAAK,eAA2B,SAAS;AACxC,wBAAM,cAAc;AAAA,oBACnB,GAAG,MAAM;AAAA,oBACT,CAAC,EAAE,GAAG;AAAA,kBACP;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAGA,QAAI,WAAW,QAAQ,SAAS,QAAQ,MAAM;AAC7C,eAAS,OAAO;AAAA,IACjB;AAEA,QAAI,UAAU,MAAM,SAAS,UAAU,MAAM;AAC5C,eAAS,SAAS,CAAC;AAAA,IACpB;AAEA,WAAO,OAAO,SAAS,KAAK,EAAE,QAAQ,CAAC,SAAS;AAC/C,aAAO,OAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC7C,YAAI,UAAU,MAAM;AACnB,eACE,MAAM,SAAS,uBAAuB,MAAM,SAAS,wBACtD,MAAM,MAAM,YAAY,MACvB;AACD,kBAAM,MAAM,WAAW;AAAA,UACxB;AAAA,QACD;AAEA,YAAI,UAAU,MAAM;AACnB,cACC,MAAM,SAAS,+BACf,MAAM,SAAS,6BACf,MAAM,SAAS,2BACf,MAAM,SAAS,qBACd;AACD,gBAAI,UAAU,SAAS,OAAO,MAAM,SAAS,UAAU;AACtD,oBAAM,QAAQ,MAAM;AAAA,YACrB;AACA,gBAAI,CAAC,MAAM,OAAO;AACjB,oBAAM,QAAQ;AAAA,YACf;AACA,gBAAI,CAAC,MAAM,YAAY;AACtB,oBAAM,aAAa,CAAC,KAAK,GAAG;AAAA,YAC7B;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAGA,SAAO,OAAO,SAAS,UAAU,EAAE,QAAQ,CAAC,cAAc;AACzD,cAAU,cAAc,UAAU,YAAY,OAAO,CAAC,OAAO;AAC5D,aAAO,SAAS,MAAM,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM;AAAA,IACpD,CAAC;AACD,cAAU,YAAY;AACtB,cAAU,YAAY;AACtB,cAAU,YAAY;AACtB,cAAU,YAAY;AAAA,EACvB,CAAC;AAED,WAAS,UAAU;AAEnB,SAAO;AACR;AAqBO,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,aAAU;AACV,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,WAAQ;AAVG,SAAAA;AAAA,GAAA;AAcL,IAAK,iBAAL,kBAAKC,oBAAL;AACN,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,eAAY;AACZ,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,YAAS;AAZE,SAAAA;AAAA,GAAA;AAgBL,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,WAAQ;AAHG,SAAAA;AAAA,GAAA;AAOL,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,YAAS;AAJE,SAAAA;AAAA,GAAA;AAQL,IAAK,iBAAL,kBAAKC,oBAAL;AACN,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,aAAU;AAJC,SAAAA;AAAA,GAAA;AAQL,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,UAAO;AAJI,SAAAA;AAAA,GAAA;AAuEL,IAAK,iBAAL,kBAAKC,oBAAL;AACN,EAAAA,gBAAA,WAAQ;AADG,SAAAA;AAAA,GAAA;AAyHL,IAAK,gBAAL,kBAAKC,mBAAL;AACN,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,WAAQ;AAFG,SAAAA;AAAA,GAAA;AA0CZ,MAAM,qBAAkE;AAAA,EACvE,CAAC,mBAAoB,GAAG;AAAA,EACxB,CAAC,mBAAoB,GAAG;AAAA,EACxB,CAAC,2BAAwB,GAAG;AAAA,EAC5B,CAAC,iBAAmB,GAAG;AAAA,EACvB,CAAC,mBAAoB,GAAG;AAAA,EACxB,CAAC,iBAAmB,GAAG;AAAA,EACvB,CAAC,iBAAmB,GAAG;AAAA,EACvB,CAAC,qBAAqB,GAAG;AAAA,EACzB,CAAC,qBAAqB,GAAG;AAAA,EACzB,CAAC,qBAAqB,GAAG;AAAA,EACzB,CAAC,eAAkB,GAAG;AAAA,EACtB,CAAC,qBAAqB,GAAG;AAC1B;AAEA,MAAM,mBAA8D;AAAA,EACnE,CAAC,iBAAkB,GAAG;AAAA,EACtB,CAAC,iBAAkB,GAAG;AAAA,EACtB,CAAC,qBAAoB,GAAG;AAAA,EACxB,CAAC,mBAAmB,GAAG;AACxB;AAEA,MAAM,qBAA4E;AAAA,EACjF,CAAC,mBAAoB,GAAG;AAAA,EACxB,CAAC,qBAAqB,GAAG;AAAA,EACzB,CAAC,eAAkB,GAAG;AAAA,EACtB,CAAC,uBAAsB,GAAG;AAC3B;AAEA,MAAM,6BAA8E;AAAA,EACnF,CAAC,mBAAoB,GAAG;AAAA,EACxB,CAAC,qBAAqB,GAAG;AAAA,EACzB,CAAC,eAAkB,GAAG;AAAA,EACtB,CAAC,uBAAsB,GAAG;AAC3B;AAEA,MAAM,2BAAsE;AAAA,EAC3E,CAAC,mBAAmB,GAAG;AAAA,EACvB,CAAC,qBAAoB,GAAG;AAAA,EACxB,CAAC,mBAAmB,GAAG;AACxB;AAEA,MAAM,mBAA8D;AAAA,EACnE,CAAC,mBAAmB,GAAG;AAAA,EACvB,CAAC,qBAAoB,GAAG;AAAA,EACxB,CAAC,mBAAmB,GAAG;AACxB;AAEA,MAAM,qBAAgE;AAAA,EACrE,CAAC,mBAAmB,GAAG;AAAA,EACvB,CAAC,qBAAoB,GAAG;AAAA,EACxB,CAAC,qBAAoB,GAAG;AAAA,EACxB,CAAC,iBAAkB,GAAG;AACvB;AAEA,SAAS,WAAW,OAAwD;AAC3E,SAAO,QAAS,mBAAmB,KAAK,KAAK,UAAW;AACzD;AAEA,SAAS,UAAU,MAAqD;AACvE,SAAO,OAAQ,iBAAiB,IAAI,KAAK,SAAU;AACpD;AAEA,SAAS,WAAW,OAAkE;AACrF,SAAO,QAAS,mBAAmB,KAAK,KAAK,WAAY;AAC1D;AAEA,SAAS,eAAe,OAA4D;AACnF,SAAO,QAAS,2BAA2B,KAAK,KAAK,WAAY;AAClE;AAEA,SAAS,cAAc,MAAqD;AAC3E,SAAO,OAAQ,yBAAyB,IAAI,KAAK,MAAO;AACzD;AAEA,SAAS,UAAU,MAAqD;AACvE,SAAO,OAAQ,iBAAiB,IAAI,KAAK,MAAO;AACjD;AAEA,SAAS,UAAU,MAAqD;AACvE,SAAO,OAAQ,mBAAmB,IAAI,KAAK,SAAU;AACtD;AAEA,SAAS,WAAW,OAA2B;AAC9C,SAAO;AAAA,IACN,GAAG,aAAa,MAAM,CAAC,CAAC;AAAA,IACxB,GAAG,aAAa,MAAM,CAAC,CAAC;AAAA,IACxB,GAAG,MAAM,CAAC,KAAK,OAAO,MAAM,aAAa,MAAM,CAAC,CAAC;AAAA,EAClD;AACD;AAEA,SAAS,eAAe,YAAoE;AAC3F,SAAO,eAAe,sBAAuB,UAAU;AACxD;AAEA,SAAS,UAAU,UAA+B,OAAuB;AACxE,SAAO,WACJ,UAAU,uBAAwB,UAAU,sBAC3C,SACA,UACD;AACJ;",
|
|
6
6
|
"names": ["bounds", "TLV1ShapeType", "TLV1ColorStyle", "TLV1SizeStyle", "TLV1DashStyle", "TLV1AlignStyle", "TLV1FontStyle", "TLV1Decoration", "TLV1AssetType"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tldraw",
|
|
3
3
|
"description": "A tiny little drawing editor.",
|
|
4
|
-
"version": "3.15.0-canary.
|
|
4
|
+
"version": "3.15.0-canary.f6f94b895c02",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "tldraw Inc.",
|
|
7
7
|
"email": "hello@tldraw.com"
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"keywords": [
|
|
19
19
|
"tldraw",
|
|
20
|
+
"sdk",
|
|
20
21
|
"drawing",
|
|
21
22
|
"app",
|
|
22
23
|
"development",
|
|
@@ -53,8 +54,8 @@
|
|
|
53
54
|
"@tiptap/pm": "^2.9.1",
|
|
54
55
|
"@tiptap/react": "^2.9.1",
|
|
55
56
|
"@tiptap/starter-kit": "^2.9.1",
|
|
56
|
-
"@tldraw/editor": "3.15.0-canary.
|
|
57
|
-
"@tldraw/store": "3.15.0-canary.
|
|
57
|
+
"@tldraw/editor": "3.15.0-canary.f6f94b895c02",
|
|
58
|
+
"@tldraw/store": "3.15.0-canary.f6f94b895c02",
|
|
58
59
|
"classnames": "^2.5.1",
|
|
59
60
|
"hotkeys-js": "^3.13.9",
|
|
60
61
|
"idb": "^7.1.1",
|
package/src/index.ts
CHANGED
|
@@ -382,7 +382,11 @@ export {
|
|
|
382
382
|
type TLUiDropdownMenuSubTriggerProps,
|
|
383
383
|
type TLUiDropdownMenuTriggerProps,
|
|
384
384
|
} from './lib/ui/components/primitives/TldrawUiDropdownMenu'
|
|
385
|
-
export {
|
|
385
|
+
export {
|
|
386
|
+
TldrawUiIcon,
|
|
387
|
+
type TLUiIconJsx,
|
|
388
|
+
type TLUiIconProps,
|
|
389
|
+
} from './lib/ui/components/primitives/TldrawUiIcon'
|
|
386
390
|
export { TldrawUiInput, type TLUiInputProps } from './lib/ui/components/primitives/TldrawUiInput'
|
|
387
391
|
export { TldrawUiKbd, type TLUiKbdProps } from './lib/ui/components/primitives/TldrawUiKbd'
|
|
388
392
|
export {
|
package/src/lib/TldrawImage.tsx
CHANGED
|
@@ -15,6 +15,7 @@ import { memo, useEffect, useLayoutEffect, useMemo, useState } from 'react'
|
|
|
15
15
|
import { defaultBindingUtils } from './defaultBindingUtils'
|
|
16
16
|
import { defaultShapeUtils } from './defaultShapeUtils'
|
|
17
17
|
import { TLUiAssetUrlOverrides } from './ui/assetUrls'
|
|
18
|
+
import { useDefaultEditorAssetsWithOverrides } from './utils/static-assets/assetUrls'
|
|
18
19
|
import { defaultAddFontsFromNode, tipTapDefaultExtensions } from './utils/text/richText'
|
|
19
20
|
|
|
20
21
|
/** @public */
|
|
@@ -111,6 +112,7 @@ export const TldrawImage = memo(function TldrawImage(props: TldrawImageProps) {
|
|
|
111
112
|
assetUrls,
|
|
112
113
|
textOptions = defaultTextOptions,
|
|
113
114
|
} = props
|
|
115
|
+
const assetUrlsWithOverrides = useDefaultEditorAssetsWithOverrides(assetUrls)
|
|
114
116
|
|
|
115
117
|
useLayoutEffect(() => {
|
|
116
118
|
if (!container) return
|
|
@@ -129,7 +131,7 @@ export const TldrawImage = memo(function TldrawImage(props: TldrawImageProps) {
|
|
|
129
131
|
tools: [],
|
|
130
132
|
getContainer: () => tempElm,
|
|
131
133
|
licenseKey,
|
|
132
|
-
fontAssetUrls:
|
|
134
|
+
fontAssetUrls: assetUrlsWithOverrides.fonts,
|
|
133
135
|
textOptions,
|
|
134
136
|
})
|
|
135
137
|
|
|
@@ -138,6 +140,8 @@ export const TldrawImage = memo(function TldrawImage(props: TldrawImageProps) {
|
|
|
138
140
|
const shapeIds = editor.getCurrentPageShapeIds()
|
|
139
141
|
|
|
140
142
|
async function setSvg() {
|
|
143
|
+
// We have to wait for the fonts to load so that we can correctly measure text sizes
|
|
144
|
+
await editor.fonts.loadRequiredFontsForCurrentPage(editor.options.maxFontsToLoadBeforeRender)
|
|
141
145
|
const imageResult = await editor.toImage([...shapeIds], {
|
|
142
146
|
bounds,
|
|
143
147
|
scale,
|
|
@@ -175,7 +179,7 @@ export const TldrawImage = memo(function TldrawImage(props: TldrawImageProps) {
|
|
|
175
179
|
preserveAspectRatio,
|
|
176
180
|
licenseKey,
|
|
177
181
|
pixelRatio,
|
|
178
|
-
|
|
182
|
+
assetUrlsWithOverrides,
|
|
179
183
|
textOptions,
|
|
180
184
|
])
|
|
181
185
|
|
|
@@ -118,6 +118,7 @@ export class Pointing extends StateNode {
|
|
|
118
118
|
const change = util.onHandleDrag?.(shape, {
|
|
119
119
|
handle: { ...startHandle, x: 0, y: 0 },
|
|
120
120
|
isPrecise: true,
|
|
121
|
+
isCreatingShape: true,
|
|
121
122
|
initial: initial,
|
|
122
123
|
})
|
|
123
124
|
|
|
@@ -145,6 +146,7 @@ export class Pointing extends StateNode {
|
|
|
145
146
|
const change = util.onHandleDrag?.(shape, {
|
|
146
147
|
handle: { ...startHandle, x: 0, y: 0 },
|
|
147
148
|
isPrecise: this.isPrecise,
|
|
149
|
+
isCreatingShape: true,
|
|
148
150
|
initial: initial,
|
|
149
151
|
})
|
|
150
152
|
|
|
@@ -162,6 +164,7 @@ export class Pointing extends StateNode {
|
|
|
162
164
|
const change = util.onHandleDrag?.(this.editor.getShape(shape)!, {
|
|
163
165
|
handle: { ...endHandle, x: point.x, y: point.y },
|
|
164
166
|
isPrecise: false,
|
|
167
|
+
isCreatingShape: true,
|
|
165
168
|
initial: initial,
|
|
166
169
|
})
|
|
167
170
|
|
|
@@ -145,8 +145,6 @@ export class LineShapeUtil extends ShapeUtil<TLLineShape> {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
override onHandleDrag(shape: TLLineShape, { handle }: TLHandleDragInfo<TLLineShape>) {
|
|
148
|
-
// we should only ever be dragging vertex handles
|
|
149
|
-
if (handle.type !== 'vertex') return
|
|
150
148
|
const newPoint = maybeSnapToGrid(new Vec(handle.x, handle.y), this.editor)
|
|
151
149
|
return {
|
|
152
150
|
...shape,
|
|
@@ -160,6 +158,25 @@ export class LineShapeUtil extends ShapeUtil<TLLineShape> {
|
|
|
160
158
|
}
|
|
161
159
|
}
|
|
162
160
|
|
|
161
|
+
override onHandleDragStart(shape: TLLineShape, { handle }: TLHandleDragInfo<TLLineShape>) {
|
|
162
|
+
// For line shapes, if we're dragging a "create" handle, then
|
|
163
|
+
// create a new vertex handle at that point; and make this handle
|
|
164
|
+
// the handle that we're dragging.
|
|
165
|
+
if (handle.type === 'create') {
|
|
166
|
+
return {
|
|
167
|
+
...shape,
|
|
168
|
+
props: {
|
|
169
|
+
...shape.props,
|
|
170
|
+
points: {
|
|
171
|
+
...shape.props.points,
|
|
172
|
+
[handle.index]: { id: handle.index, index: handle.index, x: handle.x, y: handle.y },
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
|
|
163
180
|
component(shape: TLLineShape) {
|
|
164
181
|
return (
|
|
165
182
|
<SVGContainer style={{ minWidth: 50, minHeight: 50 }}>
|
|
@@ -81,7 +81,7 @@ export const PlainTextLabel = React.memo(function PlainTextLabel({
|
|
|
81
81
|
return (
|
|
82
82
|
<div
|
|
83
83
|
className={`${cssPrefix}-label tl-text-wrapper tl-plain-text-wrapper`}
|
|
84
|
-
aria-hidden=
|
|
84
|
+
aria-hidden={!isEditing}
|
|
85
85
|
data-font={font}
|
|
86
86
|
data-align={align}
|
|
87
87
|
data-hastext={!isEmpty}
|
|
@@ -128,7 +128,7 @@ export const RichTextLabel = React.memo(function RichTextLabel({
|
|
|
128
128
|
return (
|
|
129
129
|
<div
|
|
130
130
|
className={`${cssPrefix}-label tl-text-wrapper tl-rich-text-wrapper`}
|
|
131
|
-
aria-hidden=
|
|
131
|
+
aria-hidden={!isEditing}
|
|
132
132
|
data-font={font}
|
|
133
133
|
data-align={align}
|
|
134
134
|
data-hastext={!isEmpty}
|
package/src/lib/styles.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
Mat,
|
|
2
3
|
StateNode,
|
|
3
4
|
TLArrowShape,
|
|
4
5
|
TLHandle,
|
|
@@ -26,20 +27,20 @@ export type DraggingHandleInfo = TLPointerEventInfo & {
|
|
|
26
27
|
export class DraggingHandle extends StateNode {
|
|
27
28
|
static override id = 'dragging_handle'
|
|
28
29
|
|
|
29
|
-
shapeId
|
|
30
|
-
initialHandle
|
|
31
|
-
initialAdjacentHandle
|
|
32
|
-
initialPagePoint
|
|
30
|
+
shapeId!: TLShapeId
|
|
31
|
+
initialHandle!: TLHandle
|
|
32
|
+
initialAdjacentHandle!: TLHandle | null
|
|
33
|
+
initialPagePoint!: Vec
|
|
33
34
|
|
|
34
|
-
markId
|
|
35
|
-
initialPageTransform
|
|
36
|
-
initialPageRotation
|
|
35
|
+
markId!: string
|
|
36
|
+
initialPageTransform!: Mat
|
|
37
|
+
initialPageRotation!: number
|
|
37
38
|
|
|
38
|
-
info
|
|
39
|
+
info!: DraggingHandleInfo
|
|
39
40
|
|
|
40
41
|
isPrecise = false
|
|
41
|
-
isPreciseId
|
|
42
|
-
pointingId
|
|
42
|
+
isPreciseId: TLShapeId | null = null
|
|
43
|
+
pointingId: TLShapeId | null = null
|
|
43
44
|
|
|
44
45
|
override onEnter(info: DraggingHandleInfo) {
|
|
45
46
|
const { shape, isCreating, creatingMarkId, handle } = info
|
|
@@ -66,26 +67,6 @@ export class DraggingHandle extends StateNode {
|
|
|
66
67
|
|
|
67
68
|
this.initialHandle = structuredClone(handle)
|
|
68
69
|
|
|
69
|
-
if (this.editor.isShapeOfType<TLLineShape>(shape, 'line')) {
|
|
70
|
-
// For line shapes, if we're dragging a "create" handle, then
|
|
71
|
-
// create a new vertex handle at that point; and make this handle
|
|
72
|
-
// the handle that we're dragging.
|
|
73
|
-
if (this.initialHandle.type === 'create') {
|
|
74
|
-
this.editor.updateShape({
|
|
75
|
-
...shape,
|
|
76
|
-
props: {
|
|
77
|
-
points: {
|
|
78
|
-
...shape.props.points,
|
|
79
|
-
[handle.index]: { id: handle.index, index: handle.index, x: handle.x, y: handle.y },
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
})
|
|
83
|
-
const handlesAfter = this.editor.getShapeHandles(shape)!
|
|
84
|
-
const handleAfter = handlesAfter.find((h) => h.index === handle.index)!
|
|
85
|
-
this.initialHandle = structuredClone(handleAfter)
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
70
|
this.initialPageTransform = this.editor.getShapePageTransform(shape)!
|
|
90
71
|
this.initialPageRotation = this.initialPageTransform.rotation()
|
|
91
72
|
this.initialPagePoint = this.editor.inputs.originPagePoint.clone()
|
|
@@ -135,6 +116,19 @@ export class DraggingHandle extends StateNode {
|
|
|
135
116
|
}
|
|
136
117
|
// -->
|
|
137
118
|
|
|
119
|
+
// Call onHandleDragStart callback
|
|
120
|
+
const handleDragInfo = {
|
|
121
|
+
handle: this.initialHandle,
|
|
122
|
+
isPrecise: this.isPrecise,
|
|
123
|
+
isCreatingShape: !!this.info.isCreating,
|
|
124
|
+
initial: shape,
|
|
125
|
+
}
|
|
126
|
+
const util = this.editor.getShapeUtil(shape)
|
|
127
|
+
const startChanges = util.onHandleDragStart?.(shape, handleDragInfo)
|
|
128
|
+
if (startChanges) {
|
|
129
|
+
this.editor.updateShapes([{ ...startChanges, id: shape.id, type: shape.type }])
|
|
130
|
+
}
|
|
131
|
+
|
|
138
132
|
this.update()
|
|
139
133
|
|
|
140
134
|
this.editor.select(this.shapeId)
|
|
@@ -204,6 +198,22 @@ export class DraggingHandle extends StateNode {
|
|
|
204
198
|
this.editor.snaps.clearIndicators()
|
|
205
199
|
kickoutOccludedShapes(this.editor, [this.shapeId])
|
|
206
200
|
|
|
201
|
+
// Call onHandleDragEnd callback before state transitions
|
|
202
|
+
const shape = this.editor.getShape(this.shapeId)
|
|
203
|
+
if (shape) {
|
|
204
|
+
const util = this.editor.getShapeUtil(shape)
|
|
205
|
+
const handleDragInfo = {
|
|
206
|
+
handle: this.initialHandle,
|
|
207
|
+
isPrecise: this.isPrecise,
|
|
208
|
+
isCreatingShape: !!this.info.isCreating,
|
|
209
|
+
initial: this.info.shape,
|
|
210
|
+
}
|
|
211
|
+
const endChanges = util.onHandleDragEnd?.(shape, handleDragInfo)
|
|
212
|
+
if (endChanges) {
|
|
213
|
+
this.editor.updateShapes([{ ...endChanges, id: shape.id, type: shape.type }])
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
207
217
|
const { onInteractionEnd } = this.info
|
|
208
218
|
if (this.editor.getInstanceState().isToolLocked && onInteractionEnd) {
|
|
209
219
|
// Return to the tool that was active before this one,
|
|
@@ -216,6 +226,19 @@ export class DraggingHandle extends StateNode {
|
|
|
216
226
|
}
|
|
217
227
|
|
|
218
228
|
private cancel() {
|
|
229
|
+
// Call onHandleDragCancel callback before bailing to mark
|
|
230
|
+
const shape = this.editor.getShape(this.shapeId)
|
|
231
|
+
if (shape) {
|
|
232
|
+
const util = this.editor.getShapeUtil(shape)
|
|
233
|
+
const handleDragInfo = {
|
|
234
|
+
handle: this.initialHandle,
|
|
235
|
+
isPrecise: this.isPrecise,
|
|
236
|
+
isCreatingShape: !!this.info.isCreating,
|
|
237
|
+
initial: this.info.shape,
|
|
238
|
+
}
|
|
239
|
+
util.onHandleDragCancel?.(shape, handleDragInfo)
|
|
240
|
+
}
|
|
241
|
+
|
|
219
242
|
this.editor.bailToMark(this.markId)
|
|
220
243
|
this.editor.snaps.clearIndicators()
|
|
221
244
|
|
|
@@ -284,6 +307,7 @@ export class DraggingHandle extends StateNode {
|
|
|
284
307
|
const changes = util.onHandleDrag?.(shape, {
|
|
285
308
|
handle: nextHandle,
|
|
286
309
|
isPrecise: this.isPrecise || altKey,
|
|
310
|
+
isCreatingShape: !!this.info.isCreating,
|
|
287
311
|
initial: initial,
|
|
288
312
|
})
|
|
289
313
|
|
|
@@ -122,8 +122,19 @@ export class Resizing extends StateNode {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
private cancel() {
|
|
125
|
-
//
|
|
125
|
+
// Call onResizeCancel callback before resetting
|
|
126
|
+
const { shapeSnapshots } = this.snapshot
|
|
127
|
+
|
|
128
|
+
shapeSnapshots.forEach(({ shape }) => {
|
|
129
|
+
const current = this.editor.getShape(shape.id)
|
|
130
|
+
if (current) {
|
|
131
|
+
const util = this.editor.getShapeUtil(shape)
|
|
132
|
+
util.onResizeCancel?.(shape, current)
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
|
|
126
136
|
this.editor.bailToMark(this.markId)
|
|
137
|
+
|
|
127
138
|
if (this.info.onInteractionEnd) {
|
|
128
139
|
this.editor.setCurrentTool(this.info.onInteractionEnd, {})
|
|
129
140
|
} else {
|
|
@@ -109,6 +109,17 @@ export class Rotating extends StateNode {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
private cancel() {
|
|
112
|
+
// Call onRotateCancel callback before bailing to mark
|
|
113
|
+
const { shapeSnapshots } = this.snapshot
|
|
114
|
+
|
|
115
|
+
shapeSnapshots.forEach(({ shape }) => {
|
|
116
|
+
const current = this.editor.getShape(shape.id)
|
|
117
|
+
if (current) {
|
|
118
|
+
const util = this.editor.getShapeUtil(shape)
|
|
119
|
+
util.onRotateCancel?.(shape, current)
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
|
|
112
123
|
this.editor.bailToMark(this.markId)
|
|
113
124
|
if (this.info.onInteractionEnd) {
|
|
114
125
|
this.editor.setCurrentTool(this.info.onInteractionEnd, this.info)
|