tldraw 4.2.2 → 4.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/dist-cjs/index.d.ts +242 -311
  2. package/dist-cjs/index.js +5 -13
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +4 -7
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  7. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/defaultSideEffects.js +1 -6
  11. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +13 -14
  13. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  15. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  16. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  17. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  18. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  19. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +10 -4
  22. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  23. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +4 -7
  24. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  25. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  26. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  27. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  28. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +22 -24
  29. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/draw/getPath.js +11 -20
  31. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  32. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +86 -82
  33. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  34. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +0 -6
  35. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  37. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +5 -6
  38. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +142 -146
  40. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +10 -5
  42. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  43. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  44. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  45. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +21 -23
  46. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  47. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  48. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  49. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +11 -6
  50. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  51. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  52. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +10 -5
  53. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +2 -3
  55. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +2 -14
  57. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  58. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +4 -12
  59. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  60. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  61. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  62. package/dist-cjs/lib/shapes/shared/crop.js +0 -1
  63. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  64. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  65. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  66. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  67. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  68. package/dist-cjs/lib/shapes/shared/{useEfficientZoomThreshold.js → useForceSolid.js} +7 -10
  69. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +7 -0
  70. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  71. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  72. package/dist-cjs/lib/shapes/text/RichTextArea.js +0 -5
  73. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  74. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -5
  75. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  76. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +10 -4
  77. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  78. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +5 -7
  79. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  80. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  81. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  82. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +5 -4
  83. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  84. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +4 -2
  85. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  86. package/dist-cjs/lib/tools/HandTool/HandTool.js +5 -3
  87. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  88. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +2 -3
  89. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  90. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  91. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  92. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  93. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  94. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +11 -10
  95. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  96. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +5 -6
  97. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +6 -4
  99. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +1 -2
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +6 -8
  111. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +11 -38
  113. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +50 -42
  115. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  117. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  118. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  119. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +14 -4
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +13 -4
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +6 -5
  131. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  132. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +3 -2
  133. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  134. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +6 -7
  135. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +11 -13
  137. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  138. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +4 -15
  139. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  140. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  141. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  142. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  143. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  144. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +6 -5
  145. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  146. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +3 -1
  147. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  148. package/dist-cjs/lib/{utils/test-helpers.js → tools/selection-logic/getShouldEnterCropModeOnPointerDown.js} +8 -21
  149. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +7 -0
  150. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  151. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  152. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  153. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  154. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  155. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +9 -3
  157. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +3 -1
  159. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  161. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +21 -1
  163. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/EditLinkDialog.js +1 -11
  165. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  167. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  168. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  169. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +15 -2
  170. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  171. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +1 -3
  172. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +0 -6
  174. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  175. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  176. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  177. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  178. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  179. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  180. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  181. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +32 -0
  182. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +7 -0
  183. package/dist-cjs/lib/ui/components/menu-items.js +1 -3
  184. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  185. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -3
  186. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +93 -149
  190. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  191. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  192. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +1 -1
  194. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  195. package/dist-cjs/lib/ui/context/actions.js +8 -7
  196. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  197. package/dist-cjs/lib/ui/context/components.js +2 -1
  198. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  199. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  200. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  201. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  202. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  203. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  204. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  205. package/dist-cjs/lib/ui/hooks/useTools.js +5 -4
  206. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  207. package/dist-cjs/lib/ui/version.js +3 -3
  208. package/dist-cjs/lib/ui/version.js.map +1 -1
  209. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +6 -16
  210. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  211. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  212. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  213. package/dist-cjs/lib/utils/text/richText.js +2 -4
  214. package/dist-cjs/lib/utils/text/richText.js.map +2 -2
  215. package/dist-cjs/lib/utils/text/textDirection.js +51 -0
  216. package/dist-cjs/lib/utils/text/textDirection.js.map +7 -0
  217. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +2 -7
  218. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  219. package/dist-esm/index.d.mts +242 -311
  220. package/dist-esm/index.mjs +5 -14
  221. package/dist-esm/index.mjs.map +2 -2
  222. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  223. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +4 -8
  224. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  225. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  226. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  227. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  228. package/dist-esm/lib/defaultSideEffects.mjs +1 -6
  229. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  231. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  233. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  235. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +10 -4
  239. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +4 -7
  241. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  243. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +24 -29
  246. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/draw/getPath.mjs +11 -21
  248. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +86 -83
  250. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  251. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +0 -6
  252. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  253. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  254. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +5 -6
  255. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  256. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +142 -147
  257. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +10 -5
  259. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  260. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  261. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  262. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +22 -24
  263. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  264. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  265. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  266. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +12 -7
  267. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  268. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  269. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +10 -5
  270. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  271. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +3 -4
  272. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +2 -14
  274. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  275. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +4 -12
  276. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  277. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  278. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  279. package/dist-esm/lib/shapes/shared/crop.mjs +0 -1
  280. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  281. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  282. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  283. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  284. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  285. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +9 -0
  286. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +7 -0
  287. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  288. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  289. package/dist-esm/lib/shapes/text/RichTextArea.mjs +0 -5
  290. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  291. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +2 -5
  292. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  293. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +10 -4
  294. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  295. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +5 -7
  296. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  297. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  298. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  299. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +5 -4
  300. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  301. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +8 -3
  302. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  303. package/dist-esm/lib/tools/HandTool/HandTool.mjs +5 -3
  304. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  305. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +2 -3
  306. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  307. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  308. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  309. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  310. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  311. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +11 -10
  312. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  313. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +5 -6
  314. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  315. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +6 -4
  316. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  317. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  318. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  319. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +1 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  327. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +6 -8
  328. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  329. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +11 -38
  330. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  331. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +51 -43
  332. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  333. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  334. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  335. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  336. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  337. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +19 -6
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +13 -4
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  347. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +6 -5
  348. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +3 -2
  350. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  351. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +6 -7
  352. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  353. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +11 -13
  354. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  355. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +4 -17
  356. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  357. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  358. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  359. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  360. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  361. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +6 -5
  362. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  363. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +3 -1
  364. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  365. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +8 -0
  366. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +7 -0
  367. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  368. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  369. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  370. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  371. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  372. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  373. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +8 -2
  374. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  375. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +3 -1
  376. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  377. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  378. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  379. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +30 -3
  380. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  381. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +1 -11
  382. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  383. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  384. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  385. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  386. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +6 -3
  387. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +1 -3
  389. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  390. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +0 -6
  391. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  392. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  393. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  394. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  395. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  396. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  398. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +12 -0
  399. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +7 -0
  400. package/dist-esm/lib/ui/components/menu-items.mjs +5 -4
  401. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  402. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -3
  403. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  404. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  406. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +95 -157
  407. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  408. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  409. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  410. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +2 -2
  411. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  412. package/dist-esm/lib/ui/context/actions.mjs +8 -7
  413. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  414. package/dist-esm/lib/ui/context/components.mjs +2 -1
  415. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  416. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +4 -1
  417. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  418. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  419. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  420. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  421. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  422. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  423. package/dist-esm/lib/ui/hooks/useTools.mjs +5 -4
  424. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  425. package/dist-esm/lib/ui/version.mjs +3 -3
  426. package/dist-esm/lib/ui/version.mjs.map +1 -1
  427. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +6 -17
  428. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  429. package/dist-esm/lib/utils/export/exportAs.mjs +3 -1
  430. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  431. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  432. package/dist-esm/lib/utils/text/richText.mjs +2 -5
  433. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  434. package/dist-esm/lib/utils/text/textDirection.mjs +31 -0
  435. package/dist-esm/lib/utils/text/textDirection.mjs.map +7 -0
  436. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +2 -8
  437. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  438. package/package.json +16 -18
  439. package/src/index.ts +2 -6
  440. package/src/lib/Tldraw.test.tsx +1 -46
  441. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  442. package/src/lib/canvas/TldrawSelectionForeground.tsx +9 -20
  443. package/src/lib/defaultEmbedDefinitions.ts +0 -1
  444. package/src/lib/defaultExternalContentHandlers.ts +14 -13
  445. package/src/lib/defaultSideEffects.ts +1 -6
  446. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +133 -40
  447. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  448. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  449. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  450. package/src/lib/shapes/arrow/arrow-types.ts +0 -2
  451. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  452. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  453. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  454. package/src/lib/shapes/arrow/shared.ts +4 -4
  455. package/src/lib/shapes/arrow/toolStates/Idle.tsx +14 -4
  456. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +5 -8
  457. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  458. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  459. package/src/lib/shapes/draw/DrawShapeUtil.tsx +26 -30
  460. package/src/lib/shapes/draw/getPath.ts +10 -31
  461. package/src/lib/shapes/draw/toolStates/Drawing.ts +90 -100
  462. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -8
  463. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  464. package/src/lib/shapes/frame/FrameShapeUtil.tsx +4 -10
  465. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +2 -10
  466. package/src/lib/shapes/geo/GeoShapeUtil.tsx +176 -228
  467. package/src/lib/shapes/geo/toolStates/Idle.ts +15 -5
  468. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  469. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +24 -25
  470. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  471. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  472. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  473. package/src/lib/shapes/note/NoteShapeTool.test.ts +1 -2
  474. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -9
  475. package/src/lib/shapes/note/noteCloning.test.ts +1 -3
  476. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  477. package/src/lib/shapes/note/toolStates/Pointing.ts +10 -5
  478. package/src/lib/shapes/shared/HyperlinkButton.tsx +3 -4
  479. package/src/lib/shapes/shared/PlainTextLabel.tsx +2 -12
  480. package/src/lib/shapes/shared/RichTextLabel.tsx +4 -14
  481. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  482. package/src/lib/shapes/shared/crop.ts +0 -1
  483. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  484. package/src/lib/shapes/shared/useEditablePlainText.ts +3 -7
  485. package/src/lib/shapes/shared/useEditableRichText.ts +3 -7
  486. package/src/lib/shapes/shared/useForceSolid.ts +6 -0
  487. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  488. package/src/lib/shapes/text/RichTextArea.tsx +0 -5
  489. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  490. package/src/lib/shapes/text/TextShapeUtil.tsx +0 -5
  491. package/src/lib/shapes/text/toolStates/Idle.ts +14 -4
  492. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  493. package/src/lib/shapes/video/VideoShapeUtil.tsx +1 -2
  494. package/src/lib/tools/EraserTool/childStates/Erasing.ts +10 -7
  495. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -5
  496. package/src/lib/tools/HandTool/HandTool.ts +5 -3
  497. package/src/lib/tools/HandTool/childStates/Dragging.ts +2 -3
  498. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  499. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  500. package/src/lib/tools/SelectTool/DragAndDropManager.ts +11 -14
  501. package/src/lib/tools/SelectTool/childStates/Brushing.ts +11 -8
  502. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +6 -7
  503. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +4 -3
  504. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  505. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  506. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +1 -2
  507. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  508. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +12 -11
  509. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +16 -57
  510. package/src/lib/tools/SelectTool/childStates/Idle.ts +81 -64
  511. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +8 -7
  512. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  513. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +17 -9
  514. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  515. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  516. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  517. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +14 -4
  518. package/src/lib/tools/SelectTool/childStates/Resizing.ts +10 -8
  519. package/src/lib/tools/SelectTool/childStates/Rotating.ts +3 -2
  520. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +10 -9
  521. package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -16
  522. package/src/lib/tools/SelectTool/selectHelpers.ts +4 -39
  523. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  524. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  525. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +6 -5
  526. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +3 -1
  527. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +10 -0
  528. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  529. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  530. package/src/lib/ui/TldrawUi.tsx +2 -5
  531. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +9 -1
  532. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +3 -1
  533. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  534. package/src/lib/ui/components/DefaultDebugPanel.tsx +42 -3
  535. package/src/lib/ui/components/EditLinkDialog.tsx +6 -16
  536. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  537. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  538. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +5 -6
  539. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +1 -3
  540. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +0 -8
  541. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  542. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  543. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  544. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  545. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +10 -0
  546. package/src/lib/ui/components/menu-items.tsx +15 -9
  547. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +3 -5
  548. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  549. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +113 -208
  550. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  551. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  552. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +2 -2
  553. package/src/lib/ui/context/actions.tsx +19 -15
  554. package/src/lib/ui/context/components.tsx +2 -1
  555. package/src/lib/ui/hooks/menu-hooks.ts +19 -9
  556. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  557. package/src/lib/ui/hooks/useFlatten.ts +2 -1
  558. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  559. package/src/lib/ui/hooks/useTools.tsx +7 -5
  560. package/src/lib/ui/version.ts +3 -3
  561. package/src/lib/ui.css +29 -31
  562. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +48 -12
  563. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +6 -19
  564. package/src/lib/utils/export/exportAs.ts +9 -2
  565. package/src/lib/utils/frames/frames.ts +1 -1
  566. package/src/lib/utils/text/richText.ts +5 -6
  567. package/src/lib/utils/text/textDirection.ts +32 -0
  568. package/src/lib/utils/tldr/buildFromV1Document.ts +19 -21
  569. package/src/test/Editor.test.tsx +41 -78
  570. package/src/test/EraserTool.test.ts +12 -10
  571. package/src/test/SelectTool.test.ts +19 -11
  572. package/src/test/TestEditor.ts +51 -49
  573. package/src/test/TldrawEditor.test.tsx +20 -24
  574. package/src/test/__snapshots__/drawing.test.ts.snap +1257 -3
  575. package/src/test/__snapshots__/resizing.test.ts.snap +12 -3
  576. package/src/test/arrows-megabus.test.tsx +1 -1
  577. package/src/test/bindings.test.tsx +25 -29
  578. package/src/test/bindingsIndex.test.tsx +4 -4
  579. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  580. package/src/test/commands/createShapes.test.ts +1 -15
  581. package/src/test/commands/getSvgString.test.ts +2 -2
  582. package/src/test/commands/putContent.test.ts +1 -80
  583. package/src/test/commands/setCamera.test.ts +11 -13
  584. package/src/test/commands/stackShapes.test.ts +8 -34
  585. package/src/test/commands/updateShapes.test.ts +5 -21
  586. package/src/test/commands/zoomToBounds.test.ts +3 -19
  587. package/src/test/commands/zoomToSelection.test.ts +3 -14
  588. package/src/test/custom-clipping.test.ts +44 -52
  589. package/src/test/customSnapping.test.tsx +62 -77
  590. package/src/test/drawing.test.ts +10 -17
  591. package/src/test/duplicate.test.ts +1 -1
  592. package/src/test/flipShapes.test.ts +0 -33
  593. package/src/test/frames.test.ts +2 -94
  594. package/src/test/getCulledShapes.test.tsx +3 -11
  595. package/src/test/getShapeAtPoint.test.ts +2 -2
  596. package/src/test/groups.test.tsx +4 -7
  597. package/src/test/modifiers.test.ts +6 -6
  598. package/src/test/resizing.test.ts +22 -16
  599. package/src/test/selection-omnibus.test.ts +13 -13
  600. package/src/test/shapeutils.test.ts +1 -1
  601. package/src/test/spacebarPanning.test.ts +10 -28
  602. package/src/test/styles2.test.tsx +1 -1
  603. package/src/test/styles3.test.ts +5 -5
  604. package/src/test/test-jsx.tsx +57 -72
  605. package/src/test/text.test.ts +17 -15
  606. package/src/test/translating.test.ts +8 -6
  607. package/tldraw.css +41 -45
  608. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +0 -7
  609. package/dist-cjs/lib/utils/test-helpers.js.map +0 -7
  610. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +0 -12
  611. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +0 -7
  612. package/dist-esm/lib/utils/test-helpers.mjs +0 -21
  613. package/dist-esm/lib/utils/test-helpers.mjs.map +0 -7
  614. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +0 -146
  615. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +0 -146
  616. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +0 -10
  617. package/src/lib/utils/test-helpers.ts +0 -60
  618. package/src/test/commands/cameraState.test.ts +0 -299
  619. package/src/test/commands/createShape.test.ts +0 -64
  620. package/src/test/commands/isShapeOfType.test.ts +0 -44
  621. package/src/test/commands/updateShape.test.ts +0 -67
