tldraw 3.16.0-internal.a478398270c6 → 3.16.0-next.15f085081fd5

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.
Files changed (534) hide show
  1. package/dist-cjs/index.d.ts +316 -23
  2. package/dist-cjs/index.js +34 -2
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/Tldraw.js +12 -2
  5. package/dist-cjs/lib/Tldraw.js.map +2 -2
  6. package/dist-cjs/lib/TldrawImage.js +5 -2
  7. package/dist-cjs/lib/TldrawImage.js.map +3 -3
  8. package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
  9. package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +2 -2
  10. package/dist-cjs/lib/canvas/TldrawHandles.js +1 -1
  11. package/dist-cjs/lib/canvas/TldrawHandles.js.map +2 -2
  12. package/dist-cjs/lib/canvas/TldrawOverlays.js +1 -1
  13. package/dist-cjs/lib/canvas/TldrawOverlays.js.map +2 -2
  14. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  15. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  16. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +279 -271
  17. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  18. package/dist-cjs/lib/defaultExternalContentHandlers.js +6 -4
  19. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +27 -44
  21. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +16 -4
  23. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  25. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  26. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  27. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
  29. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  30. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -6
  31. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  34. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -17
  35. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  37. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  39. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  41. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  42. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -4
  43. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  44. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  45. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  46. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +20 -5
  47. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  49. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/PathBuilder.js +21 -3
  51. package/dist-cjs/lib/shapes/shared/PathBuilder.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -0
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +5 -2
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  57. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js +4 -3
  59. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  61. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  62. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  63. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +7 -13
  64. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  65. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  66. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  67. package/dist-cjs/lib/styles.js.map +2 -2
  68. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  69. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  70. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  71. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +7 -1
  73. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  74. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +43 -22
  75. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  76. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -15
  77. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  78. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +5 -0
  79. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  80. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +8 -0
  81. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  82. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +8 -0
  83. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +8 -0
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  86. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  87. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  88. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  89. package/dist-cjs/lib/ui/components/A11y.js +14 -12
  90. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  92. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  93. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  94. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  96. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  97. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  98. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +57 -7
  100. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -2
  102. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  104. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  106. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +4 -5
  108. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  110. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  112. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  114. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  115. package/dist-cjs/lib/ui/components/Spinner.js +2 -25
  116. package/dist-cjs/lib/ui/components/Spinner.js.map +2 -2
  117. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  118. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  119. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -139
  120. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  122. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  123. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  124. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  125. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +21 -7
  126. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +3 -3
  127. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  128. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  129. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  130. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  131. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  132. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  133. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  134. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  135. package/dist-cjs/lib/ui/components/menu-items.js +22 -0
  136. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  137. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButtonIcon.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +7 -16
  139. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  140. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  141. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  142. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
  143. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js.map +2 -2
  144. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +35 -1
  145. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
  146. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  147. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  148. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +6 -2
  149. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  150. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +31 -7
  151. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  152. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +262 -0
  153. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  154. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  155. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  156. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  157. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  159. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -22
  161. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  162. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  163. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/actions.js +72 -9
  165. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/components.js +2 -0
  167. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  168. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  169. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  171. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  172. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  173. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  174. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  175. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +12 -0
  176. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  177. package/dist-cjs/lib/ui/kbd-utils.js +11 -4
  178. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  179. package/dist-cjs/lib/ui/version.js +3 -3
  180. package/dist-cjs/lib/ui/version.js.map +1 -1
  181. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +1 -1
  182. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  183. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +3 -2
  184. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  185. package/dist-esm/index.d.mts +316 -23
  186. package/dist-esm/index.mjs +57 -5
  187. package/dist-esm/index.mjs.map +2 -2
  188. package/dist-esm/lib/Tldraw.mjs +14 -4
  189. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  190. package/dist-esm/lib/TldrawImage.mjs +5 -2
  191. package/dist-esm/lib/TldrawImage.mjs.map +2 -2
  192. package/dist-esm/lib/canvas/TldrawCropHandles.mjs +1 -1
  193. package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
  194. package/dist-esm/lib/canvas/TldrawHandles.mjs +1 -1
  195. package/dist-esm/lib/canvas/TldrawHandles.mjs.map +2 -2
  196. package/dist-esm/lib/canvas/TldrawOverlays.mjs +1 -1
  197. package/dist-esm/lib/canvas/TldrawOverlays.mjs.map +2 -2
  198. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  199. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  200. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +279 -271
  201. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  202. package/dist-esm/lib/defaultExternalContentHandlers.mjs +6 -4
  203. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  204. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +30 -44
  205. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  206. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +19 -5
  207. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  208. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  209. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  210. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  211. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  212. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
  213. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -6
  215. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  217. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  218. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -17
  219. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  221. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  223. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  225. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -4
  227. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  229. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +21 -5
  231. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  233. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/shared/PathBuilder.mjs +22 -3
  235. package/dist-esm/lib/shapes/shared/PathBuilder.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -0
  237. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +5 -2
  239. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  241. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs +4 -3
  243. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  246. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +8 -13
  248. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  250. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  251. package/dist-esm/lib/styles.mjs.map +2 -2
  252. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  253. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  254. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  255. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  256. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +7 -1
  257. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  258. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +43 -22
  259. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  260. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -15
  261. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  262. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +5 -0
  263. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  264. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +8 -0
  265. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  266. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +8 -0
  267. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  268. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +8 -0
  269. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  270. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  271. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  272. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  273. package/dist-esm/lib/ui/components/A11y.mjs +14 -12
  274. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  275. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  276. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  277. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  278. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  279. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  280. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  281. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  282. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +57 -7
  284. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -3
  286. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  288. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  290. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  291. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +4 -5
  292. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  293. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  294. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  295. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  296. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  297. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  298. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  299. package/dist-esm/lib/ui/components/Spinner.mjs +3 -26
  300. package/dist-esm/lib/ui/components/Spinner.mjs.map +2 -2
  301. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  302. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  303. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -139
  304. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  305. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  306. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  307. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  308. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +23 -9
  310. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +3 -3
  311. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  312. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  313. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  314. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  316. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  317. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  318. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/menu-items.mjs +22 -0
  320. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButtonIcon.mjs.map +2 -2
  322. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +8 -6
  323. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  324. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  325. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  326. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs +1 -1
  327. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs.map +2 -2
  328. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +36 -2
  329. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
  330. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  331. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  332. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +6 -2
  333. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +31 -7
  335. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +239 -0
  337. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  338. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  339. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  340. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  341. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  342. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -24
  345. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  346. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  347. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  348. package/dist-esm/lib/ui/context/actions.mjs +72 -9
  349. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  350. package/dist-esm/lib/ui/context/components.mjs +2 -0
  351. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  352. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  354. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  355. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  356. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  357. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  358. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +12 -0
  359. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  360. package/dist-esm/lib/ui/kbd-utils.mjs +11 -4
  361. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  362. package/dist-esm/lib/ui/version.mjs +3 -3
  363. package/dist-esm/lib/ui/version.mjs.map +1 -1
  364. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +1 -1
  365. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  366. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +3 -2
  367. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  368. package/package.json +12 -34
  369. package/src/index.ts +42 -3
  370. package/src/lib/Tldraw.tsx +15 -2
  371. package/src/lib/TldrawImage.tsx +6 -2
  372. package/src/lib/canvas/TldrawCropHandles.tsx +3 -1
  373. package/src/lib/canvas/TldrawHandles.tsx +5 -1
  374. package/src/lib/canvas/TldrawOverlays.tsx +1 -1
  375. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  376. package/src/lib/canvas/TldrawSelectionForeground.tsx +5 -1
  377. package/src/lib/defaultExternalContentHandlers.ts +14 -5
  378. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  379. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  380. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +12 -11
  381. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +30 -46
  382. package/src/lib/shapes/arrow/arrowLabel.ts +23 -3
  383. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  384. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  385. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
  386. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  387. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -7
  388. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  389. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -21
  390. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  391. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  392. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  393. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -4
  394. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  395. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  396. package/src/lib/shapes/line/LineShapeUtil.tsx +25 -6
  397. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  398. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  399. package/src/lib/shapes/shared/PathBuilder.test.tsx +1 -1
  400. package/src/lib/shapes/shared/PathBuilder.tsx +35 -1
  401. package/src/lib/shapes/shared/PlainTextLabel.tsx +1 -0
  402. package/src/lib/shapes/shared/RichTextLabel.tsx +4 -0
  403. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  404. package/src/lib/shapes/shared/SvgTextLabel.tsx +4 -2
  405. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  406. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  407. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  408. package/src/lib/shapes/text/TextShapeUtil.tsx +8 -14
  409. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  410. package/src/lib/styles.tsx +3 -1
  411. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  412. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  413. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +8 -1
  414. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +54 -30
  415. package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -24
  416. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +7 -0
  417. package/src/lib/tools/SelectTool/childStates/Resizing.ts +12 -1
  418. package/src/lib/tools/SelectTool/childStates/Rotating.ts +11 -0
  419. package/src/lib/tools/SelectTool/childStates/Translating.ts +11 -1
  420. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -0
  421. package/src/lib/ui/TldrawUi.tsx +33 -12
  422. package/src/lib/ui/components/A11y.tsx +15 -13
  423. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  424. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  425. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  426. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  427. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +46 -6
  428. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -2
  429. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  430. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  431. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +4 -5
  432. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  433. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  434. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  435. package/src/lib/ui/components/Spinner.tsx +2 -24
  436. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  437. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -106
  438. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  439. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  440. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +25 -9
  441. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  442. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  443. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  444. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +17 -12
  445. package/src/lib/ui/components/menu-items.tsx +25 -0
  446. package/src/lib/ui/components/primitives/Button/TldrawUiButtonIcon.tsx +2 -2
  447. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -35
  448. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  449. package/src/lib/ui/components/primitives/TldrawUiDialog.tsx +1 -1
  450. package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +41 -3
  451. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  452. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +6 -1
  453. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +56 -12
  454. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +325 -0
  455. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +2 -2
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  458. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  459. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +224 -23
  460. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  461. package/src/lib/ui/context/actions.tsx +74 -10
  462. package/src/lib/ui/context/components.tsx +3 -0
  463. package/src/lib/ui/context/events.tsx +6 -2
  464. package/src/lib/ui/hooks/menu-hooks.ts +1 -0
  465. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +3 -2
  466. package/src/lib/ui/hooks/useTools.tsx +142 -11
  467. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +12 -0
  468. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +12 -0
  469. package/src/lib/ui/kbd-utils.ts +12 -4
  470. package/src/lib/ui/version.ts +3 -3
  471. package/src/lib/ui.css +417 -314
  472. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +21 -7
  473. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +1 -1
  474. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +28 -7
  475. package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
  476. package/src/test/A11y.test.tsx +3 -2
  477. package/src/test/ClickManager.test.ts +7 -6
  478. package/src/test/Editor.test.tsx +21 -20
  479. package/src/test/EraserTool.test.ts +184 -13
  480. package/src/test/HandTool.test.ts +10 -9
  481. package/src/test/HighlightShape.test.ts +2 -1
  482. package/src/test/SelectTool.test.ts +40 -13
  483. package/src/test/TLUserPreferences.test.ts +4 -3
  484. package/src/test/TestEditor.ts +13 -15
  485. package/src/test/TldrawEditor.test.tsx +11 -10
  486. package/src/test/ZoomTool.test.ts +7 -6
  487. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  488. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  489. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  490. package/src/test/arrows-megabus.test.tsx +17 -10
  491. package/src/test/bindings.test.tsx +24 -37
  492. package/src/test/bookmark-shapes.test.ts +1 -8
  493. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  494. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  495. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  496. package/src/test/commands/alignShapes.test.tsx +25 -24
  497. package/src/test/commands/animationSpeed.test.ts +2 -1
  498. package/src/test/commands/centerOnPoint.test.ts +3 -2
  499. package/src/test/commands/clipboard.test.ts +3 -2
  500. package/src/test/commands/createShapes.test.ts +2 -1
  501. package/src/test/commands/deletePage.test.ts +84 -1
  502. package/src/test/commands/deleteShapes.test.ts +2 -1
  503. package/src/test/commands/distributeShapes.test.tsx +11 -10
  504. package/src/test/commands/getSvgString.test.ts +2 -1
  505. package/src/test/commands/packShapes.test.ts +5 -4
  506. package/src/test/commands/resizeShape.test.ts +2 -1
  507. package/src/test/commands/rotateShapes.test.ts +7 -6
  508. package/src/test/commands/setCamera.test.ts +4 -3
  509. package/src/test/commands/setCurrentPage.test.ts +3 -2
  510. package/src/test/commands/stackShapes.test.ts +11 -10
  511. package/src/test/commands/stretch.test.tsx +13 -12
  512. package/src/test/createDeepLink.test.tsx +2 -1
  513. package/src/test/cropping.test.ts +3 -2
  514. package/src/test/drawing.test.ts +2 -1
  515. package/src/test/flipShapes.test.ts +4 -3
  516. package/src/test/frames.test.ts +25 -24
  517. package/src/test/getCulledShapes.test.tsx +3 -2
  518. package/src/test/groups.test.tsx +2 -2
  519. package/src/test/handleDeepLink.test.tsx +2 -1
  520. package/src/test/inner-outer-margin.test.ts +315 -0
  521. package/src/test/maxShapes.test.ts +3 -2
  522. package/src/test/modifiers.test.ts +5 -4
  523. package/src/test/navigation.test.ts +264 -9
  524. package/src/test/panning.test.ts +2 -1
  525. package/src/test/perf/perf.test.ts +2 -1
  526. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  527. package/src/test/resizing.test.ts +39 -38
  528. package/src/test/select.test.tsx +4 -3
  529. package/src/test/selection-omnibus.test.ts +11 -10
  530. package/src/test/shapeutils.test.ts +398 -48
  531. package/src/test/translating.test.ts +10 -9
  532. package/tldraw.css +737 -627
  533. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  534. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
