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
@@ -34,15 +34,10 @@ export function registerDefaultSideEffects(editor: Editor) {
34
34
  editor.getInstanceState().isToolLocked
35
35
  ) {
36
36
  editor.setCurrentTool('select.editing_shape', {
37
- target: 'shape',
38
- shape: shape,
39
37
  isCreatingTextWhileToolLocked: true,
40
38
  })
41
39
  } else {
42
- editor.setCurrentTool('select.editing_shape', {
43
- target: 'shape',
44
- shape: shape,
45
- })
40
+ editor.setCurrentTool('select.editing_shape')
46
41
  }
47
42
  }
48
43
  } else if (prev.editingShapeId && !next.editingShapeId) {
@@ -48,19 +48,19 @@ describe('ArrowShapeOptions', () => {
48
48
  const util = editor.getShapeUtil<ArrowShapeUtil>('arrow')
49
49
 
50
50
  // Test without alt key, not precise
51
- editor.inputs.setAltKey(false)
51
+ editor.inputs.altKey = false
52
52
  expect(util.options.shouldBeExact(editor, false)).toBe(false)
53
53
 
54
54
  // Test without alt key, precise
55
- editor.inputs.setAltKey(false)
55
+ editor.inputs.altKey = false
56
56
  expect(util.options.shouldBeExact(editor, true)).toBe(false)
57
57
 
58
58
  // Test with alt key, not precise
59
- editor.inputs.setAltKey(true)
59
+ editor.inputs.altKey = true
60
60
  expect(util.options.shouldBeExact(editor, false)).toBe(true)
61
61
 
62
62
  // Test with alt key, precise
63
- editor.inputs.setAltKey(true)
63
+ editor.inputs.altKey = true
64
64
  expect(util.options.shouldBeExact(editor, true)).toBe(true)
65
65
  })
66
66
 
@@ -68,19 +68,59 @@ describe('ArrowShapeOptions', () => {
68
68
  const util = editor.getShapeUtil<ArrowShapeUtil>('arrow')
69
69
 
70
70
  // Test without ctrl key
71
- editor.inputs.setCtrlKey(false)
71
+ editor.inputs.ctrlKey = false
72
72
  expect(util.options.shouldIgnoreTargets(editor)).toBe(false)
73
73
 
74
74
  // Test with ctrl key
75
- editor.inputs.setCtrlKey(true)
75
+ editor.inputs.ctrlKey = true
76
76
  expect(util.options.shouldIgnoreTargets(editor)).toBe(true)
77
77
  })
78
78
  })
79
79
 
