tldraw 4.3.0-canary.9c474ef3fad5 → 4.3.0-canary.a2419250444e

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 (507) hide show
  1. package/dist-cjs/index.d.ts +285 -237
  2. package/dist-cjs/index.js +12 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  5. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  6. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  7. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  8. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  9. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +6 -2
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  17. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  18. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  19. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  21. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  22. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  23. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +22 -20
  25. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  27. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  28. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  29. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  30. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  31. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +5 -4
  33. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +136 -136
  35. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  37. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  38. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  39. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  40. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +22 -20
  41. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  42. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  43. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  44. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +1 -6
  45. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  46. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  47. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  48. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +1 -1
  49. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +1 -1
  51. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  53. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  54. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  55. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  56. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  57. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  58. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  59. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  60. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  61. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  62. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  63. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  64. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  65. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  66. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  67. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  68. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  69. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  70. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  71. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +9 -7
  73. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  74. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  75. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  76. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  77. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  78. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  79. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  80. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  81. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  82. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  83. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  86. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  87. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  88. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +7 -5
  89. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  90. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  91. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  92. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  93. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  94. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  95. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  96. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  97. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  99. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  101. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  103. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  107. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  113. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  115. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  117. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  118. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  119. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  120. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  121. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  122. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  123. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  124. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  125. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  126. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  127. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  128. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  129. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  130. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  131. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  132. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  133. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  134. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  135. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  136. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  137. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  139. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  140. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  141. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  142. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  143. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  144. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  145. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  146. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  147. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  148. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  149. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  150. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  151. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  152. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  153. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  154. package/dist-cjs/lib/ui/components/ZoomMenu/DefaultZoomMenu.js +1 -1
  155. package/dist-cjs/lib/ui/components/ZoomMenu/DefaultZoomMenu.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  157. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +6 -5
  159. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  161. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +13 -6
  163. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/actions.js +6 -6
  165. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/components.js +1 -2
  167. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  168. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  169. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  171. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  172. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  173. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  174. package/dist-cjs/lib/ui/version.js +3 -3
  175. package/dist-cjs/lib/ui/version.js.map +1 -1
  176. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -6
  177. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  178. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  179. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  180. package/dist-cjs/lib/utils/text/richText.js +4 -2
  181. package/dist-cjs/lib/utils/text/richText.js.map +2 -2
  182. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  183. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  184. package/dist-esm/index.d.mts +285 -237
  185. package/dist-esm/index.mjs +12 -5
  186. package/dist-esm/index.mjs.map +2 -2
  187. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  188. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  189. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  190. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  191. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  192. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  193. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +6 -2
  194. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  195. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  196. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  197. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  198. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  199. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  200. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  202. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  203. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  204. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  206. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  207. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +27 -22
  208. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  209. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  210. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  211. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  212. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  213. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  214. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  215. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +5 -4
  216. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  217. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +137 -136
  218. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  219. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  220. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  221. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  222. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  223. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +23 -21
  224. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  225. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  226. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  227. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +2 -7
  228. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  229. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  230. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  231. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +1 -1
  232. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +1 -1
  234. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  236. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  238. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  240. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  241. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  242. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  243. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  244. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  245. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +2 -4
  246. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  247. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  248. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  249. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  250. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  251. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  252. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  253. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  254. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  255. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +9 -7
  256. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  257. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  258. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  259. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  260. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  261. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  262. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  263. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  264. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  265. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  266. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  267. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  268. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  269. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  270. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  271. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +7 -5
  272. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  273. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  274. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  275. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  276. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  277. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  278. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  279. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  280. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  281. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -15
  282. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  283. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  284. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  285. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  286. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  287. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  288. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  289. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  290. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  291. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  292. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  293. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  294. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  295. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  296. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  297. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  298. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  299. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  300. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  301. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  302. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  303. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  304. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  305. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  306. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  307. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  308. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  309. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  310. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  311. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  312. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  313. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  314. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  316. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  317. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  318. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  320. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  322. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  323. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  324. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  325. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  326. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  327. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  328. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  329. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  330. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  331. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  332. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  333. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  335. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  337. package/dist-esm/lib/ui/components/ZoomMenu/DefaultZoomMenu.mjs +1 -1
  338. package/dist-esm/lib/ui/components/ZoomMenu/DefaultZoomMenu.mjs.map +2 -2
  339. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  340. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  341. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +6 -5
  342. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  345. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +13 -6
  346. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  347. package/dist-esm/lib/ui/context/actions.mjs +6 -6
  348. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  349. package/dist-esm/lib/ui/context/components.mjs +1 -2
  350. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  351. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  352. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  354. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  355. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  356. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  357. package/dist-esm/lib/ui/version.mjs +3 -3
  358. package/dist-esm/lib/ui/version.mjs.map +1 -1
  359. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +9 -6
  360. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  361. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  362. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  363. package/dist-esm/lib/utils/text/richText.mjs +5 -2
  364. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  365. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  366. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  367. package/package.json +18 -16
  368. package/src/index.ts +5 -2
  369. package/src/lib/Tldraw.test.tsx +46 -1
  370. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  371. package/src/lib/defaultExternalContentHandlers.ts +10 -10
  372. package/src/lib/defaultSideEffects.ts +6 -1
  373. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  374. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  375. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +6 -4
  376. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  377. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  378. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  379. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  380. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  381. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +7 -4
  382. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  383. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  384. package/src/lib/shapes/draw/DrawShapeUtil.tsx +28 -24
  385. package/src/lib/shapes/draw/getPath.ts +31 -10
  386. package/src/lib/shapes/draw/toolStates/Drawing.ts +96 -86
  387. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +7 -0
  388. package/src/lib/shapes/frame/FrameShapeUtil.tsx +9 -3
  389. package/src/lib/shapes/geo/GeoShapeUtil.tsx +219 -172
  390. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  391. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  392. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  393. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +24 -23
  394. package/src/lib/shapes/line/toolStates/Pointing.ts +3 -3
  395. package/src/lib/shapes/note/NoteShapeUtil.tsx +2 -2
  396. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  397. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  398. package/src/lib/shapes/shared/HyperlinkButton.tsx +1 -1
  399. package/src/lib/shapes/shared/RichTextLabel.tsx +1 -1
  400. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  401. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  402. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  403. package/src/lib/shapes/text/toolStates/Pointing.ts +7 -7
  404. package/src/lib/tools/EraserTool/childStates/Erasing.ts +4 -5
  405. package/src/lib/tools/EraserTool/childStates/Pointing.ts +2 -4
  406. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  407. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  408. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  409. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  410. package/src/lib/tools/SelectTool/DragAndDropManager.ts +12 -7
  411. package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -5
  412. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  413. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +1 -1
  414. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  415. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  416. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  417. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  418. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +7 -5
  419. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +55 -12
  420. package/src/lib/tools/SelectTool/childStates/Idle.ts +58 -71
  421. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +6 -7
  422. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  423. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -5
  424. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  425. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  426. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  427. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  428. package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -6
  429. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  430. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +7 -6
  431. package/src/lib/tools/SelectTool/childStates/Translating.ts +15 -12
  432. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  433. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  434. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  435. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  436. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  437. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  438. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  439. package/src/lib/ui/TldrawUi.tsx +5 -2
  440. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  441. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  442. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  443. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  444. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  445. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  446. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  447. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  448. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  449. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  450. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  451. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  452. package/src/lib/ui/components/ZoomMenu/DefaultZoomMenu.tsx +1 -1
  453. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  454. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +12 -5
  455. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +5 -2
  458. package/src/lib/ui/context/actions.tsx +6 -6
  459. package/src/lib/ui/context/components.tsx +1 -2
  460. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  461. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  462. package/src/lib/ui/hooks/useTools.tsx +4 -5
  463. package/src/lib/ui/version.ts +3 -3
  464. package/src/lib/ui.css +27 -23
  465. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  466. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +11 -6
  467. package/src/lib/utils/test-helpers.ts +60 -0
  468. package/src/lib/utils/text/richText.ts +6 -5
  469. package/src/lib/utils/tldr/buildFromV1Document.ts +9 -2
  470. package/src/test/Editor.test.tsx +40 -29
  471. package/src/test/EraserTool.test.ts +10 -12
  472. package/src/test/TestEditor.ts +48 -47
  473. package/src/test/TldrawEditor.test.tsx +3 -2
  474. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  475. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  476. package/src/test/arrows-megabus.test.tsx +1 -1
  477. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +8 -8
  478. package/src/test/commands/setCamera.test.ts +13 -11
  479. package/src/test/commands/stackShapes.test.ts +34 -8
  480. package/src/test/commands/zoomToBounds.test.ts +19 -3
  481. package/src/test/commands/zoomToSelection.test.ts +14 -3
  482. package/src/test/custom-clipping.test.ts +16 -9
  483. package/src/test/drawing.test.ts +17 -10
  484. package/src/test/flipShapes.test.ts +33 -0
  485. package/src/test/frames.test.ts +92 -0
  486. package/src/test/groups.test.tsx +1 -1
  487. package/src/test/modifiers.test.ts +6 -6
  488. package/src/test/resizing.test.ts +7 -9
  489. package/src/test/selection-omnibus.test.ts +2 -2
  490. package/src/test/spacebarPanning.test.ts +28 -10
  491. package/src/test/test-jsx.tsx +3 -0
  492. package/src/test/ui/BackToContent.test.tsx +111 -0
  493. package/tldraw.css +33 -31
  494. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  495. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  496. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  497. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  498. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  499. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  500. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  501. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  502. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  503. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  504. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  505. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  506. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  507. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -3,8 +3,10 @@ import { Popover as _Popover } from 'radix-ui'
