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
@@ -16,7 +16,9 @@ export class PointingShape extends StateNode {
16
16
  const selectedShapeIds = this.editor.getSelectedShapeIds()
17
17
  const selectionBounds = this.editor.getSelectionRotatedPageBounds()
18
18
  const focusedGroupId = this.editor.getFocusedGroupId()
19
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
19
+ const {
20
+ inputs: { currentPagePoint },
21
+ } = this.editor
20
22
  const { shiftKey, altKey, accelKey } = info
21
23
 
22
24
  this.hitShape = info.shape
@@ -64,7 +66,9 @@ export class PointingShape extends StateNode {
64
66
  const selectedShapeIds = this.editor.getSelectedShapeIds()
65
67
  const focusedGroupId = this.editor.getFocusedGroupId()
66
68
  const zoomLevel = this.editor.getZoomLevel()
67
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
69
+ const {
70
+ inputs: { currentPagePoint },
71
+ } = this.editor
68
72
 
69
73
  const additiveSelectionKey = info.shiftKey || info.accelKey
70
74
 
@@ -149,7 +153,13 @@ export class PointingShape extends StateNode {
149
153
  this.editor.markHistoryStoppingPoint('editing on pointer up')
150
154
  this.editor.select(selectingShape.id)
151
155
 
152
- if (!this.editor.canEditShape(selectingShape)) return
156
+ const util = this.editor.getShapeUtil(selectingShape)
157
+ if (this.editor.getIsReadonly()) {
158
+ if (!util.canEditInReadonly(selectingShape)) {
159
+ return
160
+ }
161
+ }
162
+
153
163
  this.editor.setEditingShape(selectingShape.id)
154
164
  this.editor.setCurrentTool('select.editing_shape')
155
165
 
@@ -200,7 +210,7 @@ export class PointingShape extends StateNode {
200
210
  }
201
211
 
202
212
  override onPointerMove(info: TLPointerEventInfo) {
203
- if (this.editor.inputs.getIsDragging()) {
213
+ if (this.editor.inputs.isDragging) {
204
214
  if (isOverArrowLabel(this.editor, this.hitShape)) {
205
215
  // We're moving the label on a shape.
206
216
  this.parent.transition('pointing_arrow_label', { ...info, shape: this.hitShape })
@@ -7,10 +7,12 @@ import {
7
7
  SelectionCorner,
8
8
  SelectionEdge,
9
9
  StateNode,
10
+ TLFrameShape,
10
11
  TLPointerEventInfo,
11
12
  TLShape,
12
13
  TLShapeId,
13
14
  TLShapePartial,
15
+ TLTextShape,
14
16
  TLTickEventInfo,
15
17
  Vec,
16
18
  VecLike,
@@ -211,8 +213,7 @@ export class Resizing extends StateNode {
211
213
  }
212
214
 
213
215
  private updateShapes() {
214
- const altKey = this.editor.inputs.getAltKey()
215
- const shiftKey = this.editor.inputs.getShiftKey()
216
+ const { altKey, shiftKey } = this.editor.inputs
216
217
  const {
217
218
  frames,
218
219
  shapeSnapshots,
@@ -227,7 +228,7 @@ export class Resizing extends StateNode {
227
228
 
228
229
  if (shapeSnapshots.size === 1) {
229
230
  const onlySnapshot = [...shapeSnapshots.values()][0]!
230
- if (this.editor.isShapeOfType(onlySnapshot.shape, 'text')) {
231
+ if (this.editor.isShapeOfType<TLTextShape>(onlySnapshot.shape, 'text')) {
231
232
  isAspectRatioLocked = !(this.info.handle === 'left' || this.info.handle === 'right')
232
233
  }
233
234
  }
@@ -267,13 +268,12 @@ export class Resizing extends StateNode {
267
268
 
268
269
  const isHoldingAccel = isAccelKey(this.editor.inputs)
269
270
 
270
- const currentPagePoint = this.editor.inputs
271
- .getCurrentPagePoint()
271
+ const currentPagePoint = this.editor.inputs.currentPagePoint
272
272
  .clone()
273
273
  .sub(cursorHandleOffset)
274
274
  .sub(this.creationCursorOffset)
275
275
 
276
- const originPagePoint = this.editor.inputs.getOriginPagePoint().clone().sub(cursorHandleOffset)
276
+ const originPagePoint = this.editor.inputs.originPagePoint.clone().sub(cursorHandleOffset)
277
277
 
278
278
  if (this.editor.getInstanceState().isGridMode && !isHoldingAccel) {
279
279
  const { gridSize } = this.editor.getDocumentSettings()
@@ -476,7 +476,9 @@ export class Resizing extends StateNode {
476
476
  const { editor } = this
477
477
  const selectedShapeIds = editor.getSelectedShapeIds()
478
478
  const selectionRotation = editor.getSelectionRotation()
479
- const originPagePoint = editor.inputs.getOriginPagePoint()
479
+ const {
480
+ inputs: { originPagePoint },
481
+ } = editor
480
482
 
481
483
  const selectionBounds = editor.getSelectionRotatedPageBounds()
482
484
  if (!selectionBounds) throw Error('Resizing but nothing is selected')
@@ -526,7 +528,7 @@ export class Resizing extends StateNode {
526
528
  // descendants (easy) but also flagging with behavior like "resize" or "keep absolute position" or "reposition only with accel key",
527
529
  // though I'm not sure where that would be defined; perhaps better handled with onResizeStart / onResize callbacks on the util, and
528
530
  // pass `accelKeyIsPressed` as well as `accelKeyWasPressed`?
529
- if (editor.isShapeOfType(shape, 'frame')) {
531
+ if (editor.isShapeOfType<TLFrameShape>(shape, 'frame')) {
530
532
  frames.push({
531
533
  id: shape.id,
532
534
  children: compact(
@@ -163,8 +163,9 @@ export class Rotating extends StateNode {
163
163
  }
164
164
 
165
165
  _getRotationFromPointerPosition({ snapToNearestDegree }: { snapToNearestDegree: boolean }) {
166
- const shiftKey = this.editor.inputs.getShiftKey()
167
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
166
+ const {
167
+ inputs: { shiftKey, currentPagePoint },
168
+ } = this.editor
168
169
  const { initialCursorAngle, initialShapesRotation, initialPageCenter } = this.snapshot
169
170
 
170
171
  // The delta is the difference between the current angle and the initial angle
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  Geometry2d,
3
3
  StateNode,
4
+ TLFrameShape,
5
+ TLGroupShape,
4
6
  TLShape,
5
7
  TLShapeId,
6
8
  Vec,
@@ -22,7 +24,7 @@ export class ScribbleBrushing extends StateNode {
22
24
 
23
25
  override onEnter() {
24
26
  this.initialSelectedShapeIds = new Set<TLShapeId>(
25
- this.editor.inputs.getShiftKey() ? this.editor.getSelectedShapeIds() : []
27
+ this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []
26
28
  )
27
29
  this.newlySelectedShapeIds = new Set<TLShapeId>()
28
30
  this.size = 0
@@ -58,7 +60,7 @@ export class ScribbleBrushing extends StateNode {
58
60
  }
59
61
 
60
62
  override onKeyUp() {
61
- if (!this.editor.inputs.getAltKey()) {
63
+ if (!this.editor.inputs.altKey) {
62
64
  this.parent.transition('brushing')
63
65
  } else {
64
66
  this.updateScribbleSelection(false)
@@ -74,7 +76,7 @@ export class ScribbleBrushing extends StateNode {
74
76
  }
75
77
 
76
78
  private pushPointToScribble() {
77
- const { x, y } = this.editor.inputs.getCurrentPagePoint()
79
+ const { x, y } = this.editor.inputs.currentPagePoint
78
80
  this.editor.scribbles.addPoint(this.scribbleId, x, y)
79
81
  }
80
82
 
@@ -82,10 +84,9 @@ export class ScribbleBrushing extends StateNode {
82
84
  const { editor } = this
83
85
  // const zoomLevel = this.editor.getZoomLevel()
84
86
  const currentPageShapes = this.editor.getCurrentPageRenderingShapesSorted()
85
- const shiftKey = this.editor.inputs.getShiftKey()
86
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
87
- const previousPagePoint = this.editor.inputs.getPreviousPagePoint()
88
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
87
+ const {
88
+ inputs: { shiftKey, originPagePoint, previousPagePoint, currentPagePoint },
89
+ } = this.editor
89
90
 
90
91
  const { newlySelectedShapeIds, initialSelectedShapeIds } = this
91
92
 
@@ -103,7 +104,7 @@ export class ScribbleBrushing extends StateNode {
103
104
 
104
105
  // If the shape is a group or is already selected or locked, don't select it
105
106
  if (
106
- editor.isShapeOfType(shape, 'group') ||
107
+ editor.isShapeOfType<TLGroupShape>(shape, 'group') ||
107
108
  newlySelectedShapeIds.has(shape.id) ||
108
109
  editor.isShapeOrAncestorLocked(shape)
109
110
  ) {
@@ -114,7 +115,7 @@ export class ScribbleBrushing extends StateNode {
114
115
 
115
116
  // If the scribble started inside of the frame, don't select it
116
117
  if (
117
- editor.isShapeOfType(shape, 'frame') &&
118
+ editor.isShapeOfType<TLFrameShape>(shape, 'frame') &&
118
119
  geometry.bounds.containsPoint(editor.getPointInShapeSpace(shape, originPagePoint))
119
120
  ) {
120
121
  continue
@@ -92,7 +92,7 @@ export class Translating extends StateNode {
92
92
 
93
93
  // Don't clone on create; otherwise clone on altKey
94
94
  if (!this.isCreating) {
95
- if (this.editor.inputs.getAltKey()) {
95
+ if (this.editor.inputs.altKey) {
96
96
  this.startCloning()
97
97
  if (this.isCloning) return
98
98
  }
@@ -122,7 +122,7 @@ export class Translating extends StateNode {
122
122
  }
123
123
 
124
124
  override onKeyDown() {
125
- if (this.editor.inputs.getAltKey() && !this.isCloning) {
125
+ if (this.editor.inputs.altKey && !this.isCloning) {
126
126
  this.startCloning()
127
127
  if (this.isCloning) return
128
128
  }
@@ -132,7 +132,7 @@ export class Translating extends StateNode {
132
132
  }
133
133
 
134
134
  override onKeyUp() {
135
- if (!this.editor.inputs.getAltKey() && this.isCloning) {
135
+ if (!this.editor.inputs.altKey && this.isCloning) {
136
136
  this.stopCloning()
137
137
  return
138
138
  }
@@ -258,7 +258,7 @@ export class Translating extends StateNode {
258
258
  // Get fresh shapes from the snapshot, in case onTranslateStart mutates the shape
259
259
  compact(this.snapshot.movingShapes.map((s) => this.editor.getShape(s.id))),
260
260
  // Start from the place where the user started dragging
261
- this.editor.inputs.getOriginPagePoint(),
261
+ this.editor.inputs.originPagePoint,
262
262
  this.updateParentTransforms
263
263
  )
264
264
 
@@ -305,7 +305,7 @@ export class Translating extends StateNode {
305
305
  // We should have started already, but hey
306
306
  this.dragAndDropManager.startDraggingShapes(
307
307
  snapshot.movingShapes,
308
- this.editor.inputs.getOriginPagePoint(),
308
+ this.editor.inputs.originPagePoint,
309
309
  this.updateParentTransforms
310
310
  )
311
311
 
@@ -404,10 +404,12 @@ function getTranslatingSnapshot(editor: Editor) {
404
404
  let noteAdjacentPositions: Vec[] | undefined
405
405
  let noteSnapshot: (MovingShapeSnapshot & { shape: TLNoteShape }) | undefined
406
406
 
407
- const originPagePoint = editor.inputs.getOriginPagePoint()
407
+ const { originPagePoint } = editor.inputs
408
408
 
409
409
  const allHoveredNotes = shapeSnapshots.filter(
410
- (s) => editor.isShapeOfType(s.shape, 'note') && editor.isPointInShape(s.shape, originPagePoint)
410
+ (s) =>
411
+ editor.isShapeOfType<TLNoteShape>(s.shape, 'note') &&
412
+ editor.isPointInShape(s.shape, originPagePoint)
411
413
  ) as (MovingShapeSnapshot & { shape: TLNoteShape })[]
412
414
 
413
415
  if (allHoveredNotes.length === 0) {
@@ -473,16 +475,13 @@ export function moveShapesToPoint({
473
475
  averagePagePoint,
474
476
  } = snapshot
475
477
 
476
- const shiftKey = editor.inputs.getShiftKey()
477
- const accelKey = editor.inputs.getAccelKey()
478
-
479
478
  const isGridMode = editor.getInstanceState().isGridMode
480
479
 
481
480
  const gridSize = editor.getDocumentSettings().gridSize
482
481
 
483
- const delta = Vec.Sub(inputs.getCurrentPagePoint(), inputs.getOriginPagePoint())
482
+ const delta = Vec.Sub(inputs.currentPagePoint, inputs.originPagePoint)
484
483
 
485
- const flatten: 'x' | 'y' | null = shiftKey
484
+ const flatten: 'x' | 'y' | null = editor.inputs.shiftKey
486
485
  ? Math.abs(delta.x) < Math.abs(delta.y)
487
486
  ? 'x'
488
487
  : 'y'
@@ -498,9 +497,9 @@ export function moveShapesToPoint({
498
497
  editor.snaps.clearIndicators()
499
498
 
500
499
  // If the user isn't moving super quick
501
- const isSnapping = editor.user.getIsSnapMode() ? !accelKey : accelKey
500
+ const isSnapping = editor.user.getIsSnapMode() ? !inputs.ctrlKey : inputs.ctrlKey
502
501
  let snappedToPit = false
503
- if (isSnapping && editor.inputs.getPointerVelocity().len() < 0.5) {
502
+ if (isSnapping && editor.inputs.pointerVelocity.len() < 0.5) {
504
503
  // snapping
505
504
  const { nudge } = editor.snaps.shapeBounds.snapTranslateShapes({
506
505
  dragDelta: delta,
@@ -540,9 +539,9 @@ export function moveShapesToPoint({
540
539
 
541
540
  const averageSnappedPoint = Vec.Add(averagePagePoint, delta)
542
541
 
543
- // we don't want to snap to the grid if we're holding the accel key, if we've already snapped into a pit, or if we're showing snapping indicators
542
+ // we don't want to snap to the grid if we're holding the ctrl key, if we've already snapped into a pit, or if we're showing snapping indicators
544
543
  const snapIndicators = editor.snaps.getIndicators()
545
- if (isGridMode && !accelKey && !snappedToPit && snapIndicators.length === 0) {
544
+ if (isGridMode && !inputs.ctrlKey && !snappedToPit && snapIndicators.length === 0) {
546
545
  averageSnappedPoint.snapToGrid(gridSize)
547
546
  }
548
547
 
@@ -1,50 +1,15 @@
1
- import {
2
- Editor,
3
- ExtractShapeByProps,
4
- richTextValidator,
5
- TLEventInfo,
6
- TLRichText,
7
- TLShape,
8
- TLShapeId,
9
- } from '@tldraw/editor'
1
+ import { Editor, TLShape } from '@tldraw/editor'
10
2
 
11
3
  /** @internal */
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
- }
4
+ export function startEditingShapeWithLabel(editor: Editor, shape: TLShape, selectAll = false) {
40
5
  // Finish this shape and start editing the next one
6
+ editor.select(shape)
41
7
  editor.setEditingShape(shape)
42
8
  editor.setCurrentTool('select.editing_shape', {
43
- ...options.info,
44
9
  target: 'shape',
45
10
  shape: shape,
46
11
  })
47
- if (options.selectAll) {
12
+ if (selectAll) {
48
13
  editor.emit('select-all-text', { shapeId: shape.id })
49
14
  }
50
15
  }
@@ -57,7 +57,7 @@ export class ZoomTool extends StateNode {
57
57
  }
58
58
 
59
59
  private updateCursor() {
60
- if (this.editor.inputs.getAltKey()) {
60
+ if (this.editor.inputs.altKey) {
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.getIsDragging()) {
17
+ if (this.editor.inputs.isDragging) {
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.getCurrentScreenPoint()
28
- if (this.editor.inputs.getAltKey()) {
27
+ const { currentScreenPoint } = this.editor.inputs
28
+ if (this.editor.inputs.altKey) {
29
29
  this.editor.zoomOut(currentScreenPoint, { animation: { duration: 220 } })
30
30
  } else {
31
31
  this.editor.zoomIn(currentScreenPoint, { animation: { duration: 220 } })
@@ -29,8 +29,9 @@ export class ZoomBrushing extends StateNode {
29
29
  }
30
30
 
31
31
  private update() {
32
- const originPagePoint = this.editor.inputs.getOriginPagePoint()
33
- const currentPagePoint = this.editor.inputs.getCurrentPagePoint()
32
+ const {
33
+ inputs: { originPagePoint, currentPagePoint },
34
+ } = this.editor
34
35
 
35
36
  this.zoomBrush.setTo(Box.FromPoints([originPagePoint, currentPagePoint]))
36
37
  this.editor.updateInstanceState({ zoomBrush: this.zoomBrush.toJson() })
@@ -45,14 +46,14 @@ export class ZoomBrushing extends StateNode {
45
46
  const threshold = 8 / this.editor.getZoomLevel()
46
47
  // If the selected area is small then treat it as a click
47
48
  if (zoomBrush.width < threshold && zoomBrush.height < threshold) {
48
- const point = this.editor.inputs.getCurrentScreenPoint()
49
- if (this.editor.inputs.getAltKey()) {
49
+ const point = this.editor.inputs.currentScreenPoint
50
+ if (this.editor.inputs.altKey) {
50
51
  this.editor.zoomOut(point, { animation: { duration: 220 } })
51
52
  } else {
52
53
  this.editor.zoomIn(point, { animation: { duration: 220 } })
53
54
  }
54
55
  } else {
55
- const targetZoom = this.editor.inputs.getAltKey() ? this.editor.getZoomLevel() / 2 : undefined
56
+ const targetZoom = this.editor.inputs.altKey ? this.editor.getZoomLevel() / 2 : undefined
56
57
  this.editor.zoomToBounds(zoomBrush, { targetZoom, animation: { duration: 220 } })
57
58
  }
58
59
 
@@ -6,7 +6,9 @@ export function getHitShapeOnCanvasPointerDown(
6
6
  hitLabels = false
7
7
  ): TLShape | undefined {
8
8
  const zoomLevel = editor.getZoomLevel()
9
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
9
+ const {
10
+ inputs: { currentPagePoint },
11
+ } = editor
10
12
 
11
13
  return (
12
14
  // hovered shape at point
@@ -0,0 +1,10 @@
1
+ import { Editor } from '@tldraw/editor'
2
+
3
+ export function getShouldEnterCropMode(editor: Editor): boolean {
4
+ const onlySelectedShape = editor.getOnlySelectedShape()
5
+ return !!(
6
+ onlySelectedShape &&
7
+ !editor.isShapeOrAncestorLocked(onlySelectedShape) &&
8
+ editor.getShapeUtil(onlySelectedShape).canCrop(onlySelectedShape)
9
+ )
10
+ }
@@ -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.getCurrentPagePoint()
8
+ const { currentPagePoint } = editor.inputs
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.getCurrentPagePoint(), {
5
+ const hitShape = editor.getShapeAtPoint(editor.inputs.currentPagePoint, {
6
6
  hitInside: false,
7
7
  hitLabels: false,
8
8
  margin: editor.options.hitTestMargin / editor.getZoomLevel(),
@@ -81,11 +81,6 @@ 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
-
89
84
  return (
90
85
  <>
91
86
  {children}
@@ -117,6 +112,8 @@ const TldrawUiContent = React.memo(function TldrawUI() {
117
112
  A11y,
118
113
  } = useTldrawUiComponents()
119
114
 
115
+ useKeyboardShortcuts()
116
+ useNativeClipboardEvents()
120
117
  useEditorEvents()
121
118
 
122
119
  const rIsEditingAnything = useRef(false)
@@ -1,3 +1,4 @@
1
+ import { useEditor, useValue } from '@tldraw/editor'
1
2
  import { PORTRAIT_BREAKPOINT } from '../../constants'
2
3
  import { useBreakpoint } from '../../context/breakpoints'
3
4
  import {
@@ -8,7 +9,6 @@ import {
8
9
  useThreeStackableItems,
9
10
  useUnlockedSelectedShapesCount,
10
11
  } 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,6 +99,14 @@ 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
+
102
110
  export function RotateCCWMenuItem() {
103
111
  const oneSelected = useUnlockedSelectedShapesCount(1)
104
112
  const isInSelectState = useIsInSelectState()
@@ -66,7 +66,9 @@ 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 currentPagePoint = editor.inputs.getCurrentPagePoint()
69
+ const {
70
+ inputs: { currentPagePoint },
71
+ } = editor
70
72
 
71
73
  // get all of the shapes under the current pointer
72
74
  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 | null>) {
49
+ function usePositionBubble(ref: RefObject<HTMLInputElement>) {
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.getCurrentScreenPoint()
56
+ const { x, y } = editor.inputs.currentScreenPoint
57
57
  ref.current?.style.setProperty('transform', `translate(${x}px, ${y}px)`)
58
58
 
59
59
  // Positioning the chat bubble
@@ -1,5 +1,12 @@
1
- import { debugFlags, track, useEditor, usePassThroughWheelEvents, useValue } from '@tldraw/editor'
2
- import { memo, useEffect, useRef } from 'react'
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'
3
10
  import { useTldrawUiComponents } from '../context/components'
4
11
 
5
12
  /** @internal */
@@ -18,10 +25,42 @@ export const DefaultDebugPanel = memo(function DefaultDebugPanel() {
18
25
  )
19
26
  })
20
27
 
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
+
21
41
  const CurrentState = track(function CurrentState() {
42
+ useTick()
43
+
22
44
  const editor = useEditor()
45
+
23
46
  const path = editor.getPath()
24
- return <div className="tlui-debug-panel__current-state">{`${path}`}</div>
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>
25
64
  })
26
65
 
27
66
  function FPS() {
@@ -1,4 +1,4 @@
1
- import { ExtractShapeByProps, T, TLShape, track, useEditor } from '@tldraw/editor'
1
+ import { T, TLBaseShape, track, useEditor } from '@tldraw/editor'
2
2
  import { useCallback, useEffect, useRef, useState } from 'react'
3
3
  import { TLUiDialogProps } from '../context/dialogs'
4
4
  import { useTranslation } from '../hooks/useTranslation/useTranslation'
@@ -25,28 +25,20 @@ function validateUrl(url: string) {
25
25
  return { isValid: false, hasProtocol: false }
26
26
  }
27
27
 
28
- type ShapeWithUrl = ExtractShapeByProps<{ url: string }>
29
-
30
- function isShapeWithUrl(shape: TLShape | null | undefined): shape is ShapeWithUrl {
31
- return !!(shape && 'url' in shape.props && typeof shape.props.url === 'string')
32
- }
33
-
34
- function assertShapeWithUrl(shape: TLShape | null | undefined): asserts shape is ShapeWithUrl {
35
- if (!isShapeWithUrl(shape)) {
36
- throw new Error('Shape is not a valid ShapeWithUrl')
37
- }
38
- }
28
+ type ShapeWithUrl = TLBaseShape<string, { url: string }>
39
29
 
40
30
  export const EditLinkDialog = track(function EditLinkDialog({ onClose }: TLUiDialogProps) {
41
31
  const editor = useEditor()
42
32
 
43
33
  const selectedShape = editor.getOnlySelectedShape()
44
34
 
45
- if (!isShapeWithUrl(selectedShape)) {
35
+ if (
36
+ !(selectedShape && 'url' in selectedShape.props && typeof selectedShape.props.url === 'string')
37
+ ) {
46
38
  return null
47
39
  }
48
40
 
49
- return <EditLinkDialogInner onClose={onClose} selectedShape={selectedShape} />
41
+ return <EditLinkDialogInner onClose={onClose} selectedShape={selectedShape as ShapeWithUrl} />
50
42
  })
51
43
 
52
44
  export const EditLinkDialogInner = track(function EditLinkDialogInner({
@@ -106,7 +98,6 @@ export const EditLinkDialogInner = track(function EditLinkDialogInner({
106
98
  const handleClear = useCallback(() => {
107
99
  const onlySelectedShape = editor.getOnlySelectedShape()
108
100
  if (!onlySelectedShape) return
109
- assertShapeWithUrl(onlySelectedShape)
110
101
  editor.updateShapes([
111
102
  { id: onlySelectedShape.id, type: onlySelectedShape.type, props: { url: '' } },
112
103
  ])
@@ -117,7 +108,6 @@ export const EditLinkDialogInner = track(function EditLinkDialogInner({
117
108
  const onlySelectedShape = editor.getOnlySelectedShape()
118
109
 
119
110
  if (!onlySelectedShape) return
120
- assertShapeWithUrl(onlySelectedShape)
121
111
 
122
112
  // ? URL is a magic value
123
113
  if (onlySelectedShape && 'url' in onlySelectedShape.props) {
@@ -1,6 +1,6 @@
1
1
  import { useEditor, useValue } from '@tldraw/editor'
2
2
  import { useActions } from '../../context/actions'
3
- import { TldrawUiMenuItem, type TLUiMenuItemProps } from '../primitives/menus/TldrawUiMenuItem'
3
+ import { TldrawUiMenuItem } 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'] as TLUiMenuItemProps)} />
16
+ return <TldrawUiMenuItem {...actions['stop-following']} />
17
17
  }