@@ -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\trichText: toRichText(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": "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",
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.16.0-internal.a478398270c6",
4
+ "version": "3.16.0-next.15f085081fd5",
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",
@@ -26,9 +27,9 @@
26
27
  ],
27
28
  "main": "dist-cjs/index.js",
28
29
  "scripts": {
29
- "test-ci": "lazy inherit",
30
- "test": "yarn run -T jest",
31
- "test-coverage": "lazy inherit",
30
+ "test-ci": "yarn run -T vitest run --passWithNoTests",
31
+ "test": "yarn run -T vitest --passWithNoTests",
32
+ "test-coverage": "yarn run -T vitest run --coverage --passWithNoTests",
32
33
  "predev": "node ./scripts/copy-css-files.mjs",
33
34
  "dev": "chokidar '../{editor/editor,tldraw/src/lib/ui}.css' -c 'node ./scripts/copy-css-files.mjs'",
34
35
  "prebuild": "node ./scripts/copy-css-files.mjs",
@@ -37,7 +38,8 @@
37
38
  "prepack": "yarn run -T tsx ../../internal/scripts/prepack.ts",
38
39
  "postpack": "../../internal/scripts/postpack.sh",
39
40
  "pack-tarball": "yarn pack",
40
- "lint": "yarn run -T tsx ../../internal/scripts/lint.ts"
41
+ "lint": "yarn run -T tsx ../../internal/scripts/lint.ts",
42
+ "context": "yarn run -T tsx ../../internal/scripts/context.ts"
41
43
  },
