tldraw 4.3.0-canary.e52fa5385f86 → 4.3.0-canary.ea88b223b83a

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 (548) hide show
  1. package/dist-cjs/index.d.ts +294 -237
  2. package/dist-cjs/index.js +12 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  6. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  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 +6 -1
  11. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  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/getElbowArrowInfo.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  22. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  23. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  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/draw/DrawShapeUtil.js +25 -23
  28. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  30. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  31. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  32. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  34. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  36. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  37. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  40. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  41. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  42. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  43. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  44. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  46. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  47. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  49. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  50. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  51. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  52. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  54. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  56. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  57. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  58. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  59. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  60. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  61. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  62. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  63. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  64. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  65. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  66. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  67. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  68. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  69. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  70. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  71. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  72. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  73. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  74. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  75. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  76. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  77. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  78. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  79. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  80. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  81. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  82. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  83. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  84. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  85. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  86. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  87. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +9 -7
  88. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  89. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  90. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  91. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  92. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  93. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  94. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  95. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  96. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  97. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  98. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  99. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  103. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +7 -5
  104. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  106. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  109. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  110. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  111. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  112. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  113. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  114. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  115. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  116. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  117. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  118. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  119. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  123. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  124. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  125. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  126. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  127. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  128. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  129. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  130. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  132. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  133. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  134. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  135. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  136. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  137. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  138. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  139. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  140. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  141. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  142. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  143. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  144. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  145. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  146. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  147. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  148. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  149. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  150. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  151. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  152. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  153. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  154. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  155. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  157. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  159. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  160. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  161. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  163. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  165. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  167. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  169. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  170. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  171. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  172. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +6 -5
  174. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  175. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  176. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +1 -2
  178. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  179. package/dist-cjs/lib/ui/context/actions.js +6 -6
  180. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  181. package/dist-cjs/lib/ui/context/components.js +1 -2
  182. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  183. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  184. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  185. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  186. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  187. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  188. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  189. package/dist-cjs/lib/ui/version.js +3 -3
  190. package/dist-cjs/lib/ui/version.js.map +1 -1
  191. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -6
  192. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  193. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  194. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  195. package/dist-cjs/lib/utils/text/richText.js +4 -2
  196. package/dist-cjs/lib/utils/text/richText.js.map +2 -2
  197. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  198. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  199. package/dist-esm/index.d.mts +294 -237
  200. package/dist-esm/index.mjs +12 -5
  201. package/dist-esm/index.mjs.map +2 -2
  202. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  203. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  204. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  205. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  206. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  207. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  208. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  209. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  210. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  211. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  212. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  213. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  215. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  217. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  218. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  219. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  221. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  223. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  225. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  227. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  229. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  230. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  231. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  233. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  235. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  237. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  239. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  241. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  243. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  245. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  246. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  247. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  248. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  249. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  250. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  251. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  252. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  253. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  254. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  255. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  256. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  257. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  259. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  260. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  261. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  262. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  263. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  264. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  265. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  266. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  267. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  268. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  269. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  270. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  271. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  272. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  273. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  274. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +2 -4
  275. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  276. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  277. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  278. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  279. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  280. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  281. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  282. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  283. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  284. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +9 -7
  285. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  286. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  287. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  288. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  289. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  290. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  291. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  292. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  293. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  294. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  295. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  296. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  297. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  298. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  299. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  300. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +7 -5
  301. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  302. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  303. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  304. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  305. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  306. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  307. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  308. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  309. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  310. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -15
  311. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  312. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  313. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  314. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  315. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  316. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  317. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  318. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  319. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  320. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  321. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  322. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  323. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  325. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  326. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  327. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  328. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  329. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  330. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  331. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  332. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  333. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  334. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  335. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  336. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  337. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  338. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  339. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  340. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  341. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  342. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  343. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  345. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  346. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  347. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  348. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  349. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  350. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  351. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  352. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  353. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  354. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  355. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  356. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  357. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  358. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  359. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  360. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  361. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  362. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  363. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  364. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  365. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  366. package/dist-esm/lib/ui/components/menu-items.mjs +3 -1
  367. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  368. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  369. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  370. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +6 -5
  371. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  372. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  373. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  374. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +1 -2
  375. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  376. package/dist-esm/lib/ui/context/actions.mjs +6 -6
  377. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  378. package/dist-esm/lib/ui/context/components.mjs +1 -2
  379. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  380. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  381. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  382. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  383. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  384. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  385. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  386. package/dist-esm/lib/ui/version.mjs +3 -3
  387. package/dist-esm/lib/ui/version.mjs.map +1 -1
  388. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +9 -6
  389. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  390. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  391. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  392. package/dist-esm/lib/utils/text/richText.mjs +5 -2
  393. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  394. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  395. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  396. package/package.json +18 -16
  397. package/src/index.ts +5 -2
  398. package/src/lib/Tldraw.test.tsx +46 -1
  399. package/src/lib/canvas/TldrawSelectionForeground.tsx +2 -2
  400. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  401. package/src/lib/defaultExternalContentHandlers.ts +10 -10
  402. package/src/lib/defaultSideEffects.ts +6 -1
  403. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  404. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  405. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +15 -15
  406. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  407. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  408. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  409. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  410. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  411. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  412. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
  413. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  414. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  415. package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
  416. package/src/lib/shapes/draw/getPath.ts +31 -10
  417. package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
  418. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
  419. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  420. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  421. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  422. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  423. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  424. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
  425. package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
  426. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  427. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  428. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  429. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  430. package/src/lib/shapes/shared/PlainTextLabel.tsx +10 -1
  431. package/src/lib/shapes/shared/RichTextLabel.tsx +12 -3
  432. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  433. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  434. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  435. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  436. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  437. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  438. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  439. package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
  440. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  441. package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
  442. package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
  443. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  444. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  445. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  446. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  447. package/src/lib/tools/SelectTool/DragAndDropManager.ts +12 -7
  448. package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
  449. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  450. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
  451. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  452. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  453. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  454. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  455. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +7 -5
  456. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
  457. package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
  458. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
  459. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  460. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
  461. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  462. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  463. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  464. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  465. package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
  466. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  467. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
  468. package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
  469. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  470. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  471. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  472. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  473. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  474. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  475. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  476. package/src/lib/ui/TldrawUi.tsx +5 -2
  477. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  478. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  479. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  480. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  481. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  482. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  483. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  484. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  485. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  486. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  487. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  488. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  489. package/src/lib/ui/components/menu-items.tsx +3 -1
  490. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  491. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +12 -5
  492. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  493. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  494. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +0 -1
  495. package/src/lib/ui/context/actions.tsx +6 -6
  496. package/src/lib/ui/context/components.tsx +1 -2
  497. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  498. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  499. package/src/lib/ui/hooks/useTools.tsx +4 -5
  500. package/src/lib/ui/version.ts +3 -3
  501. package/src/lib/ui.css +27 -23
  502. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  503. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +11 -6
  504. package/src/lib/utils/test-helpers.ts +60 -0
  505. package/src/lib/utils/text/richText.ts +6 -5
  506. package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
  507. package/src/test/Editor.test.tsx +40 -29
  508. package/src/test/EraserTool.test.ts +10 -12
  509. package/src/test/TestEditor.ts +48 -47
  510. package/src/test/TldrawEditor.test.tsx +3 -2
  511. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  512. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  513. package/src/test/arrows-megabus.test.tsx +1 -1
  514. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  515. package/src/test/commands/cameraState.test.ts +299 -0
  516. package/src/test/commands/setCamera.test.ts +13 -11
  517. package/src/test/commands/stackShapes.test.ts +34 -8
  518. package/src/test/commands/zoomToBounds.test.ts +19 -3
  519. package/src/test/commands/zoomToSelection.test.ts +14 -3
  520. package/src/test/custom-clipping.test.ts +16 -9
  521. package/src/test/drawing.test.ts +17 -10
  522. package/src/test/flipShapes.test.ts +33 -0
  523. package/src/test/frames.test.ts +92 -0
  524. package/src/test/groups.test.tsx +1 -1
  525. package/src/test/modifiers.test.ts +6 -6
  526. package/src/test/resizing.test.ts +7 -9
  527. package/src/test/selection-omnibus.test.ts +2 -2
  528. package/src/test/spacebarPanning.test.ts +28 -10
  529. package/src/test/test-jsx.tsx +3 -0
  530. package/tldraw.css +41 -35
  531. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  532. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  533. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  534. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  535. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  536. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  537. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  538. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  539. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  540. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  541. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  542. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  543. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  544. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  545. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  546. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  547. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  548. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -1,15 +1,50 @@
