tldraw 4.3.0-canary.c5efe11c58e0 → 4.3.0-canary.cb6779b4f066

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