42
44
  "files": [
43
45
  "tldraw.css",
@@ -53,13 +55,13 @@
53
55
  "@tiptap/pm": "^2.9.1",
54
56
  "@tiptap/react": "^2.9.1",
55
57
  "@tiptap/starter-kit": "^2.9.1",
56
- "@tldraw/editor": "3.16.0-internal.a478398270c6",
57
- "@tldraw/store": "3.16.0-internal.a478398270c6",
58
+ "@tldraw/editor": "3.16.0-next.15f085081fd5",
59
+ "@tldraw/store": "3.16.0-next.15f085081fd5",
58
60
  "classnames": "^2.5.1",
59
61
  "hotkeys-js": "^3.13.9",
60
62
  "idb": "^7.1.1",
61
63
  "lz-string": "^1.5.0",
62
- "radix-ui": "^1.3.4"
64
+ "radix-ui": "^1.4.2"
63
65
  },
64
66
  "peerDependencies": {
65
67
  "react": "^18.2.0 || ^19.0.0",
@@ -67,40 +69,16 @@
67
69
  },
68
70
  "devDependencies": {
69
71
  "@peculiar/webcrypto": "^1.5.0",
70
- "@testing-library/jest-dom": "^5.17.0",
71
72
  "@testing-library/react": "^15.0.7",
72
73
  "@types/classnames": "^2.3.4",
73
74
  "@types/lz-string": "^1.5.0",
74
75
  "@types/react": "^18.3.18",
75
76
  "chokidar-cli": "^3.0.0",
76
- "jest-canvas-mock": "^2.5.2",
77
- "jest-environment-jsdom": "^29.7.0",
78
77
  "lazyrepo": "0.0.0-alpha.27",
79
78
  "react": "^18.3.1",
80
79
  "react-dom": "^18.3.1",
81
- "resize-observer-polyfill": "^1.5.1"
82
- },
83
- "jest": {
84
- "preset": "../../internal/config/jest/node/jest-preset.js",
85
- "testEnvironment": "../../../packages/utils/patchedJestJsDom.js",
86
- "fakeTimers": {
87
- "enableGlobally": true
88
- },
89
- "testPathIgnorePatterns": [
90
- "^.+\\.*.css$"
91
- ],
92
- "moduleNameMapper": {
93
- "^~(.*)": "<rootDir>/src/$1",
94
- "\\.(css|less|scss|sass)$": "identity-obj-proxy"
95
- },
96
- "setupFiles": [
97
- "raf/polyfill",
98
- "jest-canvas-mock",
99
- "<rootDir>/setupTests.js"
100
- ],
101
- "setupFilesAfterEnv": [
102
- "../../internal/config/setupJest.ts"
103
- ]
80
+ "resize-observer-polyfill": "^1.5.1",
81
+ "vitest": "^3.2.4"
104
82
  },