1
- import { Editor, TLShape } from '@tldraw/editor'
1
+ import {
2
+ Editor,
3
+ ExtractShapeByProps,
4
+ richTextValidator,
5
+ TLEventInfo,
6
+ TLRichText,
7
+ TLShape,
8
+ TLShapeId,
9
+ } from '@tldraw/editor'
2
10
 
3
11
  /** @internal */
4
- export function startEditingShapeWithLabel(editor: Editor, shape: TLShape, selectAll = false) {
12
+ export function hasRichText(
13
+ shape: TLShape
14
+ ): shape is ExtractShapeByProps<{ richText: TLRichText }> {
15
+ return 'richText' in shape.props && richTextValidator.isValid(shape.props.richText)
16
+ }
17
+ /**
18
+ * Start editing a shape that has rich text, such as text, note, geo, or arrow shapes.
19
+ * This will enter the editing state for the shape and optionally select all the text.
20
+ *
21
+ * @param editor - The editor instance.
22
+ * @param shapeOrId - The shape to start editing. This shape must have a richText property with a TLRichText value.
23
+ * @param options - Options: selectAll or info (TLEventInfo)
24
+ *
25
+ * @public
26
+ */
27
+ export function startEditingShapeWithRichText(
28
+ editor: Editor,
29
+ shapeOrId: TLShape | TLShapeId,
30
+ options: { selectAll?: boolean; info?: TLEventInfo } = {}
31
+ ) {
32
+ const shape = typeof shapeOrId === 'string' ? editor.getShape(shapeOrId) : shapeOrId
33
+ if (!shape) return
34
+
35
+ if (!editor.canEditShape(shape)) return
36
+
37
+ if (!hasRichText(shape)) {
38
+ throw new Error('Shape does not have rich text')
39
+ }
5
40
  // Finish this shape and start editing the next one
6
- editor.select(shape)
7
41
  editor.setEditingShape(shape)
8
42
  editor.setCurrentTool('select.editing_shape', {
43
+ ...options.info,
9
44
  target: 'shape',
10
45
  shape: shape,
11
46
  })
12
- if (selectAll) {
47
+ if (options.selectAll) {
13
48
  editor.emit('select-all-text', { shapeId: shape.id })
14
49
  }
15
50
  }
@@ -57,7 +57,7 @@ export class ZoomTool extends StateNode {
57
57
  }
58
58
 
59
59
  private updateCursor() {
60
- if (this.editor.inputs.altKey) {
60
+ if (this.editor.inputs.getAltKey()) {
61
61
  this.editor.setCursor({ type: 'zoom-out', rotation: 0 })
62
62
  } else {
63
63
  this.editor.setCursor({ type: 'zoom-in', rotation: 0 })
@@ -14,7 +14,7 @@ export class Pointing extends StateNode {
14
14
  }
15
15
 
16
16
  override onPointerMove() {
17
- if (this.editor.inputs.isDragging) {
17
+ if (this.editor.inputs.getIsDragging()) {
18
18
  this.parent.transition('zoom_brushing', this.info)
19
19
  }
20
20
  }
@@ -24,8 +24,8 @@ export class Pointing extends StateNode {
24
24
  }
25
25
 
26
26
  private complete() {
27
- const { currentScreenPoint } = this.editor.inputs
28
- if (this.editor.inputs.altKey) {
27
+ const currentScreenPoint = this.editor.inputs.getCurrentScreenPoint()
28
+ if (this.editor.inputs.getAltKey()) {
29
29
  this.editor.zoomOut(currentScreenPoint, { animation: { duration: 220 } })
30
30
  } else {
31
31
  this.editor.zoomIn(currentScreenPoint, { animation: { duration: 220 } })
@@ -29,9 +29,8 @@ export class ZoomBrushing extends StateNode {
29
29
  }
30
30
 
31
31
  private update() {
32
- const {
33
- inputs: { originPagePoint, currentPagePoint },
34
- } = this.editor
32
+ const originPagePoint = this.editor.inputs.getOriginPagePoint()
33
+ const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
35
34
 
36
35
  this.zoomBrush.setTo(Box.FromPoints([originPagePoint, currentPagePoint]))
37
36
  this.editor.updateInstanceState({ zoomBrush: this.zoomBrush.toJson() })
@@ -46,14 +45,14 @@ export class ZoomBrushing extends StateNode {
46
45
  const threshold = 8 / this.editor.getZoomLevel()
47
46
  // If the selected area is small then treat it as a click
48
47
  if (zoomBrush.width < threshold && zoomBrush.height < threshold) {
49
- const point = this.editor.inputs.currentScreenPoint
50
- if (this.editor.inputs.altKey) {
48
+ const point = this.editor.inputs.getCurrentScreenPoint()
49
+ if (this.editor.inputs.getAltKey()) {
51
50
  this.editor.zoomOut(point, { animation: { duration: 220 } })
52
51
  } else {
53
52
  this.editor.zoomIn(point, { animation: { duration: 220 } })
54
53
  }
55
54
  } else {
56
- const targetZoom = this.editor.inputs.altKey ? this.editor.getZoomLevel() / 2 : undefined
55
+ const targetZoom = this.editor.inputs.getAltKey() ? this.editor.getZoomLevel() / 2 : undefined
57
56
  this.editor.zoomToBounds(zoomBrush, { targetZoom, animation: { duration: 220 } })
58
57
  }
59
58
 
@@ -6,9 +6,7 @@ export function getHitShapeOnCanvasPointerDown(
6
6
  hitLabels = false
7
7
  ): TLShape | undefined {
8
8
  const zoomLevel = editor.getZoomLevel()
9
- const {
10
- inputs: { currentPagePoint },
11
- } = editor
9
+ const currentPagePoint = editor.inputs.getCurrentPagePoint()
12
10
 
13
11
  return (
14
12
  // hovered shape at point
@@ -5,7 +5,7 @@ export function selectOnCanvasPointerUp(
5
5
  info: TLPointerEventInfo | TLClickEventInfo
6
6
  ) {
7
7
  const selectedShapeIds = editor.getSelectedShapeIds()
8
- const { currentPagePoint } = editor.inputs
8
+ const currentPagePoint = editor.inputs.getCurrentPagePoint()
9
9
  const { shiftKey, altKey, accelKey } = info
10
10
  const additiveSelectionKey = shiftKey || accelKey
11
11
 
@@ -2,7 +2,7 @@ import { Editor, TLShape, throttle } from '@tldraw/editor'
2
2
 
3
3
  function _updateHoveredShapeId(editor: Editor) {
4
4
  // todo: consider replacing `get hoveredShapeId` with this; it would mean keeping hoveredShapeId in memory rather than in the store and possibly re-computing it more often than necessary
5
- const hitShape = editor.getShapeAtPoint(editor.inputs.currentPagePoint, {
5
+ const hitShape = editor.getShapeAtPoint(editor.inputs.getCurrentPagePoint(), {
6
6
  hitInside: false,
7
7
  hitLabels: false,
8
8
  margin: editor.options.hitTestMargin / editor.getZoomLevel(),
@@ -81,6 +81,11 @@ const TldrawUiInner = React.memo(function TldrawUiInner({
81
81
  // If we ever need want the UI to mount and preserve state, then
82
82
  // we should change this behavior and hide the UI via CSS instead.
83
83
 
84
+ // Keyboard shortcuts and clipboard events should always be mounted,
85
+ // even when the UI is hidden.
86
+ useKeyboardShortcuts()
87
+ useNativeClipboardEvents()
88
+
84
89
  return (
85
90
  <>
86
91
  {children}
@@ -112,8 +117,6 @@ const TldrawUiContent = React.memo(function TldrawUI() {
112
117
  A11y,
113
118
  } = useTldrawUiComponents()
114
119
 
115
- useKeyboardShortcuts()
116
- useNativeClipboardEvents()
117
120
  useEditorEvents()
118
121
 
119
122
  const rIsEditingAnything = useRef(false)
@@ -1,4 +1,3 @@
1
- import { useEditor, useValue } from '@tldraw/editor'
2
1
  import { PORTRAIT_BREAKPOINT } from '../../constants'
3
2
  import { useBreakpoint } from '../../context/breakpoints'
4
3
  import {
@@ -9,6 +8,7 @@ import {
9
8
  useThreeStackableItems,
10
9
  useUnlockedSelectedShapesCount,
11
10
  } from '../../hooks/menu-hooks'
11
+ import { ZoomTo100MenuItem } from '../menu-items'
12
12
  import { TldrawUiMenuActionItem } from '../primitives/menus/TldrawUiMenuActionItem'
13
13
 
14
14
  /** @public @react */
@@ -99,14 +99,6 @@ export function ZoomOrRotateMenuItem() {
99
99
  }
100
100
  /** @public @react */
101
101
 
102
- export function ZoomTo100MenuItem() {
103
- const editor = useEditor()
104
- const isZoomedTo100 = useValue('zoom is 1', () => editor.getZoomLevel() === 1, [editor])
105
-
106
- return <TldrawUiMenuActionItem actionId="zoom-to-100" disabled={isZoomedTo100} />
107
- }
108
- /** @public @react */
109
-
110
102
  export function RotateCCWMenuItem() {
111
103
  const oneSelected = useUnlockedSelectedShapesCount(1)
112
104
  const isInSelectState = useIsInSelectState()
@@ -66,9 +66,7 @@ export const DefaultContextMenu = memo(function DefaultContextMenu({
66
66
  // Weird route: selecting locked shapes on long press
67
67
  if (editor.getInstanceState().isCoarsePointer) {
68
68
  const selectedShapes = editor.getSelectedShapes()
69
- const {
70
- inputs: { currentPagePoint },
71
- } = editor
69
+ const currentPagePoint = editor.inputs.getCurrentPagePoint()
72
70
 
73
71
  // get all of the shapes under the current pointer
74
72
  const shapesAtPoint = editor.getShapesAtPoint(currentPagePoint)
@@ -46,14 +46,14 @@ export const CursorChatBubble = track(function CursorChatBubble() {
46
46
  return chatMessage.trim() ? <NotEditingChatMessage chatMessage={chatMessage} /> : null
47
47
  })
48
48
 
49
- function usePositionBubble(ref: RefObject<HTMLInputElement>) {
49
+ function usePositionBubble(ref: RefObject<HTMLInputElement | null>) {
50
50
  const editor = useEditor()
51
51
 
52
52
  useLayoutEffect(() => {
53
53
  const elm = ref.current
54
54
  if (!elm) return
55
55
 
56
- const { x, y } = editor.inputs.currentScreenPoint
56
+ const { x, y } = editor.inputs.getCurrentScreenPoint()
57
57
  ref.current?.style.setProperty('transform', `translate(${x}px, ${y}px)`)
58
58
 
59
59
  // Positioning the chat bubble
@@ -1,12 +1,5 @@
1
- import {
2
- debugFlags,
3
- track,
4
- useEditor,
5
- usePassThroughWheelEvents,
6
- useValue,
7
- Vec,
8
- } from '@tldraw/editor'
9
- import { memo, useEffect, useRef, useState } from 'react'
1
+ import { debugFlags, track, useEditor, usePassThroughWheelEvents, useValue } from '@tldraw/editor'
2
+ import { memo, useEffect, useRef } from 'react'
10
3
  import { useTldrawUiComponents } from '../context/components'
11
4
 
12
5
  /** @internal */
@@ -25,42 +18,10 @@ export const DefaultDebugPanel = memo(function DefaultDebugPanel() {
25
18
  )
26
19
  })
27
20
 
28
- function useTick(isEnabled = true) {
29
- const [_, setTick] = useState(0)
30
- const editor = useEditor()
31
- useEffect(() => {
32
- if (!isEnabled) return
33
- const update = () => setTick((tick) => tick + 1)
34
- editor.on('tick', update)
35
- return () => {
36
- editor.off('tick', update)
37
- }
38
- }, [editor, isEnabled])
39
- }
40
-
41
21
  const CurrentState = track(function CurrentState() {
42
- useTick()
43
-
44
22
  const editor = useEditor()
45
-
46
23
  const path = editor.getPath()
47
- const hoverShape = editor.getHoveredShape()
48
- const selectedShape = editor.getOnlySelectedShape()
49
- const shape = path === 'select.idle' || !path.includes('select.') ? hoverShape : selectedShape
50
- const shapeInfo =
51
- shape && path.includes('select.')
52
- ? ` / ${shape.type || ''}${
53
- 'geo' in shape.props ? ' / ' + shape.props.geo : ''
54
- } / [${Vec.ToInt(editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint))}]`
55
- : ''
56
- const ruler =
57
- path.startsWith('select.') && !path.includes('.idle')
58
- ? ` / [${Vec.ToInt(editor.inputs.originPagePoint)}] → [${Vec.ToInt(
59
- editor.inputs.currentPagePoint
60
- )}] = ${Vec.Dist(editor.inputs.originPagePoint, editor.inputs.currentPagePoint).toFixed(0)}`
61
- : ''
62
-
63
- return <div className="tlui-debug-panel__current-state">{`${path}${shapeInfo}${ruler}`}</div>
24
+ return <div className="tlui-debug-panel__current-state">{`${path}`}</div>
64
25
  })
65
26
 
66
27
  function FPS() {
@@ -1,6 +1,6 @@
1
1
  import { useEditor, useValue } from '@tldraw/editor'
2
2
  import { useActions } from '../../context/actions'
3
- import { TldrawUiMenuItem } from '../primitives/menus/TldrawUiMenuItem'
3
+ import { TldrawUiMenuItem, type TLUiMenuItemProps } from '../primitives/menus/TldrawUiMenuItem'
4
4
 
5
5
  export function StopFollowing() {
6
6
  const editor = useEditor()
@@ -13,5 +13,5 @@ export function StopFollowing() {
13
13
  )
14
14
  if (!followingUser) return null
15
15
 
16
- return <TldrawUiMenuItem {...actions['stop-following']} />
16
+ return <TldrawUiMenuItem {...(actions['stop-following'] as TLUiMenuItemProps)} />
17
17
  }
@@ -24,7 +24,7 @@ export function DefaultMinimap() {
24
24
  const rCanvas = React.useRef<HTMLCanvasElement>(null!)
25
25
  const rPointing = React.useRef(false)
26
26
 
27
- const minimapRef = React.useRef<MinimapManager>()
27
+ const minimapRef = React.useRef<MinimapManager | undefined>(undefined)
28
28
 
29
29
  React.useEffect(() => {
30
30
  try {
@@ -1,15 +1,16 @@
1
- import classNames from 'classnames'
2
1
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
3
2
  import { TldrawUiIcon } from '../primitives/TldrawUiIcon'
3
+ import { TldrawUiTooltip } from '../primitives/TldrawUiTooltip'
4
4
 
5
5
  /** @public @react */
6
6
  export function OfflineIndicator() {
7
7
  const msg = useTranslation()
8
8
 
9
9
  return (
10
- <div className={classNames('tlui-offline-indicator')}>
11
- {msg('status.offline')}
12
- <TldrawUiIcon label={msg('status.offline')} icon="status-offline" small />
13
- </div>
10
+ <TldrawUiTooltip content={msg('status.offline')}>
11
+ <div className="tlui-offline-indicator">
12
+ <TldrawUiIcon icon="status-offline" label={msg('status.offline')} small />
13
+ </div>
14
+ </TldrawUiTooltip>
14
15
  )
15
16
  }
@@ -48,7 +48,9 @@ export const PageItemInput = function PageItemInput({
48
48
  return (
49
49
  <TldrawUiInput
50
50
  className="tlui-page-menu__item__input"
51
- ref={(el) => (rInput.current = el)}
51
+ ref={(el) => {
52
+ rInput.current = el
53
+ }}
52
54
  defaultValue={name}
53
55
  onValueChange={handleChange}
54
56
  onComplete={onComplete}
@@ -3,8 +3,10 @@ import { Popover as _Popover } from 'radix-ui'
3
3
  import { ReactNode } from 'react'
4
4
  import { PORTRAIT_BREAKPOINT } from '../../constants'
5
5
  import { useBreakpoint } from '../../context/breakpoints'
6
+ import { useCollaborationStatus } from '../../hooks/useCollaborationStatus'
6
7
  import { useMenuIsOpen } from '../../hooks/useMenuIsOpen'
7
8
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
9
+ import { OfflineIndicator } from '../OfflineIndicator/OfflineIndicator'
8
10
  import { PeopleMenuAvatar } from './PeopleMenuAvatar'
9
11
  import { PeopleMenuItem } from './PeopleMenuItem'
10
12
  import { PeopleMenuMore } from './PeopleMenuMore'
@@ -30,6 +32,12 @@ export function PeopleMenu({ children }: PeopleMenuProps) {
30
32
  const breakpoint = useBreakpoint()
31
33
  const maxAvatars = breakpoint <= PORTRAIT_BREAKPOINT.MOBILE_XS ? 1 : 5
32
34
 
35
+ const collaborationStatus = useCollaborationStatus()
36
+
37
+ if (collaborationStatus === 'offline') {
38
+ return <OfflineIndicator />
39
+ }
40
+
33
41
  if (!userIds.length) return null
34
42
 
35
43
  return (
@@ -63,7 +63,7 @@ function ContextualToolbarInner({
63
63
  )
64
64
  const camera = useValue('camera', () => editor.getCamera(), [editor])
65
65
  const isInCropTool = useValue('editor path', () => editor.isIn('select.crop.'), [editor])
66
- const previousSelectionBounds = useRef<Box | undefined>()
66
+ const previousSelectionBounds = useRef<Box | undefined>(undefined)
67
67
  const handleManipulatingEnd = useCallback(() => {
68
68
  editor.setCroppingShape(null)
69
69
  editor.setCurrentTool('select.idle')
@@ -38,7 +38,7 @@ function ContextualToolbarInner({
38
38
  }) {
39
39
  const { isEditingLink, onEditLinkStart, onEditLinkClose } = useEditingLinkBehavior(textEditor)
40
40
  const [currentSelection, setCurrentSelection] = useState<Range | null>(null)
41
- const previousSelectionBounds = useRef<Box | undefined>()
41
+ const previousSelectionBounds = useRef<Box | undefined>(undefined)
42
42
  const isMousingDown = useIsMousingDownOnTextEditor(textEditor)
43
43
  const msg = useTranslation()
44
44
 
@@ -3,7 +3,7 @@ import { useBreakpoint } from '../../context/breakpoints'
3
3
 
4
4
  /** @public */
5
5
  export interface CenteredTopPanelContainerProps {
6
- children: ReactNode
6
+ children?: ReactNode
7
7
  maxWidth?: number
8
8
  ignoreRightWidth?: number
9
9
  stylePanelWidth?: number
@@ -182,7 +182,9 @@ export function UnlockAllMenuItem() {
182
182
  /** @public @react */
183
183
  export function ZoomTo100MenuItem() {
184
184
  const editor = useEditor()
185
- const isZoomedTo100 = useValue('zoomed to 100', () => editor.getZoomLevel() === 1, [editor])
185
+ const isZoomedTo100 = useValue('zoomed to 100', () => editor.getEfficientZoomLevel() === 1, [
186
+ editor,
187
+ ])
186
188
 
187
189
  return <TldrawUiMenuActionItem actionId="zoom-to-100" noClose disabled={isZoomedTo100} />
188
190
  }
@@ -52,8 +52,8 @@ export const TldrawUiContextualToolbar = ({
52
52
  const editor = useEditor()
53
53
  const toolbarRef = useRef<HTMLDivElement>(null)
54
54
 
55
- usePassThroughWheelEvents(toolbarRef as RefObject<HTMLDivElement>)
56
- usePassThroughMouseOverEvents(toolbarRef as RefObject<HTMLDivElement>)
55
+ usePassThroughWheelEvents(toolbarRef as RefObject<HTMLDivElement | null>)
56
+ usePassThroughMouseOverEvents(toolbarRef as RefObject<HTMLDivElement | null>)
57
57
 
58
58
  const { isVisible, isInteractive, hide, show, position, move } =
59
59
  useToolbarVisibilityStateMachine(changeOnlyWhenYChanges)
@@ -105,7 +105,9 @@ export const TldrawUiContextualToolbar = ({
105
105
  // to have the last updated position in page space, so that we could convert
106
106
  // it to screen space and update it here
107
107
  const elm = toolbarRef.current
108
- elm.style.setProperty('transform', `translate(${position.x}px, ${position.y}px)`)
108
+ if (elm) {
109
+ elm.style.setProperty('transform', `translate(${position.x}px, ${position.y}px)`)
110
+ }
109
111
  } else {
110
112
  const moveImmediately = lastContentSizeUpdateCounter !== nextContentSizeUpdateCounter
111
113
  // Schedule a move to its next location
@@ -410,8 +410,15 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
410
410
  const child = React.Children.only(children)
411
411
  assert(React.isValidElement(child), 'TldrawUiTooltip children must be a single element')
412
412
 
413
+ const childElement = child as React.ReactElement<{
414
+ onMouseEnter?(event: React.MouseEvent<HTMLElement>): void
415
+ onMouseLeave?(event: React.MouseEvent<HTMLElement>): void
416
+ onFocus?(event: React.FocusEvent<HTMLElement>): void
417
+ onBlur?(event: React.FocusEvent<HTMLElement>): void
418
+ }>
419
+
413
420
  const handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {
414
- child.props.onMouseEnter?.(event)
421
+ childElement.props.onMouseEnter?.(event)
415
422
  tooltipManager.handleEvent({
416
423
  type: 'show',
417
424
  tooltip: {
@@ -427,7 +434,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
427
434
  }
428
435
 
429
436
  const handleMouseLeave = (event: React.MouseEvent<HTMLElement>) => {
430
- child.props.onMouseLeave?.(event)
437
+ childElement.props.onMouseLeave?.(event)
431
438
  tooltipManager.handleEvent({
432
439
  type: 'hide',
433
440
  tooltipId: tooltipId.current,
@@ -437,7 +444,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
437
444
  }
438
445
 
439
446
  const handleFocus = (event: React.FocusEvent<HTMLElement>) => {
440
- child.props.onFocus?.(event)
447
+ childElement.props.onFocus?.(event)
441
448
  tooltipManager.handleEvent({
442
449
  type: 'show',
443
450
  tooltip: {
@@ -453,7 +460,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
453
460
  }
454
461
 
455
462
  const handleBlur = (event: React.FocusEvent<HTMLElement>) => {
456
- child.props.onBlur?.(event)
463
+ childElement.props.onBlur?.(event)
457
464
  tooltipManager.handleEvent({
458
465
  type: 'hide',
459
466
  tooltipId: tooltipId.current,
@@ -462,7 +469,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
462
469
  })
463
470
  }
464
471
 
465
- const childrenWithHandlers = React.cloneElement(children as React.ReactElement, {
472
+ const childrenWithHandlers = React.cloneElement(childElement, {
466
473
  onMouseEnter: handleMouseEnter,
467
474
  onMouseLeave: handleMouseLeave,
468
475
  onFocus: handleFocus,
@@ -17,5 +17,5 @@ export function TldrawUiMenuActionCheckboxItem({
17
17
  const actions = useActions()
18
18
  const action = actions[actionId]
19
19
  if (!action) return null
20
- return <TldrawUiMenuCheckboxItem {...action} {...rest} />
20
+ return <TldrawUiMenuCheckboxItem {...(action as TLUiMenuCheckboxItemProps)} {...rest} />
21
21
  }
@@ -11,5 +11,5 @@ export function TldrawUiMenuActionItem({ actionId = '', ...rest }: TLUiMenuActio
11
11
  const actions = useActions()
12
12
  const action = actions[actionId]
13
13
  if (!action) return null
14
- return <TldrawUiMenuItem {...action} {...rest} />
14
+ return <TldrawUiMenuItem {...(action as TLUiMenuItemProps)} {...rest} />
15
15
  }
@@ -134,7 +134,6 @@ export function TldrawUiMenuItem<
134
134
  {iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}
135
135
  <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>
136
136
  {kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}
137
- {icon && <TldrawUiButtonIcon icon={icon} small />}
138
137
  </TldrawUiButton>
139
138
  </TldrawUiDropdownMenuItem>
140
139
  )
@@ -375,7 +375,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
375
375
  if (editor.root.getCurrent()?.id === 'zoom') return
376
376
 
377
377
  trackEvent('zoom-tool', { source })
378
- if (!(editor.inputs.shiftKey || editor.inputs.ctrlKey)) {
378
+ if (!(editor.inputs.getShiftKey() || editor.inputs.getCtrlKey())) {
379
379
  const currentTool = editor.root.getCurrent()
380
380
  if (currentTool && currentTool.getCurrent()?.id === 'idle') {
381
381
  editor.setCurrentTool('zoom', { onInteractionEnd: currentTool.id, maskAs: 'zoom' })
@@ -973,7 +973,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
973
973
  helpers.paste(
974
974
  clipboardItems,
975
975
  source,
976
- source === 'context-menu' ? editor.inputs.currentPagePoint : undefined
976
+ source === 'context-menu' ? editor.inputs.getCurrentPagePoint() : undefined
977
977
  )
978
978
  })
979
979
  .catch(() => {
@@ -1037,7 +1037,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1037
1037
  if (!canApplySelectionAction()) return
1038
1038
  if (mustGoBackToSelectToolFirst()) return
1039
1039
 
1040
- const isFine = editor.inputs.altKey
1040
+ const isFine = editor.inputs.getAltKey()
1041
1041
  trackEvent('rotate-cw', { source, fine: isFine })
1042
1042
  editor.markHistoryStoppingPoint('rotate-cw')
1043
1043
  editor.run(() => {
@@ -1060,7 +1060,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1060
1060
  if (!canApplySelectionAction()) return
1061
1061
  if (mustGoBackToSelectToolFirst()) return
1062
1062
 
1063
- const isFine = editor.inputs.altKey
1063
+ const isFine = editor.inputs.getAltKey()
1064
1064
  trackEvent('rotate-ccw', { source, fine: isFine })
1065
1065
  editor.markHistoryStoppingPoint('rotate-ccw')
1066
1066
  editor.run(() => {
@@ -1092,7 +1092,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1092
1092
  readonlyOk: true,
1093
1093
  onSelect(source) {
1094
1094
  trackEvent('zoom-in', { source, towardsCursor: true })
1095
- editor.zoomIn(editor.inputs.currentScreenPoint, {
1095
+ editor.zoomIn(editor.inputs.getCurrentScreenPoint(), {
1096
1096
  animation: { duration: editor.options.animationMediumMs },
1097
1097
  })
1098
1098
  },
@@ -1116,7 +1116,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1116
1116
  readonlyOk: true,
1117
1117
  onSelect(source) {
1118
1118
  trackEvent('zoom-out', { source, towardsCursor: true })
1119
- editor.zoomOut(editor.inputs.currentScreenPoint, {
1119
+ editor.zoomOut(editor.inputs.getCurrentScreenPoint(), {
1120
1120
  animation: { duration: editor.options.animationMediumMs },
1121
1121
  })
1122
1122
  },
@@ -42,7 +42,6 @@ import {
42
42
  } from '../components/Toolbar/DefaultRichTextToolbar'
43
43
  import { DefaultToolbar } from '../components/Toolbar/DefaultToolbar'
44
44
  import { DefaultVideoToolbar } from '../components/Toolbar/DefaultVideoToolbar'
45
- import { DefaultTopPanel } from '../components/TopPanel/DefaultTopPanel'
46
45
  import { DefaultZoomMenu, TLUiZoomMenuProps } from '../components/ZoomMenu/DefaultZoomMenu'
47
46
  import { useShowCollaborationUi } from '../hooks/useCollaborationStatus'
48
47
 
@@ -117,7 +116,7 @@ export function TldrawUiComponentsProvider({
117
116
  MenuPanel: DefaultMenuPanel,
118
117
  SharePanel: showCollaborationUi ? DefaultSharePanel : null,
119
118
  CursorChatBubble: showCollaborationUi ? CursorChatBubble : null,
120
- TopPanel: showCollaborationUi ? DefaultTopPanel : null,
119
+ TopPanel: null,
121
120
  Dialogs: DefaultDialogs,
122
121
  Toasts: DefaultToasts,
123
122
  A11y: DefaultA11yAnnouncer,
@@ -783,9 +783,9 @@ export function useNativeClipboardEvents() {
783
783
  // | Y | N | Y |
784
784
  // | N | Y | Y |
785
785
  // | Y | Y | N |
786
- if (editor.inputs.shiftKey) pasteAtCursor = true
786
+ if (editor.inputs.getShiftKey()) pasteAtCursor = true
787
787
  if (editor.user.getIsPasteAtCursorMode()) pasteAtCursor = !pasteAtCursor
788
- if (pasteAtCursor) point = editor.inputs.currentPagePoint
788
+ if (pasteAtCursor) point = editor.inputs.getCurrentPagePoint()
789
789
 
790
790
  const pasteFromEvent = () => {
791
791
  if (e.clipboardData) {
@@ -93,7 +93,7 @@ export function useKeyboardShortcuts() {
93
93
 
94
94
  editor.inputs.keys.add('Comma')
95
95
 
96
- const { x, y, z } = editor.inputs.currentPagePoint
96
+ const { x, y, z } = editor.inputs.getCurrentPagePoint()
97
97
  const screenpoints = editor.pageToScreen({ x, y })
98
98
 
99
99
  const info: TLPointerEventInfo = {
@@ -120,7 +120,7 @@ export function useKeyboardShortcuts() {
120
120
 
121
121
  editor.inputs.keys.delete('Comma')
122
122
 
123
- const { x, y, z } = editor.inputs.currentScreenPoint
123
+ const { x, y, z } = editor.inputs.getCurrentScreenPoint()
124
124
  const info: TLPointerEventInfo = {
125
125
  type: 'pointer',
126
126
  name: 'pointer_up',