@@ -183,11 +183,6 @@ export const RichTextArea = React.forwardRef<HTMLDivElement, TextAreaProps>(func
183
183
  blockSeparator: '\n',
184
184
  },
185
185
  },
186
- // N.B. We disable the text direction in the core list here,
187
- // but we add it back in again in our own extensions list so that
188
- // people can omit/override it if they want to.
189
- enableCoreExtensions: { textDirection: false },
190
- textDirection: 'auto',
191
186
  ...restOfTipTapConfig,
192
187
  content: rInitialRichText.current as JSONContent,
193
188
  })
@@ -1,4 +1,4 @@
1
- import { DefaultTextAlignStyle, toRichText } from '@tldraw/editor'
1
+ import { DefaultTextAlignStyle, TLTextShape, toRichText } from '@tldraw/editor'
2
2
  import { vi } from 'vitest'
3
3
  import { TestEditor } from '../../../test/TestEditor'
4
4
  import { TextShapeTool } from './TextShapeTool'
@@ -24,7 +24,7 @@ describe(TextShapeTool, () => {
24
24
  editor.pointerUp()
25
25
  editor.expectToBeIn('select.editing_shape')
26
26
  // This comes from the component, not the state chart
27
- editor.updateShapes([
27
+ editor.updateShapes<TLTextShape>([
28
28
  {
29
29
  ...editor.getCurrentPageShapes()[0]!,
30
30
  type: 'text',
@@ -96,7 +96,7 @@ describe('When in idle state', () => {
96
96
  editor.expectToBeIn('select.editing_shape')
97
97
 
98
98
  // Update the text shape with some content
99
- editor.updateShapes([
99
+ editor.updateShapes<TLTextShape>([
100
100
  {
101
101
  ...editor.getCurrentPageShapes()[0]!,
102
102
  type: 'text',
@@ -133,7 +133,7 @@ describe('When in idle state', () => {
133
133
  editor.expectToBeIn('select.editing_shape')
134
134
 
135
135
  // Update the text shape with some content
136
- editor.updateShapes([
136
+ editor.updateShapes<TLTextShape>([
137
137
  {
138
138
  ...editor.getCurrentPageShapes()[0]!,
139
139
  type: 'text',
@@ -43,8 +43,6 @@ const sizeCache = createComputedCache(
43
43
  export interface TextShapeOptions {
44
44
  /** How much addition padding should be added to the horizontal geometry of the shape when binding to an arrow? */
45
45
  extraArrowHorizontalPadding: number
46
- /** Whether to show the outline of the text shape (using the same color as the canvas). This helps with overlapping shapes. It does not show up on Safari, where text outline is a performance issues. */
47
- showTextOutline: boolean
48
46
  }
49
47
 
50
48
  /** @public */
@@ -55,7 +53,6 @@ export class TextShapeUtil extends ShapeUtil<TLTextShape> {
55
53
 
56
54
  override options: TextShapeOptions = {
57
55
  extraArrowHorizontalPadding: 10,
58
- showTextOutline: true,
59
56
  }
60
57
 
61
58
  getDefaultProps(): TLTextShape['props'] {
@@ -143,7 +140,6 @@ export class TextShapeUtil extends ShapeUtil<TLTextShape> {
143
140
  isSelected={isSelected}
144
141
  textWidth={width}
145
142
  textHeight={height}
146
- showTextOutline={this.options.showTextOutline}
147
143
  style={{
148
144
  transform: `scale(${scale})`,
149
145
  transformOrigin: 'top left',
@@ -179,7 +175,6 @@ export class TextShapeUtil extends ShapeUtil<TLTextShape> {
179
175
  labelColor={getColorValue(theme, shape.props.color, 'solid')}
180
176
  bounds={exportBounds}
181
177
  padding={0}
182
- showTextOutline={this.options.showTextOutline}
183
178
  />
184
179
  )
185
180
  }
@@ -1,6 +1,5 @@
1
1
  import { StateNode, TLKeyboardEventInfo, TLPointerEventInfo } from '@tldraw/editor'
2
2
  import { updateHoveredShapeId } from '../../../tools/selection-logic/updateHoveredShapeId'
3
- import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
4
3
 
5
4
  export class Idle extends StateNode {
6
5
  static override id = 'idle'
@@ -28,10 +27,21 @@ export class Idle extends StateNode {
28
27
 
29
28
  override onKeyDown(info: TLKeyboardEventInfo) {
30
29
  if (info.key === 'Enter') {
30
+ if (this.editor.getIsReadonly()) return null
31
31
  const onlySelectedShape = this.editor.getOnlySelectedShape()
32
- if (!this.editor.canEditShape(onlySelectedShape)) return
33
- this.editor.setCurrentTool('select')
34
- startEditingShapeWithRichText(this.editor, onlySelectedShape.id, { info })
32
+ // If the only selected shape is editable, start editing it
33
+ if (
34
+ onlySelectedShape &&
35
+ this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)
36
+ ) {
37
+ this.editor.setCurrentTool('select')
38
+ this.editor.setEditingShape(onlySelectedShape.id)
39
+ this.editor.root.getCurrent()?.transition('editing_shape', {
40
+ ...info,
41
+ target: 'shape',
42
+ shape: onlySelectedShape,
43
+ })
44
+ }
35
45
  }
36
46
  }
37
47
 
@@ -9,7 +9,6 @@ import {
9
9
  maybeSnapToGrid,
10
10
  toRichText,
11
11
  } from '@tldraw/editor'
12
- import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
13
12
 
14
13
  export class Pointing extends StateNode {
15
14
  static override id = 'pointing'
@@ -38,12 +37,11 @@ export class Pointing extends StateNode {
38
37
  if (Date.now() - this.enterTime < 150) return
39
38
 
40
39
  const { editor } = this
41
- const isPointing = editor.inputs.getIsPointing()
40
+ const { isPointing } = editor.inputs
42
41
 
43
42
  if (!isPointing) return
44
43
 
45
- const originPagePoint = editor.inputs.getOriginPagePoint()
46
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
44
+ const { originPagePoint, currentPagePoint } = editor.inputs
47
45
 
48
46
  const currentDragDist = Math.abs(originPagePoint.x - currentPagePoint.x)
49
47
 
@@ -85,7 +83,8 @@ export class Pointing extends StateNode {
85
83
  creationCursorOffset: { x: currentDragDist * scale, y: 1 },
86
84
  onInteractionEnd: 'text',
87
85
  onCreate: () => {
88
- startEditingShapeWithRichText(editor, shape.id)
86
+ editor.setEditingShape(shape.id)
87
+ // this will automatically set the state to 'select.editing_shape'
89
88
  },
90
89
  })
91
90
  }
@@ -110,12 +109,13 @@ export class Pointing extends StateNode {
110
109
  private complete() {
111
110
  this.editor.markHistoryStoppingPoint('creating text shape')
112
111
  const id = createShapeId()
113
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
112
+ const { originPagePoint } = this.editor.inputs
114
113
  const shape = this.createTextShape(id, originPagePoint, true, 20)
115
114
  if (!shape) return
116
115
 
117
116
  this.editor.select(id)
118
- startEditingShapeWithRichText(this.editor, id)
117
+ this.editor.setEditingShape(id)
118
+ // this will automatically set the state to 'select.editing_shape'
119
119
  }
120
120
 
121
121
  private cancel() {
@@ -124,7 +124,7 @@ export class Pointing extends StateNode {
124
124
  }
125
125
 
126
126
  private createTextShape(id: TLShapeId, point: Vec, autoSize: boolean, width: number) {
127
- this.editor.createShape({
127
+ this.editor.createShape<TLTextShape>({
128
128
  id,
129
129
  type: 'text',
130
130
  x: point.x,
@@ -95,8 +95,7 @@ export class VideoShapeUtil extends BaseBoxShapeUtil<TLVideoShape> {
95
95
 
96
96
  const VideoShape = memo(function VideoShape({ shape }: { shape: TLVideoShape }) {
97
97
  const editor = useEditor()
98
- const showControls =
99
- editor.getShapeGeometry(shape).bounds.w * editor.getEfficientZoomLevel() >= 110
98
+ const showControls = editor.getShapeGeometry(shape).bounds.w * editor.getZoomLevel() >= 110
100
99
  const isEditing = useIsEditing(shape.id)
101
100
  const prefersReducedMotion = usePrefersReducedMotion()
102
101
  const { Spinner } = useEditorComponents()
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  StateNode,
3
+ TLFrameShape,
4
+ TLGroupShape,
3
5
  TLPointerEventInfo,
4
6
  TLShapeId,
5
7
  isAccelKey,
@@ -26,7 +28,7 @@ export class Erasing extends StateNode {
26
28
  this.markId = this.editor.markHistoryStoppingPoint('erase scribble begin')
27
29
  this.info = info
28
30
 
29
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
31
+ const { originPagePoint } = this.editor.inputs
30
32
  this.excludedShapeIds = new Set(
31
33
  this.editor
32
34
  .getCurrentPageShapes()
@@ -35,8 +37,8 @@ export class Erasing extends StateNode {
35
37
  if (this.editor.isShapeOrAncestorLocked(shape)) return true
36
38
  //If the shape is a group or frame, check we're inside it when we start erasing
37
39
  if (
38
- this.editor.isShapeOfType(shape, 'group') ||
39
- this.editor.isShapeOfType(shape, 'frame')
40
+ this.editor.isShapeOfType<TLGroupShape>(shape, 'group') ||
41
+ this.editor.isShapeOfType<TLFrameShape>(shape, 'frame')
40
42
  ) {
41
43
  const pointInShapeShape = this.editor.getPointInShapeSpace(shape, originPagePoint)
42
44
  const geometry = this.editor.getShapeGeometry(shape)
@@ -58,7 +60,7 @@ export class Erasing extends StateNode {
58
60
  }
59
61
 
60
62
  private pushPointToScribble() {
61
- const { x, y } = this.editor.inputs.getCurrentPagePoint()
63
+ const { x, y } = this.editor.inputs.currentPagePoint
62
64
  this.editor.scribbles.addPoint(this.scribbleId, x, y)
63
65
  }
64
66
 
@@ -98,8 +100,9 @@ export class Erasing extends StateNode {
98
100
  const erasingShapeIds = editor.getErasingShapeIds()
99
101
  const zoomLevel = editor.getZoomLevel()
100
102
  const currentPageShapes = editor.getCurrentPageRenderingShapesSorted()
101
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
102
- const previousPagePoint = editor.inputs.getPreviousPagePoint()
103
+ const {
104
+ inputs: { currentPagePoint, previousPagePoint },
105
+ } = editor
103
106
 
104
107
  this.pushPointToScribble()
105
108
 
@@ -108,7 +111,7 @@ export class Erasing extends StateNode {
108
111
  const minDist = this.editor.options.hitTestMargin / zoomLevel
109
112
 
110
113
  for (const shape of currentPageShapes) {
111
- if (editor.isShapeOfType(shape, 'group')) continue
114
+ if (editor.isShapeOfType<TLGroupShape>(shape, 'group')) continue
112
115
 
113
116
  // Avoid testing masked shapes, unless the pointer is inside the mask
114
117
  const pageMask = editor.getShapeMask(shape.id)
@@ -1,4 +1,11 @@
1
- import { isAccelKey, StateNode, TLPointerEventInfo, TLShapeId } from '@tldraw/editor'
1
+ import {
2
+ isAccelKey,
3
+ StateNode,
4
+ TLFrameShape,
5
+ TLGroupShape,
6
+ TLPointerEventInfo,
7
+ TLShapeId,
8
+ } from '@tldraw/editor'
2
9
 
3
10
  export class Pointing extends StateNode {
4
11
  static override id = 'pointing'
@@ -10,7 +17,9 @@ export class Pointing extends StateNode {
10
17
 
11
18
  const zoomLevel = this.editor.getZoomLevel()
12
19
  const currentPageShapesSorted = this.editor.getCurrentPageRenderingShapesSorted()
13
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
20
+ const {
21
+ inputs: { currentPagePoint },
22
+ } = this.editor
14
23
 
15
24
  const erasing = new Set<TLShapeId>()
16
25
 
@@ -18,7 +27,10 @@ export class Pointing extends StateNode {
18
27
 
19
28
  for (let n = currentPageShapesSorted.length, i = n - 1; i >= 0; i--) {
20
29
  const shape = currentPageShapesSorted[i]
21
- if (this.editor.isShapeOrAncestorLocked(shape) || this.editor.isShapeOfType(shape, 'group')) {
30
+ if (
31
+ this.editor.isShapeOrAncestorLocked(shape) ||
32
+ this.editor.isShapeOfType<TLGroupShape>(shape, 'group')
33
+ ) {
22
34
  continue
23
35
  }
24
36
 
@@ -30,7 +42,10 @@ export class Pointing extends StateNode {
30
42
  ) {
31
43
  const hitShape = this.editor.getOutermostSelectableShape(shape)
32
44
  // If we've hit a frame after hitting any other shape, stop here
33
- if (this.editor.isShapeOfType(hitShape, 'frame') && erasing.size > initialSize) {
45
+ if (
46
+ this.editor.isShapeOfType<TLFrameShape>(hitShape, 'frame') &&
47
+ erasing.size > initialSize
48
+ ) {
34
49
  break
35
50
  }
36
51
 
@@ -67,7 +82,7 @@ export class Pointing extends StateNode {
67
82
  override onPointerMove(info: TLPointerEventInfo) {
68
83
  if (this._isHoldingAccelKey) return
69
84
 
70
- if (this.editor.inputs.getIsDragging()) {
85
+ if (this.editor.inputs.isDragging) {
71
86
  this.startErasing(info)
72
87
  }
73
88
  }
@@ -14,7 +14,7 @@ export class HandTool extends StateNode {
14
14
 
15
15
  override onDoubleClick(info: TLClickEventInfo) {
16
16
  if (info.phase === 'settle') {
17
- const currentScreenPoint = this.editor.inputs.getCurrentScreenPoint()
17
+ const { currentScreenPoint } = this.editor.inputs
18
18
  this.editor.zoomIn(currentScreenPoint, {
19
19
  animation: { duration: 220, easing: EASINGS.easeOutQuint },
20
20
  })
@@ -23,7 +23,7 @@ export class HandTool extends StateNode {
23
23
 
24
24
  override onTripleClick(info: TLClickEventInfo) {
25
25
  if (info.phase === 'settle') {
26
- const currentScreenPoint = this.editor.inputs.getCurrentScreenPoint()
26
+ const { currentScreenPoint } = this.editor.inputs
27
27
  this.editor.zoomOut(currentScreenPoint, {
28
28
  animation: { duration: 320, easing: EASINGS.easeOutQuint },
29
29
  })
@@ -33,7 +33,9 @@ export class HandTool extends StateNode {
33
33
  override onQuadrupleClick(info: TLClickEventInfo) {
34
34
  if (info.phase === 'settle') {
35
35
  const zoomLevel = this.editor.getZoomLevel()
36
- const currentScreenPoint = this.editor.inputs.getCurrentScreenPoint()
36
+ const {
37
+ inputs: { currentScreenPoint },
38
+ } = this.editor
37
39
 
38
40
  if (zoomLevel === 1) {
39
41
  this.editor.zoomToFit({ animation: { duration: 400, easing: EASINGS.easeOutQuint } })
@@ -28,8 +28,7 @@ export class Dragging extends StateNode {
28
28
 
29
29
  private update() {
30
30
  const { initialCamera, editor } = this
31
- const currentScreenPoint = editor.inputs.getCurrentScreenPoint()
32
- const originScreenPoint = editor.inputs.getOriginScreenPoint()
31
+ const { currentScreenPoint, originScreenPoint } = editor.inputs
33
32
 
34
33
  const delta = Vec.Sub(currentScreenPoint, originScreenPoint).div(editor.getZoomLevel())
35
34
  if (delta.len2() === 0) return
@@ -38,7 +37,7 @@ export class Dragging extends StateNode {
38
37
 
39
38
  private complete() {
40
39
  const { editor } = this
41
- const pointerVelocity = editor.inputs.getPointerVelocity()
40
+ const { pointerVelocity } = editor.inputs
42
41
 
43
42
  const velocityAtPointerUp = Math.min(pointerVelocity.len(), 2)
44
43
 
@@ -13,7 +13,7 @@ export class Pointing extends StateNode {
13
13
  }
14
14
 
15
15
  override onPointerMove() {
16
- if (this.editor.inputs.getIsDragging()) {
16
+ if (this.editor.inputs.isDragging) {
17
17
  this.startDragging()
18
18
  }
19
19
  }
@@ -31,7 +31,7 @@ export class Lasering extends StateNode {
31
31
  }
32
32
 
33
33
  private pushPointToScribble() {
34
- const { x, y } = this.editor.inputs.getCurrentPagePoint()
34
+ const { x, y } = this.editor.inputs.currentPagePoint
35
35
  this.editor.scribbles.addPoint(this.scribbleId, x, y)
36
36
  }
37
37
 
@@ -44,7 +44,7 @@ export class DragAndDropManager {
44
44
 
45
45
  for (const shape of shapesToActuallyMove) {
46
46
  const parent = editor.getShapeParent(shape)
47
- if (parent && editor.isShapeOfType(parent, 'group')) {
47
+ if (parent && editor.isShapeOfType<TLGroupShape>(parent, 'group')) {
48
48
  if (!movingGroups.has(parent)) {
49
49
  movingGroups.add(parent)
50
50
  }
@@ -70,7 +70,9 @@ export class DragAndDropManager {
70
70
  }
71
71
  this.initialIndices.set(shape.id, shape.index)
72
72
 
73
- const group = editor.findShapeAncestor(shape, (s) => editor.isShapeOfType(s, 'group'))
73
+ const group = editor.findShapeAncestor(shape, (s) =>
74
+ editor.isShapeOfType<TLGroupShape>(s, 'group')
75
+ )
74
76
  if (group) {
75
77
  this.initialGroupIds.set(shape.id, group.id)
76
78
  }
@@ -92,13 +94,10 @@ export class DragAndDropManager {
92
94
  this.intervalTimerId = this.editor.timers.setInterval(
93
95
  () => {
94
96
  skip2of3FramesWhileMovingFast++
95
- if (
96
- skip2of3FramesWhileMovingFast % 3 &&
97
- this.editor.inputs.getPointerVelocity().len() > 0.5
98
- ) {
97
+ if (skip2of3FramesWhileMovingFast % 3 && this.editor.inputs.pointerVelocity.len() > 0.5) {
99
98
  return
100
99
  }
101
- this.updateDraggingShapes(editor.inputs.getCurrentPagePoint(), cb)
100
+ this.updateDraggingShapes(editor.inputs.currentPagePoint, cb)
102
101
  },
103
102
  movingShapes.length > 10 ? SLOW_POINTER_LAG_DURATION : FAST_POINTER_LAG_DURATION
104
103
  )
@@ -106,10 +105,9 @@ export class DragAndDropManager {
106
105
 
107
106
  dropShapes(shapes: TLShape[]) {
108
107
  const { editor } = this
109
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
110
- this.updateDraggingShapes(currentPagePoint)
108
+ this.updateDraggingShapes(editor.inputs.currentPagePoint)
111
109
 
112
- const draggingOverShape = editor.getDraggingOverShape(currentPagePoint, shapes)
110
+ const draggingOverShape = editor.getDraggingOverShape(editor.inputs.currentPagePoint, shapes)
113
111
 
114
112
  if (draggingOverShape) {
115
113
  const util = editor.getShapeUtil(draggingOverShape)
@@ -151,9 +149,8 @@ export class DragAndDropManager {
151
149
  // This is the shape under the pointer that can handle at least one of the dragging shapes
152
150
  const nextDraggingOverShape = editor.getDraggingOverShape(point, this.shapesToActuallyMove)
153
151
 
154
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
155
- const cursorDidMove = !this.prevPagePoint.equals(currentPagePoint)
156
- this.prevPagePoint.setTo(currentPagePoint)
152
+ const cursorDidMove = !this.prevPagePoint.equals(editor.inputs.currentPagePoint)
153
+ this.prevPagePoint.setTo(editor.inputs.currentPagePoint)
157
154
 
158
155
  editor.run(() => {
159
156
  if (this.prevDraggingOverShape?.id === nextDraggingOverShape?.id) {
@@ -161,7 +158,7 @@ export class DragAndDropManager {
161
158
  cursorDidMove &&
162
159
  nextDraggingOverShape &&
163
160
  isShapeId(nextDraggingOverShape.id) &&
164
- !editor.inputs.getPreviousPagePoint().equals(currentPagePoint)
161
+ !editor.inputs.previousPagePoint.equals(editor.inputs.currentPagePoint)
165
162
  ) {
166
163
  // If the cursor moved, call onDragShapesOver for the previous dragging over shape
167
164
  const util = editor.getShapeUtil(nextDraggingOverShape)
@@ -3,6 +3,8 @@ import {
3
3
  Mat,
4
4
  StateNode,
5
5
  TLCancelEventInfo,
6
+ TLFrameShape,
7
+ TLGroupShape,
6
8
  TLKeyboardEventInfo,
7
9
  TLPageId,
8
10
  TLPointerEventInfo,
@@ -31,7 +33,7 @@ export class Brushing extends StateNode {
31
33
 
32
34
  override onEnter(info: TLPointerEventInfo & { target: 'canvas' }) {
33
35
  const { editor } = this
34
- const altKey = editor.inputs.getAltKey()
36
+ const { altKey } = editor.inputs
35
37
 
36
38
  this.isWrapMode = editor.user.getIsWrapMode()
37
39
 
@@ -55,7 +57,9 @@ export class Brushing extends StateNode {
55
57
  editor
56
58
  .getCurrentPageShapes()
57
59
  .filter(
58
- (shape) => editor.isShapeOfType(shape, 'group') || editor.isShapeOrAncestorLocked(shape)
60
+ (shape) =>
61
+ editor.isShapeOfType<TLGroupShape>(shape, 'group') ||
62
+ editor.isShapeOrAncestorLocked(shape)
59
63
  )
60
64
  .map((shape) => shape.id)
61
65
  )
@@ -96,7 +100,7 @@ export class Brushing extends StateNode {
96
100
  }
97
101
 
98
102
  override onKeyDown(info: TLKeyboardEventInfo) {
99
- if (this.editor.inputs.getAltKey()) {
103
+ if (this.editor.inputs.altKey) {
100
104
  this.parent.transition('scribble_brushing', info)
101
105
  } else {
102
106
  this.hitTestShapes()
@@ -114,10 +118,9 @@ export class Brushing extends StateNode {
114
118
 
115
119
  private hitTestShapes() {
116
120
  const { editor, excludedShapeIds, isWrapMode } = this
117
- const originPagePoint = editor.inputs.getOriginPagePoint()
118
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
119
- const shiftKey = editor.inputs.getShiftKey()
120
- const ctrlKey = editor.inputs.getCtrlKey()
121
+ const {
122
+ inputs: { originPagePoint, currentPagePoint, shiftKey, ctrlKey },
123
+ } = editor
121
124
 
122
125
  // We'll be collecting shape ids of selected shapes; if we're holding shift key, we start from our initial shapes
123
126
  const results = new Set(shiftKey ? this.initialSelectedShapeIds : [])
@@ -174,7 +177,7 @@ export class Brushing extends StateNode {
174
177
 
175
178
  // If we're in wrap mode and the brush did not fully encloses the shape, it's a miss
176
179
  // We also skip frames unless we've completely selected the frame.
177
- if (isWrapping || editor.isShapeOfType(shape, 'frame')) {
180
+ if (isWrapping || editor.isShapeOfType<TLFrameShape>(shape, 'frame')) {
178
181
  continue testAllShapes
179
182
  }
180
183
 
@@ -83,12 +83,9 @@ export class Cropping extends StateNode {
83
83
  const util = this.editor.getShapeUtil<ShapeWithCrop>(shape.type)
84
84
  if (!util) return
85
85
 
86
- const shiftKey = this.editor.inputs.getShiftKey()
87
- const currentPagePoint = this.editor.inputs
88
- .getCurrentPagePoint()
89
- .clone()
90
- .sub(cursorHandleOffset)
91
- const originPagePoint = this.editor.inputs.getOriginPagePoint().clone().sub(cursorHandleOffset)
86
+ const { shiftKey } = this.editor.inputs
87
+ const currentPagePoint = this.editor.inputs.currentPagePoint.clone().sub(cursorHandleOffset)
88
+ const originPagePoint = this.editor.inputs.originPagePoint.clone().sub(cursorHandleOffset)
92
89
  const change = currentPagePoint.clone().sub(originPagePoint).rot(-shape.rotation)
93
90
 
94
91
  const crop = shape.props.crop ?? getDefaultCrop()
@@ -148,7 +145,9 @@ export class Cropping extends StateNode {
148
145
 
149
146
  private createSnapshot() {
150
147
  const selectionRotation = this.editor.getSelectionRotation()
151
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
148
+ const {
149
+ inputs: { originPagePoint },
150
+ } = this.editor
152
151
 
153
152
  const shape = this.editor.getOnlySelectedShape() as ShapeWithCrop
154
153
 
@@ -2,6 +2,7 @@ import {
2
2
  ShapeWithCrop,
3
3
  StateNode,
4
4
  TLClickEventInfo,
5
+ TLGroupShape,
5
6
  TLKeyboardEventInfo,
6
7
  TLPointerEventInfo,
7
8
  Vec,
@@ -42,7 +43,7 @@ export class Idle extends StateNode {
42
43
  switch (info.target) {
43
44
  case 'canvas': {
44
45
  const hitShape = getHitShapeOnCanvasPointerDown(this.editor)
45
- if (hitShape && !this.editor.isShapeOfType(hitShape, 'group')) {
46
+ if (hitShape && !this.editor.isShapeOfType<TLGroupShape>(hitShape, 'group')) {
46
47
  this.onPointerDown({
47
48
  ...info,
48
49
  shape: hitShape,
@@ -112,7 +113,7 @@ export class Idle extends StateNode {
112
113
  override onDoubleClick(info: TLClickEventInfo) {
113
114
  // Without this, the double click's "settle" would trigger the reset
114
115
  // after the user double clicked the edge to begin cropping
115
- if (this.editor.inputs.getShiftKey() || info.phase !== 'up') return
116
+ if (this.editor.inputs.shiftKey || info.phase !== 'up') return
116
117
 
117
118
  const croppingShapeId = this.editor.getCroppingShapeId()
118
119
  if (!croppingShapeId) return
@@ -190,7 +191,7 @@ export class Idle extends StateNode {
190
191
  this.editor.markHistoryStoppingPoint('translate crop')
191
192
  }
192
193
 
193
- this.editor.updateShapes([partial])
194
+ this.editor.updateShapes<ShapeWithCrop>([partial])
194
195
  }
195
196
  }
196
197
  }
@@ -8,7 +8,7 @@ export class PointingCrop extends StateNode {
8
8
  }
9
9
 
10
10
  override onPointerMove(info: TLPointerEventInfo) {
11
- if (this.editor.inputs.getIsDragging()) {
11
+ if (this.editor.inputs.isDragging) {
12
12
  this.startDragging(info)
13
13
  }
14
14
  }
@@ -31,7 +31,7 @@ export class PointingCropHandle extends StateNode {
31
31
  }
32
32
 
33
33
  override onPointerMove() {
34
- if (this.editor.inputs.getIsDragging()) {
34
+ if (this.editor.inputs.isDragging) {
35
35
  this.startCropping()
36
36
  }
37
37
  }
@@ -94,8 +94,7 @@ export class TranslatingCrop extends StateNode {
94
94
 
95
95
  if (!shape) return
96
96
 
97
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
98
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
97
+ const { originPagePoint, currentPagePoint } = this.editor.inputs
99
98
  const delta = currentPagePoint.clone().sub(originPagePoint)
100
99
  const partial = getTranslateCroppedImageChange(this.editor, shape, delta)
101
100
 
@@ -12,7 +12,7 @@ export function getTranslateCroppedImageChange(editor: Editor, shape: ShapeWithC
12
12
  return
13
13
  }
14
14
 
15
- const flatten: 'x' | 'y' | null = editor.inputs.getShiftKey()
15
+ const flatten: 'x' | 'y' | null = editor.inputs.shiftKey
16
16
  ? Math.abs(delta.x) < Math.abs(delta.y)
17
17
  ? 'x'
18
18
  : 'y'
@@ -73,7 +73,7 @@ export class DraggingHandle extends StateNode {
73
73
 
74
74
  this.initialPageTransform = this.editor.getShapePageTransform(shape)!
75
75
  this.initialPageRotation = this.initialPageTransform.rotation()
76
- this.initialPagePoint = this.editor.inputs.getOriginPagePoint().clone()
76
+ this.initialPagePoint = this.editor.inputs.originPagePoint.clone()
77
77
 
78
78
  this.editor.setCursor({ type: isCreating ? 'cross' : 'grabbing', rotation: 0 })
79
79
 
@@ -115,7 +115,7 @@ export class DraggingHandle extends StateNode {
115
115
  }
116
116
 
117
117
  // <!-- Only relevant to arrows
118
- if (this.editor.isShapeOfType(shape, 'arrow')) {
118
+ if (this.editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {
119
119
  const initialBinding = getArrowBindings(this.editor, shape)[info.handle.id as 'start' | 'end']
120
120
 
121
121
  this.isPrecise = false
@@ -228,7 +228,7 @@ export class DraggingHandle extends StateNode {
228
228
  }
229
229
  const endChanges = util.onHandleDragEnd?.(shape, handleDragInfo)
230
230
  if (endChanges) {
231
- this.editor.updateShapes([{ ...endChanges, id: shape.id }])
231
+ this.editor.updateShapes([{ ...endChanges, id: shape.id, type: shape.type }])
232
232
  }
233
233
  }
234
234
 
@@ -284,12 +284,10 @@ export class DraggingHandle extends StateNode {
284
284
  const { editor, shapeId, initialPagePoint } = this
285
285
  const { initialHandle, initialPageRotation, initialAdjacentHandle } = this
286
286
  const isSnapMode = this.editor.user.getIsSnapMode()
287
- const { snaps } = editor
288
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
289
- const shiftKey = editor.inputs.getShiftKey()
290
- const ctrlKey = editor.inputs.getCtrlKey()
291
- const altKey = editor.inputs.getAltKey()
292
- const pointerVelocity = editor.inputs.getPointerVelocity()
287
+ const {
288
+ snaps,
289
+ inputs: { currentPagePoint, shiftKey, ctrlKey, altKey, pointerVelocity },
290
+ } = editor
293
291
 
294
292
  const initial = this.info.shape
295
293
 
@@ -297,7 +295,7 @@ export class DraggingHandle extends StateNode {
297
295
  if (!shape) return
298
296
  const util = editor.getShapeUtil(shape)
299
297
 
300
- const initialBinding = editor.isShapeOfType(shape, 'arrow')
298
+ const initialBinding = editor.isShapeOfType<TLArrowShape>(shape, 'arrow')
301
299
  ? getArrowBindings(editor, shape)[initialHandle.id as 'start' | 'end']
302
300
  : undefined
303
301
 
@@ -354,7 +352,10 @@ export class DraggingHandle extends StateNode {
354
352
  const next: TLShapePartial<any> = { id: shape.id, type: shape.type, ...changes }
355
353
 
356
354
  // Arrows
357
- if (initialHandle.type === 'vertex' && this.editor.isShapeOfType(shape, 'arrow')) {
355
+ if (
356
+ initialHandle.type === 'vertex' &&
357
+ this.editor.isShapeOfType<TLArrowShape>(shape, 'arrow')
358
+ ) {
358
359
  const bindingAfter = getArrowBindings(editor, shape)[initialHandle.id as 'start' | 'end']
359
360
 
360
361
  if (bindingAfter) {