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
@@ -5,6 +5,7 @@ import {
5
5
  Polygon2d,
6
6
  SVGContainer,
7
7
  ShapeUtil,
8
+ TLDrawShapeSegment,
8
9
  TLHighlightShape,
9
10
  TLHighlightShapeProps,
10
11
  TLResizeInfo,
@@ -18,7 +19,7 @@ import {
18
19
  useValue,
19
20
  } from '@tldraw/editor'
20
21
 
21
- import { getHighlightFreehandSettings, getPointsFromDrawSegments } from '../draw/getPath'
22
+ import { getHighlightFreehandSettings, getPointsFromSegments } from '../draw/getPath'
22
23
  import { FONT_SIZES } from '../shared/default-shape-constants'
23
24
  import { getStrokeOutlinePoints } from '../shared/freehand/getStrokeOutlinePoints'
24
25
  import { getStrokePoints } from '../shared/freehand/getStrokePoints'
@@ -69,8 +70,6 @@ export class HighlightShapeUtil extends ShapeUtil<TLHighlightShape> {
69
70
  isComplete: false,
70
71
  isPen: false,
71
72
  scale: 1,
72
- scaleX: 1,
73
- scaleY: 1,
74
73
  }
75
74
  }
76
75
 
@@ -131,11 +130,7 @@ export class HighlightShapeUtil extends ShapeUtil<TLHighlightShape> {
131
130
  const strokeWidth = getStrokeWidth(shape)
132
131
 
133
132
  const { strokePoints, sw } = getHighlightStrokePoints(shape, strokeWidth, forceSolid)
134
- const allPointsFromSegments = getPointsFromDrawSegments(
135
- shape.props.segments,
136
- shape.props.scaleX,
137
- shape.props.scaleY
138
- )
133
+ const allPointsFromSegments = getPointsFromSegments(shape.props.segments)
139
134
 
140
135
  let strokePath
141
136
  if (strokePoints.length < 2) {
@@ -182,10 +177,24 @@ export class HighlightShapeUtil extends ShapeUtil<TLHighlightShape> {
182
177
  override onResize(shape: TLHighlightShape, info: TLResizeInfo<TLHighlightShape>) {
183
178
  const { scaleX, scaleY } = info
184
179
 
180
+ const newSegments: TLDrawShapeSegment[] = []
181
+
182
+ for (const segment of shape.props.segments) {
183
+ newSegments.push({
184
+ ...segment,
185
+ points: segment.points.map(({ x, y, z }) => {
186
+ return {
187
+ x: scaleX * x,
188
+ y: scaleY * y,
189
+ z,
190
+ }
191
+ }),
192
+ })
193
+ }
194
+
185
195
  return {
186
196
  props: {
187
- scaleX: scaleX * shape.props.scaleX,
188
- scaleY: scaleY * shape.props.scaleY,
197
+ segments: newSegments,
189
198
  },
190
199
  }
191
200
  }
@@ -222,11 +231,7 @@ function getHighlightStrokePoints(
222
231
  strokeWidth: number,
223
232
  forceSolid: boolean
224
233
  ) {
225
- const allPointsFromSegments = getPointsFromDrawSegments(
226
- shape.props.segments,
227
- shape.props.scaleX,
228
- shape.props.scaleY
229
- )
234
+ const allPointsFromSegments = getPointsFromSegments(shape.props.segments)
230
235
  const showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'
231
236
 
232
237
  let sw = strokeWidth
@@ -249,9 +254,7 @@ function getStrokeWidth(shape: TLHighlightShape) {
249
254
  }
250
255
 
251
256
  function getIsDot(shape: TLHighlightShape) {
252
- // Each point is 8 base64 characters (3 Float16s = 6 bytes = 8 base64 chars)
253
- // Check if we have less than 2 points without decoding
254
- return shape.props.segments.length === 1 && shape.props.segments[0].points.length < 16
257
+ return shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2
255
258
  }
256
259
 
257
260
  function HighlightRenderer({
@@ -267,11 +270,7 @@ function HighlightRenderer({
267
270
  }) {
268
271
  const theme = useDefaultColorTheme()
269
272
 
270
- const allPointsFromSegments = getPointsFromDrawSegments(
271
- shape.props.segments,
272
- shape.props.scaleX,
273
- shape.props.scaleY
274
- )
273
+ const allPointsFromSegments = getPointsFromSegments(shape.props.segments)
275
274
 
276
275
  let sw = strokeWidth
277
276
  if (!forceSolid && !shape.props.isPen && allPointsFromSegments.length === 1) {
@@ -288,7 +287,7 @@ function HighlightRenderer({
288
287
  const solidStrokePath =
289
288
  strokePoints.length > 1
290
289
  ? getSvgPathFromStrokePoints(strokePoints, false)
291
- : getShapeDot(allPointsFromSegments[0])
290
+ : getShapeDot(shape.props.segments[0].points[0])
292
291
 
293
292
  const colorSpace = useColorSpace()
294
293
 
@@ -316,7 +315,7 @@ function useHighlightForceSolid(editor: Editor, shape: TLHighlightShape) {
316
315
  'forceSolid',
317
316
  () => {
318
317
  const sw = getStrokeWidth(shape)
319
- const zoomLevel = editor.getEfficientZoomLevel()
318
+ const zoomLevel = editor.getZoomLevel()
320
319
  if (sw / zoomLevel < 1.5) {
321
320
  return true
322
321
  }
@@ -1,4 +1,4 @@
1
- import { assert } from '@tldraw/editor'
1
+ import { TLLineShape, assert } from '@tldraw/editor'
2
2
  import { TestEditor } from '../../../test/TestEditor'
3
3
 
4
4
  let editor: TestEditor
@@ -127,7 +127,7 @@ describe('When extending the line with the shift-key in tool-lock mode', () => {
127
127
  .pointerUp(20, 10)
128
128
 
129
129
  const line = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
130
- assert(editor.isShapeOfType(line, 'line'))
130
+ assert(editor.isShapeOfType<TLLineShape>(line, 'line'))
131
131
  expect(Object.keys(line.props.points).length).toBe(3)
132
132
  })
133
133
 
@@ -143,7 +143,7 @@ describe('When extending the line with the shift-key in tool-lock mode', () => {
143
143
  .pointerUp(30, 10)
144
144
 
145
145
  const line = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
146
- assert(editor.isShapeOfType(line, 'line'))
146
+ assert(editor.isShapeOfType<TLLineShape>(line, 'line'))
147
147
  expect(Object.keys(line.props.points).length).toBe(2)
148
148
  })
149
149
 
@@ -160,7 +160,7 @@ describe('When extending the line with the shift-key in tool-lock mode', () => {
160
160
  .pointerUp(30, 10)
161
161
 
162
162
  const line = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
163
- assert(editor.isShapeOfType(line, 'line'))
163
+ assert(editor.isShapeOfType<TLLineShape>(line, 'line'))
164
164
  expect(Object.keys(line.props.points).length).toBe(3)
165
165
  })
166
166
 
@@ -179,7 +179,7 @@ describe('When extending the line with the shift-key in tool-lock mode', () => {
179
179
  .pointerUp(30, 10)
180
180
 
181
181
  const line = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
182
- assert(editor.isShapeOfType(line, 'line'))
182
+ assert(editor.isShapeOfType<TLLineShape>(line, 'line'))
183
183
  expect(Object.keys(line.props.points).length).toBe(3)
184
184
  })
185
185
 
@@ -200,7 +200,7 @@ describe('When extending the line with the shift-key in tool-lock mode', () => {
200
200
  .pointerUp(40, 10)
201
201
 
202
202
  const line = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
203
- assert(editor.isShapeOfType(line, 'line'))
203
+ assert(editor.isShapeOfType<TLLineShape>(line, 'line'))
204
204
  expect(Object.keys(line.props.points).length).toBe(3)
205
205
  })
206
206
  })
@@ -24,7 +24,7 @@ beforeEach(() => {
24
24
  editor
25
25
  .selectAll()
26
26
  .deleteShapes(editor.getSelectedShapeIds())
27
- .createShapes([
27
+ .createShapes<TLLineShape>([
28
28
  {
29
29
  id: id,
30
30
  type: 'line',
@@ -168,10 +168,10 @@ describe('Snapping', () => {
168
168
  type: 'line',
169
169
  props: {
170
170
  points: {
171
- a1: { id: 'a1', index: 'a1' as IndexKey, x: 0, y: 0 },
172
- a2: { id: 'a2', index: 'a2' as IndexKey, x: 100, y: 0 },
173
- a3: { id: 'a3', index: 'a3' as IndexKey, x: 100, y: 100 },
174
- a4: { id: 'a4', index: 'a4' as IndexKey, x: 0, y: 100 },
171
+ a1: { id: 'a1', index: 'a1', x: 0, y: 0 },
172
+ a2: { id: 'a2', index: 'a2', x: 100, y: 0 },
173
+ a3: { id: 'a3', index: 'a3', x: 100, y: 100 },
174
+ a4: { id: 'a4', index: 'a4', x: 0, y: 100 },
175
175
  },
176
176
  },
177
177
  })
@@ -23,14 +23,14 @@ export class Pointing extends StateNode {
23
23
 
24
24
  override onEnter(info: { shapeId?: TLShapeId }) {
25
25
  const { inputs } = this.editor
26
- const currentPagePoint = inputs.getCurrentPagePoint()
26
+ const { currentPagePoint } = inputs
27
27
 
28
28
  this.markId = undefined
29
29
 
30
30
  // Previously created line shape that we might be extending
31
31
  const shape = info.shapeId && this.editor.getShape<TLLineShape>(info.shapeId)
32
32
 
33
- if (shape && inputs.getShiftKey()) {
33
+ if (shape && inputs.shiftKey) {
34
34
  // Extending a previous shape
35
35
  this.markId = this.editor.markHistoryStoppingPoint(`creating_line:${shape.id}`)
36
36
  this.shape = shape
@@ -89,7 +89,7 @@ export class Pointing extends StateNode {
89
89
 
90
90
  const newPoint = maybeSnapToGrid(currentPagePoint, this.editor)
91
91
 
92
- this.editor.createShapes([
92
+ this.editor.createShapes<TLLineShape>([
93
93
  {
94
94
  id,
95
95
  type: 'line',
@@ -114,7 +114,7 @@ export class Pointing extends StateNode {
114
114
  override onPointerMove() {
115
115
  if (!this.shape) return
116
116
 
117
- if (this.editor.inputs.getIsDragging()) {
117
+ if (this.editor.inputs.isDragging) {
118
118
  const handles = this.editor.getShapeHandles(this.shape)
119
119
  if (!handles) {
120
120
  if (this.markId) this.editor.bailToMark(this.markId)
@@ -1,4 +1,3 @@
1
- import { TLNoteShape } from '@tldraw/editor'
2
1
  import { TestEditor } from '../../../test/TestEditor'
3
2
  import { NoteShapeTool } from './NoteShapeTool'
4
3
 
@@ -243,7 +242,7 @@ describe('Adjacent note position helpers (sticky pits)', () => {
243
242
 
244
243
  it('Falls into correct pit below notes with growY', () => {
245
244
  editor.createShape({ type: 'note', x: 0, y: 0 }).updateShape({
246
- ...editor.getLastCreatedShape<TLNoteShape>(),
245
+ ...editor.getLastCreatedShape(),
247
246
  props: { growY: 100 },
248
247
  })
249
248
 
@@ -32,7 +32,7 @@ import {
32
32
  useValue,
33
33
  } from '@tldraw/editor'
34
34
  import { useCallback, useContext } from 'react'
35
- import { startEditingShapeWithRichText } from '../../tools/SelectTool/selectHelpers'
35
+ import { startEditingShapeWithLabel } from '../../tools/SelectTool/selectHelpers'
36
36
  import { TranslationsContext } from '../../ui/hooks/useTranslation/useTranslation'
37
37
  import {
38
38
  isEmptyRichText,
@@ -50,7 +50,6 @@ import {
50
50
  } from '../shared/default-shape-constants'
51
51
  import { useDefaultColorTheme } from '../shared/useDefaultColorTheme'
52
52
  import { useIsReadyForEditing } from '../shared/useEditablePlainText'
53
- import { useEfficientZoomThreshold } from '../shared/useEfficientZoomThreshold'
54
53
  import {
55
54
  CLONE_HANDLE_MARGIN,
56
55
  NOTE_CENTER_OFFSET,
@@ -159,7 +158,7 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
159
158
  const isCoarsePointer = this.editor.getInstanceState().isCoarsePointer
160
159
  if (isCoarsePointer) return []
161
160
 
162
- const zoom = this.editor.getEfficientZoomLevel()
161
+ const zoom = this.editor.getZoomLevel()
163
162
  if (zoom * scale < 0.25) return []
164
163
 
165
164
  const nh = getNoteHeight(shape)
@@ -269,11 +268,14 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
269
268
  [this.editor]
270
269
  )
271
270
 
272
- const isDarkMode = useValue('dark mode', () => this.editor.user.getIsDarkMode(), [this.editor])
271
+ // todo: consider hiding shadows on dark mode if they're invisible anyway
272
+
273
+ const hideShadows = useValue('zoom', () => this.editor.getZoomLevel() < 0.35 / scale, [
274
+ scale,
275
+ this.editor,
276
+ ])
273
277
 
274
- // Shadows are hidden when zoomed out far enough or in dark mode
275
- let hideShadows = useEfficientZoomThreshold(scale * 0.25)
276
- if (isDarkMode) hideShadows = true
278
+ const isDarkMode = useValue('dark mode', () => this.editor.user.getIsDarkMode(), [this.editor])
277
279
 
278
280
  const isSelected = shape.id === this.editor.getOnlySelectedShapeId()
279
281
 
@@ -316,7 +318,6 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
316
318
  wrap
317
319
  padding={LABEL_PADDING * scale}
318
320
  hasCustomTabBehavior
319
- showTextOutline={false}
320
321
  onKeyDown={handleKeyDown}
321
322
  />
322
323
  )}
@@ -536,7 +537,7 @@ function useNoteKeydownHandler(id: TLShapeId) {
536
537
  const newNote = getNoteShapeForAdjacentPosition(editor, shape, adjacentCenter, pageRotation)
537
538
 
538
539
  if (newNote) {
539
- startEditingShapeWithRichText(editor, newNote, { selectAll: true })
540
+ startEditingShapeWithLabel(editor, newNote, true /* selectAll */)
540
541
  }
541
542
  }
542
543
  },
@@ -30,7 +30,7 @@ function testCloneHandles(x: number, y: number, rotation: number) {
30
30
  const handleInPageSpace = editor.getShapePageTransform(shape).applyToPoint(handle)
31
31
  editor.select(shape.id)
32
32
  editor.pointerMove(handleInPageSpace.x, handleInPageSpace.y)
33
- expect(editor.inputs.getCurrentPagePoint()).toMatchObject({
33
+ expect(editor.inputs.currentPagePoint).toMatchObject({
34
34
  x: handleInPageSpace.x,
35
35
  y: handleInPageSpace.y,
36
36
  })
@@ -99,7 +99,6 @@ function testDragCloneHandles(x: number, y: number, rotation: number) {
99
99
  editor.expectToBeIn('select.pointing_handle')
100
100
 
101
101
  editor.pointerMove(handleInPageSpace.x + 30, handleInPageSpace.y + 30)
102
- editor.forceTick()
103
102
 
104
103
  editor.expectToBeIn('select.translating')
105
104
 
@@ -206,7 +205,6 @@ it('Creates an adjacent note when dragging the clone handle', () => {
206
205
  editor.expectToBeIn('select.pointing_handle')
207
206
 
208
207
  editor.pointerMove(handle.x + 30, handle.y + 30)
209
- editor.forceTick()
210
208
 
211
209
  const newShape = editor.getLastCreatedShape()
212
210
 
@@ -104,7 +104,7 @@ export function getAvailableNoteAdjacentPositions(
104
104
  // Get all the positions that are adjacent to the selected note shapes
105
105
  for (const shape of editor.getCurrentPageShapes()) {
106
106
  if (
107
- !editor.isShapeOfType(shape, 'note') ||
107
+ !editor.isShapeOfType<TLNoteShape>(shape, 'note') ||
108
108
  scale !== shape.props.scale ||
109
109
  selectedShapeIds.has(shape.id)
110
110
  ) {
@@ -204,7 +204,7 @@ export function getNoteShapeForAdjacentPosition(
204
204
 
205
205
  // We create it at the center first, so that it becomes
206
206
  // the child of whatever parent was at that center
207
- editor.createShape({
207
+ editor.createShape<TLNoteShape>({
208
208
  id,
209
209
  type: 'note',
210
210
  x: center.x,
@@ -9,7 +9,6 @@ import {
9
9
  maybeSnapToGrid,
10
10
  } from '@tldraw/editor'
11
11
 
12
- import { startEditingShapeWithRichText } from '../../../tools/SelectTool/selectHelpers'
13
12
  import {
14
13
  NOTE_ADJACENT_POSITION_SNAP_RADIUS,
15
14
  getAvailableNoteAdjacentPositions,
@@ -33,7 +32,7 @@ export class Pointing extends StateNode {
33
32
  this.markId = editor.markHistoryStoppingPoint(`creating_note:${id}`)
34
33
 
35
34
  // Check for note pits; if the pointer is close to one, place the note centered on the pit
36
- const center = this.editor.inputs.getOriginPagePoint().clone()
35
+ const center = this.editor.inputs.originPagePoint.clone()
37
36
  const offset = getNoteShapeAdjacentPositionOffset(
38
37
  this.editor,
39
38
  center,
@@ -53,7 +52,7 @@ export class Pointing extends StateNode {
53
52
  }
54
53
 
55
54
  override onPointerMove(info: TLPointerEventInfo) {
56
- if (this.editor.inputs.getIsDragging()) {
55
+ if (this.editor.inputs.isDragging) {
57
56
  this.editor.setCurrentTool('select.translating', {
58
57
  ...info,
59
58
  target: 'shape',
@@ -62,7 +61,8 @@ export class Pointing extends StateNode {
62
61
  isCreating: true,
63
62
  creatingMarkId: this.markId,
64
63
  onCreate: () => {
65
- startEditingShapeWithRichText(this.editor, this.shape.id)
64
+ this.editor.setEditingShape(this.shape.id)
65
+ this.editor.setCurrentTool('select.editing_shape')
66
66
  },
67
67
  })
68
68
  }
@@ -88,7 +88,12 @@ export class Pointing extends StateNode {
88
88
  if (this.editor.getInstanceState().isToolLocked) {
89
89
  this.parent.transition('idle')
90
90
  } else {
91
- startEditingShapeWithRichText(this.editor, this.shape.id, { info: this.info })
91
+ this.editor.setEditingShape(this.shape.id)
92
+ this.editor.setCurrentTool('select.editing_shape', {
93
+ ...this.info,
94
+ target: 'shape',
95
+ shape: this.shape,
96
+ })
92
97
  }
93
98
  }
94
99
 
@@ -1,17 +1,16 @@
1
- import { useEditor } from '@tldraw/editor'
1
+ import { useEditor, useValue } from '@tldraw/editor'
2
2
  import classNames from 'classnames'
3
3
  import { PointerEventHandler, useCallback } from 'react'
4
- import { useEfficientZoomThreshold } from './useEfficientZoomThreshold'
5
4
 
6
5
  const LINK_ICON =
7
6
  "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' fill='none'%3E%3Cpath stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M13 5H7a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6M19 5h6m0 0v6m0-6L13 17'/%3E%3C/svg%3E"
8
7
 
9
8
  export function HyperlinkButton({ url }: { url: string }) {
10
9
  const editor = useEditor()
11
- const hideButton = useEfficientZoomThreshold()
10
+ const hideButton = useValue('zoomLevel', () => editor.getZoomLevel() < 0.32, [editor])
12
11
  const markAsHandledOnShiftKey = useCallback<PointerEventHandler>(
13
12
  (e) => {
14
- if (!editor.inputs.getShiftKey()) editor.markEventAsHandled(e)
13
+ if (!editor.inputs.shiftKey) editor.markEventAsHandled(e)
15
14
  },
16
15
  [editor]
17
16
  )
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  Box,
3
- ExtractShapeByProps,
4
3
  TLDefaultFillStyle,
5
4
  TLDefaultFontStyle,
6
5
  TLDefaultHorizontalAlignStyle,
7
6
  TLDefaultVerticalAlignStyle,
8
7
  TLShapeId,
9
8
  } from '@tldraw/editor'
10
- import classNames from 'classnames'
11
9
  import React from 'react'
12
10
  import { PlainTextArea } from '../text/PlainTextArea'
13
11
  import { TextHelpers } from './TextHelpers'
@@ -17,7 +15,7 @@ import { useEditablePlainText } from './useEditablePlainText'
17
15
  /** @public */
18
16
  export interface PlainTextLabelProps {
19
17
  shapeId: TLShapeId
20
- type: ExtractShapeByProps<{ text: string }>['type']
18
+ type: string
21
19
  font: TLDefaultFontStyle
22
20
  fontSize: number
23
21
  lineHeight: number
@@ -35,7 +33,6 @@ export interface PlainTextLabelProps {
35
33
  textWidth?: number
36
34
  textHeight?: number
37
35
  padding?: number
38
- showTextOutline?: boolean
39
36
  }
40
37
 
41
38
  /**
@@ -63,7 +60,6 @@ export const PlainTextLabel = React.memo(function PlainTextLabel({
63
60
  style,
64
61
  textWidth,
65
62
  textHeight,
66
- showTextOutline = true,
67
63
  }: PlainTextLabelProps) {
68
64
  const { rInput, isEmpty, isEditing, isReadyForEditing, ...editableTextRest } =
69
65
  useEditablePlainText(shapeId, type, plaintext)
@@ -112,13 +108,7 @@ export const PlainTextLabel = React.memo(function PlainTextLabel({
112
108
  height: textHeight ? Math.ceil(textHeight) : undefined,
113
109
  }}
114
110
  >
115
- <div
116
- className={classNames(
117
- `${cssPrefix} tl-text tl-text-content`,
118
- showTextOutline ? 'tl-text__outline' : 'tl-text__no-outline'
119
- )}
120
- dir="auto"
121
- >
111
+ <div className={`${cssPrefix} tl-text tl-text-content`} dir="auto">
122
112
  {finalPlainText.split('\n').map((lineOfText, index) => (
123
113
  <div key={index} dir="auto">
124
114
  {lineOfText}
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  Box,
3
3
  DefaultFontFamilies,
4
- ExtractShapeByProps,
5
4
  TLDefaultFillStyle,
6
5
  TLDefaultFontStyle,
7
6
  TLDefaultHorizontalAlignStyle,
@@ -15,7 +14,6 @@ import {
15
14
  useReactor,
16
15
  useValue,
17
16
  } from '@tldraw/editor'
18
- import classNames from 'classnames'
19
17
  import React, { useMemo } from 'react'
20
18
  import { renderHtmlFromRichText } from '../../utils/text/richText'
21
19
  import { RichTextArea } from '../text/RichTextArea'
@@ -26,7 +24,7 @@ import { useEditableRichText } from './useEditableRichText'
26
24
  /** @public */
27
25
  export interface RichTextLabelProps {
28
26
  shapeId: TLShapeId
29
- type: ExtractShapeByProps<{ richText: TLRichText }>['type']
27
+ type: string
30
28
  font: TLDefaultFontStyle
31
29
  fontSize: number
32
30
  lineHeight: number
@@ -45,7 +43,6 @@ export interface RichTextLabelProps {
45
43
  textHeight?: number
46
44
  padding?: number
47
45
  hasCustomTabBehavior?: boolean
48
- showTextOutline?: boolean
49
46
  }
50
47
 
51
48
  /**
@@ -74,7 +71,6 @@ export const RichTextLabel = React.memo(function RichTextLabel({
74
71
  textWidth,
75
72
  textHeight,
76
73
  hasCustomTabBehavior,
77
- showTextOutline = true,
78
74
  }: RichTextLabelProps) {
79
75
  const editor = useEditor()
80
76
  const isDragging = React.useRef(false)
@@ -97,7 +93,7 @@ export const RichTextLabel = React.memo(function RichTextLabel({
97
93
  'isDragging',
98
94
  () => {
99
95
  editor.getInstanceState()
100
- isDragging.current = editor.inputs.getIsDragging()
96
+ isDragging.current = editor.inputs.isDragging
101
97
  },
102
98
  [editor]
103
99
  )
@@ -132,10 +128,7 @@ export const RichTextLabel = React.memo(function RichTextLabel({
132
128
  const cssPrefix = classNamePrefix || 'tl-text'
133
129
  return (
134
130
  <div
135
- className={classNames(
136
- `${cssPrefix}-label tl-text-wrapper tl-rich-text-wrapper`,
137
- showTextOutline ? 'tl-text__outline' : 'tl-text__no-outline'
138
- )}
131
+ className={`${cssPrefix}-label tl-text-wrapper tl-rich-text-wrapper`}
139
132
  aria-hidden={!isEditing}
140
133
  data-font={font}
141
134
  data-align={align}
@@ -265,10 +258,7 @@ export function RichTextSVG({
265
258
  y={bounds.minY}
266
259
  width={bounds.w}
267
260
  height={bounds.h}
268
- className={classNames(
269
- 'tl-export-embed-styles tl-rich-text tl-rich-text-svg',
270
- showTextOutline ? 'tl-text__outline' : 'tl-text__no-outline'
271
- )}
261
+ className="tl-export-embed-styles tl-rich-text tl-rich-text-svg"
272
262
  >
273
263
  <div style={wrapperStyle}>
274
264
  <div dangerouslySetInnerHTML={{ __html: html }} style={style} />
@@ -50,10 +50,10 @@ export const ShapeFill = React.memo(function ShapeFill({
50
50
  export function PatternFill({ d, color, theme }: ShapeFillProps) {
51
51
  const editor = useEditor()
52
52
  const svgExport = useSvgExportContext()
53
- const zoomLevel = useValue('zoomLevel', () => editor.getEfficientZoomLevel(), [editor])
53
+ const zoomLevel = useValue('zoomLevel', () => editor.getZoomLevel(), [editor])
54
54
  const getHashPatternZoomName = useGetHashPatternZoomName()
55
55
 
56
- const teenyTiny = zoomLevel <= 0.18
56
+ const teenyTiny = editor.getZoomLevel() <= 0.18
57
57
 
58
58
  return (
59
59
  <>
@@ -361,7 +361,6 @@ export function getCropBox<T extends ShapeWithCrop>(
361
361
  x: newPoint.x,
362
362
  y: newPoint.y,
363
363
  props: {
364
- ...shape.props,
365
364
  w: tempBox.w,
366
365
  h: tempBox.h,
367
366
  crop: newCrop,
@@ -1,4 +1,4 @@
1
- import { TLDrawShapeSegment, VecModel, b64Vecs, lerp } from '@tldraw/editor'
1
+ import { TLDrawShapeSegment, VecModel, lerp } from '@tldraw/editor'
2
2
 
3
3
  /** @public */
4
4
  export const interpolateSegments = (
@@ -10,8 +10,8 @@ export const interpolateSegments = (
10
10
  const endPoints: VecModel[] = []
11
11
 
12
12
  // Extract all points from startSegments and endSegments
13
- startSegments.forEach((segment) => startPoints.push(...b64Vecs.decodePoints(segment.points)))
14
- endSegments.forEach((segment) => endPoints.push(...b64Vecs.decodePoints(segment.points)))
13
+ startSegments.forEach((segment) => startPoints.push(...segment.points))
14
+ endSegments.forEach((segment) => endPoints.push(...segment.points))
15
15
 
16
16
  const maxLength = Math.max(startPoints.length, endPoints.length)
17
17
  const pointsToUseStart: VecModel[] = []
@@ -39,7 +39,7 @@ export const interpolateSegments = (
39
39
  return [
40
40
  {
41
41
  type: 'free',
42
- points: b64Vecs.encodePoints(interpolatedPoints),
42
+ points: interpolatedPoints,
43
43
  },
44
44
  ]
45
45
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Editor,
3
- ExtractShapeByProps,
4
3
  TLShapeId,
4
+ TLUnknownShape,
5
5
  getPointerInfo,
6
6
  noop,
7
7
  preventDefault,
@@ -13,11 +13,7 @@ import React, { useCallback, useEffect, useRef } from 'react'
13
13
  import { TextHelpers } from './TextHelpers'
14
14
 
15
15
  /** @public */
16
- export function useEditablePlainText(
17
- shapeId: TLShapeId,
18
- type: ExtractShapeByProps<{ text: string }>['type'],
19
- text?: string
20
- ) {
16
+ export function useEditablePlainText(shapeId: TLShapeId, type: string, text?: string) {
21
17
  const commonUseEditableTextHandlers = useEditableTextCommon(shapeId)
22
18
  const isEditing = commonUseEditableTextHandlers.isEditing
23
19
  const editor = useEditor()
@@ -79,7 +75,7 @@ export function useEditablePlainText(
79
75
  if (editor.getEditingShapeId() !== shapeId) return
80
76
 
81
77
  const normalizedPlaintext = TextHelpers.normalizeText(plaintext || '')
82
- editor.updateShape({
78
+ editor.updateShape<TLUnknownShape & { props: { text: string } }>({
83
79
  id: shapeId,
84
80
  type,
85
81
  props: { text: normalizedPlaintext },
@@ -1,14 +1,10 @@
1
- import { ExtractShapeByProps, TLRichText, TLShapeId, isAccelKey, useEditor } from '@tldraw/editor'
1
+ import { TLRichText, TLShapeId, TLUnknownShape, isAccelKey, useEditor } from '@tldraw/editor'
2
2
  import { useCallback, useEffect, useRef } from 'react'
3
3
  import { isEmptyRichText } from '../../utils/text/richText'
4
4
  import { useEditableTextCommon } from './useEditablePlainText'
5
5
 
6
6
  /** @public */
7
- export function useEditableRichText(
8
- shapeId: TLShapeId,
9
- type: ExtractShapeByProps<{ richText: TLRichText }>['type'],
10
- richText?: TLRichText
11
- ) {
7
+ export function useEditableRichText(shapeId: TLShapeId, type: string, richText?: TLRichText) {
12
8
  const commonUseEditableTextHandlers = useEditableTextCommon(shapeId)
13
9
  const isEditing = commonUseEditableTextHandlers.isEditing
14
10
  const editor = useEditor()
@@ -43,7 +39,7 @@ export function useEditableRichText(
43
39
  ({ richText }: { richText: TLRichText }) => {
44
40
  if (editor.getEditingShapeId() !== shapeId) return
45
41
 
46
- editor.updateShape({
42
+ editor.updateShape<TLUnknownShape & { props: { richText: TLRichText } }>({
47
43
  id: shapeId,
48
44
  type,
49
45
  props: { richText },
@@ -0,0 +1,6 @@
1
+ import { useEditor, useValue } from '@tldraw/editor'
2
+
3
+ export function useForceSolid() {
4
+ const editor = useEditor()
5
+ return useValue('zoom', () => editor.getZoomLevel() < 0.35, [editor])
6
+ }
@@ -96,7 +96,7 @@ export function useImageOrVideoAsset({ shapeId, assetId, width }: UseImageOrVide
96
96
 
97
97
  const screenScale = exportInfo
98
98
  ? exportInfo.scale * (width / asset.props.w)
99
- : editor.getEfficientZoomLevel() * (width / asset.props.w)
99
+ : editor.getZoomLevel() * (width / asset.props.w)
100
100
 
101
101
  function resolve(asset: TLImageAsset | TLVideoAsset, url: string | null) {
102
102
  if (isCancelled) return // don't update if the hook has remounted