tldraw 4.3.0-next.f4772c19540d → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +0 -2
  2. package/dist-cjs/index.d.ts +311 -242
  3. package/dist-cjs/index.js +13 -5
  4. package/dist-cjs/index.js.map +2 -2
  5. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  7. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  8. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  9. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  11. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  12. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  13. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  15. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  17. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  18. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  19. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  23. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  25. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  26. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  27. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  29. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  30. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  31. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  32. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
  33. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  35. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  36. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  37. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  38. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  39. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  41. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  42. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  44. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  46. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  47. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  48. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  49. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  50. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  51. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  52. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  53. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  54. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  55. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  56. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  57. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  59. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  61. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  62. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  63. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  64. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  65. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  66. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  67. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  68. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  69. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  70. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  72. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  73. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  74. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  75. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  76. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  77. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  78. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  79. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  80. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  81. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  82. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  83. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  84. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  85. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  86. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  87. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  88. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  89. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  90. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  91. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  92. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  93. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  94. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  95. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  96. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  97. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
  99. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  113. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
  115. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  117. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  118. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  119. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  132. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  133. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  134. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  135. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  137. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  138. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  139. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  140. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  141. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  142. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  143. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  144. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  145. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  146. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  147. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  148. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  149. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  150. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  151. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  152. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  153. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  154. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  155. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  156. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  157. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  159. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  161. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  163. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  165. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  167. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  169. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  170. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  171. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  172. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  174. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  175. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  176. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  178. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  180. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  181. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  182. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  183. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  184. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  185. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  186. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  190. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  191. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  192. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  194. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  195. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
  196. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  197. package/dist-cjs/lib/ui/context/actions.js +7 -8
  198. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  199. package/dist-cjs/lib/ui/context/components.js +1 -2
  200. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  201. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  202. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  203. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  204. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  205. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  206. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  207. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  208. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  209. package/dist-cjs/lib/ui/version.js +3 -3
  210. package/dist-cjs/lib/ui/version.js.map +1 -1
  211. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
  212. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  213. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  214. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  215. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  216. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  217. package/dist-cjs/lib/utils/text/richText.js +15 -19
  218. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  219. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  220. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  221. package/dist-esm/index.d.mts +311 -242
  222. package/dist-esm/index.mjs +14 -5
  223. package/dist-esm/index.mjs.map +2 -2
  224. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  225. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  226. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  227. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  228. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  229. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  230. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  231. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  232. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  234. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  236. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  238. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  241. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  243. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  244. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  246. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  248. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  250. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  251. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  252. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  253. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  254. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  255. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  256. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  257. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  259. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  260. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  261. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  262. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  263. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  264. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  265. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  266. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  267. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  268. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  269. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  270. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  271. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  272. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  274. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  275. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  276. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  277. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  278. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  279. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  280. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  281. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  282. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  283. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  284. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  285. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  286. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  287. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  288. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  289. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  290. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  291. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  292. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  293. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  294. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  295. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  296. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  297. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  298. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  299. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  300. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  301. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  302. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  303. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  304. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  305. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  306. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
  307. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  308. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  309. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  310. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  311. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  312. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  313. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  314. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  315. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  316. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
  317. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  318. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  319. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  327. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  328. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  329. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  330. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  331. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  332. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
  333. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  334. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  335. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  336. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  337. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  347. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  348. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  350. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  351. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  352. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  353. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  354. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  355. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  356. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  357. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  358. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  359. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  360. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  361. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  362. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  363. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  364. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  365. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  366. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  367. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  368. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  369. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  370. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  371. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  372. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  373. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  374. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  375. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  376. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  377. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  378. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  379. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  380. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  381. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  382. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  383. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  384. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  385. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  386. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  387. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  389. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  390. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  391. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  392. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  393. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  394. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  395. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  396. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  398. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  399. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  400. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  401. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  402. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  403. package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
  404. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  406. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  407. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  408. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  409. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  410. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  411. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  412. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  413. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
  414. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  415. package/dist-esm/lib/ui/context/actions.mjs +7 -8
  416. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  417. package/dist-esm/lib/ui/context/components.mjs +1 -2
  418. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  419. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  420. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  421. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  422. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  423. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  424. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  425. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  426. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  427. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  428. package/dist-esm/lib/ui/version.mjs +3 -3
  429. package/dist-esm/lib/ui/version.mjs.map +1 -1
  430. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
  431. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  432. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  433. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  434. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  435. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  436. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  437. package/dist-esm/lib/utils/text/richText.mjs +12 -5
  438. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  439. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  440. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  441. package/package.json +18 -16
  442. package/src/index.ts +6 -2
  443. package/src/lib/Tldraw.test.tsx +46 -1
  444. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  445. package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
  446. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  447. package/src/lib/defaultExternalContentHandlers.ts +13 -14
  448. package/src/lib/defaultSideEffects.ts +6 -1
  449. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  450. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  451. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  452. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  453. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  454. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  455. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  456. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  457. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  458. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  459. package/src/lib/shapes/arrow/shared.ts +4 -4
  460. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  461. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
  462. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  463. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  464. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  465. package/src/lib/shapes/draw/DrawShapeUtil.tsx +33 -27
  466. package/src/lib/shapes/draw/getPath.ts +31 -10
  467. package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
  468. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
  469. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  470. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  471. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  472. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  473. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  474. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  475. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  476. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +27 -24
  477. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  478. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  479. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  480. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  481. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  482. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  483. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  484. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  485. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  486. package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
  487. package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
  488. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  489. package/src/lib/shapes/shared/crop.ts +1 -0
  490. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  491. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  492. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  493. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  494. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  495. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  496. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  497. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  498. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  499. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  500. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  501. package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
  502. package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
  503. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  504. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  505. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  506. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  507. package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
  508. package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
  509. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  510. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
  511. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  512. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  513. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  514. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  515. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
  516. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
  517. package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
  518. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
  519. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  520. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
  521. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  522. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  523. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  524. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  525. package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
  526. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  527. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
  528. package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
  529. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  530. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  531. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  532. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  533. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  534. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  535. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  536. package/src/lib/ui/TldrawUi.tsx +5 -2
  537. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  538. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  539. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  540. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  541. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  542. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  543. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  544. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  545. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  546. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  547. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  548. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  549. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  550. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  551. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  552. package/src/lib/ui/components/menu-items.tsx +9 -15
  553. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  554. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  555. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  556. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  557. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  558. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
  559. package/src/lib/ui/context/actions.tsx +15 -19
  560. package/src/lib/ui/context/components.tsx +1 -2
  561. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  562. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  563. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  564. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  565. package/src/lib/ui/hooks/useTools.tsx +5 -7
  566. package/src/lib/ui/version.ts +3 -3
  567. package/src/lib/ui.css +27 -23
  568. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  569. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
  570. package/src/lib/utils/export/exportAs.ts +2 -9
  571. package/src/lib/utils/frames/frames.ts +1 -1
  572. package/src/lib/utils/test-helpers.ts +62 -0
  573. package/src/lib/utils/text/richText.ts +13 -8
  574. package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
  575. package/src/test/Editor.test.tsx +78 -41
  576. package/src/test/EraserTool.test.ts +10 -12
  577. package/src/test/SelectTool.test.ts +11 -19
  578. package/src/test/TestEditor.ts +49 -51
  579. package/src/test/TldrawEditor.test.tsx +24 -20
  580. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  581. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  582. package/src/test/arrows-megabus.test.tsx +1 -1
  583. package/src/test/bindings.test.tsx +29 -25
  584. package/src/test/bindingsIndex.test.tsx +4 -4
  585. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  586. package/src/test/commands/cameraState.test.ts +299 -0
  587. package/src/test/commands/createShape.test.ts +64 -0
  588. package/src/test/commands/createShapes.test.ts +15 -1
  589. package/src/test/commands/getSvgString.test.ts +2 -2
  590. package/src/test/commands/isShapeOfType.test.ts +44 -0
  591. package/src/test/commands/putContent.test.ts +80 -1
  592. package/src/test/commands/setCamera.test.ts +13 -11
  593. package/src/test/commands/stackShapes.test.ts +34 -8
  594. package/src/test/commands/updateShape.test.ts +67 -0
  595. package/src/test/commands/updateShapes.test.ts +21 -5
  596. package/src/test/commands/zoomToBounds.test.ts +19 -3
  597. package/src/test/commands/zoomToSelection.test.ts +14 -3
  598. package/src/test/custom-clipping.test.ts +52 -44
  599. package/src/test/customSnapping.test.tsx +77 -62
  600. package/src/test/drawing.test.ts +17 -10
  601. package/src/test/duplicate.test.ts +1 -1
  602. package/src/test/flipShapes.test.ts +33 -0
  603. package/src/test/frames.test.ts +94 -2
  604. package/src/test/getCulledShapes.test.tsx +11 -3
  605. package/src/test/getShapeAtPoint.test.ts +2 -2
  606. package/src/test/groups.test.tsx +7 -4
  607. package/src/test/modifiers.test.ts +6 -6
  608. package/src/test/resizing.test.ts +16 -22
  609. package/src/test/selection-omnibus.test.ts +13 -13
  610. package/src/test/shapeutils.test.ts +1 -1
  611. package/src/test/spacebarPanning.test.ts +28 -10
  612. package/src/test/styles2.test.tsx +1 -1
  613. package/src/test/styles3.test.ts +5 -5
  614. package/src/test/test-jsx.tsx +72 -57
  615. package/src/test/text.test.ts +15 -17
  616. package/src/test/translating.test.ts +6 -8
  617. package/src/test/ui/BackToContent.test.tsx +111 -0
  618. package/tldraw.css +41 -35
  619. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  620. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  621. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  622. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  623. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  624. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  625. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  626. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  627. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  628. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  629. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  630. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  631. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  632. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  633. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  634. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  635. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  636. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -3,11 +3,9 @@ import {
3
3
  StateNode,
4
4
  TLAdjacentDirection,
5
5
  TLClickEventInfo,
6
- TLGroupShape,
7
6
  TLKeyboardEventInfo,
8
7
  TLPointerEventInfo,
9
8
  TLShape,
10
- TLTextShape,
11
9
  Vec,
12
10
  VecLike,
13
11
  createShapeId,
@@ -18,10 +16,9 @@ import {
18
16
  } from '@tldraw/editor'
19
17
  import { isOverArrowLabel } from '../../../shapes/arrow/arrowLabel'
20
18
  import { getHitShapeOnCanvasPointerDown } from '../../selection-logic/getHitShapeOnCanvasPointerDown'
21
- import { getShouldEnterCropMode } from '../../selection-logic/getShouldEnterCropModeOnPointerDown'
22
19
  import { selectOnCanvasPointerUp } from '../../selection-logic/selectOnCanvasPointerUp'
23
20
  import { updateHoveredShapeId } from '../../selection-logic/updateHoveredShapeId'
24
- import { startEditingShapeWithLabel } from '../selectHelpers'
21
+ import { hasRichText, startEditingShapeWithRichText } from '../selectHelpers'
25
22
 
26
23
  const SKIPPED_KEYS_FOR_AUTO_EDITING = [
27
24
  'Delete',
@@ -55,8 +52,6 @@ export class Idle extends StateNode {
55
52
  }
56
53
 
57
54
  override onPointerDown(info: TLPointerEventInfo) {
58
- const shouldEnterCropMode = info.ctrlKey && getShouldEnterCropMode(this.editor)
59
-
60
55
  switch (info.target) {
61
56
  case 'canvas': {
62
57
  // Check to see if we hit any shape under the pointer; if so,
@@ -73,9 +68,7 @@ export class Idle extends StateNode {
73
68
 
74
69
  const selectedShapeIds = this.editor.getSelectedShapeIds()
75
70
  const onlySelectedShape = this.editor.getOnlySelectedShape()
76
- const {
77
- inputs: { currentPagePoint },
78
- } = this.editor
71
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
79
72
 
80
73
  if (
81
74
  selectedShapeIds.length > 1 ||
@@ -108,7 +101,7 @@ export class Idle extends StateNode {
108
101
  }
109
102
  case 'handle': {
110
103
  if (this.editor.getIsReadonly()) break
111
- if (this.editor.inputs.altKey) {
104
+ if (this.editor.inputs.getAltKey()) {
112
105
  this.parent.transition('pointing_shape', info)
113
106
  } else {
114
107
  // If we're holding ctrl key, we might select it, or start brushing...
@@ -138,7 +131,8 @@ export class Idle extends StateNode {
138
131
  case 'top_right':
139
132
  case 'bottom_left':
140
133
  case 'bottom_right': {
141
- if (shouldEnterCropMode) {
134
+ const onlySelectedShape = this.editor.getOnlySelectedShape()
135
+ if (info.ctrlKey && this.editor.canCropShape(onlySelectedShape)) {
142
136
  this.parent.transition('crop.pointing_crop_handle', info)
143
137
  } else {
144
138
  if (info.accelKey) {
@@ -173,7 +167,7 @@ export class Idle extends StateNode {
173
167
  }
174
168
 
175
169
  override onDoubleClick(info: TLClickEventInfo) {
176
- if (this.editor.inputs.shiftKey || info.phase !== 'up') return
170
+ if (this.editor.inputs.getShiftKey() || info.phase !== 'up') return
177
171
 
178
172
  // We don't want to double click while toggling shapes
179
173
  if (info.ctrlKey || info.shiftKey) return
@@ -189,11 +183,12 @@ export class Idle extends StateNode {
189
183
  // of the shape yet because that also creates text shapes, and can produce
190
184
  // unexpected results when working "inside of" a hollow shape.
191
185
 
186
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
192
187
  const hitShape =
193
- hoveredShape && !this.editor.isShapeOfType<TLGroupShape>(hoveredShape, 'group')
188
+ hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
194
189
  ? hoveredShape
195
- : (this.editor.getSelectedShapeAtPoint(this.editor.inputs.currentPagePoint) ??
196
- this.editor.getShapeAtPoint(this.editor.inputs.currentPagePoint, {
190
+ : (this.editor.getSelectedShapeAtPoint(currentPagePoint) ??
191
+ this.editor.getShapeAtPoint(currentPagePoint, {
197
192
  margin: this.editor.options.hitTestMargin / this.editor.getZoomLevel(),
198
193
  hitInside: false,
199
194
  }))
@@ -201,13 +196,13 @@ export class Idle extends StateNode {
201
196
  const focusedGroupId = this.editor.getFocusedGroupId()
202
197
 
203
198
  if (hitShape) {
204
- if (this.editor.isShapeOfType<TLGroupShape>(hitShape, 'group')) {
199
+ if (this.editor.isShapeOfType(hitShape, 'group')) {
205
200
  // Probably select the shape
206
201
  selectOnCanvasPointerUp(this.editor, info)
207
202
  return
208
203
  } else {
209
204
  const parent = this.editor.getShape(hitShape.parentId)
210
- if (parent && this.editor.isShapeOfType<TLGroupShape>(parent, 'group')) {
205
+ if (parent && this.editor.isShapeOfType(parent, 'group')) {
211
206
  // The shape is the direct child of a group. If the group is
212
207
  // selected, then we can select the shape. If the group is the
213
208
  // focus layer id, then we can double click into it as usual.
@@ -234,30 +229,45 @@ export class Idle extends StateNode {
234
229
  return
235
230
  }
236
231
 
237
- if (!this.editor.inputs.shiftKey) {
232
+ if (!this.editor.inputs.getShiftKey()) {
238
233
  this.handleDoubleClickOnCanvas(info)
239
234
  }
240
235
  break
241
236
  }
242
237
  case 'selection': {
243
- if (this.editor.getIsReadonly()) break
244
-
245
238
  const onlySelectedShape = this.editor.getOnlySelectedShape()
246
239
 
247
240
  if (onlySelectedShape) {
248
241
  const util = this.editor.getShapeUtil(onlySelectedShape)
249
-
250
- if (!this.canInteractWithShapeInReadOnly(onlySelectedShape)) {
251
- return
252
- }
253
-
254
- // Test edges for an onDoubleClickEdge handler
255
- if (
242
+ const isEdge =
256
243
  info.handle === 'right' ||
257
244
  info.handle === 'left' ||
258
245
  info.handle === 'top' ||
259
246
  info.handle === 'bottom'
260
- ) {
247
+ const isCorner =
248
+ info.handle === 'top_left' ||
249
+ info.handle === 'top_right' ||
250
+ info.handle === 'bottom_right' ||
251
+ info.handle === 'bottom_left'
252
+
253
+ if (this.editor.getIsReadonly()) {
254
+ // includes readonly check
255
+ if (
256
+ this.editor.canEditShape(onlySelectedShape, {
257
+ type: isCorner
258
+ ? 'double-click-corner'
259
+ : isEdge
260
+ ? 'double-click-edge'
261
+ : 'double-click',
262
+ })
263
+ ) {
264
+ this.startEditingShape(onlySelectedShape, info, true /* select all */)
265
+ }
266
+ break
267
+ }
268
+
269
+ // Test edges for an onDoubleClickEdge handler
270
+ if (isEdge) {
261
271
  const change = util.onDoubleClickEdge?.(onlySelectedShape, info)
262
272
  if (change) {
263
273
  this.editor.markHistoryStoppingPoint('double click edge')
@@ -267,12 +277,7 @@ export class Idle extends StateNode {
267
277
  }
268
278
  }
269
279
 
270
- if (
271
- info.handle === 'top_left' ||
272
- info.handle === 'top_right' ||
273
- info.handle === 'bottom_right' ||
274
- info.handle === 'bottom_left'
275
- ) {
280
+ if (isCorner) {
276
281
  const change = util.onDoubleClickCorner?.(onlySelectedShape, info)
277
282
  if (change) {
278
283
  this.editor.markHistoryStoppingPoint('double click corner')
@@ -281,16 +286,14 @@ export class Idle extends StateNode {
281
286
  return
282
287
  }
283
288
  }
289
+
284
290
  // For corners OR edges but NOT rotation corners
285
- if (
286
- util.canCrop(onlySelectedShape) &&
287
- !this.editor.isShapeOrAncestorLocked(onlySelectedShape)
288
- ) {
291
+ if (this.editor.canCropShape(onlySelectedShape)) {
289
292
  this.parent.transition('crop', info)
290
293
  return
291
294
  }
292
295
 
293
- if (this.shouldStartEditingShape(onlySelectedShape)) {
296
+ if (this.editor.canEditShape(onlySelectedShape)) {
294
297
  this.startEditingShape(onlySelectedShape, info, true /* select all */)
295
298
  }
296
299
  }
@@ -321,7 +324,7 @@ export class Idle extends StateNode {
321
324
  }
322
325
 
323
326
  // If the shape can edit, then begin editing
324
- if (this.shouldStartEditingShape(shape)) {
327
+ if (this.editor.canEditShape(shape)) {
325
328
  this.startEditingShape(shape, info, true /* select all */)
326
329
  } else {
327
330
  // If the shape's double click handler has not created a change,
@@ -343,7 +346,7 @@ export class Idle extends StateNode {
343
346
  } else {
344
347
  // If the shape's double click handler has not created a change,
345
348
  // and if the shape can edit, then begin editing the shape.
346
- if (this.shouldStartEditingShape(shape)) {
349
+ if (this.editor.canEditShape(shape)) {
347
350
  this.startEditingShape(shape, info, true /* select all */)
348
351
  }
349
352
  }
@@ -356,9 +359,9 @@ export class Idle extends StateNode {
356
359
  case 'canvas': {
357
360
  const hoveredShape = this.editor.getHoveredShape()
358
361
  const hitShape =
359
- hoveredShape && !this.editor.isShapeOfType<TLGroupShape>(hoveredShape, 'group')
362
+ hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
360
363
  ? hoveredShape
361
- : this.editor.getShapeAtPoint(this.editor.inputs.currentPagePoint, {
364
+ : this.editor.getShapeAtPoint(this.editor.inputs.getCurrentPagePoint(), {
362
365
  margin: this.editor.options.hitTestMargin / this.editor.getZoomLevel(),
363
366
  hitInside: false,
364
367
  hitLabels: true,
@@ -378,9 +381,7 @@ export class Idle extends StateNode {
378
381
 
379
382
  const selectedShapeIds = this.editor.getSelectedShapeIds()
380
383
  const onlySelectedShape = this.editor.getOnlySelectedShape()
381
- const {
382
- inputs: { currentPagePoint },
383
- } = this.editor
384
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
384
385
 
385
386
  if (
386
387
  selectedShapeIds.length > 1 ||
@@ -473,7 +474,7 @@ export class Idle extends StateNode {
473
474
  // If it's a note shape, then edit on type
474
475
  this.editor.isShapeOfType(onlySelectedShape, 'note') &&
475
476
  // If it's not locked or anything
476
- this.shouldStartEditingShape(onlySelectedShape)
477
+ this.editor.canEditShape(onlySelectedShape)
477
478
  ) {
478
479
  this.startEditingShape(
479
480
  onlySelectedShape,
@@ -525,9 +526,7 @@ export class Idle extends StateNode {
525
526
  const selectedShapes = this.editor.getSelectedShapes()
526
527
 
527
528
  // On enter, if every selected shape is a group, then select all of the children of the groups
528
- if (
529
- selectedShapes.every((shape) => this.editor.isShapeOfType<TLGroupShape>(shape, 'group'))
530
- ) {
529
+ if (selectedShapes.every((shape) => this.editor.isShapeOfType(shape, 'group'))) {
531
530
  this.editor.setSelectedShapes(
532
531
  selectedShapes.flatMap((shape) => this.editor.getSortedChildIdsForParent(shape.id))
533
532
  )
@@ -536,7 +535,10 @@ export class Idle extends StateNode {
536
535
 
537
536
  // If the only selected shape is editable, then begin editing it
538
537
  const onlySelectedShape = this.editor.getOnlySelectedShape()
539
- if (onlySelectedShape && this.shouldStartEditingShape(onlySelectedShape)) {
538
+ if (
539
+ onlySelectedShape &&
540
+ this.editor.canEditShape(onlySelectedShape, { type: 'press_enter' })
541
+ ) {
540
542
  this.startEditingShape(
541
543
  onlySelectedShape,
542
544
  {
@@ -550,7 +552,7 @@ export class Idle extends StateNode {
550
552
  }
551
553
 
552
554
  // If the only selected shape is croppable, then begin cropping it
553
- if (getShouldEnterCropMode(this.editor)) {
555
+ if (this.editor.canCropShape(onlySelectedShape)) {
554
556
  this.parent.transition('crop', info)
555
557
  }
556
558
  break
@@ -565,23 +567,18 @@ export class Idle extends StateNode {
565
567
  }
566
568
  }
567
569
 
568
- private shouldStartEditingShape(
569
- shape: TLShape | null = this.editor.getOnlySelectedShape()
570
- ): boolean {
571
- if (!shape) return false
572
- if (this.editor.isShapeOrAncestorLocked(shape) && shape.type !== 'embed') return false
573
- if (!this.canInteractWithShapeInReadOnly(shape)) return false
574
- return this.editor.getShapeUtil(shape).canEdit(shape)
575
- }
576
-
577
570
  private startEditingShape(
578
571
  shape: TLShape,
579
572
  info: TLClickEventInfo | TLKeyboardEventInfo,
580
573
  shouldSelectAll?: boolean
581
574
  ) {
582
- if (this.editor.isShapeOrAncestorLocked(shape) && shape.type !== 'embed') return
575
+ const { editor } = this
583
576
  this.editor.markHistoryStoppingPoint('editing shape')
584
- startEditingShapeWithLabel(this.editor, shape, shouldSelectAll)
577
+ if (hasRichText(shape)) {
578
+ startEditingShapeWithRichText(editor, shape, { selectAll: shouldSelectAll })
579
+ } else {
580
+ editor.setEditingShape(shape)
581
+ }
585
582
  this.parent.transition('editing_shape', info)
586
583
  }
587
584
 
@@ -601,10 +598,10 @@ export class Idle extends StateNode {
601
598
 
602
599
  const id = createShapeId()
603
600
 
604
- const { x, y } = this.editor.inputs.currentPagePoint
601
+ const { x, y } = this.editor.inputs.getCurrentPagePoint()
605
602
 
606
603
  // Allow this to trigger the max shapes reached alert
607
- this.editor.createShapes<TLTextShape>([
604
+ this.editor.createShapes([
608
605
  {
609
606
  id,
610
607
  type: 'text',
@@ -620,16 +617,9 @@ export class Idle extends StateNode {
620
617
  const shape = this.editor.getShape(id)
621
618
  if (!shape) return
622
619
 
623
- const util = this.editor.getShapeUtil(shape)
624
- if (this.editor.getIsReadonly()) {
625
- if (!util.canEditInReadonly(shape)) {
626
- return
627
- }
628
- }
620
+ if (!this.editor.canEditShape(shape)) return
629
621
 
630
- this.editor.setEditingShape(id)
631
- this.editor.select(id)
632
- this.parent.transition('editing_shape', info)
622
+ startEditingShapeWithRichText(this.editor, id, { info })
633
623
  }
634
624
 
635
625
  private nudgeSelectedShapes(ephemeral = false) {
@@ -669,13 +659,6 @@ export class Idle extends StateNode {
669
659
  this.editor.nudgeShapes(selectedShapeIds, delta.mul(step))
670
660
  kickoutOccludedShapes(this.editor, selectedShapeIds)
671
661
  }
672
-
673
- private canInteractWithShapeInReadOnly(shape: TLShape) {
674
- if (!this.editor.getIsReadonly()) return true
675
- const util = this.editor.getShapeUtil(shape)
676
- if (util.canEditInReadonly(shape)) return true
677
- return false
678
- }
679
662
  }
680
663
 
681
664
  export const MAJOR_NUDGE_FACTOR = 10
@@ -11,6 +11,7 @@ import {
11
11
  getArrowBodyGeometry,
12
12
  getArrowLabelDefaultPosition,
13
13
  } from '../../../shapes/arrow/arrowLabel'
14
+ import { startEditingShapeWithRichText } from '../selectHelpers'
14
15
 
15
16
  export class PointingArrowLabel extends StateNode {
16
17
  static override id = 'pointing_arrow_label'
@@ -54,7 +55,7 @@ export class PointingArrowLabel extends StateNode {
54
55
  if (!labelGeometry) {
55
56
  throw Error(`Expected to find an arrow label geometry for shape: ${shape.id}`)
56
57
  }
57
- const { currentPagePoint } = this.editor.inputs
58
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
58
59
  const pointInShapeSpace = this.editor.getPointInShapeSpace(shape, currentPagePoint)
59
60
 
60
61
  this._labelDragOffset = Vec.Sub(labelGeometry.center, pointInShapeSpace)
@@ -81,7 +82,7 @@ export class PointingArrowLabel extends StateNode {
81
82
  private _labelDragOffset = new Vec(0, 0)
82
83
 
83
84
  override onPointerMove() {
84
- const { isDragging } = this.editor.inputs
85
+ const isDragging = this.editor.inputs.getIsDragging()
85
86
  if (!isDragging) return
86
87
 
87
88
  if (this.didCtrlOnEnter) {
@@ -97,7 +98,7 @@ export class PointingArrowLabel extends StateNode {
97
98
  const transform = this.editor.getShapePageTransform(shape.id)
98
99
 
99
100
  const pointInShapeSpace = this.editor
100
- .getPointInShapeSpace(shape, this.editor.inputs.currentPagePoint)
101
+ .getPointInShapeSpace(shape, this.editor.inputs.getCurrentPagePoint())
101
102
  .add(this._labelDragOffset)
102
103
 
103
104
  const defaultLabelPosition = getArrowLabelDefaultPosition(this.editor, shape)
@@ -124,7 +125,7 @@ export class PointingArrowLabel extends StateNode {
124
125
  }
125
126
 
126
127
  this.didDrag = true
127
- this.editor.updateShape<TLArrowShape>({
128
+ this.editor.updateShape({
128
129
  id: shape.id,
129
130
  type: shape.type,
130
131
  props: { labelPosition: nextLabelPosition },
@@ -137,10 +138,8 @@ export class PointingArrowLabel extends StateNode {
137
138
 
138
139
  if (this.didDrag || !this.wasAlreadySelected) {
139
140
  this.complete()
140
- } else if (!this.editor.getIsReadonly()) {
141
- // Go into edit mode.
142
- this.editor.setEditingShape(shape.id)
143
- this.editor.setCurrentTool('select.editing_shape')
141
+ } else if (this.editor.canEditShape(shape)) {
142
+ startEditingShapeWithRichText(this.editor, shape.id)
144
143
  }
145
144
  }
146
145
 
@@ -16,7 +16,7 @@ export class PointingCanvas extends StateNode {
16
16
  }
17
17
 
18
18
  override onPointerMove(info: TLPointerEventInfo) {
19
- if (this.editor.inputs.isDragging) {
19
+ if (this.editor.inputs.getIsDragging()) {
20
20
  this.parent.transition('brushing', info)
21
21
  }
22
22
  }
@@ -1,12 +1,4 @@
1
- import {
2
- Editor,
3
- StateNode,
4
- TLArrowShape,
5
- TLHandle,
6
- TLNoteShape,
7
- TLPointerEventInfo,
8
- Vec,
9
- } from '@tldraw/editor'
1
+ import { Editor, StateNode, TLHandle, TLNoteShape, TLPointerEventInfo, Vec } from '@tldraw/editor'
10
2
  import { updateArrowTargetState } from '../../../shapes/arrow/arrowTargetState'
11
3
  import { getArrowBindings } from '../../../shapes/arrow/shared'
12
4
  import {
@@ -14,7 +6,7 @@ import {
14
6
  getNoteAdjacentPositions,
15
7
  getNoteShapeForAdjacentPosition,
16
8
  } from '../../../shapes/note/noteHelpers'
17
- import { startEditingShapeWithLabel } from '../selectHelpers'
9
+ import { startEditingShapeWithRichText } from '../selectHelpers'
18
10
 
19
11
  export class PointingHandle extends StateNode {
20
12
  static override id = 'pointing_handle'
@@ -29,7 +21,7 @@ export class PointingHandle extends StateNode {
29
21
  this.didCtrlOnEnter = info.accelKey
30
22
 
31
23
  const { shape } = info
32
- if (this.editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {
24
+ if (this.editor.isShapeOfType(shape, 'arrow')) {
33
25
  const initialBindings = getArrowBindings(this.editor, shape)
34
26
  const currentBinding = initialBindings[info.handle.id as 'start' | 'end']
35
27
  const oppositeBinding = initialBindings[info.handle.id === 'start' ? 'end' : 'start']
@@ -58,11 +50,11 @@ export class PointingHandle extends StateNode {
58
50
  override onPointerUp() {
59
51
  const { shape, handle } = this.info
60
52
 
61
- if (this.editor.isShapeOfType<TLNoteShape>(shape, 'note')) {
53
+ if (this.editor.isShapeOfType(shape, 'note')) {
62
54
  const { editor } = this
63
55
  const nextNote = getNoteForAdjacentPosition(editor, shape, handle, false)
64
56
  if (nextNote) {
65
- startEditingShapeWithLabel(editor, nextNote, true /* selectAll */)
57
+ startEditingShapeWithRichText(editor, nextNote, { selectAll: true })
66
58
  return
67
59
  }
68
60
  }
@@ -72,7 +64,7 @@ export class PointingHandle extends StateNode {
72
64
 
73
65
  override onPointerMove(info: TLPointerEventInfo) {
74
66
  const { editor } = this
75
- if (editor.inputs.isDragging) {
67
+ if (editor.inputs.getIsDragging()) {
76
68
  if (this.didCtrlOnEnter) {
77
69
  this.parent.transition('brushing', info)
78
70
  } else {
@@ -90,12 +82,12 @@ export class PointingHandle extends StateNode {
90
82
  if (editor.getIsReadonly()) return
91
83
  const { shape, handle } = this.info
92
84
 
93
- if (editor.isShapeOfType<TLNoteShape>(shape, 'note')) {
85
+ if (editor.isShapeOfType(shape, 'note')) {
94
86
  const nextNote = getNoteForAdjacentPosition(editor, shape, handle, true)
95
87
  if (nextNote) {
96
88
  // Center the shape on the current pointer
97
89
  const centeredOnPointer = editor
98
- .getPointInParentSpace(nextNote, editor.inputs.originPagePoint)
90
+ .getPointInParentSpace(nextNote, editor.inputs.getOriginPagePoint())
99
91
  .sub(Vec.Rot(NOTE_CENTER_OFFSET.clone().mul(shape.props.scale), nextNote.rotation))
100
92
  editor.updateShape({ ...nextNote, x: centeredOnPointer.x, y: centeredOnPointer.y })
101
93
 
@@ -111,7 +103,7 @@ export class PointingHandle extends StateNode {
111
103
  isCreating: true,
112
104
  onCreate: () => {
113
105
  // When we're done, start editing it
114
- startEditingShapeWithLabel(editor, nextNote, true /* selectAll */)
106
+ startEditingShapeWithRichText(editor, nextNote, { selectAll: true })
115
107
  },
116
108
  })
117
109
  return
@@ -47,7 +47,7 @@ export class PointingResizeHandle extends StateNode {
47
47
  }
48
48
 
49
49
  override onPointerMove() {
50
- if (this.editor.inputs.isDragging) {
50
+ if (this.editor.inputs.getIsDragging()) {
51
51
  this.startResizing()
52
52
  }
53
53
  }
@@ -31,7 +31,7 @@ export class PointingRotateHandle extends StateNode {
31
31
  }
32
32
 
33
33
  override onPointerMove() {
34
- if (this.editor.inputs.isDragging) {
34
+ if (this.editor.inputs.getIsDragging()) {
35
35
  this.startRotating()
36
36
  }
37
37
  }
@@ -1,4 +1,4 @@
1
- import { StateNode, TLClickEventInfo, TLGroupShape, TLPointerEventInfo } from '@tldraw/editor'
1
+ import { StateNode, TLClickEventInfo, TLPointerEventInfo } from '@tldraw/editor'
2
2
  import { selectOnCanvasPointerUp } from '../../selection-logic/selectOnCanvasPointerUp'
3
3
 
4
4
  export class PointingSelection extends StateNode {
@@ -18,7 +18,7 @@ export class PointingSelection extends StateNode {
18
18
  }
19
19
 
20
20
  override onPointerMove(info: TLPointerEventInfo) {
21
- if (this.editor.inputs.isDragging) {
21
+ if (this.editor.inputs.getIsDragging()) {
22
22
  this.startTranslating(info)
23
23
  }
24
24
  }
@@ -35,9 +35,9 @@ export class PointingSelection extends StateNode {
35
35
  override onDoubleClick?(info: TLClickEventInfo) {
36
36
  const hoveredShape = this.editor.getHoveredShape()
37
37
  const hitShape =
38
- hoveredShape && !this.editor.isShapeOfType<TLGroupShape>(hoveredShape, 'group')
38
+ hoveredShape && !this.editor.isShapeOfType(hoveredShape, 'group')
39
39
  ? hoveredShape
40
- : this.editor.getShapeAtPoint(this.editor.inputs.currentPagePoint, {
40
+ : this.editor.getShapeAtPoint(this.editor.inputs.getCurrentPagePoint(), {
41
41
  hitInside: true,
42
42
  margin: 0,
43
43
  renderingOnly: true,
@@ -16,9 +16,7 @@ export class PointingShape extends StateNode {
16
16
  const selectedShapeIds = this.editor.getSelectedShapeIds()
17
17
  const selectionBounds = this.editor.getSelectionRotatedPageBounds()
18
18
  const focusedGroupId = this.editor.getFocusedGroupId()
19
- const {
20
- inputs: { currentPagePoint },
21
- } = this.editor
19
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
22
20
  const { shiftKey, altKey, accelKey } = info
23
21
 
24
22
  this.hitShape = info.shape
@@ -66,9 +64,7 @@ export class PointingShape extends StateNode {
66
64
  const selectedShapeIds = this.editor.getSelectedShapeIds()
67
65
  const focusedGroupId = this.editor.getFocusedGroupId()
68
66
  const zoomLevel = this.editor.getZoomLevel()
69
- const {
70
- inputs: { currentPagePoint },
71
- } = this.editor
67
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
72
68
 
73
69
  const additiveSelectionKey = info.shiftKey || info.accelKey
74
70
 
@@ -153,13 +149,7 @@ export class PointingShape extends StateNode {
153
149
  this.editor.markHistoryStoppingPoint('editing on pointer up')
154
150
  this.editor.select(selectingShape.id)
155
151
 
156
- const util = this.editor.getShapeUtil(selectingShape)
157
- if (this.editor.getIsReadonly()) {
158
- if (!util.canEditInReadonly(selectingShape)) {
159
- return
160
- }
161
- }
162
-
152
+ if (!this.editor.canEditShape(selectingShape)) return
163
153
  this.editor.setEditingShape(selectingShape.id)
164
154
  this.editor.setCurrentTool('select.editing_shape')
165
155
 
@@ -210,7 +200,7 @@ export class PointingShape extends StateNode {
210
200
  }
211
201
 
212
202
  override onPointerMove(info: TLPointerEventInfo) {
213
- if (this.editor.inputs.isDragging) {
203
+ if (this.editor.inputs.getIsDragging()) {
214
204
  if (isOverArrowLabel(this.editor, this.hitShape)) {
215
205
  // We're moving the label on a shape.
216
206
  this.parent.transition('pointing_arrow_label', { ...info, shape: this.hitShape })
@@ -7,12 +7,10 @@ import {
7
7
  SelectionCorner,
8
8
  SelectionEdge,
9
9
  StateNode,
10
- TLFrameShape,
11
10
  TLPointerEventInfo,
12
11
  TLShape,
13
12
  TLShapeId,
14
13
  TLShapePartial,
15
- TLTextShape,
16
14
  TLTickEventInfo,
17
15
  Vec,
18
16
  VecLike,
@@ -213,7 +211,8 @@ export class Resizing extends StateNode {
213
211
  }
214
212
 
215
213
  private updateShapes() {
216
- const { altKey, shiftKey } = this.editor.inputs
214
+ const altKey = this.editor.inputs.getAltKey()
215
+ const shiftKey = this.editor.inputs.getShiftKey()
217
216
  const {
218
217
  frames,
219
218
  shapeSnapshots,
@@ -228,7 +227,7 @@ export class Resizing extends StateNode {
228
227
 
229
228
  if (shapeSnapshots.size === 1) {
230
229
  const onlySnapshot = [...shapeSnapshots.values()][0]!
231
- if (this.editor.isShapeOfType<TLTextShape>(onlySnapshot.shape, 'text')) {
230
+ if (this.editor.isShapeOfType(onlySnapshot.shape, 'text')) {
232
231
  isAspectRatioLocked = !(this.info.handle === 'left' || this.info.handle === 'right')
233
232
  }
234
233
  }
@@ -268,12 +267,13 @@ export class Resizing extends StateNode {
268
267
 
269
268
  const isHoldingAccel = isAccelKey(this.editor.inputs)
270
269
 
271
- const currentPagePoint = this.editor.inputs.currentPagePoint
270
+ const currentPagePoint = this.editor.inputs
271
+ .getCurrentPagePoint()
272
272
  .clone()
273
273
  .sub(cursorHandleOffset)
274
274
  .sub(this.creationCursorOffset)
275
275
 
276
- const originPagePoint = this.editor.inputs.originPagePoint.clone().sub(cursorHandleOffset)
276
+ const originPagePoint = this.editor.inputs.getOriginPagePoint().clone().sub(cursorHandleOffset)
277
277
 
278
278
  if (this.editor.getInstanceState().isGridMode && !isHoldingAccel) {
279
279
  const { gridSize } = this.editor.getDocumentSettings()
@@ -476,9 +476,7 @@ export class Resizing extends StateNode {
476
476
  const { editor } = this
477
477
  const selectedShapeIds = editor.getSelectedShapeIds()
478
478
  const selectionRotation = editor.getSelectionRotation()
479
- const {
480
- inputs: { originPagePoint },
481
- } = editor
479
+ const originPagePoint = editor.inputs.getOriginPagePoint()
482
480
 
483
481
  const selectionBounds = editor.getSelectionRotatedPageBounds()
484
482
  if (!selectionBounds) throw Error('Resizing but nothing is selected')
@@ -528,7 +526,7 @@ export class Resizing extends StateNode {
528
526
  // descendants (easy) but also flagging with behavior like "resize" or "keep absolute position" or "reposition only with accel key",
529
527
  // though I'm not sure where that would be defined; perhaps better handled with onResizeStart / onResize callbacks on the util, and
530
528
  // pass `accelKeyIsPressed` as well as `accelKeyWasPressed`?
531
- if (editor.isShapeOfType<TLFrameShape>(shape, 'frame')) {
529
+ if (editor.isShapeOfType(shape, 'frame')) {
532
530
  frames.push({
533
531
  id: shape.id,
534
532
  children: compact(
@@ -163,9 +163,8 @@ export class Rotating extends StateNode {
163
163
  }
164
164
 
165
165
  _getRotationFromPointerPosition({ snapToNearestDegree }: { snapToNearestDegree: boolean }) {
166
- const {
167
- inputs: { shiftKey, currentPagePoint },
168
- } = this.editor
166
+ const shiftKey = this.editor.inputs.getShiftKey()
167
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
169
168
  const { initialCursorAngle, initialShapesRotation, initialPageCenter } = this.snapshot
170
169
 
171
170
  // The delta is the difference between the current angle and the initial angle