80
80
  describe('shouldIgnoreTargets option', () => {
81
+ it('should not bind to shapes when shouldIgnoreTargets returns true', () => {
82
+ editor.setCurrentTool('arrow')
83
+
84
+ // Simulate ctrl key held (default shouldIgnoreTargets behavior)
85
+ editor.inputs.ctrlKey = true
86
+
87
+ editor.pointerDown(50, 50) // Start outside any shape
88
+ editor.pointerMove(150, 150) // Move to center of box1
89
+ editor.pointerUp()
90
+
91
+ const createdArrow = editor
92
+ .getCurrentPageShapes()
93
+ .find((s) => s.type === 'arrow') as TLArrowShape
94
+ expect(createdArrow).toBeDefined()
95
+
96
+ const arrowBindings = getArrowBindings(editor, createdArrow)
97
+ expect(arrowBindings.start).toBeUndefined()
98
+ expect(arrowBindings.end).toBeUndefined()
99
+ })
100
+
101
+ it('should bind to shapes when shouldIgnoreTargets returns false', () => {
102
+ editor.setCurrentTool('arrow')
103
+
104
+ // Simulate no ctrl key (default shouldIgnoreTargets behavior)
105
+ editor.inputs.ctrlKey = false
106
+
107
+ editor.pointerDown(50, 50) // Start outside any shape
108
+ editor.pointerMove(150, 150) // Move to center of box1
109
+ editor.pointerUp()
110
+
111
+ const createdArrow = editor
112
+ .getCurrentPageShapes()
113
+ .find((s) => s.type === 'arrow') as TLArrowShape
114
+ expect(createdArrow).toBeDefined()
115
+
116
+ const arrowBindings = getArrowBindings(editor, createdArrow)
117
+ expect(arrowBindings.end).toBeDefined()
118
+ expect(arrowBindings.end?.toId).toBe(ids.box1)
119
+ })
120
+
81
121
  it('should work with updateArrowTargetState function', () => {
82
122
  // Test that updateArrowTargetState returns null when shouldIgnoreTargets is true
83
- editor.inputs.setCtrlKey(true)
123
+ editor.inputs.ctrlKey = true
84
124
 
85
125
  const targetState = updateArrowTargetState({
86
126
  editor,
@@ -95,7 +135,7 @@ describe('ArrowShapeOptions', () => {
95
135
  })
96
136
 
97
137
  it('should return valid target state when shouldIgnoreTargets is false', () => {
98
- editor.inputs.setCtrlKey(false)
138
+ editor.inputs.ctrlKey = false
99
139
 
100
140
  const targetState = updateArrowTargetState({
101
141
  editor,
@@ -113,8 +153,8 @@ describe('ArrowShapeOptions', () => {
113
153
 
114
154
  describe('shouldBeExact option', () => {
115
155
  it('should affect arrow targeting behavior when true', () => {
116
- editor.inputs.setAltKey(true) // shouldBeExact = true
117
- editor.inputs.setCtrlKey(false) // shouldIgnoreTargets = false
156
+ editor.inputs.altKey = true // shouldBeExact = true
157
+ editor.inputs.ctrlKey = false // shouldIgnoreTargets = false
118
158
 
119
159
  const targetState = updateArrowTargetState({
120
160
  editor,
@@ -130,8 +170,8 @@ describe('ArrowShapeOptions', () => {
130
170
  })
131
171
 
132
172
  it('should affect arrow targeting behavior when false', () => {
133
- editor.inputs.setAltKey(false) // shouldBeExact = false
134
- editor.inputs.setCtrlKey(false) // shouldIgnoreTargets = false
173
+ editor.inputs.altKey = false // shouldBeExact = false
174
+ editor.inputs.ctrlKey = false // shouldIgnoreTargets = false
135
175
 
136
176
  const targetState = updateArrowTargetState({
137
177
  editor,
@@ -154,21 +194,21 @@ describe('ArrowShapeOptions', () => {
154
194
  class CustomArrowShapeUtil extends ArrowShapeUtil {
155
195
  override options = {
156
196
  ...baseUtil.options,
157
- shouldBeExact: (editor: any, _isPrecise: boolean) => editor.inputs.getShiftKey(), // Use shift instead of alt
197
+ shouldBeExact: (editor: any, _isPrecise: boolean) => editor.inputs.shiftKey, // Use shift instead of alt
158
198
  }
159
199
  }
160
200
 
161
201
  const customUtil = new CustomArrowShapeUtil(editor)
162
202
 
163
203
  // Test with shift key
164
- editor.inputs.setShiftKey(true)
165
- editor.inputs.setAltKey(false)
204
+ editor.inputs.shiftKey = true
205
+ editor.inputs.altKey = false
166
206
  expect(customUtil.options.shouldBeExact(editor, false)).toBe(true)
167
207
  expect(customUtil.options.shouldBeExact(editor, true)).toBe(true)
168
208
 
169
209
  // Test without shift key
170
- editor.inputs.setShiftKey(false)
171
- editor.inputs.setAltKey(true) // Alt key should not matter for custom implementation
210
+ editor.inputs.shiftKey = false
211
+ editor.inputs.altKey = true // Alt key should not matter for custom implementation
172
212
  expect(customUtil.options.shouldBeExact(editor, false)).toBe(false)
173
213
  expect(customUtil.options.shouldBeExact(editor, true)).toBe(false)
174
214
  })
@@ -179,20 +219,20 @@ describe('ArrowShapeOptions', () => {
179
219
  class CustomArrowShapeUtil extends ArrowShapeUtil {
180
220
  override options = {
181
221
  ...baseUtil.options,
182
- shouldIgnoreTargets: (editor: any) => editor.inputs.getShiftKey(), // Use shift instead of ctrl
222
+ shouldIgnoreTargets: (editor: any) => editor.inputs.shiftKey, // Use shift instead of ctrl
183
223
  }
184
224
  }
185
225
 
186
226
  const customUtil = new CustomArrowShapeUtil(editor)
187
227
 
188
228
  // Test with shift key
189
- editor.inputs.setShiftKey(true)
190
- editor.inputs.setCtrlKey(false)
229
+ editor.inputs.shiftKey = true
230
+ editor.inputs.ctrlKey = false
191
231
  expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(true)
192
232
 
193
233
  // Test without shift key
194
- editor.inputs.setShiftKey(false)
195
- editor.inputs.setCtrlKey(true) // Ctrl key should not matter for custom implementation
234
+ editor.inputs.shiftKey = false
235
+ editor.inputs.ctrlKey = true // Ctrl key should not matter for custom implementation
196
236
  expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(false)
197
237
  })
198
238
 
@@ -204,13 +244,11 @@ describe('ArrowShapeOptions', () => {
204
244
  ...baseUtil.options,
205
245
  shouldBeExact: (editor: any, isPrecise: boolean) => {
206
246
  // Custom logic: exact when both alt and shift are pressed, and only if precise
207
- return editor.inputs.getAltKey() && editor.inputs.getShiftKey() && isPrecise
247
+ return editor.inputs.altKey && editor.inputs.shiftKey && isPrecise
208
248
  },
209
249
  shouldIgnoreTargets: (editor: any) => {
210
250
  // Custom logic: ignore targets when any modifier key is pressed
211
- return (
212
- editor.inputs.getAltKey() || editor.inputs.getCtrlKey() || editor.inputs.getShiftKey()
213
- )
251
+ return editor.inputs.altKey || editor.inputs.ctrlKey || editor.inputs.shiftKey
214
252
  },
215
253
  }
216
254
  }
@@ -218,35 +256,48 @@ describe('ArrowShapeOptions', () => {
218
256
  const customUtil = new CustomArrowShapeUtil(editor)
219
257
 
220
258
  // Test shouldBeExact with both keys and precise
221
- editor.inputs.setAltKey(true)
222
- editor.inputs.setShiftKey(true)
259
+ editor.inputs.altKey = true
260
+ editor.inputs.shiftKey = true
223
261
  expect(customUtil.options.shouldBeExact(editor, true)).toBe(true)
224
262
 
225
263
  // Test shouldBeExact with both keys but not precise
226
- editor.inputs.setAltKey(true)
227
- editor.inputs.setShiftKey(true)
264
+ editor.inputs.altKey = true
265
+ editor.inputs.shiftKey = true
228
266
  expect(customUtil.options.shouldBeExact(editor, false)).toBe(false)
229
267
 
230
268
  // Test shouldBeExact with only one key
231
- editor.inputs.setAltKey(true)
232
- editor.inputs.setShiftKey(false)
269
+ editor.inputs.altKey = true
270
+ editor.inputs.shiftKey = false
233
271
  expect(customUtil.options.shouldBeExact(editor, true)).toBe(false)
234
272
 
235
273
  // Test shouldIgnoreTargets with any key
236
- editor.inputs.setAltKey(false)
237
- editor.inputs.setCtrlKey(false)
238
- editor.inputs.setShiftKey(true)
274
+ editor.inputs.altKey = false
275
+ editor.inputs.ctrlKey = false
276
+ editor.inputs.shiftKey = true
239
277
  expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(true)
240
278
 
241
279
  // Test shouldIgnoreTargets with no keys
242
- editor.inputs.setAltKey(false)
243
- editor.inputs.setCtrlKey(false)
244
- editor.inputs.setShiftKey(false)
280
+ editor.inputs.altKey = false
281
+ editor.inputs.ctrlKey = false
282
+ editor.inputs.shiftKey = false
245
283
  expect(customUtil.options.shouldIgnoreTargets(editor)).toBe(false)
246
284
  })
247
285
  })
248
286
 
249
287
  describe('Integration with arrow tool states', () => {
288
+ it('should respect shouldIgnoreTargets in idle state', () => {
289
+ editor.setCurrentTool('arrow')
290
+ editor.expectToBeIn('arrow.idle')
291
+
292
+ // Move to a position over box1
293
+ editor.inputs.ctrlKey = true // shouldIgnoreTargets = true
294
+ editor.pointerMove(150, 150)
295
+
296
+ // The arrow tool should not show any target highlighting
297
+ // (This is more of an integration test - exact assertions would depend on internal state)
298
+ expect(editor.getCurrentToolId()).toBe('arrow')
299
+ })
300
+
250
301
  it('should allow custom shouldBeExact logic based on isPrecise - example from arrow precise-exact', () => {
251
302
  // This replicates the logic from the arrows-precise-exact example
252
303
  const baseUtil = editor.getShapeUtil<ArrowShapeUtil>('arrow')
@@ -264,10 +315,10 @@ describe('ArrowShapeOptions', () => {
264
315
 
265
316
  try {
266
317
  editor.setCurrentTool('arrow')
267
- editor.inputs.setCtrlKey(false) // Allow binding
318
+ editor.inputs.ctrlKey = false // Allow binding
268
319
 
269
320
  // Set up fast pointer velocity to ensure precise remains false
270
- editor.inputs.setPointerVelocity({ x: 2, y: 2, len: () => 2.8 } as any)
321
+ editor.inputs.pointerVelocity = { x: 2, y: 2, len: () => 2.8 } as any
271
322
 
272
323
  const targetState = updateArrowTargetState({
273
324
  editor,
@@ -301,5 +352,47 @@ describe('ArrowShapeOptions', () => {
301
352
  baseUtil.options.shouldBeExact = originalShouldBeExact
302
353
  }
303
354
  })
355
+
356
+ it('should respect shouldIgnoreTargets when starting arrow creation', () => {
357
+ editor.setCurrentTool('arrow')
358
+
359
+ // Start creating arrow with ctrl held (shouldIgnoreTargets = true)
360
+ editor.inputs.ctrlKey = true
361
+ editor.pointerDown(150, 150) // Start in center of box1
362
+
363
+ // Even though we're starting in a shape, no binding should be created
364
+ editor.pointerMove(200, 200)
365
+ editor.pointerUp()
366
+
367
+ const createdArrow = editor
368
+ .getCurrentPageShapes()
369
+ .find((s) => s.type === 'arrow') as TLArrowShape
370
+ expect(createdArrow).toBeDefined()
371
+
372
+ const arrowBindings = getArrowBindings(editor, createdArrow)
373
+ expect(arrowBindings.start).toBeUndefined()
374
+ expect(arrowBindings.end).toBeUndefined()
375
+ })
376
+
377
+ it('should respect shouldBeExact during arrow creation', () => {
378
+ editor.setCurrentTool('arrow')
379
+
380
+ // Create arrow with alt held (shouldBeExact = true)
381
+ editor.inputs.altKey = true
382
+ editor.inputs.ctrlKey = false // Allow binding
383
+
384
+ editor.pointerDown(50, 50) // Start outside shapes
385
+ editor.pointerMove(150, 150) // Move to center of box1
386
+ editor.pointerUp()
387
+
388
+ const createdArrow = editor
389
+ .getCurrentPageShapes()
390
+ .find((s) => s.type === 'arrow') as TLArrowShape
391
+ expect(createdArrow).toBeDefined()
392
+
393
+ const arrowBindings = getArrowBindings(editor, createdArrow)
394
+ expect(arrowBindings.end).toBeDefined()
395
+ expect(arrowBindings.end?.props.isExact).toBe(true)
396
+ })
304
397
  })
305
398
  })
@@ -144,7 +144,7 @@ describe('When pointing a start shape', () => {
144
144
  expect(getArrowTargetState(editor)).not.toBeNull()
145
145
 
146
146
  // Fake some velocity
147
- editor.inputs.setPointerVelocity(new Vec(1, 1))
147
+ editor.inputs.pointerVelocity = new Vec(1, 1)
148
148
 
149
149
  editor.pointerMove(375, 500)
150
150
 
@@ -189,7 +189,7 @@ describe('When pointing an end shape', () => {
189
189
  expect(editor.getHintingShapeIds().length).toBe(0)
190
190
 
191
191
  // Fake some velocity
192
- editor.inputs.setPointerVelocity(new Vec(1, 1))
192
+ editor.inputs.pointerVelocity = new Vec(1, 1)
193
193
 
194
194
  // Move onto shape
195
195
  editor.pointerMove(375, 375)
@@ -227,7 +227,7 @@ describe('When pointing an end shape', () => {
227
227
  it('unbinds and rebinds', () => {
228
228
  editor.setCurrentTool('arrow').pointerDown(0, 0)
229
229
 
230
- editor.inputs.setPointerVelocity(new Vec(1, 1))
230
+ editor.inputs.pointerVelocity = new Vec(1, 1)
231
231
 
232
232
  editor.pointerMove(375, 375)
233
233
 
@@ -283,7 +283,7 @@ describe('When pointing an end shape', () => {
283
283
  })
284
284
 
285
285
  // Build up some velocity
286
- editor.inputs.setPointerVelocity(new Vec(1, 1))
286
+ editor.inputs.pointerVelocity = new Vec(1, 1)
287
287
  editor.pointerMove(325, 325)
288
288
  expect(getArrowTargetState(editor)).not.toBeNull()
289
289
 
@@ -403,7 +403,7 @@ describe('When pointing an end shape', () => {
403
403
 
404
404
  it('begins imprecise when moving quickly', () => {
405
405
  editor.setCurrentTool('arrow').pointerDown(0, 0)
406
- editor.inputs.setPointerVelocity(new Vec(1, 1))
406
+ editor.inputs.pointerVelocity = new Vec(1, 1)
407
407
  editor.pointerMove(370, 370)
408
408
 
409
409
  const arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
@@ -435,7 +435,7 @@ describe('When pointing an end shape', () => {
435
435
 
436
436
  expect(getArrowTargetState(editor)).toBeNull()
437
437
 
438
- editor.inputs.setPointerVelocity(new Vec(0.001, 0.001))
438
+ editor.inputs.pointerVelocity = new Vec(0.001, 0.001)
439
439
  editor.pointerMove(375, 375)
440
440
 
441
441
  arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
@@ -588,7 +588,7 @@ describe('precision timeout configuration', () => {
588
588
 
589
589
  editor.setCurrentTool('arrow').pointerDown(0, 0)
590
590
  // Use high velocity to avoid precise mode immediately
591
- editor.inputs.setPointerVelocity(new Vec(1, 1))
591
+ editor.inputs.pointerVelocity = new Vec(1, 1)
592
592
  editor.pointerMove(100, 100)
593
593
 
594
594
  const arrow = editor.getCurrentPageShapes()[
@@ -630,7 +630,7 @@ describe('precision timeout configuration', () => {
630
630
 
631
631
  editor.setCurrentTool('arrow').pointerDown(0, 0)
632
632
  // Use high velocity to avoid precise mode immediately
633
- editor.inputs.setPointerVelocity(new Vec(1, 1))
633
+ editor.inputs.pointerVelocity = new Vec(1, 1)
634
634
  editor.pointerMove(100, 100)
635
635
 
636
636
  const arrow = editor.getCurrentPageShapes()[
@@ -333,7 +333,7 @@ describe('Arrow labels', () => {
333
333
  // Create an arrow with a label
334
334
  editor.setCurrentTool('arrow').pointerDown(10, 10).pointerMove(100, 100).pointerUp()
335
335
  const arrowId = editor.getOnlySelectedShape()!.id
336
- editor.updateShapes([
336
+ editor.updateShapes<TLArrowShape>([
337
337
  { id: arrowId, type: 'arrow', props: { richText: toRichText('Test Label') } },
338
338
  ])
339
339
  })
@@ -349,7 +349,7 @@ describe('Arrow labels', () => {
349
349
 
350
350
  it('should update the label of an arrow', () => {
351
351
  const arrowId = editor.getOnlySelectedShape()!.id
352
- editor.updateShapes([
352
+ editor.updateShapes<TLArrowShape>([
353
353
  { id: arrowId, type: 'arrow', props: { richText: toRichText('New Label') } },
354
354
  ])
355
355
  expect(arrow(arrowId)).toMatchObject({
@@ -45,6 +45,7 @@ import {
45
45
  useEditor,
46
46
  useIsEditing,
47
47
  useSharedSafeId,
48
+ useValue,
48
49
  } from '@tldraw/editor'
49
50
  import React, { useMemo } from 'react'
50
51
  import { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'
@@ -55,7 +56,6 @@ import { ShapeFill } from '../shared/ShapeFill'
55
56
  import { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'
56
57
  import { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'
57
58
  import { useDefaultColorTheme } from '../shared/useDefaultColorTheme'
58
- import { useEfficientZoomThreshold } from '../shared/useEfficientZoomThreshold'
59
59
  import { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'
60
60
  import { ArrowShapeOptions } from './arrow-types'
61
61
  import {
@@ -117,13 +117,9 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
117
117
 
118
118
  hoverPreciseTimeout: 600,
119
119
  pointingPreciseTimeout: 320,
120
- shouldBeExact(editor: Editor) {
121
- return editor.inputs.getAltKey()
122
- },
123
- shouldIgnoreTargets(editor: Editor) {
124
- return editor.inputs.getCtrlKey()
125
- },
126
- showTextOutline: true,
120
+
121
+ shouldBeExact: (editor: Editor) => editor.inputs.altKey,
122
+ shouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,
127
123
  }
128
124
 
129
125
  override canEdit() {
@@ -273,7 +269,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
273
269
 
274
270
  const segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)
275
271
  const segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)
276
- const segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getEfficientZoomLevel()
272
+ const segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()
277
273
 
278
274
  if (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {
279
275
  handles.push({
@@ -373,8 +369,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
373
369
 
374
370
  // we want to snap to certain points. the maximum distance at which a snap will occur is
375
371
  // relative to the zoom level:
376
- const maxSnapDistance =
377
- this.options.elbowMidpointSnapDistance / this.editor.getEfficientZoomLevel()
372
+ const maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()
378
373
 
379
374
  // we snap to the midpoint of the range by default
380
375
  const midPoint = perpDistanceToLineAngle(
@@ -799,7 +794,6 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
799
794
  textWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}
800
795
  isSelected={isSelected}
801
796
  padding={0}
802
- showTextOutline={this.options.showTextOutline}
803
797
  style={{
804
798
  transform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,
805
799
  }}
@@ -923,7 +917,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
923
917
  if (isEmptyRichText(shape.props.richText)) {
924
918
  // editing text for the first time, so set the position to the default:
925
919
  const labelPosition = getArrowLabelDefaultPosition(this.editor, shape)
926
- this.editor.updateShape({
920
+ this.editor.updateShape<TLArrowShape>({
927
921
  id: shape.id,
928
922
  type: shape.type,
929
923
  props: { labelPosition },
@@ -950,7 +944,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
950
944
  .box.clone()
951
945
  .expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}
952
946
  padding={0}
953
- showTextOutline={this.options.showTextOutline}
947
+ showTextOutline={true}
954
948
  />
955
949
  </g>
956
950
  )
@@ -1011,7 +1005,13 @@ const ArrowSvg = track(function ArrowSvg({
1011
1005
  const editor = useEditor()
1012
1006
  const theme = useDefaultColorTheme()
1013
1007
  const info = getArrowInfo(editor, shape)
1014
- const isForceSolid = useEfficientZoomThreshold(shape.props.scale * 0.25)
1008
+ const isForceSolid = useValue(
1009
+ 'force solid',
1010
+ () => {
1011
+ return editor.getZoomLevel() < 0.2
1012
+ },
1013
+ [editor]
1014
+ )
1015
1015
  const clipPathId = useSharedSafeId(shape.id + '_clip')
1016
1016
  const arrowheadDotId = useSharedSafeId('arrowhead-dot')
1017
1017
  const arrowheadCrossId = useSharedSafeId('arrowhead-cross')
@@ -1037,7 +1037,7 @@ const ArrowSvg = track(function ArrowSvg({
1037
1037
  start: 'skip',
1038
1038
  end: 'skip',
1039
1039
  lengthRatio: 2.5,
1040
- strokeWidth: 2 / editor.getEfficientZoomLevel(),
1040
+ strokeWidth: 2 / editor.getZoomLevel(),
1041
1041
  props: {
1042
1042
  className: 'tl-arrow-hint',
1043
1043
  markerStart: bindings.start
@@ -95,8 +95,6 @@ export interface ArrowShapeOptions {
95
95
  * When creating an arrow, should it bind to the target shape.
96
96
  */
97
97
  shouldIgnoreTargets(editor: Editor): boolean
98
- /** Whether to show the outline of the arrow shape's label (using the same color as the canvas). This helps with overlapping shapes. It does not show up on Safari, where text outline is a performance issues. */
99
- readonly showTextOutline: boolean
100
98
  }
101
99
 
102
100
  /** @public */
@@ -311,9 +311,9 @@ export function getArrowLabelDefaultPosition(editor: Editor, shape: TLArrowShape
311
311
 
312
312
  /** @internal */
313
313
  export function isOverArrowLabel(editor: Editor, shape: TLShape) {
314
- if (!editor.isShapeOfType(shape, 'arrow')) return false
314
+ if (!editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) return false
315
315
 
316
- const pointInShapeSpace = editor.getPointInShapeSpace(shape, editor.inputs.getCurrentPagePoint())
316
+ const pointInShapeSpace = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)
317
317
  // How should we handle multiple labels? Do shapes ever have multiple labels?
318
318
  const labelGeometry = editor.getShapeGeometry<Group2d>(shape).children[1]
319
319
  // Knowing what we know about arrows... if the shape has no text in its label,
@@ -198,7 +198,7 @@ export function updateArrowTargetState({
198
198
  if (!precise) {
199
199
  // If we're switching to a new bound shape, then precise only if moving slowly
200
200
  if (!currentBinding || (currentBinding && target.id !== currentBinding.toId)) {
201
- precise = editor.inputs.getPointerVelocity().len() < 0.5
201
+ precise = editor.inputs.pointerVelocity.len() < 0.5
202
202
  }
203
203
  }
204
204
 
@@ -377,7 +377,7 @@ export function updateArrowTargetState({
377
377
  return result
378
378
  }
379
379
 
380
- const targetFilterFallback = { type: 'arrow' as const }
380
+ const targetFilterFallback = { type: 'arrow' }
381
381
 
382
382
  /**
383
383
  * Funky math but we want the snap distance to be 4 at the minimum and either 16 or 15% of the
@@ -39,17 +39,17 @@ export function getElbowArrowSnapLines(editor: Editor) {
39
39
  .get(editor, (editor) => {
40
40
  const currentSelectedArrowShape = computed('current selected arrow shape', () => {
41
41
  const shape = editor.getOnlySelectedShape()
42
- if (!shape || !editor.isShapeOfType(shape, 'arrow')) return null
42
+ if (!shape || !editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) return null
43
43
  return shape.id
44
44
  })
45
45
 
46
46
  const unselectedArrowShapeIds = editor.store.query.ids('shape', () => {
47
47
  const activeArrowShapeId = currentSelectedArrowShape.get()
48
- if (!activeArrowShapeId) return { type: { eq: 'arrow' } } as const
48
+ if (!activeArrowShapeId) return { type: { eq: 'arrow' } }
49
49
  return {
50
50
  type: { eq: 'arrow' },
51
51
  id: { neq: activeArrowShapeId },
52
- } as const
52
+ }
53
53
  })
54
54
 
55
55
  return computed('elbow arrow snap lines', () => {
@@ -38,7 +38,7 @@ export function getBoundShapeInfoForTerminal(
38
38
  terminalName: 'start' | 'end'
39
39
  ): BoundShapeInfo | undefined {
40
40
  const binding = editor
41
- .getBindingsFromShape(arrow, 'arrow')
41
+ .getBindingsFromShape<TLArrowBinding>(arrow, 'arrow')
42
42
  .find((b) => b.props.terminal === terminalName)
43
43
  if (!binding) return
44
44
 
@@ -105,7 +105,7 @@ export interface TLArrowBindings {
105
105
  const arrowBindingsCache = createComputedCache(
106
106
  'arrow bindings',
107
107
  (editor: Editor, arrow: TLArrowShape) => {
108
- const bindings = editor.getBindingsFromShape(arrow.id, 'arrow')
108
+ const bindings = editor.getBindingsFromShape<TLArrowBinding>(arrow.id, 'arrow')
109
109
  return {
110
110
  start: bindings.find((b) => b.props.terminal === 'start'),
111
111
  end: bindings.find((b) => b.props.terminal === 'end'),
@@ -223,7 +223,7 @@ export function createOrUpdateArrowBinding(
223
223
  const targetId = typeof target === 'string' ? target : target.id
224
224
 
225
225
  const existingMany = editor
226
- .getBindingsFromShape(arrowId, 'arrow')
226
+ .getBindingsFromShape<TLArrowBinding>(arrowId, 'arrow')
227
227
  .filter((b) => b.props.terminal === props.terminal)
228
228
 
229
229
  // if we've somehow ended up with too many bindings, delete the extras
@@ -254,7 +254,7 @@ export function createOrUpdateArrowBinding(
254
254
  */
255
255
  export function removeArrowBinding(editor: Editor, arrow: TLArrowShape, terminal: 'start' | 'end') {
256
256
  const existing = editor
257
- .getBindingsFromShape(arrow, 'arrow')
257
+ .getBindingsFromShape<TLArrowBinding>(arrow, 'arrow')
258
258
  .filter((b) => b.props.terminal === terminal)
259
259
 
260
260
  editor.deleteBindings(existing)
@@ -1,5 +1,4 @@
1
1
  import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo, TLShapeId } from '@tldraw/editor'
2
- import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
3
2
  import { ArrowShapeUtil } from '../ArrowShapeUtil'
4
3
  import { clearArrowTargetState, updateArrowTargetState } from '../arrowTargetState'
5
4
 
@@ -41,9 +40,20 @@ export class Idle extends StateNode {
41
40
  override onKeyUp(info: TLKeyboardEventInfo) {
42
41
  this.update()
43
42
  if (info.key === 'Enter') {
43
+ if (this.editor.getIsReadonly()) return null
44
44
  const onlySelectedShape = this.editor.getOnlySelectedShape()
45
- if (this.editor.canEditShape(onlySelectedShape)) {
46
- startEditingShapeWithRichText(this.editor, onlySelectedShape, { selectAll: true })
45
+ // If the only selected shape is editable, start editing it
46
+ if (
47
+ onlySelectedShape &&
48
+ this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)
49
+ ) {
50
+ this.editor.setCurrentTool('select')
51
+ this.editor.setEditingShape(onlySelectedShape.id)
52
+ this.editor.root.getCurrent()?.transition('editing_shape', {
53
+ ...info,
54
+ target: 'shape',
55
+ shape: onlySelectedShape,
56
+ })
47
57
  }
48
58
  }
49
59
  }
@@ -53,7 +63,7 @@ export class Idle extends StateNode {
53
63
 
54
64
  const targetState = updateArrowTargetState({
55
65
  editor: this.editor,
56
- pointInPageSpace: this.editor.inputs.getCurrentPagePoint(),
66
+ pointInPageSpace: this.editor.inputs.currentPagePoint,
57
67
  arrow: undefined,
58
68
  isPrecise: this.isPrecise,
59
69
  currentBinding: undefined,