tldraw 4.2.2 → 4.2.3

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