3
3
  import { ReactNode } from 'react'
4
4
  import { PORTRAIT_BREAKPOINT } from '../../constants'
5
5
  import { useBreakpoint } from '../../context/breakpoints'
6
+ import { useCollaborationStatus } from '../../hooks/useCollaborationStatus'
6
7
  import { useMenuIsOpen } from '../../hooks/useMenuIsOpen'
7
8
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
9
+ import { OfflineIndicator } from '../OfflineIndicator/OfflineIndicator'
8
10
  import { PeopleMenuAvatar } from './PeopleMenuAvatar'
9
11
  import { PeopleMenuItem } from './PeopleMenuItem'
10
12
  import { PeopleMenuMore } from './PeopleMenuMore'
@@ -30,6 +32,12 @@ export function PeopleMenu({ children }: PeopleMenuProps) {
30
32
  const breakpoint = useBreakpoint()
31
33
  const maxAvatars = breakpoint <= PORTRAIT_BREAKPOINT.MOBILE_XS ? 1 : 5
32
34
 
35
+ const collaborationStatus = useCollaborationStatus()
36
+
37
+ if (collaborationStatus === 'offline') {
38
+ return <OfflineIndicator />
39
+ }
40
+
33
41
  if (!userIds.length) return null
34
42
 
35
43
  return (
@@ -63,7 +63,7 @@ function ContextualToolbarInner({
63
63
  )
64
64
  const camera = useValue('camera', () => editor.getCamera(), [editor])
65
65
  const isInCropTool = useValue('editor path', () => editor.isIn('select.crop.'), [editor])
66
- const previousSelectionBounds = useRef<Box | undefined>()
66
+ const previousSelectionBounds = useRef<Box | undefined>(undefined)
67
67
  const handleManipulatingEnd = useCallback(() => {
68
68
  editor.setCroppingShape(null)
69
69
  editor.setCurrentTool('select.idle')
@@ -38,7 +38,7 @@ function ContextualToolbarInner({
38
38
  }) {
39
39
  const { isEditingLink, onEditLinkStart, onEditLinkClose } = useEditingLinkBehavior(textEditor)
40
40
  const [currentSelection, setCurrentSelection] = useState<Range | null>(null)
41
- const previousSelectionBounds = useRef<Box | undefined>()
41
+ const previousSelectionBounds = useRef<Box | undefined>(undefined)
42
42
  const isMousingDown = useIsMousingDownOnTextEditor(textEditor)
43
43
  const msg = useTranslation()
44
44
 
@@ -3,7 +3,7 @@ import { useBreakpoint } from '../../context/breakpoints'
3
3
 
4
4
  /** @public */
5
5
  export interface CenteredTopPanelContainerProps {
6
- children: ReactNode
6
+ children?: ReactNode
7
7
  maxWidth?: number
8
8
  ignoreRightWidth?: number
9
9
  stylePanelWidth?: number
@@ -48,7 +48,7 @@ export const DefaultZoomMenu = memo(function DefaultZoomMenu({ children }: TLUiZ
48
48
  const ZoomTriggerButton = () => {
49
49
  const editor = useEditor()
50
50
  const breakpoint = useBreakpoint()
51
- const zoom = useValue('zoom', () => editor.getEfficientZoomLevel(), [editor])
51
+ const zoom = useValue('zoom', () => editor.getZoomLevel(), [editor])
52
52
  const msg = useTranslation()
53
53
 
54
54
  const handleDoubleClick = useCallback(() => {
@@ -52,8 +52,8 @@ export const TldrawUiContextualToolbar = ({
52
52
  const editor = useEditor()
53
53
  const toolbarRef = useRef<HTMLDivElement>(null)
54
54
 
55
- usePassThroughWheelEvents(toolbarRef as RefObject<HTMLDivElement>)
56
- usePassThroughMouseOverEvents(toolbarRef as RefObject<HTMLDivElement>)
55
+ usePassThroughWheelEvents(toolbarRef as RefObject<HTMLDivElement | null>)
56
+ usePassThroughMouseOverEvents(toolbarRef as RefObject<HTMLDivElement | null>)
57
57
 
58
58
  const { isVisible, isInteractive, hide, show, position, move } =
59
59
  useToolbarVisibilityStateMachine(changeOnlyWhenYChanges)
@@ -105,7 +105,9 @@ export const TldrawUiContextualToolbar = ({
105
105
  // to have the last updated position in page space, so that we could convert
106
106
  // it to screen space and update it here
107
107
  const elm = toolbarRef.current
108
- elm.style.setProperty('transform', `translate(${position.x}px, ${position.y}px)`)
108
+ if (elm) {
109
+ elm.style.setProperty('transform', `translate(${position.x}px, ${position.y}px)`)
110
+ }
109
111
  } else {
110
112
  const moveImmediately = lastContentSizeUpdateCounter !== nextContentSizeUpdateCounter
111
113
  // Schedule a move to its next location
@@ -410,8 +410,15 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
410
410
  const child = React.Children.only(children)
411
411
  assert(React.isValidElement(child), 'TldrawUiTooltip children must be a single element')
412
412
 
413
+ const childElement = child as React.ReactElement<{
414
+ onMouseEnter?(event: React.MouseEvent<HTMLElement>): void
415
+ onMouseLeave?(event: React.MouseEvent<HTMLElement>): void
416
+ onFocus?(event: React.FocusEvent<HTMLElement>): void
417
+ onBlur?(event: React.FocusEvent<HTMLElement>): void
418
+ }>
419
+
413
420
  const handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {
414
- child.props.onMouseEnter?.(event)
421
+ childElement.props.onMouseEnter?.(event)
415
422
  tooltipManager.handleEvent({
416
423
  type: 'show',
417
424
  tooltip: {
@@ -427,7 +434,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
427
434
  }
428
435
 
429
436
  const handleMouseLeave = (event: React.MouseEvent<HTMLElement>) => {
430
- child.props.onMouseLeave?.(event)
437
+ childElement.props.onMouseLeave?.(event)
431
438
  tooltipManager.handleEvent({
432
439
  type: 'hide',
433
440
  tooltipId: tooltipId.current,
@@ -437,7 +444,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
437
444
  }
438
445
 
439
446
  const handleFocus = (event: React.FocusEvent<HTMLElement>) => {
440
- child.props.onFocus?.(event)
447
+ childElement.props.onFocus?.(event)
441
448
  tooltipManager.handleEvent({
442
449
  type: 'show',
443
450
  tooltip: {
@@ -453,7 +460,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
453
460
  }
454
461
 
455
462
  const handleBlur = (event: React.FocusEvent<HTMLElement>) => {
456
- child.props.onBlur?.(event)
463
+ childElement.props.onBlur?.(event)
457
464
  tooltipManager.handleEvent({
458
465
  type: 'hide',
459
466
  tooltipId: tooltipId.current,
@@ -462,7 +469,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
462
469
  })
463
470
  }
464
471
 
465
- const childrenWithHandlers = React.cloneElement(children as React.ReactElement, {
472
+ const childrenWithHandlers = React.cloneElement(childElement, {
466
473
  onMouseEnter: handleMouseEnter,
467
474
  onMouseLeave: handleMouseLeave,
468
475
  onFocus: handleFocus,
@@ -17,5 +17,5 @@ export function TldrawUiMenuActionCheckboxItem({
17
17
  const actions = useActions()
18
18
  const action = actions[actionId]
19
19
  if (!action) return null
20
- return <TldrawUiMenuCheckboxItem {...action} {...rest} />
20
+ return <TldrawUiMenuCheckboxItem {...(action as TLUiMenuCheckboxItemProps)} {...rest} />
21
21
  }
@@ -11,5 +11,5 @@ export function TldrawUiMenuActionItem({ actionId = '', ...rest }: TLUiMenuActio
11
11
  const actions = useActions()
12
12
  const action = actions[actionId]
13
13
  if (!action) return null
14
- return <TldrawUiMenuItem {...action} {...rest} />
14
+ return <TldrawUiMenuItem {...(action as TLUiMenuItemProps)} {...rest} />
15
15
  }
@@ -134,7 +134,6 @@ export function TldrawUiMenuItem<
134
134
  {iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}
135
135
  <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>
136
136
  {kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}
137
- {icon && <TldrawUiButtonIcon icon={icon} small />}
138
137
  </TldrawUiButton>
139
138
  </TldrawUiDropdownMenuItem>
140
139
  )
@@ -200,7 +199,11 @@ export function TldrawUiMenuItem<
200
199
  }
201
200
  case 'helper-buttons': {
202
201
  return (
203
- <TldrawUiButton type="low" onClick={() => onSelect(sourceId)}>
202
+ <TldrawUiButton
203
+ type="low"
204
+ data-testid={`${sourceId}.${id}`}
205
+ onClick={() => onSelect(sourceId)}
206
+ >
204
207
  <TldrawUiButtonIcon icon={icon!} />
205
208
  <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>
206
209
  </TldrawUiButton>
@@ -375,7 +375,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
375
375
  if (editor.root.getCurrent()?.id === 'zoom') return
376
376
 
377
377
  trackEvent('zoom-tool', { source })
378
- if (!(editor.inputs.shiftKey || editor.inputs.ctrlKey)) {
378
+ if (!(editor.inputs.getShiftKey() || editor.inputs.getCtrlKey())) {
379
379
  const currentTool = editor.root.getCurrent()
380
380
  if (currentTool && currentTool.getCurrent()?.id === 'idle') {
381
381
  editor.setCurrentTool('zoom', { onInteractionEnd: currentTool.id, maskAs: 'zoom' })
@@ -973,7 +973,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
973
973
  helpers.paste(
974
974
  clipboardItems,
975
975
  source,
976
- source === 'context-menu' ? editor.inputs.currentPagePoint : undefined
976
+ source === 'context-menu' ? editor.inputs.getCurrentPagePoint() : undefined
977
977
  )
978
978
  })
979
979
  .catch(() => {
@@ -1037,7 +1037,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1037
1037
  if (!canApplySelectionAction()) return
1038
1038
  if (mustGoBackToSelectToolFirst()) return
1039
1039
 
1040
- const isFine = editor.inputs.altKey
1040
+ const isFine = editor.inputs.getAltKey()
1041
1041
  trackEvent('rotate-cw', { source, fine: isFine })
1042
1042
  editor.markHistoryStoppingPoint('rotate-cw')
1043
1043
  editor.run(() => {
@@ -1060,7 +1060,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1060
1060
  if (!canApplySelectionAction()) return
1061
1061
  if (mustGoBackToSelectToolFirst()) return
1062
1062
 
1063
- const isFine = editor.inputs.altKey
1063
+ const isFine = editor.inputs.getAltKey()
1064
1064
  trackEvent('rotate-ccw', { source, fine: isFine })
1065
1065
  editor.markHistoryStoppingPoint('rotate-ccw')
1066
1066
  editor.run(() => {
@@ -1092,7 +1092,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1092
1092
  readonlyOk: true,
1093
1093
  onSelect(source) {
1094
1094
  trackEvent('zoom-in', { source, towardsCursor: true })
1095
- editor.zoomIn(editor.inputs.currentScreenPoint, {
1095
+ editor.zoomIn(editor.inputs.getCurrentScreenPoint(), {
1096
1096
  animation: { duration: editor.options.animationMediumMs },
1097
1097
  })
1098
1098
  },
@@ -1116,7 +1116,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1116
1116
  readonlyOk: true,
1117
1117
  onSelect(source) {
1118
1118
  trackEvent('zoom-out', { source, towardsCursor: true })
1119
- editor.zoomOut(editor.inputs.currentScreenPoint, {
1119
+ editor.zoomOut(editor.inputs.getCurrentScreenPoint(), {
1120
1120
  animation: { duration: editor.options.animationMediumMs },
1121
1121
  })
1122
1122
  },
@@ -42,7 +42,6 @@ import {
42
42
  } from '../components/Toolbar/DefaultRichTextToolbar'
43
43
  import { DefaultToolbar } from '../components/Toolbar/DefaultToolbar'
44
44
  import { DefaultVideoToolbar } from '../components/Toolbar/DefaultVideoToolbar'
45
- import { DefaultTopPanel } from '../components/TopPanel/DefaultTopPanel'
46
45
  import { DefaultZoomMenu, TLUiZoomMenuProps } from '../components/ZoomMenu/DefaultZoomMenu'
47
46
  import { useShowCollaborationUi } from '../hooks/useCollaborationStatus'
48
47
 
@@ -117,7 +116,7 @@ export function TldrawUiComponentsProvider({
117
116
  MenuPanel: DefaultMenuPanel,
118
117
  SharePanel: showCollaborationUi ? DefaultSharePanel : null,
119
118
  CursorChatBubble: showCollaborationUi ? CursorChatBubble : null,
120
- TopPanel: showCollaborationUi ? DefaultTopPanel : null,
119
+ TopPanel: null,
121
120
  Dialogs: DefaultDialogs,
122
121
  Toasts: DefaultToasts,
123
122
  A11y: DefaultA11yAnnouncer,
@@ -783,9 +783,9 @@ export function useNativeClipboardEvents() {
783
783
  // | Y | N | Y |
784
784
  // | N | Y | Y |
785
785
  // | Y | Y | N |
786
- if (editor.inputs.shiftKey) pasteAtCursor = true
786
+ if (editor.inputs.getShiftKey()) pasteAtCursor = true
787
787
  if (editor.user.getIsPasteAtCursorMode()) pasteAtCursor = !pasteAtCursor
788
- if (pasteAtCursor) point = editor.inputs.currentPagePoint
788
+ if (pasteAtCursor) point = editor.inputs.getCurrentPagePoint()
789
789
 
790
790
  const pasteFromEvent = () => {
791
791
  if (e.clipboardData) {
@@ -93,7 +93,7 @@ export function useKeyboardShortcuts() {
93
93
 
94
94
  editor.inputs.keys.add('Comma')
95
95
 
96
- const { x, y, z } = editor.inputs.currentPagePoint
96
+ const { x, y, z } = editor.inputs.getCurrentPagePoint()
97
97
  const screenpoints = editor.pageToScreen({ x, y })
98
98
 
99
99
  const info: TLPointerEventInfo = {
@@ -120,7 +120,7 @@ export function useKeyboardShortcuts() {
120
120
 
121
121
  editor.inputs.keys.delete('Comma')
122
122
 
123
- const { x, y, z } = editor.inputs.currentScreenPoint
123
+ const { x, y, z } = editor.inputs.getCurrentScreenPoint()
124
124
  const info: TLPointerEventInfo = {
125
125
  type: 'pointer',
126
126
  name: 'pointer_up',
@@ -10,6 +10,7 @@ import {
10
10
  useMaybeEditor,
11
11
  } from '@tldraw/editor'
12
12
  import * as React from 'react'
13
+ import { startEditingShapeWithRichText } from '../../tools/SelectTool/selectHelpers'
13
14
  import { EmbedDialog } from '../components/EmbedDialog'
14
15
  import { TLUiIconJsx } from '../components/primitives/TldrawUiIcon'
15
16
  import { useA11y } from '../context/a11y'
@@ -239,8 +240,7 @@ export function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {
239
240
  createShape: (id) =>
240
241
  editor.createShape({ id, type: 'text', props: { richText: toRichText('Text') } }),
241
242
  onDragEnd: (id) => {
242
- editor.setEditingShape(id)
243
- editor.emit('select-all-text', { shapeId: id })
243
+ startEditingShapeWithRichText(editor, id, { selectAll: true })
244
244
  },
245
245
  })
246
246
  trackEvent('drag-tool', { source, id: 'text' })
@@ -269,8 +269,7 @@ export function ToolsProvider({ overrides, children }: TLUiToolsProviderProps) {
269
269
  onDragFromToolbarToCreateShape(editor, info, {
270
270
  createShape: (id) => editor.createShape({ id, type: 'note' }),
271
271
  onDragEnd: (id) => {
272
- editor.setEditingShape(id)
273
- editor.emit('select-all-text', { shapeId: id })
272
+ startEditingShapeWithRichText(editor, id, { selectAll: true })
274
273
  },
275
274
  })
276
275
  trackEvent('drag-tool', { source, id: 'note' })
@@ -360,7 +359,7 @@ export function onDragFromToolbarToCreateShape(
360
359
  info: TLPointerEventInfo,
361
360
  opts: OnDragFromToolbarToCreateShapesOpts
362
361
  ) {
363
- const { x, y } = editor.inputs.currentPagePoint
362
+ const { x, y } = editor.inputs.getCurrentPagePoint()
364
363
 
365
364
  const stoppingPoint = editor.markHistoryStoppingPoint('drag shape tool')
366
365
  editor.setCurrentTool('select.translating')
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '4.3.0-canary.9c474ef3fad5'
4
+ export const version = '4.3.0-canary.a2419250444e'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2025-12-07T21:52:48.186Z',
8
- patch: '2025-12-07T21:52:48.186Z',
7
+ minor: '2026-01-07T11:52:01.977Z',
8
+ patch: '2026-01-07T11:52:01.977Z',
9
9
  }
package/src/lib/ui.css CHANGED
@@ -609,25 +609,31 @@
609
609
 
610
610
  /* Submenu triggers */
611
611
 
612
- .tlui-menu__submenu__trigger[data-state='open']::after {
613
- opacity: 1;
614
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
612
+ .tlui-menu__submenu__trigger {
613
+ --gradient-angle: 90deg;
615
614
  }
616
615
 
617
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']::after {
616
+ .tlui-menu__submenu__trigger[data-direction='left'] {
617
+ --gradient-angle: 270deg;
618
+ }
619
+
620
+ .tlui-menu__submenu__trigger[data-state='open']::after {
618
621
  opacity: 1;
619
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
622
+ background: linear-gradient(
623
+ var(--gradient-angle),
624
+ rgba(144, 144, 144, 0) 0%,
625
+ var(--tl-color-muted-2) 100%
626
+ );
620
627
  }
621
628
 
622
629
  @media (hover: hover) {
623
- .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after {
630
+ .tlui-menu__submenu__trigger:is(:hover, [data-state='open'])::after {
624
631
  opacity: 1;
625
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
626
- }
627
-
628
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']:not(:hover)::after {
629
- opacity: 1;
630
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
632
+ background: linear-gradient(
633
+ var(--gradient-angle),
634
+ rgba(144, 144, 144, 0) 0%,
635
+ var(--tl-color-muted-2) 100%
636
+ );
631
637
  }
632
638
  }
633
639
 
@@ -906,10 +912,8 @@
906
912
  }
907
913
  }
908
914
 
909
- @media (any-pointer: coarse) {
910
- .tlui-page_menu__item__submenu > .tlui-button {
911
- opacity: 1;
912
- }
915
+ .tl-container[data-coarse='true'] .tlui-page_menu__item__submenu > .tlui-button {
916
+ opacity: 1;
913
917
  }
914
918
 
915
919
  .tlui-button__icon {
@@ -948,16 +952,15 @@
948
952
 
949
953
  .tlui-offline-indicator {
950
954
  display: flex;
951
- flex-direction: row;
952
- gap: var(--tl-space-3);
953
- color: var(--tl-color-text);
954
- background-color: var(--tl-color-low);
955
- border: 3px solid var(--tl-color-background);
956
- padding: 0px var(--tl-space-5);
957
- height: 42px;
955
+ color: var(--tl-color-background);
956
+ background-color: var(--tl-color-text);
957
+ border: none;
958
+ width: 32px;
959
+ height: 32px;
958
960
  align-items: center;
959
961
  justify-content: center;
960
962
  border-radius: 99px;
963
+ cursor: default;
961
964
  opacity: 0;
962
965
  animation: tl-fade-in;
963
966
  animation-duration: 0.12s;
@@ -1275,6 +1278,7 @@ tldraw? probably.
1275
1278
  position: relative;
1276
1279
  background: var(--tl-color-panel);
1277
1280
  box-shadow: var(--tl-shadow-2);
1281
+ contain: layout style paint;
1278
1282
  }
1279
1283
 
1280
1284
  .tlui-main-toolbar--horizontal .tlui-main-toolbar__mobile-style-panel {
@@ -730,20 +730,11 @@ exports[`putExcalidrawContent test fixtures > line-drawing.json 1`] = `
730
730
  "isComplete": false,
731
731
  "isPen": false,
732
732
  "scale": 1,
733
+ "scaleX": 1,
734
+ "scaleY": 1,
733
735
  "segments": [
734
736
  {
735
- "points": [
736
- {
737
- "x": 0,
738
- "y": 0,
739
- "z": 0.5,
740
- },
741
- {
742
- "x": 0.0001,
743
- "y": 0.0001,
744
- "z": 0.5,
745
- },
746
- ],
737
+ "points": "AAAAAAA4jgaOBgA4",
747
738
  "type": "free",
748
739
  },
749
740
  ],
@@ -770,20 +761,11 @@ exports[`putExcalidrawContent test fixtures > line-drawing.json 1`] = `
770
761
  "isComplete": false,
771
762
  "isPen": false,
772
763
  "scale": 1,
764
+ "scaleX": 1,
765
+ "scaleY": 1,
773
766
  "segments": [
774
767
  {
775
- "points": [
776
- {
777
- "x": 0,
778
- "y": 0,
779
- "z": 0.5,
780
- },
781
- {
782
- "x": 0.0001,
783
- "y": 0.0001,
784
- "z": 0.5,
785
- },
786
- ],
768
+ "points": "AAAAAAA4jgaOBgA4",
787
769
  "type": "free",
788
770
  },
789
771
  ],
@@ -1393,20 +1375,11 @@ exports[`putExcalidrawContent test fixtures > line-drawing.json 1`] = `
1393
1375
  "isComplete": false,
1394
1376
  "isPen": false,
1395
1377
  "scale": 1,
1378
+ "scaleX": 1,
1379
+ "scaleY": 1,
1396
1380
  "segments": [
1397
1381
  {
1398
- "points": [
1399
- {
1400
- "x": 0,
1401
- "y": 0,
1402
- "z": 0.5,
1403
- },
1404
- {
1405
- "x": 0.0001,
1406
- "y": 0.0001,
1407
- "z": 0.5,
1408
- },
1409
- ],
1382
+ "points": "AAAAAAA4jgaOBgA4",
1410
1383
  "type": "free",
1411
1384
  },
1412
1385
  ],
@@ -1433,20 +1406,11 @@ exports[`putExcalidrawContent test fixtures > line-drawing.json 1`] = `
1433
1406
  "isComplete": false,
1434
1407
  "isPen": false,
1435
1408
  "scale": 1,
1409
+ "scaleX": 1,
1410
+ "scaleY": 1,
1436
1411
  "segments": [
1437
1412
  {
1438
- "points": [
1439
- {
1440
- "x": 0,
1441
- "y": 0,
1442
- "z": 0.5,
1443
- },
1444
- {
1445
- "x": 0.0001,
1446
- "y": 0.0001,
1447
- "z": 0.5,
1448
- },
1449
- ],
1413
+ "points": "AAAAAAA4jgaOBgA4",
1450
1414
  "type": "free",
1451
1415
  },
1452
1416
  ],
@@ -16,7 +16,9 @@ import {
16
16
  TLShapeId,
17
17
  Vec,
18
18
  VecLike,
19
+ VecModel,
19
20
  ZERO_INDEX_KEY,
21
+ b64Vecs,
20
22
  compact,
21
23
  createBindingId,
22
24
  createShapeId,
@@ -149,6 +151,13 @@ export async function putExcalidrawContent(
149
151
  break
150
152
  }
151
153
  case 'freedraw': {
154
+ const points: VecModel[] = element.points.map(([x, y, z = 0.5]: number[]) => ({
155
+ x,
156
+ y,
157
+ z,
158
+ }))
159
+ const base64Points = b64Vecs.encodePoints(points)
160
+
152
161
  tldrawContent.shapes.push({
153
162
  ...base,
154
163
  type: 'draw',
@@ -160,11 +169,7 @@ export async function putExcalidrawContent(
160
169
  segments: [
161
170
  {
162
171
  type: 'free',
163
- points: element.points.map(([x, y, z = 0.5]: number[]) => ({
164
- x,
165
- y,
166
- z,
167
- })),
172
+ points: base64Points,
168
173
  },
169
174
  ],
170
175
  },
@@ -329,7 +334,7 @@ export async function putExcalidrawContent(
329
334
  index = getIndexAbove(index)
330
335
  }
331
336
 
332
- const p = point ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : undefined)
337
+ const p = point ?? (editor.inputs.getShiftKey() ? editor.inputs.getCurrentPagePoint() : undefined)
333
338
 
334
339
  editor.putContentOntoCurrentPage(tldrawContent, {
335
340
  point: p,
@@ -0,0 +1,60 @@
1
+ import type { TLDrawShapeSegment, VecModel } from '@tldraw/editor'
2
+ import { b64Vecs, compressLegacySegments } from '@tldraw/editor'
3
+
4
+ /**
5
+ * Helper function to convert draw shape points from VecModel[] to base64 string.
6
+ * This is useful for tests that create draw shapes with the legacy array format.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const segments = [{ type: 'free', points: pointsToBase64([{x: 0, y: 0, z: 0.5}]) }]
11
+ * ```
12
+ *
13
+ * @public
14
+ */
15
+ export function pointsToBase64(points: VecModel[]): string {
16
+ return b64Vecs.encodePoints(points)
17
+ }
18
+
19
+ /**
20
+ * Helper function to convert base64 string back to VecModel[] points.
21
+ * This is useful for tests that need to inspect draw shape points.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const points = base64ToPoints(shape.props.segments[0].points)
26
+ * expect(points[0].x).toBe(0)
27
+ * ```
28
+ *
29
+ * @public
30
+ */
31
+ export function base64ToPoints(base64: string): VecModel[] {
32
+ return b64Vecs.decodePoints(base64)
33
+ }
34
+
35
+ /**
36
+ * Helper function to create draw shape segments from legacy array format.
37
+ * This allows tests to use the old format while the shape uses the new base64 format.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * editor.createShapes([{
42
+ * type: 'draw',
43
+ * props: {
44
+ * segments: createDrawSegments([[{x: 0, y: 0}, {x: 10, y: 10}]])
45
+ * }
46
+ * }])
47
+ * ```
48
+ * @public
49
+ */
50
+ export function createDrawSegments(
51
+ pointArrays: VecModel[][],
52
+ type: 'free' | 'straight' = 'free'
53
+ ): TLDrawShapeSegment[] {
54
+ return compressLegacySegments(
55
+ pointArrays.map((points) => ({
56
+ type,
57
+ points,
58
+ }))
59
+ )
60
+ }
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Extension,
3
3
  Extensions,
4
+ extensions,
4
5
  generateHTML,
5
6
  generateJSON,
6
7
  generateText,
@@ -19,7 +20,6 @@ import {
19
20
  WeakCache,
20
21
  } from '@tldraw/editor'
21
22
  import { DefaultFontFaces } from '../../shapes/shared/defaultFonts'
22
- import { TextDirection } from './textDirection'
23
23
 
24
24
  /** @public */
25
25
  export const KeyboardShiftEnterTweakExtension = Extension.create({
@@ -59,7 +59,11 @@ export const tipTapDefaultExtensions: Extensions = [
59
59
  }),
60
60
  Highlight,
61
61
  KeyboardShiftEnterTweakExtension,
62
- TextDirection,
62
+
63
+ // N.B. We disable the text direction core extension in RichTextArea,
64
+ // but we add it back in again here in our own extensions list so that
65
+ // people can omit/override it if they want to.
66
+ extensions.TextDirection.configure({ direction: 'auto' }),
63
67
  ]
64
68
 
65
69
  // todo: bust this if the editor changes, too
@@ -88,7 +92,6 @@ export function renderHtmlFromRichText(editor: Editor, richText: TLRichText) {
88
92
  * @param editor - The editor instance.
89
93
  * @param richText - The rich text content.
90
94
  *
91
- *
92
95
  * @public
93
96
  */
94
97
  export function renderHtmlFromRichTextForMeasurement(editor: Editor, richText: TLRichText) {
@@ -111,7 +114,6 @@ export function isEmptyRichText(richText: TLRichText) {
111
114
  * @param editor - The editor instance.
112
115
  * @param richText - The rich text content.
113
116
  *
114
- *
115
117
  * @public
116
118
  */
117
119
  export function renderPlaintextFromRichText(editor: Editor, richText: TLRichText) {
@@ -131,7 +133,6 @@ export function renderPlaintextFromRichText(editor: Editor, richText: TLRichText
131
133
  * @param editor - The editor instance.
132
134
  * @param richText - The rich text content.
133
135
  *
134
- *
135
136
  * @public
136
137
  */
137
138
  export function renderRichTextFromHTML(editor: Editor, html: string): TLRichText {