tldraw 4.3.0-canary.fb247de51b9a → 4.3.0-canary.fda2775019a1

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 (561) 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 +6 -5
  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 +4 -5
  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 +6 -5
  91. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  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 +7 -6
  129. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  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 +1 -21
  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 +6 -5
  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 +4 -5
  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 +6 -5
  292. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  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 +7 -6
  330. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  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 +3 -30
  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 +10 -4
  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 +4 -5
  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 +6 -5
  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 +7 -6
  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 +3 -42
  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/resizing.test.ts +7 -9
  539. package/src/test/selection-omnibus.test.ts +2 -2
  540. package/src/test/spacebarPanning.test.ts +28 -10
  541. package/src/test/test-jsx.tsx +3 -0
  542. package/src/test/ui/BackToContent.test.tsx +111 -0
  543. package/tldraw.css +41 -35
  544. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  545. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  546. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  547. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  548. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  549. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  550. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  551. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  552. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  553. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  554. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  555. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  556. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  557. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  558. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  559. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  560. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  561. 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
@@ -22,7 +22,7 @@ export class ScribbleBrushing extends StateNode {
22
22
 
23
23
  override onEnter() {
24
24
  this.initialSelectedShapeIds = new Set<TLShapeId>(
25
- this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []
25
+ this.editor.inputs.getShiftKey() ? this.editor.getSelectedShapeIds() : []
26
26
  )
27
27
  this.newlySelectedShapeIds = new Set<TLShapeId>()
28
28
  this.size = 0
@@ -58,7 +58,7 @@ export class ScribbleBrushing extends StateNode {
58
58
  }
59
59
 
60
60
  override onKeyUp() {
61
- if (!this.editor.inputs.altKey) {
61
+ if (!this.editor.inputs.getAltKey()) {
62
62
  this.parent.transition('brushing')
63
63
  } else {
64
64
  this.updateScribbleSelection(false)
@@ -74,7 +74,7 @@ export class ScribbleBrushing extends StateNode {
74
74
  }
75
75
 
76
76
  private pushPointToScribble() {
77
- const { x, y } = this.editor.inputs.currentPagePoint
77
+ const { x, y } = this.editor.inputs.getCurrentPagePoint()
78
78
  this.editor.scribbles.addPoint(this.scribbleId, x, y)
79
79
  }
80
80
 
@@ -82,9 +82,10 @@ export class ScribbleBrushing extends StateNode {
82
82
  const { editor } = this
83
83
  // const zoomLevel = this.editor.getZoomLevel()
84
84
  const currentPageShapes = this.editor.getCurrentPageRenderingShapesSorted()
85
- const {
86
- inputs: { shiftKey, originPagePoint, previousPagePoint, currentPagePoint },
87
- } = this.editor
85
+ const shiftKey = this.editor.inputs.getShiftKey()
86
+ const originPagePoint = this.editor.inputs.getOriginPagePoint()
87
+ const previousPagePoint = this.editor.inputs.getPreviousPagePoint()
88
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
88
89
 
89
90
  const { newlySelectedShapeIds, initialSelectedShapeIds } = this
90
91
 
@@ -92,7 +92,7 @@ export class Translating extends StateNode {
92
92
 
93
93
  // Don't clone on create; otherwise clone on altKey
94
94
  if (!this.isCreating) {
95
- if (this.editor.inputs.altKey) {
95
+ if (this.editor.inputs.getAltKey()) {
96
96
  this.startCloning()
97
97
  if (this.isCloning) return
98
98
  }
@@ -122,7 +122,7 @@ export class Translating extends StateNode {
122
122
  }
123
123
 
124
124
  override onKeyDown() {
125
- if (this.editor.inputs.altKey && !this.isCloning) {
125
+ if (this.editor.inputs.getAltKey() && !this.isCloning) {
126
126
  this.startCloning()
127
127
  if (this.isCloning) return
128
128
  }
@@ -132,7 +132,7 @@ export class Translating extends StateNode {
132
132
  }
133
133
 
134
134
  override onKeyUp() {
135
- if (!this.editor.inputs.altKey && this.isCloning) {
135
+ if (!this.editor.inputs.getAltKey() && this.isCloning) {
136
136
  this.stopCloning()
137
137
  return
138
138
  }
@@ -258,7 +258,7 @@ export class Translating extends StateNode {
258
258
  // Get fresh shapes from the snapshot, in case onTranslateStart mutates the shape
259
259
  compact(this.snapshot.movingShapes.map((s) => this.editor.getShape(s.id))),
260
260
  // Start from the place where the user started dragging
261
- this.editor.inputs.originPagePoint,
261
+ this.editor.inputs.getOriginPagePoint(),
262
262
  this.updateParentTransforms
263
263
  )
264
264
 
@@ -305,7 +305,7 @@ export class Translating extends StateNode {
305
305
  // We should have started already, but hey
306
306
  this.dragAndDropManager.startDraggingShapes(
307
307
  snapshot.movingShapes,
308
- this.editor.inputs.originPagePoint,
308
+ this.editor.inputs.getOriginPagePoint(),
309
309
  this.updateParentTransforms
310
310
  )
311
311
 
@@ -404,7 +404,7 @@ function getTranslatingSnapshot(editor: Editor) {
404
404
  let noteAdjacentPositions: Vec[] | undefined
405
405
  let noteSnapshot: (MovingShapeSnapshot & { shape: TLNoteShape }) | undefined
406
406
 
407
- const { originPagePoint } = editor.inputs
407
+ const originPagePoint = editor.inputs.getOriginPagePoint()
408
408
 
409
409
  const allHoveredNotes = shapeSnapshots.filter(
410
410
  (s) => editor.isShapeOfType(s.shape, 'note') && editor.isPointInShape(s.shape, originPagePoint)
@@ -473,13 +473,16 @@ export function moveShapesToPoint({
473
473
  averagePagePoint,
474
474
  } = snapshot
475
475
 
476
+ const shiftKey = editor.inputs.getShiftKey()
477
+ const accelKey = editor.inputs.getAccelKey()
478
+
476
479
  const isGridMode = editor.getInstanceState().isGridMode
477
480
 
478
481
  const gridSize = editor.getDocumentSettings().gridSize
479
482
 
480
- const delta = Vec.Sub(inputs.currentPagePoint, inputs.originPagePoint)
483
+ const delta = Vec.Sub(inputs.getCurrentPagePoint(), inputs.getOriginPagePoint())
481
484
 
482
- const flatten: 'x' | 'y' | null = editor.inputs.shiftKey
485
+ const flatten: 'x' | 'y' | null = shiftKey
483
486
  ? Math.abs(delta.x) < Math.abs(delta.y)
484
487
  ? 'x'
485
488
  : 'y'
@@ -495,9 +498,9 @@ export function moveShapesToPoint({
495
498
  editor.snaps.clearIndicators()
496
499
 
497
500
  // If the user isn't moving super quick
498
- const isSnapping = editor.user.getIsSnapMode() ? !inputs.ctrlKey : inputs.ctrlKey
501
+ const isSnapping = editor.user.getIsSnapMode() ? !accelKey : accelKey
499
502
  let snappedToPit = false
500
- if (isSnapping && editor.inputs.pointerVelocity.len() < 0.5) {
503
+ if (isSnapping && editor.inputs.getPointerVelocity().len() < 0.5) {
501
504
  // snapping
502
505
  const { nudge } = editor.snaps.shapeBounds.snapTranslateShapes({
503
506
  dragDelta: delta,
@@ -537,9 +540,9 @@ export function moveShapesToPoint({
537
540
 
538
541
  const averageSnappedPoint = Vec.Add(averagePagePoint, delta)
539
542
 
540
- // we don't want to snap to the grid if we're holding the ctrl key, if we've already snapped into a pit, or if we're showing snapping indicators
543
+ // we don't want to snap to the grid if we're holding the accel key, if we've already snapped into a pit, or if we're showing snapping indicators
541
544
  const snapIndicators = editor.snaps.getIndicators()
542
- if (isGridMode && !inputs.ctrlKey && !snappedToPit && snapIndicators.length === 0) {
545
+ if (isGridMode && !accelKey && !snappedToPit && snapIndicators.length === 0) {
543
546
  averageSnappedPoint.snapToGrid(gridSize)
544
547
  }
545
548