105
83
  "module": "dist-esm/index.mjs",
106
84
  "source": "src/index.ts",
package/src/index.ts CHANGED
@@ -22,8 +22,20 @@ export {
22
22
  } from './lib/shapes/shared/PathBuilder'
23
23
  export { usePrefersReducedMotion } from './lib/shapes/shared/usePrefersReducedMotion'
24
24
  export { DefaultA11yAnnouncer, useSelectedShapesAnnouncer } from './lib/ui/components/A11y'
25
+ export { AccessibilityMenu } from './lib/ui/components/AccessibilityMenu'
25
26
  export { ColorSchemeMenu } from './lib/ui/components/ColorSchemeMenu'
27
+ export { DefaultFollowingIndicator } from './lib/ui/components/DefaultFollowingIndicator'
26
28
  export { DefaultDialogs } from './lib/ui/components/Dialogs'
29
+ export {
30
+ TldrawUiColumn,
31
+ TldrawUiGrid,
32
+ TldrawUiOrientationProvider,
33
+ TldrawUiRow,
34
+ useTldrawUiOrientation,
35
+ type TldrawUiOrientationContext,
36
+ type TldrawUiOrientationProviderProps,
37
+ type TLUiLayoutProps,
38
+ } from './lib/ui/components/primitives/layout'
27
39
  export {
28
40
  TldrawUiMenuActionCheckboxItem,
29
41
  type TLUiMenuActionCheckboxItemProps,
@@ -41,6 +53,7 @@ export { TldrawUiTranslationProvider } from './lib/ui/hooks/useTranslation/useTr
41
53
  // eslint-disable-next-line local/no-export-star
42
54
  export * from '@tldraw/editor'
43
55
  export { ArrowBindingUtil } from './lib/bindings/arrow/ArrowBindingUtil'
56
+ export { TldrawCropHandles, type TldrawCropHandlesProps } from './lib/canvas/TldrawCropHandles'
44
57
  export { TldrawHandles } from './lib/canvas/TldrawHandles'
45
58
  export { TldrawArrowHints, TldrawOverlays } from './lib/canvas/TldrawOverlays'
46
59
  export { TldrawScribble } from './lib/canvas/TldrawScribble'
@@ -71,7 +84,9 @@ export {
71
84
  defaultHandleExternalTldrawContent,
72
85
  defaultHandleExternalUrlAsset,
73
86
  defaultHandleExternalUrlContent,
87
+ getAssetInfo,
74
88
  getMediaAssetInfoPartial,
89
+ notifyIfFileNotAllowed,
75
90
  registerDefaultExternalContentHandlers,
76
91
  type TLDefaultExternalContentHandlerOpts,
77
92
  type TLExternalContentProps,
@@ -153,6 +168,9 @@ export {
153
168
  type TLDefaultFont,
154
169
  type TLDefaultFonts,
155
170
  } from './lib/shapes/shared/defaultFonts'
171
+ export { getStrokePoints } from './lib/shapes/shared/freehand/getStrokePoints'
172
+ export { getSvgPathFromStrokePoints } from './lib/shapes/shared/freehand/svg'
173
+ export { type StrokeOptions, type StrokePoint } from './lib/shapes/shared/freehand/types'
156
174
  export {
157
175
  PlainTextLabel,
158
176
  TextLabel,
@@ -183,6 +201,7 @@ export { TldrawImage, type TldrawImageProps } from './lib/TldrawImage'
183
201
  export { EraserTool } from './lib/tools/EraserTool/EraserTool'
184
202
  export { HandTool } from './lib/tools/HandTool/HandTool'
185
203
  export { LaserTool } from './lib/tools/LaserTool/LaserTool'
204
+ export { getHitShapeOnCanvasPointerDown } from './lib/tools/selection-logic/getHitShapeOnCanvasPointerDown'
186
205
  export { SelectTool } from './lib/tools/SelectTool/SelectTool'
187
206
  export { ZoomTool } from './lib/tools/ZoomTool/ZoomTool'
188
207
  export {
@@ -250,6 +269,7 @@ export {
250
269
  EditSubmenu,
251
270
  ExportFileContentSubMenu,
252
271
  ExtrasGroup,
272
+ LockGroup,
253
273
  MiscMenuGroup,
254
274
  PreferencesGroup,
255
275
  UndoRedoGroup,
@@ -283,12 +303,14 @@ export {
283
303
  ToggleEdgeScrollingItem,
284
304
  ToggleFocusModeItem,
285
305
  ToggleGridItem,
306
+ ToggleKeyboardShortcutsItem,
286
307
  ToggleLockMenuItem,
287
308
  TogglePasteAtCursorItem,
288
309
  ToggleReduceMotionItem,
289
310
  ToggleSnapModeItem,
290
311
  ToggleToolLockItem,
291
312
  ToggleTransparentBgMenuItem,
313
+ ToggleUiLabelsItem,
292
314
  ToggleWrapModeItem,
293
315
  UngroupMenuItem,
294
316
  UnlockAllMenuItem,
@@ -381,7 +403,11 @@ export {
381
403
  type TLUiDropdownMenuSubTriggerProps,
382
404
  type TLUiDropdownMenuTriggerProps,
383
405
  } from './lib/ui/components/primitives/TldrawUiDropdownMenu'
384
- export { TldrawUiIcon, type TLUiIconProps } from './lib/ui/components/primitives/TldrawUiIcon'
406
+ export {
407
+ TldrawUiIcon,
408
+ type TLUiIconJsx,
409
+ type TLUiIconProps,
410
+ } from './lib/ui/components/primitives/TldrawUiIcon'
385
411
  export { TldrawUiInput, type TLUiInputProps } from './lib/ui/components/primitives/TldrawUiInput'
386
412
  export { TldrawUiKbd, type TLUiKbdProps } from './lib/ui/components/primitives/TldrawUiKbd'
387
413
  export {
@@ -403,6 +429,12 @@ export {
403
429
  type TLUiToolbarToggleGroupProps,
404
430
  type TLUiToolbarToggleItemProps,
405
431
  } from './lib/ui/components/primitives/TldrawUiToolbar'
432
+ export {
433
+ TldrawUiTooltip,
434
+ TldrawUiTooltipProvider,
435
+ type TldrawUiTooltipProps,
436
+ type TldrawUiTooltipProviderProps,
437
+ } from './lib/ui/components/primitives/TldrawUiTooltip'
406
438
  export {
407
439
  DefaultQuickActions,
408
440
  type TLUiQuickActionsProps,
@@ -463,6 +495,7 @@ export {
463
495
  EraserToolbarItem,
464
496
  FrameToolbarItem,
465
497
  HandToolbarItem,
498
+ HeartToolbarItem,
466
499
  HexagonToolbarItem,
467
500
  HighlightToolbarItem,
468
501
  LaserToolbarItem,
@@ -493,6 +526,10 @@ export {
493
526
  OverflowingToolbar,
494
527
  type OverflowingToolbarProps,
495
528
  } from './lib/ui/components/Toolbar/OverflowingToolbar'
529
+ export {
530
+ ToggleToolLockedButton,
531
+ type ToggleToolLockedButtonProps,
532
+ } from './lib/ui/components/Toolbar/ToggleToolLockedButton'
496
533
  export {
497
534
  CenteredTopPanelContainer,
498
535
  type CenteredTopPanelContainerProps,
@@ -562,7 +599,7 @@ export {
562
599
  type TLUiToastsContextType,
563
600
  type TLUiToastsProviderProps,
564
601
  } from './lib/ui/context/toasts'
565
- export { useCanRedo, useCanUndo } from './lib/ui/hooks/menu-hooks'
602
+ export { useCanRedo, useCanUndo, useUnlockedSelectedShapesCount } from './lib/ui/hooks/menu-hooks'
566
603
  export { useMenuClipboardEvents, useNativeClipboardEvents } from './lib/ui/hooks/useClipboardEvents'
567
604
  export {
568
605
  useCollaborationStatus,
@@ -576,7 +613,9 @@ export { useMenuIsOpen } from './lib/ui/hooks/useMenuIsOpen'
576
613
  export { useReadonly } from './lib/ui/hooks/useReadonly'
577
614
  export { useRelevantStyles } from './lib/ui/hooks/useRelevantStyles'
578
615
  export {
616
+ onDragFromToolbarToCreateShape,
579
617
  useTools,
618
+ type OnDragFromToolbarToCreateShapesOpts,
580
619
  type TLUiToolItem,
581
620
  type TLUiToolsContextType,
582
621
  type TLUiToolsProviderProps,
@@ -591,7 +630,7 @@ export {
591
630
  } from './lib/ui/hooks/useTranslation/useTranslation'
592
631
  export { type TLUiIconType } from './lib/ui/icon-types'
593
632
  export { useDefaultHelpers, type TLUiOverrideHelpers, type TLUiOverrides } from './lib/ui/overrides'
594
- export { TldrawUi, type TldrawUiProps } from './lib/ui/TldrawUi'
633
+ export { TldrawUi, TldrawUiInFrontOfTheCanvas, type TldrawUiProps } from './lib/ui/TldrawUi'
595
634
  export { containBoxSize, downsizeImage, type BoxWidthHeight } from './lib/utils/assets/assets'
596
635
  export { preloadFont, type TLTypeFace } from './lib/utils/assets/preload-font'
597
636
  export { getEmbedInfo, type TLEmbedResult } from './lib/utils/embeds/embeds'
@@ -33,7 +33,7 @@ import { registerDefaultSideEffects } from './defaultSideEffects'
33
33
  import { defaultTools } from './defaultTools'
34
34
  import { EmbedShapeUtil } from './shapes/embed/EmbedShapeUtil'
35
35
  import { allDefaultFontFaces } from './shapes/shared/defaultFonts'
36
- import { TldrawUi, TldrawUiProps } from './ui/TldrawUi'
36
+ import { TldrawUi, TldrawUiInFrontOfTheCanvas, TldrawUiProps } from './ui/TldrawUi'
37
37
  import { TLUiAssetUrlOverrides, useDefaultUiAssetUrlsWithOverrides } from './ui/assetUrls'
38
38
  import { LoadingScreen } from './ui/components/LoadingScreen'
39
39
  import { Spinner } from './ui/components/Spinner'
@@ -118,6 +118,18 @@ export function Tldraw(props: TldrawProps) {
118
118
 
119
119
  const _components = useShallowObjectIdentity(components)
120
120
 
121
+ const CustomInFrontOfTheCanvas = components?.InFrontOfTheCanvas
122
+ const InFrontOfTheCanvas = useMemo(() => {
123
+ if (rest.hideUi) return CustomInFrontOfTheCanvas ?? null
124
+ if (!CustomInFrontOfTheCanvas) return TldrawUiInFrontOfTheCanvas
125
+
126
+ return () => (
127
+ <>
128
+ <TldrawUiInFrontOfTheCanvas />
129
+ <CustomInFrontOfTheCanvas />
130
+ </>
131
+ )
132
+ }, [rest.hideUi, CustomInFrontOfTheCanvas])
121
133
  const componentsWithDefault = useMemo(
122
134
  () => ({
123
135
  Scribble: TldrawScribble,
@@ -129,8 +141,9 @@ export function Tldraw(props: TldrawProps) {
129
141
  Spinner,
130
142
  LoadingScreen,
131
143
  ..._components,
144
+ InFrontOfTheCanvas,
132
145
  }),
133
- [_components]
146
+ [_components, InFrontOfTheCanvas]
134
147
  )
135
148
 
136
149
  const _shapeUtils = useShallowArrayIdentity(shapeUtils)
@@ -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: assetUrls?.fonts,
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
- assetUrls,
182
+ assetUrlsWithOverrides,
179
183
  textOptions,
180
184
  ])
181
185
 
@@ -2,6 +2,7 @@ import { toDomPrecision } from '@tldraw/editor'
2
2
  import classNames from 'classnames'
3
3
  import { useTranslation } from '../ui/hooks/useTranslation/useTranslation'
4
4
 
5
+ /** @public */
5
6
  export interface TldrawCropHandlesProps {
6
7
  size: number
7
8
  width: number
@@ -9,6 +10,7 @@ export interface TldrawCropHandlesProps {
9
10
  hideAlternateHandles: boolean
10
11
  }
11
12
 
13
+ /** @public @react */
12
14
  export function TldrawCropHandles({
13
15
  size,
14
16
  width,
@@ -20,7 +22,7 @@ export function TldrawCropHandles({
20
22
  const msg = useTranslation()
21
23
 
22
24
  return (
23
- <svg className="tl-overlays__item">
25
+ <svg className="tl-overlays__item" aria-hidden="true">
24
26
  {/* Top left */}
25
27
  <polyline
26
28
  className="tl-corner-crop-handle"