tldraw 4.3.0-canary.d8da2a99f394 → 4.3.0-canary.da3162650c27

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 (636) hide show
  1. package/README.md +0 -2
  2. package/dist-cjs/index.d.ts +311 -242
  3. package/dist-cjs/index.js +13 -5
  4. package/dist-cjs/index.js.map +2 -2
  5. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  7. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  8. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  9. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  11. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  12. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  13. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  15. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  17. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  18. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  19. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  23. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  25. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  26. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  27. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  29. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  30. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  31. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  32. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
  33. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  35. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  36. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  37. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  38. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  39. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  41. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  42. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  44. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  46. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  47. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  48. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  49. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  50. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  51. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  52. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  53. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  54. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  55. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  56. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  57. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  59. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  61. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  62. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  63. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  64. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  65. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  66. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  67. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  68. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  69. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  70. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  72. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  73. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  74. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  75. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  76. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  77. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  78. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  79. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  80. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  81. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  82. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  83. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  84. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  85. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  86. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  87. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  88. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  89. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  90. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  91. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  92. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  93. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  94. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  95. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  96. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  97. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
  99. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  113. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
  115. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  117. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  118. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  119. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  132. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  133. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  134. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  135. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  137. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  138. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  139. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  140. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  141. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  142. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  143. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  144. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  145. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  146. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  147. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  148. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  149. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  150. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  151. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  152. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  153. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  154. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  155. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  156. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  157. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  159. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  161. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  163. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  165. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  167. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  169. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  170. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  171. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  172. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  174. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  175. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  176. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  178. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  180. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  181. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  182. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  183. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  184. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  185. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  186. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  190. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  191. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  192. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  194. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  195. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
  196. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  197. package/dist-cjs/lib/ui/context/actions.js +7 -8
  198. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  199. package/dist-cjs/lib/ui/context/components.js +1 -2
  200. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  201. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  202. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  203. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  204. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  205. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  206. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  207. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  208. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  209. package/dist-cjs/lib/ui/version.js +3 -3
  210. package/dist-cjs/lib/ui/version.js.map +1 -1
  211. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
  212. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  213. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  214. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  215. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  216. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  217. package/dist-cjs/lib/utils/text/richText.js +11 -19
  218. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  219. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  220. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  221. package/dist-esm/index.d.mts +311 -242
  222. package/dist-esm/index.mjs +14 -5
  223. package/dist-esm/index.mjs.map +2 -2
  224. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  225. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  226. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  227. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  228. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  229. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  230. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  231. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  232. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  234. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  236. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  238. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  241. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  243. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  244. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  246. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  248. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  250. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  251. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  252. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  253. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  254. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  255. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  256. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  257. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  259. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  260. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  261. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  262. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  263. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  264. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  265. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  266. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  267. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  268. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  269. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  270. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  271. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  272. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  274. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  275. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  276. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  277. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  278. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  279. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  280. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  281. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  282. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  283. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  284. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  285. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  286. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  287. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  288. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  289. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  290. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  291. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  292. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  293. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  294. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  295. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  296. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  297. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  298. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  299. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  300. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  301. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  302. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  303. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  304. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  305. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  306. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
  307. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  308. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  309. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  310. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  311. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  312. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  313. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  314. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  315. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  316. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
  317. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  318. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  319. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  327. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  328. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  329. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  330. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  331. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  332. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
  333. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  334. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  335. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  336. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  337. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  347. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  348. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  350. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  351. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  352. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  353. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  354. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  355. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  356. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  357. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  358. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  359. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  360. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  361. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  362. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  363. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  364. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  365. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  366. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  367. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  368. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  369. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  370. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  371. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  372. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  373. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  374. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  375. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  376. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  377. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  378. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  379. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  380. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  381. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  382. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  383. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  384. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  385. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  386. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  387. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  389. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  390. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  391. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  392. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  393. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  394. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  395. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  396. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  398. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  399. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  400. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  401. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  402. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  403. package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
  404. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  406. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  407. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  408. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  409. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  410. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  411. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  412. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  413. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
  414. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  415. package/dist-esm/lib/ui/context/actions.mjs +7 -8
  416. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  417. package/dist-esm/lib/ui/context/components.mjs +1 -2
  418. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  419. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  420. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  421. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  422. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  423. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  424. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  425. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  426. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  427. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  428. package/dist-esm/lib/ui/version.mjs +3 -3
  429. package/dist-esm/lib/ui/version.mjs.map +1 -1
  430. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
  431. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  432. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  433. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  434. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  435. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  436. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  437. package/dist-esm/lib/utils/text/richText.mjs +8 -5
  438. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  439. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  440. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  441. package/package.json +18 -16
  442. package/src/index.ts +6 -2
  443. package/src/lib/Tldraw.test.tsx +46 -1
  444. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  445. package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
  446. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  447. package/src/lib/defaultExternalContentHandlers.ts +13 -14
  448. package/src/lib/defaultSideEffects.ts +6 -1
  449. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  450. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  451. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  452. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  453. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  454. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  455. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  456. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  457. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  458. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  459. package/src/lib/shapes/arrow/shared.ts +4 -4
  460. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  461. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
  462. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  463. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  464. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  465. package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
  466. package/src/lib/shapes/draw/getPath.ts +31 -10
  467. package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
  468. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
  469. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  470. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  471. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  472. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  473. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  474. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  475. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  476. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
  477. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  478. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  479. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  480. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  481. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  482. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  483. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  484. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  485. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  486. package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
  487. package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
  488. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  489. package/src/lib/shapes/shared/crop.ts +1 -0
  490. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  491. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  492. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  493. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  494. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  495. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  496. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  497. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  498. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  499. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  500. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  501. package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
  502. package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
  503. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  504. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  505. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  506. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  507. package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
  508. package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
  509. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  510. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
  511. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  512. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  513. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  514. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  515. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
  516. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
  517. package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
  518. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
  519. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  520. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
  521. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  522. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  523. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  524. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  525. package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
  526. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  527. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
  528. package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
  529. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  530. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  531. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  532. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  533. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  534. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  535. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  536. package/src/lib/ui/TldrawUi.tsx +5 -2
  537. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  538. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  539. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  540. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  541. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  542. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  543. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  544. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  545. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  546. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  547. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  548. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  549. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  550. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  551. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  552. package/src/lib/ui/components/menu-items.tsx +9 -15
  553. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  554. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  555. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  556. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  557. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  558. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
  559. package/src/lib/ui/context/actions.tsx +15 -19
  560. package/src/lib/ui/context/components.tsx +1 -2
  561. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  562. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  563. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  564. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  565. package/src/lib/ui/hooks/useTools.tsx +5 -7
  566. package/src/lib/ui/version.ts +3 -3
  567. package/src/lib/ui.css +27 -23
  568. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  569. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
  570. package/src/lib/utils/export/exportAs.ts +2 -9
  571. package/src/lib/utils/frames/frames.ts +1 -1
  572. package/src/lib/utils/test-helpers.ts +60 -0
  573. package/src/lib/utils/text/richText.ts +9 -8
  574. package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
  575. package/src/test/Editor.test.tsx +78 -41
  576. package/src/test/EraserTool.test.ts +10 -12
  577. package/src/test/SelectTool.test.ts +11 -19
  578. package/src/test/TestEditor.ts +49 -51
  579. package/src/test/TldrawEditor.test.tsx +24 -20
  580. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  581. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  582. package/src/test/arrows-megabus.test.tsx +1 -1
  583. package/src/test/bindings.test.tsx +29 -25
  584. package/src/test/bindingsIndex.test.tsx +4 -4
  585. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  586. package/src/test/commands/cameraState.test.ts +299 -0
  587. package/src/test/commands/createShape.test.ts +64 -0
  588. package/src/test/commands/createShapes.test.ts +15 -1
  589. package/src/test/commands/getSvgString.test.ts +2 -2
  590. package/src/test/commands/isShapeOfType.test.ts +44 -0
  591. package/src/test/commands/putContent.test.ts +80 -1
  592. package/src/test/commands/setCamera.test.ts +13 -11
  593. package/src/test/commands/stackShapes.test.ts +34 -8
  594. package/src/test/commands/updateShape.test.ts +67 -0
  595. package/src/test/commands/updateShapes.test.ts +21 -5
  596. package/src/test/commands/zoomToBounds.test.ts +19 -3
  597. package/src/test/commands/zoomToSelection.test.ts +14 -3
  598. package/src/test/custom-clipping.test.ts +52 -44
  599. package/src/test/customSnapping.test.tsx +77 -62
  600. package/src/test/drawing.test.ts +17 -10
  601. package/src/test/duplicate.test.ts +1 -1
  602. package/src/test/flipShapes.test.ts +33 -0
  603. package/src/test/frames.test.ts +94 -2
  604. package/src/test/getCulledShapes.test.tsx +11 -3
  605. package/src/test/getShapeAtPoint.test.ts +2 -2
  606. package/src/test/groups.test.tsx +7 -4
  607. package/src/test/modifiers.test.ts +6 -6
  608. package/src/test/resizing.test.ts +16 -22
  609. package/src/test/selection-omnibus.test.ts +13 -13
  610. package/src/test/shapeutils.test.ts +1 -1
  611. package/src/test/spacebarPanning.test.ts +28 -10
  612. package/src/test/styles2.test.tsx +1 -1
  613. package/src/test/styles3.test.ts +5 -5
  614. package/src/test/test-jsx.tsx +72 -57
  615. package/src/test/text.test.ts +15 -17
  616. package/src/test/translating.test.ts +6 -8
  617. package/src/test/ui/BackToContent.test.tsx +111 -0
  618. package/tldraw.css +41 -35
  619. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  620. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  621. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  622. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  623. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  624. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  625. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  626. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  627. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  628. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  629. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  630. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  631. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  632. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  633. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  634. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  635. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  636. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -10,6 +10,7 @@ import {
10
10
  TLShapePartial,
11
11
  Vec,
12
12
  VecModel,
13
+ b64Vecs,
13
14
  createShapeId,
14
15
  last,
15
16
  snapAngle,
@@ -49,19 +50,23 @@ export class Drawing extends StateNode {
49
50
  mergeNextPoint = false
50
51
  currentLineLength = 0
51
52
 
53
+ // Cache for current segment's points to avoid repeated b64 decode/encode
54
+ currentSegmentPoints: Vec[] = []
55
+
52
56
  markId = null as null | string
53
57
 
54
58
  override onEnter(info: TLPointerEventInfo) {
55
59
  this.markId = null
56
60
  this.info = info
57
- this.lastRecordedPoint = this.editor.inputs.currentPagePoint.clone()
61
+ this.lastRecordedPoint = this.editor.inputs.getCurrentPagePoint().clone()
58
62
  this.startShape()
59
63
  }
60
64
 
61
65
  override onPointerMove() {
62
66
  const { inputs } = this.editor
67
+ const isPen = inputs.getIsPen()
63
68
 
64
- if (this.isPen && !inputs.isPen) {
69
+ if (this.isPen && !isPen) {
65
70
  // The user made a palm gesture before starting a pen gesture;
66
71
  // ideally we'd start the new shape here but we could also just bail
67
72
  // as the next interaction will work correctly
@@ -74,11 +79,9 @@ export class Drawing extends StateNode {
74
79
 
75
80
  if (this.isPenOrStylus) {
76
81
  // Don't update the shape if we haven't moved far enough from the last time we recorded a point
77
- if (
78
- Vec.Dist(inputs.currentPagePoint, this.lastRecordedPoint) >=
79
- 1 / this.editor.getZoomLevel()
80
- ) {
81
- this.lastRecordedPoint = inputs.currentPagePoint.clone()
82
+ const currentPagePoint = inputs.getCurrentPagePoint()
83
+ if (Vec.Dist(currentPagePoint, this.lastRecordedPoint) >= 1 / this.editor.getZoomLevel()) {
84
+ this.lastRecordedPoint = currentPagePoint.clone()
82
85
  this.mergeNextPoint = false
83
86
  } else {
84
87
  this.mergeNextPoint = true
@@ -96,7 +99,7 @@ export class Drawing extends StateNode {
96
99
  case 'free': {
97
100
  // We've just entered straight mode, go to straight mode
98
101
  this.segmentMode = 'starting_straight'
99
- this.pagePointWhereNextSegmentChanged = this.editor.inputs.currentPagePoint.clone()
102
+ this.pagePointWhereNextSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
100
103
  break
101
104
  }
102
105
  case 'starting_free': {
@@ -115,7 +118,7 @@ export class Drawing extends StateNode {
115
118
  case 'straight': {
116
119
  // We've just exited straight mode, go back to free mode
117
120
  this.segmentMode = 'starting_free'
118
- this.pagePointWhereNextSegmentChanged = this.editor.inputs.currentPagePoint.clone()
121
+ this.pagePointWhereNextSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
119
122
  break
120
123
  }
121
124
  case 'starting_straight': {
@@ -131,7 +134,7 @@ export class Drawing extends StateNode {
131
134
 
132
135
  override onExit() {
133
136
  this.editor.snaps.clearIndicators()
134
- this.pagePointWhereCurrentSegmentChanged = this.editor.inputs.currentPagePoint.clone()
137
+ this.pagePointWhereCurrentSegmentChanged = this.editor.inputs.getCurrentPagePoint().clone()
135
138
  }
136
139
 
137
140
  canClose() {
@@ -142,11 +145,13 @@ export class Drawing extends StateNode {
142
145
  if (!this.canClose()) return false
143
146
 
144
147
  const strokeWidth = STROKE_SIZES[size]
145
- const firstPoint = segments[0].points[0]
148
+ const firstPoint = b64Vecs.decodeFirstPoint(segments[0].points)
146
149
  const lastSegment = segments[segments.length - 1]
147
- const lastPoint = lastSegment.points[lastSegment.points.length - 1]
150
+ const lastPoint = b64Vecs.decodeLastPoint(lastSegment.points)
148
151
 
149
152
  return (
153
+ firstPoint !== null &&
154
+ lastPoint !== null &&
150
155
  firstPoint !== lastPoint &&
151
156
  this.currentLineLength > strokeWidth * 4 * scale &&
152
157
  Vec.DistMin(firstPoint, lastPoint, strokeWidth * 2 * scale)
@@ -154,9 +159,9 @@ export class Drawing extends StateNode {
154
159
  }
155
160
 
156
161
  private startShape() {
157
- const {
158
- inputs: { originPagePoint, isPen },
159
- } = this.editor
162
+ const inputs = this.editor.inputs
163
+ const originPagePoint = inputs.getOriginPagePoint()
164
+ const isPen = inputs.getIsPen()
160
165
 
161
166
  this.markId = this.editor.markHistoryStoppingPoint('draw start')
162
167
 
@@ -172,7 +177,7 @@ export class Drawing extends StateNode {
172
177
 
173
178
  const pressure = this.isPenOrStylus ? z * 1.25 : 0.5
174
179
 
175
- this.segmentMode = this.editor.inputs.shiftKey ? 'straight' : 'free'
180
+ this.segmentMode = this.editor.inputs.getShiftKey() ? 'straight' : 'free'
176
181
 
177
182
  this.didJustShiftClickToExtendPreviousShapeLine = false
178
183
 
@@ -188,25 +193,17 @@ export class Drawing extends StateNode {
188
193
 
189
194
  const prevSegment = last(shape.props.segments)
190
195
  if (!prevSegment) throw Error('Expected a previous segment!')
191
- const prevPoint = last(prevSegment.points)
196
+ const prevPoint = b64Vecs.decodeLastPoint(prevSegment.points)
192
197
  if (!prevPoint) throw Error('Expected a previous point!')
193
198
 
194
199
  const { x, y } = this.editor.getPointInShapeSpace(shape, originPagePoint).toFixed()
195
200
 
196
201
  const newSegment: TLDrawShapeSegment = {
197
202
  type: this.segmentMode,
198
- points: [
199
- {
200
- x: prevPoint.x,
201
- y: prevPoint.y,
202
- z: +pressure.toFixed(2),
203
- },
204
- {
205
- x,
206
- y,
207
- z: +pressure.toFixed(2),
208
- },
209
- ],
203
+ points: b64Vecs.encodePoints([
204
+ { x: prevPoint.x, y: prevPoint.y, z: +pressure.toFixed(2) },
205
+ { x, y, z: +pressure.toFixed(2) },
206
+ ]),
210
207
  }
211
208
 
212
209
  // Convert prevPoint to page space
@@ -238,7 +235,7 @@ export class Drawing extends StateNode {
238
235
  )
239
236
  }
240
237
 
241
- this.editor.updateShapes<TLDrawShape | TLHighlightShape>([shapePartial])
238
+ this.editor.updateShapes([shapePartial])
242
239
 
243
240
  return
244
241
  }
@@ -249,8 +246,12 @@ export class Drawing extends StateNode {
249
246
  this.pagePointWhereCurrentSegmentChanged = originPagePoint.clone()
250
247
  const id = createShapeId()
251
248
 
249
+ // Initialize the segment points cache
250
+ const initialPoint = new Vec(0, 0, +pressure.toFixed(2))
251
+ this.currentSegmentPoints = [initialPoint]
252
+
252
253
  // Allow this to trigger the max shapes reached alert
253
- this.editor.createShape<DrawableShape>({
254
+ this.editor.createShape({
254
255
  id,
255
256
  type: this.shapeType,
256
257
  x: originPagePoint.x,
@@ -261,13 +262,7 @@ export class Drawing extends StateNode {
261
262
  segments: [
262
263
  {
263
264
  type: this.segmentMode,
264
- points: [
265
- {
266
- x: 0,
267
- y: 0,
268
- z: +pressure.toFixed(2),
269
- },
270
- ],
265
+ points: b64Vecs.encodePoints([initialPoint]),
271
266
  },
272
267
  ],
273
268
  },
@@ -298,8 +293,9 @@ export class Drawing extends StateNode {
298
293
 
299
294
  const { segments } = shape.props
300
295
 
301
- const { x, y, z } = this.editor.getPointInShapeSpace(shape, inputs.currentPagePoint).toFixed()
302
- const pressure = this.isPenOrStylus ? +(inputs.currentPagePoint.z! * 1.25).toFixed(2) : 0.5
296
+ const currentPagePoint = inputs.getCurrentPagePoint()
297
+ const { x, y, z } = this.editor.getPointInShapeSpace(shape, currentPagePoint).toFixed()
298
+ const pressure = this.isPenOrStylus ? +(currentPagePoint.z! * 1.25).toFixed(2) : 0.5
303
299
  const newPoint = { x, y, z: pressure }
304
300
 
305
301
  switch (this.segmentMode) {
@@ -311,7 +307,7 @@ export class Drawing extends StateNode {
311
307
  }
312
308
 
313
309
  const hasMovedFarEnough =
314
- Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.currentPagePoint) >
310
+ Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.getCurrentPagePoint()) >
315
311
  this.editor.options.dragDistanceSquared
316
312
 
317
313
  // Find the distance from where the pointer was when shift was released and
@@ -328,7 +324,7 @@ export class Drawing extends StateNode {
328
324
  const prevSegment = last(segments)
329
325
  if (!prevSegment) throw Error('Expected a previous segment!')
330
326
 
331
- const prevLastPoint = last(prevSegment.points)
327
+ const prevLastPoint = b64Vecs.decodeLastPoint(prevSegment.points)
332
328
  if (!prevLastPoint) throw Error('Expected a previous last point!')
333
329
 
334
330
  let newSegment: TLDrawShapeSegment
@@ -343,7 +339,7 @@ export class Drawing extends StateNode {
343
339
 
344
340
  newSegment = {
345
341
  type: 'straight',
346
- points: [{ ...prevLastPoint }, newLastPoint],
342
+ points: b64Vecs.encodePoints([prevLastPoint, newLastPoint]),
347
343
  }
348
344
 
349
345
  const transform = this.editor.getShapePageTransform(shape)!
@@ -352,7 +348,7 @@ export class Drawing extends StateNode {
352
348
  } else {
353
349
  newSegment = {
354
350
  type: 'straight',
355
- points: [newLastPoint, newPoint],
351
+ points: b64Vecs.encodePoints([newLastPoint, newPoint]),
356
352
  }
357
353
  }
358
354
 
@@ -372,7 +368,7 @@ export class Drawing extends StateNode {
372
368
  )
373
369
  }
374
370
 
375
- this.editor.updateShapes<TLDrawShape | TLHighlightShape>([shapePartial])
371
+ this.editor.updateShapes([shapePartial])
376
372
  }
377
373
  break
378
374
  }
@@ -384,7 +380,7 @@ export class Drawing extends StateNode {
384
380
  }
385
381
 
386
382
  const hasMovedFarEnough =
387
- Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.currentPagePoint) >
383
+ Vec.Dist2(pagePointWhereNextSegmentChanged, inputs.getCurrentPagePoint()) >
388
384
  this.editor.options.dragDistanceSquared
389
385
 
390
386
  // Find the distance from where the pointer was when shift was released and
@@ -400,7 +396,7 @@ export class Drawing extends StateNode {
400
396
 
401
397
  const newSegments = segments.slice()
402
398
  const prevStraightSegment = newSegments[newSegments.length - 1]
403
- const prevPoint = last(prevStraightSegment.points)
399
+ const prevPoint = b64Vecs.decodeLastPoint(prevStraightSegment.points)
404
400
 
405
401
  if (!prevPoint) {
406
402
  throw Error('No previous point!')
@@ -408,15 +404,15 @@ export class Drawing extends StateNode {
408
404
 
409
405
  // Create the new free segment and interpolate the points between where the last line
410
406
  // ended and where the pointer is now
407
+ const interpolatedPoints = Vec.PointsBetween(prevPoint, newPoint, 6).map(
408
+ (p) => new Vec(toFixed(p.x), toFixed(p.y), toFixed(p.z))
409
+ )
410
+ // Initialize cache for the new free segment
411
+ this.currentSegmentPoints = interpolatedPoints
412
+
411
413
  const newFreeSegment: TLDrawShapeSegment = {
412
414
  type: 'free',
413
- points: [
414
- ...Vec.PointsBetween(prevPoint, newPoint, 6).map((p) => ({
415
- x: toFixed(p.x),
416
- y: toFixed(p.y),
417
- z: toFixed(p.z),
418
- })),
419
- ],
415
+ points: b64Vecs.encodePoints(interpolatedPoints),
420
416
  }
421
417
 
422
418
  const finalSegments = [...newSegments, newFreeSegment]
@@ -451,7 +447,9 @@ export class Drawing extends StateNode {
451
447
  const newSegment = newSegments[newSegments.length - 1]
452
448
 
453
449
  const { pagePointWhereCurrentSegmentChanged } = this
454
- const { ctrlKey, currentPagePoint } = this.editor.inputs
450
+ const inputs = this.editor.inputs
451
+ const ctrlKey = inputs.getCtrlKey()
452
+ const currentPagePoint = inputs.getCurrentPagePoint()
455
453
 
456
454
  if (!pagePointWhereCurrentSegmentChanged)
457
455
  throw Error('We should have a point where the segment changed')
@@ -460,7 +458,7 @@ export class Drawing extends StateNode {
460
458
  let shouldSnapToAngle = false
461
459
 
462
460
  if (this.didJustShiftClickToExtendPreviousShapeLine) {
463
- if (this.editor.inputs.isDragging) {
461
+ if (this.editor.inputs.getIsDragging()) {
464
462
  // If we've just shift clicked to extend a line, only snap once we've started dragging
465
463
  shouldSnapToAngle = !ctrlKey
466
464
  this.didJustShiftClickToExtendPreviousShapeLine = false
@@ -489,8 +487,8 @@ export class Drawing extends StateNode {
489
487
  if (!segment) break
490
488
  if (segment.type === 'free') continue
491
489
 
492
- const first = segment.points[0]
493
- const lastPoint = last(segment.points)
490
+ const first = b64Vecs.decodeFirstPoint(segment.points)
491
+ const lastPoint = b64Vecs.decodeLastPoint(segment.points)
494
492
  if (!(first && lastPoint)) continue
495
493
 
496
494
  // Snap to the nearest point on the segment, if it's closer than the previous snapped point
@@ -517,9 +515,9 @@ export class Drawing extends StateNode {
517
515
 
518
516
  if (didSnap && snapSegment) {
519
517
  const transform = this.editor.getShapePageTransform(shape)!
520
- const first = snapSegment.points[0]
521
- const lastPoint = last(snapSegment.points)
522
- if (!lastPoint) throw Error('Expected a last point!')
518
+ const first = b64Vecs.decodeFirstPoint(snapSegment.points)
519
+ const lastPoint = b64Vecs.decodeLastPoint(snapSegment.points)
520
+ if (!first || !lastPoint) throw Error('Expected a last point!')
523
521
 
524
522
  const A = Mat.applyToPoint(transform, first)
525
523
 
@@ -549,7 +547,7 @@ export class Drawing extends StateNode {
549
547
  angleDiff
550
548
  )
551
549
  } else {
552
- pagePoint = currentPagePoint
550
+ pagePoint = currentPagePoint.clone()
553
551
  }
554
552
 
555
553
  newPoint = this.editor.getPointInShapeSpace(shape, pagePoint).toFixed().toJson()
@@ -559,12 +557,18 @@ export class Drawing extends StateNode {
559
557
  // then the user just did a click-and-immediately-press-shift to create a new straight line
560
558
  // without continuing the previous line. In this case, we want to remove the previous segment.
561
559
 
562
- this.currentLineLength += Vec.Dist(newSegment.points[0], newPoint)
560
+ this.currentLineLength +=
561
+ newSegments.length && b64Vecs.decodeFirstPoint(newSegment.points)
562
+ ? Vec.Dist(b64Vecs.decodeFirstPoint(newSegment.points)!, Vec.From(newPoint))
563
+ : 0
563
564
 
564
565
  newSegments[newSegments.length - 1] = {
565
566
  ...newSegment,
566
567
  type: 'straight',
567
- points: [newSegment.points[0], newPoint],
568
+ points: b64Vecs.encodePoints([
569
+ b64Vecs.decodeFirstPoint(newSegment.points)!,
570
+ Vec.From(newPoint),
571
+ ]),
568
572
  }
569
573
 
570
574
  const shapePartial: TLShapePartial<DrawableShape> = {
@@ -588,27 +592,28 @@ export class Drawing extends StateNode {
588
592
  break
589
593
  }
590
594
  case 'free': {
591
- const newSegments = segments.slice()
592
- const newSegment = newSegments[newSegments.length - 1]
593
- const newPoints = [...newSegment.points]
594
-
595
- if (newPoints.length && this.mergeNextPoint) {
596
- const { z } = newPoints[newPoints.length - 1]
597
- newPoints[newPoints.length - 1] = {
598
- x: newPoint.x,
599
- y: newPoint.y,
600
- z: z ? Math.max(z, newPoint.z) : newPoint.z,
601
- }
595
+ // Use cached points instead of decoding from b64 on every update
596
+ const cachedPoints = this.currentSegmentPoints
597
+
598
+ if (cachedPoints.length && this.mergeNextPoint) {
599
+ const lastPoint = cachedPoints[cachedPoints.length - 1]
600
+ lastPoint.x = newPoint.x
601
+ lastPoint.y = newPoint.y
602
+ lastPoint.z = lastPoint.z ? Math.max(lastPoint.z, newPoint.z) : newPoint.z
602
603
  // Note: we could recompute the line length here, but it's not really necessary
603
604
  // this.currentLineLength = this.getLineLength(newSegments)
604
605
  } else {
605
- this.currentLineLength += Vec.Dist(newPoints[newPoints.length - 1], newPoint)
606
- newPoints.push(newPoint)
606
+ this.currentLineLength += cachedPoints.length
607
+ ? Vec.Dist(cachedPoints[cachedPoints.length - 1], newPoint)
608
+ : 0
609
+ cachedPoints.push(new Vec(newPoint.x, newPoint.y, newPoint.z))
607
610
  }
608
611
 
612
+ const newSegments = segments.slice()
613
+ const newSegment = newSegments[newSegments.length - 1]
609
614
  newSegments[newSegments.length - 1] = {
610
615
  ...newSegment,
611
- points: newPoints,
616
+ points: b64Vecs.encodePoints(cachedPoints),
612
617
  }
613
618
 
614
619
  if (this.currentLineLength < STROKE_SIZES[shape.props.size] * 4) {
@@ -634,7 +639,7 @@ export class Drawing extends StateNode {
634
639
  this.editor.updateShapes([shapePartial])
635
640
 
636
641
  // Set a maximum length for the lines array; after 200 points, complete the line.
637
- if (newPoints.length > this.util.options.maxPointsPerShape) {
642
+ if (cachedPoints.length > this.util.options.maxPointsPerShape) {
638
643
  this.editor.updateShapes([{ id, type: this.shapeType, props: { isComplete: true } }])
639
644
 
640
645
  const newShapeId = createShapeId()
@@ -642,18 +647,24 @@ export class Drawing extends StateNode {
642
647
  const props = this.editor.getShape<DrawableShape>(id)!.props
643
648
 
644
649
  if (!this.editor.canCreateShapes([newShapeId])) return this.cancel()
645
- this.editor.createShape<DrawableShape>({
650
+ const currentPagePoint = inputs.getCurrentPagePoint()
651
+
652
+ // Reset cache for the new shape's segment
653
+ const initialPoint = new Vec(0, 0, this.isPenOrStylus ? +(z! * 1.25).toFixed() : 0.5)
654
+ this.currentSegmentPoints = [initialPoint]
655
+
656
+ this.editor.createShape({
646
657
  id: newShapeId,
647
658
  type: this.shapeType,
648
- x: toFixed(inputs.currentPagePoint.x),
649
- y: toFixed(inputs.currentPagePoint.y),
659
+ x: toFixed(currentPagePoint.x),
660
+ y: toFixed(currentPagePoint.y),
650
661
  props: {
651
662
  isPen: this.isPenOrStylus,
652
663
  scale: props.scale,
653
664
  segments: [
654
665
  {
655
666
  type: 'free',
656
- points: [{ x: 0, y: 0, z: this.isPenOrStylus ? +(z! * 1.25).toFixed() : 0.5 }],
667
+ points: b64Vecs.encodePoints([initialPoint]),
657
668
  },
658
669
  ],
659
670
  },
@@ -669,7 +680,7 @@ export class Drawing extends StateNode {
669
680
 
670
681
  this.initialShape = structuredClone(shape)
671
682
  this.mergeNextPoint = false
672
- this.lastRecordedPoint = inputs.currentPagePoint.clone()
683
+ this.lastRecordedPoint = currentPagePoint.clone()
673
684
  this.currentLineLength = 0
674
685
  }
675
686
 
@@ -681,11 +692,10 @@ export class Drawing extends StateNode {
681
692
  private getLineLength(segments: TLDrawShapeSegment[]) {
682
693
  let length = 0
683
694
 
684
- for (const segment of segments) {
685
- for (let i = 0; i < segment.points.length - 1; i++) {
686
- const A = segment.points[i]
687
- const B = segment.points[i + 1]
688
- length += Vec.Dist2(B, A)
695
+ for (let j = 0; j < segments.length; j++) {
696
+ const points = b64Vecs.decodePoints(segments[j].points)
697
+ for (let i = 0; i < points.length - 1; i++) {
698
+ length += Vec.Dist2(points[i], points[i + 1])
689
699
  }
690
700
  }
691
701
 
@@ -705,7 +715,7 @@ export class Drawing extends StateNode {
705
715
  }
706
716
 
707
717
  override onInterrupt() {
708
- if (this.editor.inputs.isDragging) {
718
+ if (this.editor.inputs.getIsDragging()) {
709
719
  return
710
720
  }
711
721
 
@@ -43,6 +43,12 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
43
43
  static override migrations = embedShapeMigrations
44
44
  private static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS
45
45
 
46
+ override canEditWhileLocked(shape: TLEmbedShape) {
47
+ const result = this.getEmbedDefinition(shape.props.url)
48
+ if (!result) return true
49
+ return result.definition.canEditWhileLocked ?? true
50
+ }
51
+
46
52
  static setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {
47
53
  EmbedShapeUtil.embedDefinitions = embedDefinitions
48
54
  }
@@ -137,7 +143,7 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
137
143
 
138
144
  if (editingShapeId && hoveredShapeId !== editingShapeId) {
139
145
  const editingShape = this.editor.getShape(editingShapeId)
140
- if (editingShape && this.editor.isShapeOfType<TLEmbedShape>(editingShape, 'embed')) {
146
+ if (editingShape && this.editor.isShapeOfType(editingShape, 'embed')) {
141
147
  return true
142
148
  }
143
149
  }
@@ -211,6 +217,7 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
211
217
  frameBorder="0"
212
218
  referrerPolicy="no-referrer-when-downgrade"
213
219
  tabIndex={isEditing ? 0 : -1}
220
+ allowFullScreen
214
221
  style={{
215
222
  border: 0,
216
223
  pointerEvents: isInteractive ? 'auto' : 'none',
@@ -4,7 +4,7 @@ import { BaseBoxShapeTool, TLShape, TLShapeId } from '@tldraw/editor'
4
4
  export class FrameShapeTool extends BaseBoxShapeTool {
5
5
  static override id = 'frame'
6
6
  static override initial = 'idle'
7
- override shapeType = 'frame'
7
+ override shapeType = 'frame' as const
8
8
 
9
9
  override onCreate(shape: TLShape | null): void {
10
10
  if (!shape) return
@@ -9,6 +9,7 @@ import {
9
9
  TLClickEventInfo,
10
10
  TLDragShapesOutInfo,
11
11
  TLDragShapesOverInfo,
12
+ TLEditStartInfo,
12
13
  TLFrameShape,
13
14
  TLFrameShapeProps,
14
15
  TLResizeInfo,
@@ -53,6 +54,10 @@ export interface FrameShapeOptions {
53
54
  * When true, the frame will display colors for the shape's headings and background.
54
55
  */
55
56
  showColors: boolean
57
+ /**
58
+ * When true, the frame will resize its children when the frame itself is resized.
59
+ */
60
+ resizeChildren: boolean
56
61
  }
57
62
 
58
63
  export function defaultEmptyAs(str: string, dflt: string) {
@@ -70,6 +75,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
70
75
 
71
76
  override options: FrameShapeOptions = {
72
77
  showColors: false,
78
+ resizeChildren: false,
73
79
  }
74
80
 
75
81
  // evil crimes :)
@@ -88,8 +94,8 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
88
94
  return withOptions
89
95
  }
90
96
 
91
- override canEdit() {
92
- return true
97
+ override canEdit(shape: TLFrameShape, info: TLEditStartInfo) {
98
+ return info.type === 'click-header' || info.type === 'unknown'
93
99
  }
94
100
 
95
101
  override canResize() {
@@ -97,7 +103,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
97
103
  }
98
104
 
99
105
  override canResizeChildren() {
100
- return false
106
+ return this.options.resizeChildren
101
107
  }
102
108
 
103
109
  override isExportBoundsContainer(): boolean {
@@ -115,7 +121,7 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
115
121
  override getGeometry(shape: TLFrameShape): Geometry2d {
116
122
  const { editor } = this
117
123
 
118
- const z = editor.getZoomLevel()
124
+ const z = editor.getEfficientZoomLevel()
119
125
 
120
126
  // Which dimension measures the top edge after rotation?
121
127
  const labelSide = getFrameHeadingSide(editor, shape)
@@ -27,8 +27,16 @@ describe('Handle snapping', () => {
27
27
  )
28
28
  })
29
29
 
30
- const geoShape = () => editor.getShape(ids.geo)!
31
- const lineShape = () => editor.getShape(ids.line)!
30
+ const geoShape = () => {
31
+ const shape = editor.getShape(ids.geo)!
32
+ assert(editor.isShapeOfType(shape, 'geo'))
33
+ return shape
34
+ }
35
+ const lineShape = () => {
36
+ const shape = editor.getShape(ids.line)!
37
+ assert(editor.isShapeOfType(shape, 'line'))
38
+ return shape
39
+ }
32
40
  const lineHandles = () => editor.getShapeUtil('line').getHandles!(lineShape())!
33
41
 
34
42
  function startDraggingHandle() {