tldraw 4.3.0-next.f4772c19540d → 4.3.0

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 (636) hide show
  1. package/README.md +0 -2
  2. package/dist-cjs/index.d.ts +311 -242
  3. package/dist-cjs/index.js +13 -5
  4. package/dist-cjs/index.js.map +2 -2
  5. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  7. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  8. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  9. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  11. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  12. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  13. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  14. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  15. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  17. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  18. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  19. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  23. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  25. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  26. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  27. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  29. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  30. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  31. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  32. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
  33. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  35. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  36. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  37. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  38. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  39. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  41. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  42. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  44. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  46. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  47. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  48. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  49. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  50. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  51. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  52. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  53. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  54. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  55. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  56. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  57. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  59. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  61. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  62. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  63. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  64. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  65. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  66. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  67. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  68. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  69. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  70. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  72. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  73. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  74. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  75. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  76. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  77. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  78. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  79. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  80. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  81. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  82. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  83. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  84. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  85. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  86. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  87. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  88. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  89. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  90. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  91. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  92. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  93. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  94. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  95. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  96. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  97. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  98. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
  99. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  112. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  113. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  114. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
  115. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  116. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  117. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  118. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  119. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  132. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  133. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  134. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  135. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  137. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  138. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  139. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  140. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  141. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  142. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  143. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  144. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  145. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  146. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  147. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  148. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  149. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  150. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  151. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  152. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  153. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  154. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  155. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  156. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  157. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  159. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  161. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  162. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  163. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  164. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  165. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  166. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  167. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  168. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  169. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  170. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  171. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  172. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  173. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  174. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  175. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  176. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  177. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  178. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  180. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  181. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  182. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  183. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  184. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  185. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  186. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  190. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  191. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  192. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  194. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  195. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
  196. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  197. package/dist-cjs/lib/ui/context/actions.js +7 -8
  198. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  199. package/dist-cjs/lib/ui/context/components.js +1 -2
  200. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  201. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  202. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  203. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  204. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  205. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  206. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  207. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  208. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  209. package/dist-cjs/lib/ui/version.js +3 -3
  210. package/dist-cjs/lib/ui/version.js.map +1 -1
  211. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
  212. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  213. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  214. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  215. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  216. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  217. package/dist-cjs/lib/utils/text/richText.js +15 -19
  218. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  219. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  220. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  221. package/dist-esm/index.d.mts +311 -242
  222. package/dist-esm/index.mjs +14 -5
  223. package/dist-esm/index.mjs.map +2 -2
  224. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  225. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  226. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  227. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  228. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  229. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  230. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  231. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  232. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  234. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  236. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  238. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  241. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  243. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  244. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  246. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  248. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  250. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  251. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  252. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  253. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  254. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  255. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  256. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  257. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  258. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  259. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  260. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  261. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  262. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  263. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  264. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  265. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  266. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  267. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  268. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  269. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  270. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  271. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  272. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  274. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  275. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  276. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  277. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  278. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  279. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  280. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  281. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  282. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  283. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  284. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  285. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  286. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  287. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  288. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  289. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  290. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  291. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  292. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  293. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  294. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  295. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  296. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  297. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  298. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  299. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  300. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  301. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  302. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  303. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  304. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  305. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  306. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
  307. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  308. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  309. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  310. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  311. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  312. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  313. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  314. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  315. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  316. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
  317. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  318. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  319. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  327. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  328. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  329. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  330. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  331. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  332. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
  333. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  334. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  335. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  336. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  337. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  347. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  348. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  350. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  351. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  352. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  353. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  354. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  355. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  356. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  357. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  358. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  359. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  360. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  361. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  362. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  363. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  364. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  365. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  366. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  367. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  368. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  369. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  370. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  371. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  372. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  373. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  374. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  375. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  376. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  377. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  378. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  379. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  380. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  381. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  382. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  383. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  384. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  385. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  386. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  387. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  389. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  390. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  391. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  392. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  393. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  394. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  395. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  396. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  398. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  399. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  400. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  401. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  402. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  403. package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
  404. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  406. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  407. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  408. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  409. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  410. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  411. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  412. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  413. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
  414. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  415. package/dist-esm/lib/ui/context/actions.mjs +7 -8
  416. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  417. package/dist-esm/lib/ui/context/components.mjs +1 -2
  418. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  419. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  420. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  421. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  422. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  423. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  424. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  425. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  426. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  427. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  428. package/dist-esm/lib/ui/version.mjs +3 -3
  429. package/dist-esm/lib/ui/version.mjs.map +1 -1
  430. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
  431. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  432. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  433. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  434. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  435. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  436. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  437. package/dist-esm/lib/utils/text/richText.mjs +12 -5
  438. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  439. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  440. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  441. package/package.json +18 -16
  442. package/src/index.ts +6 -2
  443. package/src/lib/Tldraw.test.tsx +46 -1
  444. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  445. package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
  446. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  447. package/src/lib/defaultExternalContentHandlers.ts +13 -14
  448. package/src/lib/defaultSideEffects.ts +6 -1
  449. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  450. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  451. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  452. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  453. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  454. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  455. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  456. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  457. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  458. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  459. package/src/lib/shapes/arrow/shared.ts +4 -4
  460. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  461. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
  462. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  463. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  464. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  465. package/src/lib/shapes/draw/DrawShapeUtil.tsx +33 -27
  466. package/src/lib/shapes/draw/getPath.ts +31 -10
  467. package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
  468. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
  469. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  470. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  471. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  472. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  473. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  474. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  475. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  476. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +27 -24
  477. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  478. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  479. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  480. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  481. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  482. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  483. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  484. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  485. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  486. package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
  487. package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
  488. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  489. package/src/lib/shapes/shared/crop.ts +1 -0
  490. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  491. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  492. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  493. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  494. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  495. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  496. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  497. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  498. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  499. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  500. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  501. package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
  502. package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
  503. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  504. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  505. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  506. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  507. package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
  508. package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
  509. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  510. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
  511. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  512. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  513. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  514. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  515. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
  516. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
  517. package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
  518. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
  519. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  520. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
  521. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  522. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  523. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  524. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  525. package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
  526. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  527. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
  528. package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
  529. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  530. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  531. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  532. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  533. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  534. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  535. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  536. package/src/lib/ui/TldrawUi.tsx +5 -2
  537. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  538. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  539. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  540. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  541. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  542. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  543. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  544. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  545. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  546. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  547. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  548. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  549. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  550. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  551. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  552. package/src/lib/ui/components/menu-items.tsx +9 -15
  553. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  554. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  555. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  556. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  557. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  558. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
  559. package/src/lib/ui/context/actions.tsx +15 -19
  560. package/src/lib/ui/context/components.tsx +1 -2
  561. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  562. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  563. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  564. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  565. package/src/lib/ui/hooks/useTools.tsx +5 -7
  566. package/src/lib/ui/version.ts +3 -3
  567. package/src/lib/ui.css +27 -23
  568. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  569. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
  570. package/src/lib/utils/export/exportAs.ts +2 -9
  571. package/src/lib/utils/frames/frames.ts +1 -1
  572. package/src/lib/utils/test-helpers.ts +62 -0
  573. package/src/lib/utils/text/richText.ts +13 -8
  574. package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
  575. package/src/test/Editor.test.tsx +78 -41
  576. package/src/test/EraserTool.test.ts +10 -12
  577. package/src/test/SelectTool.test.ts +11 -19
  578. package/src/test/TestEditor.ts +49 -51
  579. package/src/test/TldrawEditor.test.tsx +24 -20
  580. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  581. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  582. package/src/test/arrows-megabus.test.tsx +1 -1
  583. package/src/test/bindings.test.tsx +29 -25
  584. package/src/test/bindingsIndex.test.tsx +4 -4
  585. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  586. package/src/test/commands/cameraState.test.ts +299 -0
  587. package/src/test/commands/createShape.test.ts +64 -0
  588. package/src/test/commands/createShapes.test.ts +15 -1
  589. package/src/test/commands/getSvgString.test.ts +2 -2
  590. package/src/test/commands/isShapeOfType.test.ts +44 -0
  591. package/src/test/commands/putContent.test.ts +80 -1
  592. package/src/test/commands/setCamera.test.ts +13 -11
  593. package/src/test/commands/stackShapes.test.ts +34 -8
  594. package/src/test/commands/updateShape.test.ts +67 -0
  595. package/src/test/commands/updateShapes.test.ts +21 -5
  596. package/src/test/commands/zoomToBounds.test.ts +19 -3
  597. package/src/test/commands/zoomToSelection.test.ts +14 -3
  598. package/src/test/custom-clipping.test.ts +52 -44
  599. package/src/test/customSnapping.test.tsx +77 -62
  600. package/src/test/drawing.test.ts +17 -10
  601. package/src/test/duplicate.test.ts +1 -1
  602. package/src/test/flipShapes.test.ts +33 -0
  603. package/src/test/frames.test.ts +94 -2
  604. package/src/test/getCulledShapes.test.tsx +11 -3
  605. package/src/test/getShapeAtPoint.test.ts +2 -2
  606. package/src/test/groups.test.tsx +7 -4
  607. package/src/test/modifiers.test.ts +6 -6
  608. package/src/test/resizing.test.ts +16 -22
  609. package/src/test/selection-omnibus.test.ts +13 -13
  610. package/src/test/shapeutils.test.ts +1 -1
  611. package/src/test/spacebarPanning.test.ts +28 -10
  612. package/src/test/styles2.test.tsx +1 -1
  613. package/src/test/styles3.test.ts +5 -5
  614. package/src/test/test-jsx.tsx +72 -57
  615. package/src/test/text.test.ts +15 -17
  616. package/src/test/translating.test.ts +6 -8
  617. package/src/test/ui/BackToContent.test.tsx +111 -0
  618. package/tldraw.css +41 -35
  619. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  620. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  621. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  622. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  623. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  624. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  625. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  626. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  627. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  628. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  629. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  630. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  631. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  632. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  633. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  634. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  635. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  636. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -5,8 +5,7 @@ import {
5
5
  TLBinding,
6
6
  TLBindingCreate,
7
7
  TLBindingId,
8
- TLDefaultBinding,
9
- TLDefaultShape,
8
+ TLShape,
10
9
  TLShapeId,
11
10
  TLShapePartial,
12
11
  ZERO_INDEX_KEY,
@@ -20,9 +19,13 @@ import {
20
19
  } from '@tldraw/editor'
21
20
  import React, { Fragment } from 'react'
22
21
 
22
+ // Re-export test helpers from their new location
23
+ export { base64ToPoints, createDrawSegments, pointsToBase64 } from '../lib/utils/test-helpers'
24
+
23
25
  const shapeTypeSymbol = Symbol('shapeJsx')
24
26
  const assetTypeSymbol = Symbol('assetJsx')
25
27
  const bindingTypeSymbol = Symbol('bindingJsx')
28
+
26
29
  interface CommonShapeProps {
27
30
  x?: number
28
31
  y?: number
@@ -34,7 +37,6 @@ interface CommonShapeProps {
34
37
  opacity?: number
35
38
  }
36
39
 
37
- type ShapeByType<Type extends TLDefaultShape['type']> = Extract<TLDefaultShape, { type: Type }>
38
40
  type FormatShapeProps<Props extends object> = {
39
41
  [K in keyof Props]?: Props[K] extends TLAssetId
40
42
  ? TLAssetId | React.JSX.Element
@@ -42,24 +44,39 @@ type FormatShapeProps<Props extends object> = {
42
44
  ? TLAssetId | React.JSX.Element | null
43
45
  : Props[K]
44
46
  }
45
- type PropsForShape<Type extends string> = Type extends TLDefaultShape['type']
46
- ? CommonShapeProps & FormatShapeProps<ShapeByType<Type>['props']>
47
- : CommonShapeProps & Record<string, unknown>
47
+ type PropsForShape<Type extends TLShape['type']> = CommonShapeProps &
48
+ FormatShapeProps<TLShape<Type>['props']>
48
49
 
49
50
  type AssetByType<Type extends TLAsset['type']> = Extract<TLAsset, { type: Type }>
50
51
  type PropsForAsset<Type extends string> = Type extends TLAsset['type']
51
52
  ? Partial<AssetByType<Type>['props']>
52
53
  : Record<string, unknown>
53
54
 
54
- interface CommonBindingProps {
55
+ interface BindingReactConnections {
55
56
  from?: string | TLShapeId
56
57
  to: string | TLShapeId
57
58
  }
58
59
 
59
- type BindingByType<Type extends TLBinding['type']> = Extract<TLBinding, { type: Type }>
60
- type PropsForBinding<Type extends string> = Type extends TLBinding['type']
61
- ? CommonBindingProps & Partial<BindingByType<Type>['props']>
62
- : CommonBindingProps & Record<string, unknown>
60
+ interface CommonBindingReactProps extends BindingReactConnections {
61
+ ref?: string
62
+ id?: TLBindingId
63
+ }
64
+
65
+ type ReactPropsForBinding<Type extends TLBinding['type']> = CommonBindingReactProps &
66
+ Partial<TLBinding<Type>['props']>
67
+
68
+ type BindingToCreate = TLBinding extends infer E
69
+ ? E extends TLBinding
70
+ ? {
71
+ type: E['type']
72
+ props: Partial<TLBinding<E['type']>['props']>
73
+ id: TLBindingId | undefined
74
+ parentId: TLShapeId | undefined
75
+ ref: string | undefined
76
+ connections: BindingReactConnections
77
+ }
78
+ : never
79
+ : never
63
80
 
64
81
  const createElement = (
65
82
  type: typeof shapeTypeSymbol | typeof assetTypeSymbol | typeof bindingTypeSymbol,
@@ -90,10 +107,9 @@ const tlBinding = new Proxy(
90
107
  return createElement(bindingTypeSymbol, key as string)
91
108
  },
92
109
  }
93
- ) as { [K in TLDefaultBinding['type']]: (props: PropsForBinding<K>) => null } & Record<
94
- string,
95
- (props: PropsForBinding<string>) => null
96
- >
110
+ ) as {
111
+ [K in TLBinding['type']]: (props: ReactPropsForBinding<K>) => null
112
+ }
97
113
 
98
114
  /**
99
115
  * TL - jsx helpers for creating tldraw shapes in test cases
@@ -112,8 +128,8 @@ export const TL = new Proxy(
112
128
  },
113
129
  }
114
130
  ) as { asset: typeof tlAsset; binding: typeof tlBinding } & {
115
- [K in TLDefaultShape['type']]: (props: PropsForShape<K>) => null
116
- } & Record<string, (props: PropsForShape<string>) => null>
131
+ [K in TLShape['type']]: (props: PropsForShape<K>) => null
132
+ }
117
133
 
118
134
  export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Element>, idPrefix = '') {
119
135
  const ids = { bindings: {} } as Record<string, TLShapeId> & {
@@ -122,12 +138,7 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
122
138
  const currentPageShapes: Array<TLShapePartial> = []
123
139
  const assets: Array<TLAsset> = []
124
140
 
125
- const bindingsToCreate: Array<{
126
- type: string
127
- props: Record<string, unknown>
128
- parentId: TLShapeId | undefined
129
- ref: string | undefined
130
- }> = []
141
+ const bindingsToCreate: Array<BindingToCreate> = []
131
142
 
132
143
  function addChildren(
133
144
  children: React.JSX.Element | Array<React.JSX.Element>,
@@ -152,10 +163,21 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
152
163
  }
153
164
 
154
165
  if (el.type[bindingTypeSymbol]) {
155
- const bindingType = (el.type as any)[bindingTypeSymbol] as string
156
- const ref = ((el as any).ref || el.props.ref) as string | undefined
157
- assert(ref === undefined || typeof ref === 'string', 'ref must be string or undefined')
158
- bindingsToCreate.push({ type: bindingType, props: el.props, parentId, ref })
166
+ const bindingType = (el.type as any)[bindingTypeSymbol] as TLBinding['type']
167
+ const { id, from, to, ref, ...props } = el.props
168
+ const bindingRef: unknown = (el as any).ref || ref
169
+ assert(
170
+ bindingRef === undefined || typeof bindingRef === 'string',
171
+ 'ref must be string or undefined'
172
+ )
173
+ bindingsToCreate.push({
174
+ type: bindingType,
175
+ props,
176
+ id,
177
+ parentId,
178
+ ref: bindingRef,
179
+ connections: { from, to },
180
+ })
159
181
  } else {
160
182
  const shapeType = (el.type as any)[shapeTypeSymbol] as string
161
183
  if (!shapeType) {
@@ -239,55 +261,48 @@ export function shapesFromJsx(shapes: React.JSX.Element | Array<React.JSX.Elemen
239
261
  addChildren(shapes)
240
262
 
241
263
  const bindings: TLBindingCreate[] = []
242
- for (const binding of bindingsToCreate) {
264
+ for (const { id, parentId, ref, connections, ...binding } of bindingsToCreate) {
243
265
  let fromId: TLShapeId, toId: TLShapeId
244
- if (binding.props.from) {
245
- assert(typeof binding.props.from === 'string', 'from must be a ref string or a shape id')
246
- if (isShapeId(binding.props.from)) {
247
- fromId = binding.props.from
266
+ if (connections.from) {
267
+ assert(typeof connections.from === 'string', 'from must be a ref string or a shape id')
268
+ if (isShapeId(connections.from)) {
269
+ fromId = connections.from
248
270
  } else {
249
- assert(ids[binding.props.from], `Ref not found: ${binding.props.from}`)
250
- fromId = ids[binding.props.from]
271
+ assert(ids[connections.from], `Ref not found: ${connections.from}`)
272
+ fromId = ids[connections.from]
251
273
  }
252
- } else if (binding.parentId) {
253
- fromId = binding.parentId
274
+ } else if (parentId) {
275
+ fromId = parentId
254
276
  } else {
255
277
  throw new Error('from must be specified, or binding must be a child of a shape')
256
278
  }
257
279
 
258
- assert(binding.props.to, 'to must be specified')
259
- assert(typeof binding.props.to === 'string', 'to must be a ref string or a shape id')
260
- if (isShapeId(binding.props.to)) {
261
- toId = binding.props.to
280
+ assert(connections.to, 'to must be specified')
281
+ assert(typeof connections.to === 'string', 'to must be a ref string or a shape id')
282
+ if (isShapeId(connections.to)) {
283
+ toId = connections.to
262
284
  } else {
263
- assert(ids[binding.props.to], `Ref not found: ${binding.props.to}`)
264
- toId = ids[binding.props.to]
285
+ assert(ids[connections.to], `Ref not found: ${connections.to}`)
286
+ toId = ids[connections.to]
265
287
  }
266
288
 
267
- let bindingId: TLBindingId = binding.props.id as TLBindingId
268
- if (binding.ref) {
269
- assert(typeof binding.ref === 'string', 'binding ref must be string')
270
- assert(!ids.bindings[binding.ref], `Duplicate ref: ${binding.ref}`)
271
- assert(!bindingId, `Cannot use both ref and id on binding: ${binding.ref}`)
272
- bindingId = createBindingId(`${idPrefix}${binding.ref}`)
273
- ids.bindings[binding.ref] = bindingId
289
+ let bindingId = id
290
+ if (ref) {
291
+ assert(typeof ref === 'string', 'binding ref must be string')
292
+ assert(!ids.bindings[ref], `Duplicate ref: ${ref}`)
293
+ assert(!bindingId, `Cannot use both ref and id on binding: ${ref}`)
294
+ bindingId = createBindingId(`${idPrefix}${ref}`)
295
+ ids.bindings[ref] = bindingId
274
296
  }
275
297
  if (!bindingId) {
276
298
  bindingId = createBindingId()
277
299
  }
278
300
 
279
- const props = { ...binding.props }
280
- delete props.ref
281
- delete props.id
282
- delete props.from
283
- delete props.to
284
-
285
301
  bindings.push({
302
+ ...binding,
286
303
  id: bindingId,
287
- type: binding.type,
288
304
  fromId,
289
305
  toId,
290
- props,
291
306
  })
292
307
  }
293
308
 
@@ -1,4 +1,4 @@
1
- import { TLTextShape, createShapeId, toRichText } from '@tldraw/editor'
1
+ import { createShapeId, toRichText } from '@tldraw/editor'
2
2
  import { TestEditor } from './TestEditor'
3
3
 
4
4
  let editor: TestEditor
@@ -13,7 +13,7 @@ afterEach(() => {
13
13
  describe('When editing text', () => {
14
14
  it('preserves the top center when center aligned', () => {
15
15
  const id = createShapeId()
16
- editor.createShapes<TLTextShape>([
16
+ editor.createShapes([
17
17
  {
18
18
  id,
19
19
  type: 'text',
@@ -27,7 +27,7 @@ describe('When editing text', () => {
27
27
  },
28
28
  ])
29
29
  const boundsA = editor.getShapePageBounds(id)
30
- editor.updateShapes<TLTextShape>([
30
+ editor.updateShapes([
31
31
  {
32
32
  id,
33
33
  type: 'text',
@@ -47,7 +47,7 @@ describe('When editing text', () => {
47
47
 
48
48
  it('preserved the right center when center aligned and rotated 90deg', () => {
49
49
  const id = createShapeId()
50
- editor.createShapes<TLTextShape>([
50
+ editor.createShapes([
51
51
  {
52
52
  id,
53
53
  type: 'text',
@@ -63,9 +63,7 @@ describe('When editing text', () => {
63
63
  ])
64
64
 
65
65
  const boundsA = editor.getShapePageBounds(id)!
66
- editor.updateShapes<TLTextShape>([
67
- { id, type: 'text', props: { richText: toRichText('Hello, world!') } },
68
- ])
66
+ editor.updateShapes([{ id, type: 'text', props: { richText: toRichText('Hello, world!') } }])
69
67
  const boundsB = editor.getShapePageBounds(id)!
70
68
  expect(boundsA.x).toBeCloseTo(boundsB.x)
71
69
  expect(boundsA.y).not.toBeCloseTo(boundsB.y)
@@ -75,7 +73,7 @@ describe('When editing text', () => {
75
73
 
76
74
  it('preserves the top left corner when start aligned', () => {
77
75
  const id = createShapeId()
78
- editor.createShapes<TLTextShape>([
76
+ editor.createShapes([
79
77
  {
80
78
  id,
81
79
  type: 'text',
@@ -89,7 +87,7 @@ describe('When editing text', () => {
89
87
  },
90
88
  ])
91
89
  const boundsA = editor.getShapePageBounds(id)
92
- editor.updateShapes<TLTextShape>([
90
+ editor.updateShapes([
93
91
  {
94
92
  id,
95
93
  type: 'text',
@@ -109,7 +107,7 @@ describe('When editing text', () => {
109
107
 
110
108
  it('preserves the top right edge when end aligned', () => {
111
109
  const id = createShapeId()
112
- editor.createShapes<TLTextShape>([
110
+ editor.createShapes([
113
111
  {
114
112
  id,
115
113
  type: 'text',
@@ -123,7 +121,7 @@ describe('When editing text', () => {
123
121
  },
124
122
  ])
125
123
  const boundsA = editor.getShapePageBounds(id)
126
- editor.updateShapes<TLTextShape>([
124
+ editor.updateShapes([
127
125
  {
128
126
  id,
129
127
  type: 'text',
@@ -145,7 +143,7 @@ describe('When editing text', () => {
145
143
  describe('When changing text size', () => {
146
144
  it('preserves the center when center aligned', () => {
147
145
  const id = createShapeId()
148
- editor.createShapes<TLTextShape>([
146
+ editor.createShapes([
149
147
  {
150
148
  id,
151
149
  type: 'text',
@@ -160,7 +158,7 @@ describe('When changing text size', () => {
160
158
  },
161
159
  ])
162
160
  const boundsA = editor.getShapePageBounds(id)
163
- editor.updateShapes<TLTextShape>([
161
+ editor.updateShapes([
164
162
  {
165
163
  id,
166
164
  type: 'text',
@@ -180,7 +178,7 @@ describe('When changing text size', () => {
180
178
 
181
179
  it('preserves the center left point when start aligned', () => {
182
180
  const id = createShapeId()
183
- editor.createShapes<TLTextShape>([
181
+ editor.createShapes([
184
182
  {
185
183
  id,
186
184
  type: 'text',
@@ -195,7 +193,7 @@ describe('When changing text size', () => {
195
193
  },
196
194
  ])
197
195
  const boundsA = editor.getShapePageBounds(id)
198
- editor.updateShapes<TLTextShape>([
196
+ editor.updateShapes([
199
197
  {
200
198
  id,
201
199
  type: 'text',
@@ -215,7 +213,7 @@ describe('When changing text size', () => {
215
213
 
216
214
  it('preserves the top right edge when end aligned', () => {
217
215
  const id = createShapeId()
218
- editor.createShapes<TLTextShape>([
216
+ editor.createShapes([
219
217
  {
220
218
  id,
221
219
  type: 'text',
@@ -230,7 +228,7 @@ describe('When changing text size', () => {
230
228
  },
231
229
  ])
232
230
  const boundsA = editor.getShapePageBounds(id)
233
- editor.updateShapes<TLTextShape>([
231
+ editor.updateShapes([
234
232
  {
235
233
  id,
236
234
  type: 'text',
@@ -1749,9 +1749,7 @@ describe('translating a shape with a bound shape', () => {
1749
1749
 
1750
1750
  const newArrow = editor
1751
1751
  .getCurrentPageShapes()
1752
- .find(
1753
- (s) => editor.isShapeOfType<TLArrowShape>(s, 'arrow') && s.id !== arrow1
1754
- )! as TLArrowShape
1752
+ .find((s) => editor.isShapeOfType(s, 'arrow') && s.id !== arrow1)! as TLArrowShape
1755
1753
  expect(getArrowBindings(editor, newArrow)).toMatchObject({
1756
1754
  start: { type: 'arrow' },
1757
1755
  end: undefined,
@@ -2061,7 +2059,7 @@ describe('Note shape grid helper positions / pits', () => {
2061
2059
  editor
2062
2060
  .createShape({ type: 'note' })
2063
2061
  .createShape({ type: 'note', x: 500, y: 500 })
2064
- .updateShape({ ...editor.getLastCreatedShape(), props: { growY: 100 } })
2062
+ .updateShape({ ...editor.getLastCreatedShape<TLNoteShape>(), props: { growY: 100 } })
2065
2063
  .pointerMove(600, 600)
2066
2064
  // start translating
2067
2065
  .pointerDown()
@@ -2080,7 +2078,7 @@ describe('Note shape grid helper positions / pits', () => {
2080
2078
  it('Snaps correctly to the bottom when the not-translating shape has growY', () => {
2081
2079
  editor
2082
2080
  .createShape({ type: 'note' })
2083
- .updateShape({ ...editor.getLastCreatedShape(), props: { growY: 100 } })
2081
+ .updateShape({ ...editor.getLastCreatedShape<TLNoteShape>(), props: { growY: 100 } })
2084
2082
  .createShape({ type: 'note', x: 500, y: 500 })
2085
2083
  .pointerMove(600, 600)
2086
2084
  // start translating
@@ -2183,7 +2181,7 @@ describe('Note shape grid helper positions / pits', () => {
2183
2181
 
2184
2182
  describe('cancelling a translate operation', () => {
2185
2183
  it('undoes any changes since the start of the translate operation', () => {
2186
- editor.createShape<TLGeoShape>({
2184
+ editor.createShape({
2187
2185
  type: 'geo',
2188
2186
  x: 0,
2189
2187
  y: 0,
@@ -2220,7 +2218,7 @@ describe('cancelling a translate operation', () => {
2220
2218
  const shapeId = createShapeId()
2221
2219
 
2222
2220
  editor
2223
- .createShape<TLGeoShape>({
2221
+ .createShape({
2224
2222
  id: shapeId,
2225
2223
  type: 'geo',
2226
2224
  x: 0,
@@ -2268,7 +2266,7 @@ describe('cancelling a translate operation', () => {
2268
2266
  const shapeId = createShapeId()
2269
2267
 
2270
2268
  editor
2271
- .createShape<TLGeoShape>({
2269
+ .createShape({
2272
2270
  id: shapeId,
2273
2271
  type: 'geo',
2274
2272
  x: 0,
@@ -0,0 +1,111 @@
1
+ import { act, screen, waitFor } from '@testing-library/react'
2
+ import { Box, Editor, Vec } from '@tldraw/editor'
3
+ import { Tldraw } from '../../lib/Tldraw'
4
+ import { renderTldrawComponentWithEditor } from '../testutils/renderTldrawComponent'
5
+
6
+ let editor: Editor
7
+
8
+ beforeEach(async () => {
9
+ const result = await renderTldrawComponentWithEditor((onMount) => <Tldraw onMount={onMount} />, {
10
+ waitForPatterns: false,
11
+ })
12
+ editor = result.editor
13
+
14
+ // Set up a proper viewport so shapes can be on/off screen
15
+ act(() => {
16
+ editor.updateViewportScreenBounds(new Box(0, 0, 1000, 800))
17
+ })
18
+ })
19
+
20
+ function createShapeInViewport() {
21
+ act(() => {
22
+ editor.createShape({
23
+ type: 'geo',
24
+ x: 100,
25
+ y: 100,
26
+ props: { w: 100, h: 100 },
27
+ })
28
+ })
29
+ }
30
+
31
+ function panAllShapesOffScreen() {
32
+ // Move camera so all shapes are off-screen
33
+ act(() => {
34
+ const camera = editor.getCamera()
35
+ editor.setCamera(new Vec(camera.x - 2000, camera.y - 2000, camera.z), { immediate: true })
36
+ })
37
+ }
38
+
39
+ describe('BackToContent button', () => {
40
+ it('shows when all shapes are off-screen', async () => {
41
+ createShapeInViewport()
42
+
43
+ // Initially, button should not be visible (shapes are on screen)
44
+ await waitFor(() => {
45
+ expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
46
+ })
47
+
48
+ panAllShapesOffScreen()
49
+
50
+ // Now the button should appear
51
+ await waitFor(() => {
52
+ expect(screen.queryByTestId('helper-buttons.back-to-content')).not.toBeNull()
53
+ })
54
+ })
55
+
56
+ it('shows when selected shapes are off-screen', async () => {
57
+ createShapeInViewport()
58
+
59
+ await waitFor(() => {
60
+ expect(editor.getCurrentPageShapeIds().size).toBe(1)
61
+ })
62
+
63
+ const shapeId = editor.getCurrentPageShapeIds().values().next().value!
64
+
65
+ // Select the shape
66
+ act(() => {
67
+ editor.select(shapeId)
68
+ })
69
+
70
+ // Initially, button should not be visible
71
+ await waitFor(() => {
72
+ expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
73
+ })
74
+
75
+ panAllShapesOffScreen()
76
+
77
+ // Button should still appear even though selected shapes aren't culled
78
+ await waitFor(() => {
79
+ expect(screen.queryByTestId('helper-buttons.back-to-content')).not.toBeNull()
80
+ })
81
+ })
82
+
83
+ it('does not show when some shapes are still on-screen', async () => {
84
+ // Create two shapes
85
+ act(() => {
86
+ editor.createShape({
87
+ type: 'geo',
88
+ x: 100,
89
+ y: 100,
90
+ props: { w: 100, h: 100 },
91
+ })
92
+ editor.createShape({
93
+ type: 'geo',
94
+ x: 500,
95
+ y: 500,
96
+ props: { w: 100, h: 100 },
97
+ })
98
+ })
99
+
100
+ // Pan so only the first shape is off-screen
101
+ act(() => {
102
+ const camera = editor.getCamera()
103
+ editor.setCamera(new Vec(camera.x - 300, camera.y - 300, camera.z), { immediate: true })
104
+ })
105
+
106
+ // Button should not appear since one shape is still visible
107
+ await waitFor(() => {
108
+ expect(screen.queryByTestId('helper-buttons.back-to-content')).toBeNull()
109
+ })
110
+ })
111
+ })
package/tldraw.css CHANGED
@@ -611,7 +611,6 @@ input,
611
611
  pointer-events: all;
612
612
  white-space: pre-wrap;
613
613
  overflow-wrap: break-word;
614
- text-shadow: var(--tl-text-outline);
615
614
  }
616
615
 
617
616
  .tl-text-wrapper[data-font='draw'] {
@@ -713,7 +712,7 @@ input,
713
712
  resize: none;
714
713
  border: none;
715
714
  user-select: none;
716
- contain: style paint;
715
+ contain: layout style paint;
717
716
  /* N.B. This property, while discouraged ("intended for Document Type Definition (DTD) designers") is necessary for ensuring correct mixed RTL/LTR behavior when exporting SVGs. */
718
717
  unicode-bidi: plaintext;
719
718
  -webkit-user-select: none;
@@ -774,7 +773,6 @@ input,
774
773
  justify-content: center;
775
774
  align-items: center;
776
775
  color: var(--tl-color-text);
777
- text-shadow: var(--tl-text-outline);
778
776
  line-height: inherit;
779
777
  position: absolute;
780
778
  inset: 0px;
@@ -974,6 +972,14 @@ input,
974
972
  display: block;
975
973
  }
976
974
 
975
+ .tl-text__outline {
976
+ text-shadow: var(--tl-text-outline);
977
+ }
978
+
979
+ .tl-text__no-outline {
980
+ text-shadow: none;
981
+ }
982
+
977
983
  /* --------------------- Loading -------------------- */
978
984
 
979
985
  .tl-loading {
@@ -1138,14 +1144,12 @@ input,
1138
1144
  fill: none;
1139
1145
  }
1140
1146
 
1141
- @media (pointer: coarse) {
1142
- .tl-handle__bg:active {
1143
- fill: var(--tl-color-selection-fill);
1144
- }
1147
+ .tl-container[data-coarse='true'] .tl-handle__bg:active {
1148
+ fill: var(--tl-color-selection-fill);
1149
+ }
1145
1150
 
1146
- .tl-handle__create {
1147
- opacity: 1;
1148
- }
1151
+ .tl-container[data-coarse='true'] .tl-handle__create {
1152
+ opacity: 1;
1149
1153
  }
1150
1154
 
1151
1155
  .tl-rotate-corner:not(:hover),
@@ -1221,7 +1225,6 @@ input,
1221
1225
  align-items: center;
1222
1226
  text-align: center;
1223
1227
  color: var(--tl-color-text);
1224
- text-shadow: var(--tl-text-outline);
1225
1228
  }
1226
1229
 
1227
1230
  .tl-shape[data-shape-type='arrow'] .tl-text-label__inner {
@@ -1450,7 +1453,6 @@ input,
1450
1453
  }
1451
1454
 
1452
1455
  .tl-note__container > .tl-text-label {
1453
- text-shadow: none;
1454
1456
  color: currentColor;
1455
1457
  }
1456
1458
 
@@ -2410,25 +2412,31 @@ it from receiving any pointer events or affecting the cursor. */
2410
2412
 
2411
2413
  /* Submenu triggers */
2412
2414
 
2413
- .tlui-menu__submenu__trigger[data-state='open']::after {
2414
- opacity: 1;
2415
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2415
+ .tlui-menu__submenu__trigger {
2416
+ --gradient-angle: 90deg;
2417
+ }
2418
+
2419
+ .tlui-menu__submenu__trigger[data-direction='left'] {
2420
+ --gradient-angle: 270deg;
2416
2421
  }
2417
2422
 
2418
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']::after {
2423
+ .tlui-menu__submenu__trigger[data-state='open']::after {
2419
2424
  opacity: 1;
2420
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2425
+ background: linear-gradient(
2426
+ var(--gradient-angle),
2427
+ rgba(144, 144, 144, 0) 0%,
2428
+ var(--tl-color-muted-2) 100%
2429
+ );
2421
2430
  }
2422
2431
 
2423
2432
  @media (hover: hover) {
2424
- .tlui-menu__submenu__trigger[data-state='open']:not(:hover)::after {
2433
+ .tlui-menu__submenu__trigger:is(:hover, [data-state='open'])::after {
2425
2434
  opacity: 1;
2426
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2427
- }
2428
-
2429
- .tlui-menu__submenu__trigger[data-direction='left'][data-state='open']:not(:hover)::after {
2430
- opacity: 1;
2431
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2435
+ background: linear-gradient(
2436
+ var(--gradient-angle),
2437
+ rgba(144, 144, 144, 0) 0%,
2438
+ var(--tl-color-muted-2) 100%
2439
+ );
2432
2440
  }
2433
2441
  }
2434
2442
 
@@ -2707,10 +2715,8 @@ it from receiving any pointer events or affecting the cursor. */
2707
2715
  }
2708
2716
  }
2709
2717
 
2710
- @media (any-pointer: coarse) {
2711
- .tlui-page_menu__item__submenu > .tlui-button {
2712
- opacity: 1;
2713
- }
2718
+ .tl-container[data-coarse='true'] .tlui-page_menu__item__submenu > .tlui-button {
2719
+ opacity: 1;
2714
2720
  }
2715
2721
 
2716
2722
  .tlui-button__icon {
@@ -2749,16 +2755,15 @@ it from receiving any pointer events or affecting the cursor. */
2749
2755
 
2750
2756
  .tlui-offline-indicator {
2751
2757
  display: flex;
2752
- flex-direction: row;
2753
- gap: var(--tl-space-3);
2754
- color: var(--tl-color-text);
2755
- background-color: var(--tl-color-low);
2756
- border: 3px solid var(--tl-color-background);
2757
- padding: 0px var(--tl-space-5);
2758
- height: 42px;
2758
+ color: var(--tl-color-background);
2759
+ background-color: var(--tl-color-text);
2760
+ border: none;
2761
+ width: 32px;
2762
+ height: 32px;
2759
2763
  align-items: center;
2760
2764
  justify-content: center;
2761
2765
  border-radius: 99px;
2766
+ cursor: default;
2762
2767
  opacity: 0;
2763
2768
  animation: tl-fade-in;
2764
2769
  animation-duration: 0.12s;
@@ -3076,6 +3081,7 @@ tldraw? probably.
3076
3081
  position: relative;
3077
3082
  background: var(--tl-color-panel);
3078
3083
  box-shadow: var(--tl-shadow-2);
3084
+ contain: layout style paint;
3079
3085
  }
3080
3086
 
3081
3087
  .tlui-main-toolbar--horizontal .tlui-main-toolbar__mobile-style-panel {
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/shapes/shared/useForceSolid.ts"],
4
- "sourcesContent": ["import { useEditor, useValue } from '@tldraw/editor'\n\nexport function useForceSolid() {\n\tconst editor = useEditor()\n\treturn useValue('zoom', () => editor.getZoomLevel() < 0.35, [editor])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AAE7B,SAAS,gBAAgB;AAC/B,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,QAAQ,MAAM,OAAO,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC;AACrE;",
6
- "names": []
7
- }