tldraw 4.3.0-next.82cfddd7ee89 → 4.3.0-next.842fb21476f2

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 (635) hide show
  1. package/dist-cjs/index.d.ts +311 -242
  2. package/dist-cjs/index.js +13 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  5. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +2 -2
  6. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  7. package/dist-cjs/lib/defaultEmbedDefinitions.js +1 -1
  8. package/dist-cjs/lib/defaultEmbedDefinitions.js.map +2 -2
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -5
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  11. package/dist-cjs/lib/defaultSideEffects.js +6 -1
  12. package/dist-cjs/lib/defaultSideEffects.js.map +2 -2
  13. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +14 -13
  14. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  15. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  16. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +1 -1
  17. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  18. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  19. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  21. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js +1 -1
  22. package/dist-cjs/lib/shapes/arrow/elbow/getElbowArrowInfo.js.map +2 -2
  23. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +4 -10
  25. package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +2 -2
  26. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +7 -4
  27. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  28. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +1 -1
  29. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  31. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +25 -23
  32. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/shapes/draw/getPath.js +20 -11
  34. package/dist-cjs/lib/shapes/draw/getPath.js.map +2 -2
  35. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +82 -86
  36. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +3 -3
  37. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +6 -0
  38. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  40. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +6 -5
  41. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  42. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +146 -142
  43. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  44. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +5 -10
  45. package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +2 -2
  46. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +3 -3
  47. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  48. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +23 -21
  49. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  50. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +3 -3
  51. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  52. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -11
  53. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  54. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  55. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js +5 -10
  56. package/dist-cjs/lib/shapes/note/toolStates/Pointing.js.map +2 -2
  57. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +3 -2
  58. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  59. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +14 -2
  60. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +3 -3
  61. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +12 -4
  62. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +3 -3
  63. package/dist-cjs/lib/shapes/shared/ShapeFill.js +2 -2
  64. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  65. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  66. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  67. package/dist-cjs/lib/shapes/shared/interpolate-props.js +3 -3
  68. package/dist-cjs/lib/shapes/shared/interpolate-props.js.map +2 -2
  69. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  70. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  71. package/dist-cjs/lib/shapes/shared/{useForceSolid.js → useEfficientZoomThreshold.js} +10 -7
  72. package/dist-cjs/lib/shapes/shared/useEfficientZoomThreshold.js.map +7 -0
  73. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +1 -1
  74. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  75. package/dist-cjs/lib/shapes/text/RichTextArea.js +5 -0
  76. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  77. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +5 -2
  78. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  79. package/dist-cjs/lib/shapes/text/toolStates/Idle.js +4 -10
  80. package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +2 -2
  81. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +7 -5
  82. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  83. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +1 -1
  84. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +2 -2
  85. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +4 -5
  86. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  87. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +2 -4
  88. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  89. package/dist-cjs/lib/tools/HandTool/HandTool.js +3 -5
  90. package/dist-cjs/lib/tools/HandTool/HandTool.js.map +2 -2
  91. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js +3 -2
  92. package/dist-cjs/lib/tools/HandTool/childStates/Dragging.js.map +2 -2
  93. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js +1 -1
  94. package/dist-cjs/lib/tools/HandTool/childStates/Pointing.js.map +2 -2
  95. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js +1 -1
  96. package/dist-cjs/lib/tools/LaserTool/childStates/Lasering.js.map +2 -2
  97. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +10 -11
  98. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  99. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +6 -5
  100. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  101. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js +4 -6
  102. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Cropping.js.map +2 -2
  103. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +1 -1
  104. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  105. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +1 -1
  106. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  107. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +1 -1
  108. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
  109. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +2 -1
  110. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +2 -2
  111. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js +1 -1
  112. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.js.map +2 -2
  113. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +8 -6
  114. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  115. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +38 -11
  116. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  117. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +42 -50
  118. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  119. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js +6 -6
  120. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  121. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +1 -1
  122. package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
  123. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -14
  124. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  125. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +1 -1
  126. package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
  127. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +1 -1
  128. package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
  129. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -2
  130. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  131. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +4 -13
  132. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  133. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -6
  134. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  135. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -3
  136. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  137. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +7 -6
  138. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  139. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +13 -11
  140. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  141. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +15 -4
  142. package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
  143. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js +1 -1
  144. package/dist-cjs/lib/tools/ZoomTool/ZoomTool.js.map +2 -2
  145. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js +3 -3
  146. package/dist-cjs/lib/tools/ZoomTool/childStates/Pointing.js.map +2 -2
  147. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js +5 -6
  148. package/dist-cjs/lib/tools/ZoomTool/childStates/ZoomBrushing.js.map +2 -2
  149. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js +1 -3
  150. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  151. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js +1 -1
  152. package/dist-cjs/lib/tools/selection-logic/selectOnCanvasPointerUp.js.map +2 -2
  153. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js +1 -1
  154. package/dist-cjs/lib/tools/selection-logic/updateHoveredShapeId.js.map +2 -2
  155. package/dist-cjs/lib/ui/TldrawUi.js +2 -2
  156. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  157. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js +3 -9
  158. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.js.map +2 -2
  159. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +1 -3
  160. package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
  161. package/dist-cjs/lib/ui/components/CursorChatBubble.js +1 -1
  162. package/dist-cjs/lib/ui/components/CursorChatBubble.js.map +2 -2
  163. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js +1 -21
  164. package/dist-cjs/lib/ui/components/DefaultDebugPanel.js.map +2 -2
  165. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  166. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  167. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js +1 -1
  168. package/dist-cjs/lib/ui/components/HelperButtons/BackToContent.js.map +2 -2
  169. package/dist-cjs/lib/ui/components/HelperButtons/StopFollowing.js.map +2 -2
  170. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -1
  171. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  172. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js +2 -15
  173. package/dist-cjs/lib/ui/components/OfflineIndicator/OfflineIndicator.js.map +3 -3
  174. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js +3 -1
  175. package/dist-cjs/lib/ui/components/PageMenu/PageItemInput.js.map +2 -2
  176. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js +6 -0
  177. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenu.js.map +2 -2
  178. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  179. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +1 -1
  180. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +2 -2
  181. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js +1 -1
  182. package/dist-cjs/lib/ui/components/Toolbar/DefaultRichTextToolbar.js.map +2 -2
  183. package/dist-cjs/lib/ui/components/TopPanel/CenteredTopPanelContainer.js.map +1 -1
  184. package/dist-cjs/lib/ui/components/menu-items.js +3 -1
  185. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  186. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +3 -1
  187. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  188. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  189. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  190. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +149 -93
  191. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  192. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.js.map +2 -2
  193. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.js.map +2 -2
  194. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +14 -7
  195. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  196. package/dist-cjs/lib/ui/context/actions.js +7 -8
  197. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  198. package/dist-cjs/lib/ui/context/components.js +1 -2
  199. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  200. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  201. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +2 -2
  202. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  203. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  204. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  205. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  206. package/dist-cjs/lib/ui/hooks/useTools.js +4 -5
  207. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  208. package/dist-cjs/lib/ui/version.js +3 -3
  209. package/dist-cjs/lib/ui/version.js.map +1 -1
  210. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +16 -6
  211. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  212. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  213. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  214. package/dist-cjs/lib/{tools/selection-logic/getShouldEnterCropModeOnPointerDown.js → utils/test-helpers.js} +21 -8
  215. package/dist-cjs/lib/utils/test-helpers.js.map +7 -0
  216. package/dist-cjs/lib/utils/text/richText.js +11 -19
  217. package/dist-cjs/lib/utils/text/richText.js.map +3 -3
  218. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +7 -2
  219. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  220. package/dist-esm/index.d.mts +311 -242
  221. package/dist-esm/index.mjs +14 -5
  222. package/dist-esm/index.mjs.map +2 -2
  223. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  224. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +2 -2
  225. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  226. package/dist-esm/lib/defaultEmbedDefinitions.mjs +1 -1
  227. package/dist-esm/lib/defaultEmbedDefinitions.mjs.map +2 -2
  228. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -5
  229. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  230. package/dist-esm/lib/defaultSideEffects.mjs +6 -1
  231. package/dist-esm/lib/defaultSideEffects.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +15 -15
  233. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +1 -1
  235. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  237. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs +1 -1
  240. package/dist-esm/lib/shapes/arrow/elbow/getElbowArrowInfo.mjs.map +2 -2
  241. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +4 -10
  243. package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +7 -4
  245. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  246. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +1 -1
  247. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  248. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +30 -25
  250. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  251. package/dist-esm/lib/shapes/draw/getPath.mjs +21 -11
  252. package/dist-esm/lib/shapes/draw/getPath.mjs.map +2 -2
  253. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +83 -86
  254. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +3 -3
  255. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +6 -0
  256. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  257. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  258. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +6 -5
  259. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  260. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +147 -142
  261. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  262. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +5 -10
  263. package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +2 -2
  264. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +3 -3
  265. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  266. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +24 -22
  267. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  268. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +3 -3
  269. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  270. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -12
  271. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  272. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  273. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs +5 -10
  274. package/dist-esm/lib/shapes/note/toolStates/Pointing.mjs.map +2 -2
  275. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +4 -3
  276. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  277. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +14 -2
  278. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  279. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +12 -4
  280. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  281. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +2 -2
  282. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  283. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  284. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  285. package/dist-esm/lib/shapes/shared/interpolate-props.mjs +4 -4
  286. package/dist-esm/lib/shapes/shared/interpolate-props.mjs.map +2 -2
  287. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  288. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  289. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs +12 -0
  290. package/dist-esm/lib/shapes/shared/useEfficientZoomThreshold.mjs.map +7 -0
  291. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +1 -1
  292. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  293. package/dist-esm/lib/shapes/text/RichTextArea.mjs +5 -0
  294. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  295. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +5 -2
  296. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  297. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +4 -10
  298. package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +2 -2
  299. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +7 -5
  300. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  301. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +1 -1
  302. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +2 -2
  303. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +4 -5
  304. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  305. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +3 -8
  306. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  307. package/dist-esm/lib/tools/HandTool/HandTool.mjs +3 -5
  308. package/dist-esm/lib/tools/HandTool/HandTool.mjs.map +2 -2
  309. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs +3 -2
  310. package/dist-esm/lib/tools/HandTool/childStates/Dragging.mjs.map +2 -2
  311. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs +1 -1
  312. package/dist-esm/lib/tools/HandTool/childStates/Pointing.mjs.map +2 -2
  313. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs +1 -1
  314. package/dist-esm/lib/tools/LaserTool/childStates/Lasering.mjs.map +2 -2
  315. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +10 -11
  316. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  317. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +6 -5
  318. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  319. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs +4 -6
  320. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Cropping.mjs.map +2 -2
  321. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +1 -1
  322. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  323. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +1 -1
  324. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  325. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +1 -1
  326. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
  327. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +2 -1
  328. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +2 -2
  329. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs +1 -1
  330. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.mjs.map +2 -2
  331. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +8 -6
  332. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  333. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +38 -11
  334. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  335. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +43 -51
  336. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  337. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs +6 -6
  338. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  339. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +1 -1
  340. package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
  341. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +6 -19
  342. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  343. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +1 -1
  344. package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
  345. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +1 -1
  346. package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
  347. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -2
  348. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  349. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +4 -13
  350. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  351. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -6
  352. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  353. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -3
  354. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  355. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +7 -6
  356. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  357. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +13 -11
  358. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  359. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +17 -4
  360. package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
  361. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs +1 -1
  362. package/dist-esm/lib/tools/ZoomTool/ZoomTool.mjs.map +2 -2
  363. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs +3 -3
  364. package/dist-esm/lib/tools/ZoomTool/childStates/Pointing.mjs.map +2 -2
  365. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs +5 -6
  366. package/dist-esm/lib/tools/ZoomTool/childStates/ZoomBrushing.mjs.map +2 -2
  367. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs +1 -3
  368. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  369. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs +1 -1
  370. package/dist-esm/lib/tools/selection-logic/selectOnCanvasPointerUp.mjs.map +2 -2
  371. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs +1 -1
  372. package/dist-esm/lib/tools/selection-logic/updateHoveredShapeId.mjs.map +2 -2
  373. package/dist-esm/lib/ui/TldrawUi.mjs +2 -2
  374. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  375. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs +2 -8
  376. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.mjs.map +2 -2
  377. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +1 -3
  378. package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
  379. package/dist-esm/lib/ui/components/CursorChatBubble.mjs +1 -1
  380. package/dist-esm/lib/ui/components/CursorChatBubble.mjs.map +2 -2
  381. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs +3 -30
  382. package/dist-esm/lib/ui/components/DefaultDebugPanel.mjs.map +2 -2
  383. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  384. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  385. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs +1 -1
  386. package/dist-esm/lib/ui/components/HelperButtons/BackToContent.mjs.map +2 -2
  387. package/dist-esm/lib/ui/components/HelperButtons/StopFollowing.mjs.map +2 -2
  388. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -1
  389. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  390. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs +3 -6
  391. package/dist-esm/lib/ui/components/OfflineIndicator/OfflineIndicator.mjs.map +2 -2
  392. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs +3 -1
  393. package/dist-esm/lib/ui/components/PageMenu/PageItemInput.mjs.map +2 -2
  394. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs +6 -0
  395. package/dist-esm/lib/ui/components/SharePanel/PeopleMenu.mjs.map +2 -2
  396. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  397. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +1 -1
  398. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +2 -2
  399. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs +1 -1
  400. package/dist-esm/lib/ui/components/Toolbar/DefaultRichTextToolbar.mjs.map +2 -2
  401. package/dist-esm/lib/ui/components/TopPanel/CenteredTopPanelContainer.mjs.map +1 -1
  402. package/dist-esm/lib/ui/components/menu-items.mjs +4 -5
  403. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  404. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +3 -1
  405. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  406. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +2 -2
  407. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  408. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +157 -95
  409. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  410. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.mjs.map +2 -2
  411. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.mjs.map +2 -2
  412. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +15 -8
  413. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  414. package/dist-esm/lib/ui/context/actions.mjs +7 -8
  415. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  416. package/dist-esm/lib/ui/context/components.mjs +1 -2
  417. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  418. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  419. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  420. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  421. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  422. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  423. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  424. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  425. package/dist-esm/lib/ui/hooks/useTools.mjs +4 -5
  426. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  427. package/dist-esm/lib/ui/version.mjs +3 -3
  428. package/dist-esm/lib/ui/version.mjs.map +1 -1
  429. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +17 -6
  430. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  431. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  432. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  433. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  434. package/dist-esm/lib/utils/test-helpers.mjs +21 -0
  435. package/dist-esm/lib/utils/test-helpers.mjs.map +7 -0
  436. package/dist-esm/lib/utils/text/richText.mjs +8 -5
  437. package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
  438. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +8 -2
  439. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  440. package/package.json +18 -16
  441. package/src/index.ts +6 -2
  442. package/src/lib/Tldraw.test.tsx +46 -1
  443. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  444. package/src/lib/canvas/TldrawSelectionForeground.tsx +6 -11
  445. package/src/lib/defaultEmbedDefinitions.ts +2 -1
  446. package/src/lib/defaultExternalContentHandlers.ts +13 -14
  447. package/src/lib/defaultSideEffects.ts +6 -1
  448. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +40 -133
  449. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +8 -8
  450. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  451. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +16 -16
  452. package/src/lib/shapes/arrow/arrow-types.ts +2 -0
  453. package/src/lib/shapes/arrow/arrowLabel.ts +2 -2
  454. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -2
  455. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  456. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.test.ts +80 -0
  457. package/src/lib/shapes/arrow/elbow/getElbowArrowInfo.tsx +1 -1
  458. package/src/lib/shapes/arrow/shared.ts +4 -4
  459. package/src/lib/shapes/arrow/toolStates/Idle.tsx +4 -14
  460. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +8 -5
  461. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +1 -1
  462. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  463. package/src/lib/shapes/draw/DrawShapeUtil.test.ts +146 -0
  464. package/src/lib/shapes/draw/DrawShapeUtil.tsx +31 -27
  465. package/src/lib/shapes/draw/getPath.ts +31 -10
  466. package/src/lib/shapes/draw/toolStates/Drawing.ts +100 -90
  467. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +8 -1
  468. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  469. package/src/lib/shapes/frame/FrameShapeUtil.tsx +10 -4
  470. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  471. package/src/lib/shapes/geo/GeoShapeUtil.tsx +228 -176
  472. package/src/lib/shapes/geo/toolStates/Idle.ts +5 -15
  473. package/src/lib/shapes/geo/toolStates/Pointing.ts +6 -6
  474. package/src/lib/shapes/highlight/HighlightShapeUtil.test.ts +146 -0
  475. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +25 -24
  476. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  477. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  478. package/src/lib/shapes/line/toolStates/Pointing.ts +4 -4
  479. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  480. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -10
  481. package/src/lib/shapes/note/noteCloning.test.ts +3 -1
  482. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  483. package/src/lib/shapes/note/toolStates/Pointing.ts +5 -10
  484. package/src/lib/shapes/shared/HyperlinkButton.tsx +4 -3
  485. package/src/lib/shapes/shared/PlainTextLabel.tsx +12 -2
  486. package/src/lib/shapes/shared/RichTextLabel.tsx +14 -4
  487. package/src/lib/shapes/shared/ShapeFill.tsx +2 -2
  488. package/src/lib/shapes/shared/crop.ts +1 -0
  489. package/src/lib/shapes/shared/interpolate-props.ts +4 -4
  490. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  491. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  492. package/src/lib/shapes/shared/useEfficientZoomThreshold.ts +10 -0
  493. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +1 -1
  494. package/src/lib/shapes/text/RichTextArea.tsx +5 -0
  495. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  496. package/src/lib/shapes/text/TextShapeUtil.tsx +5 -0
  497. package/src/lib/shapes/text/toolStates/Idle.ts +4 -14
  498. package/src/lib/shapes/text/toolStates/Pointing.ts +8 -8
  499. package/src/lib/shapes/video/VideoShapeUtil.tsx +2 -1
  500. package/src/lib/tools/EraserTool/childStates/Erasing.ts +7 -10
  501. package/src/lib/tools/EraserTool/childStates/Pointing.ts +5 -20
  502. package/src/lib/tools/HandTool/HandTool.ts +3 -5
  503. package/src/lib/tools/HandTool/childStates/Dragging.ts +3 -2
  504. package/src/lib/tools/HandTool/childStates/Pointing.ts +1 -1
  505. package/src/lib/tools/LaserTool/childStates/Lasering.ts +1 -1
  506. package/src/lib/tools/SelectTool/DragAndDropManager.ts +14 -11
  507. package/src/lib/tools/SelectTool/childStates/Brushing.ts +8 -11
  508. package/src/lib/tools/SelectTool/childStates/Crop/children/Cropping.ts +7 -6
  509. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +3 -4
  510. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +1 -1
  511. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +1 -1
  512. package/src/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.ts +2 -1
  513. package/src/lib/tools/SelectTool/childStates/Crop/children/crop_helpers.ts +1 -1
  514. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +11 -12
  515. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +57 -16
  516. package/src/lib/tools/SelectTool/childStates/Idle.ts +64 -81
  517. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +7 -8
  518. package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +1 -1
  519. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +9 -17
  520. package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +1 -1
  521. package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +1 -1
  522. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +4 -4
  523. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +4 -14
  524. package/src/lib/tools/SelectTool/childStates/Resizing.ts +8 -10
  525. package/src/lib/tools/SelectTool/childStates/Rotating.ts +2 -3
  526. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +9 -10
  527. package/src/lib/tools/SelectTool/childStates/Translating.ts +16 -15
  528. package/src/lib/tools/SelectTool/selectHelpers.ts +39 -4
  529. package/src/lib/tools/ZoomTool/ZoomTool.ts +1 -1
  530. package/src/lib/tools/ZoomTool/childStates/Pointing.ts +3 -3
  531. package/src/lib/tools/ZoomTool/childStates/ZoomBrushing.ts +5 -6
  532. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -3
  533. package/src/lib/tools/selection-logic/selectOnCanvasPointerUp.ts +1 -1
  534. package/src/lib/tools/selection-logic/updateHoveredShapeId.ts +1 -1
  535. package/src/lib/ui/TldrawUi.tsx +5 -2
  536. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenuContent.tsx +1 -9
  537. package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +1 -3
  538. package/src/lib/ui/components/CursorChatBubble.tsx +2 -2
  539. package/src/lib/ui/components/DefaultDebugPanel.tsx +3 -42
  540. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  541. package/src/lib/ui/components/HelperButtons/BackToContent.tsx +1 -1
  542. package/src/lib/ui/components/HelperButtons/StopFollowing.tsx +2 -2
  543. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -1
  544. package/src/lib/ui/components/OfflineIndicator/OfflineIndicator.tsx +6 -5
  545. package/src/lib/ui/components/PageMenu/PageItemInput.tsx +3 -1
  546. package/src/lib/ui/components/SharePanel/PeopleMenu.tsx +8 -0
  547. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  548. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +1 -1
  549. package/src/lib/ui/components/Toolbar/DefaultRichTextToolbar.tsx +1 -1
  550. package/src/lib/ui/components/TopPanel/CenteredTopPanelContainer.tsx +1 -1
  551. package/src/lib/ui/components/menu-items.tsx +9 -15
  552. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +5 -3
  553. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  554. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +208 -113
  555. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionCheckboxItem.tsx +1 -1
  556. package/src/lib/ui/components/primitives/menus/TldrawUiMenuActionItem.tsx +1 -1
  557. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +7 -4
  558. package/src/lib/ui/context/actions.tsx +15 -19
  559. package/src/lib/ui/context/components.tsx +1 -2
  560. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  561. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  562. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  563. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +2 -2
  564. package/src/lib/ui/hooks/useTools.tsx +5 -7
  565. package/src/lib/ui/version.ts +3 -3
  566. package/src/lib/ui.css +27 -23
  567. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +12 -48
  568. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +19 -6
  569. package/src/lib/utils/export/exportAs.ts +2 -9
  570. package/src/lib/utils/frames/frames.ts +1 -1
  571. package/src/lib/utils/test-helpers.ts +60 -0
  572. package/src/lib/utils/text/richText.ts +9 -8
  573. package/src/lib/utils/tldr/buildFromV1Document.ts +21 -19
  574. package/src/test/Editor.test.tsx +78 -41
  575. package/src/test/EraserTool.test.ts +10 -12
  576. package/src/test/SelectTool.test.ts +11 -19
  577. package/src/test/TestEditor.ts +49 -51
  578. package/src/test/TldrawEditor.test.tsx +24 -20
  579. package/src/test/__snapshots__/drawing.test.ts.snap +3 -1257
  580. package/src/test/__snapshots__/resizing.test.ts.snap +3 -12
  581. package/src/test/arrows-megabus.test.tsx +1 -1
  582. package/src/test/bindings.test.tsx +29 -25
  583. package/src/test/bindingsIndex.test.tsx +4 -4
  584. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +10 -10
  585. package/src/test/commands/cameraState.test.ts +299 -0
  586. package/src/test/commands/createShape.test.ts +64 -0
  587. package/src/test/commands/createShapes.test.ts +15 -1
  588. package/src/test/commands/getSvgString.test.ts +2 -2
  589. package/src/test/commands/isShapeOfType.test.ts +44 -0
  590. package/src/test/commands/putContent.test.ts +80 -1
  591. package/src/test/commands/setCamera.test.ts +13 -11
  592. package/src/test/commands/stackShapes.test.ts +34 -8
  593. package/src/test/commands/updateShape.test.ts +67 -0
  594. package/src/test/commands/updateShapes.test.ts +21 -5
  595. package/src/test/commands/zoomToBounds.test.ts +19 -3
  596. package/src/test/commands/zoomToSelection.test.ts +14 -3
  597. package/src/test/custom-clipping.test.ts +52 -44
  598. package/src/test/customSnapping.test.tsx +77 -62
  599. package/src/test/drawing.test.ts +17 -10
  600. package/src/test/duplicate.test.ts +1 -1
  601. package/src/test/flipShapes.test.ts +33 -0
  602. package/src/test/frames.test.ts +94 -2
  603. package/src/test/getCulledShapes.test.tsx +11 -3
  604. package/src/test/getShapeAtPoint.test.ts +2 -2
  605. package/src/test/groups.test.tsx +7 -4
  606. package/src/test/modifiers.test.ts +6 -6
  607. package/src/test/resizing.test.ts +16 -22
  608. package/src/test/selection-omnibus.test.ts +13 -13
  609. package/src/test/shapeutils.test.ts +1 -1
  610. package/src/test/spacebarPanning.test.ts +28 -10
  611. package/src/test/styles2.test.tsx +1 -1
  612. package/src/test/styles3.test.ts +5 -5
  613. package/src/test/test-jsx.tsx +72 -57
  614. package/src/test/text.test.ts +15 -17
  615. package/src/test/translating.test.ts +6 -8
  616. package/src/test/ui/BackToContent.test.tsx +111 -0
  617. package/tldraw.css +41 -35
  618. package/dist-cjs/lib/shapes/shared/useForceSolid.js.map +0 -7
  619. package/dist-cjs/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.js.map +0 -7
  620. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js +0 -32
  621. package/dist-cjs/lib/ui/components/TopPanel/DefaultTopPanel.js.map +0 -7
  622. package/dist-cjs/lib/utils/text/textDirection.js +0 -51
  623. package/dist-cjs/lib/utils/text/textDirection.js.map +0 -7
  624. package/dist-esm/lib/shapes/shared/useForceSolid.mjs +0 -9
  625. package/dist-esm/lib/shapes/shared/useForceSolid.mjs.map +0 -7
  626. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs +0 -8
  627. package/dist-esm/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.mjs.map +0 -7
  628. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs +0 -12
  629. package/dist-esm/lib/ui/components/TopPanel/DefaultTopPanel.mjs.map +0 -7
  630. package/dist-esm/lib/utils/text/textDirection.mjs +0 -31
  631. package/dist-esm/lib/utils/text/textDirection.mjs.map +0 -7
  632. package/src/lib/shapes/shared/useForceSolid.ts +0 -6
  633. package/src/lib/tools/selection-logic/getShouldEnterCropModeOnPointerDown.ts +0 -10
  634. package/src/lib/ui/components/TopPanel/DefaultTopPanel.tsx +0 -10
  635. package/src/lib/utils/text/textDirection.ts +0 -32
@@ -637,3 +637,36 @@ it('Updates the image shape flip properties when flipped', () => {
637
637
  editor.flipShapes(editor.getSelectedShapeIds(), 'vertical')
638
638
  expect(editor.getLastCreatedShape<TLImageShape>().props.flipY).toBe(true)
639
639
  })
640
+
641
+ it('Restores flipped shape positions when shape is rotated', () => {
642
+ editor.selectAll().rotateSelection(PI / 2.5)
643
+ const before = editor.getSelectedShapes()
644
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
645
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
646
+ const after = editor.getSelectedShapes()
647
+ expect(after.length).toBe(before.length)
648
+ for (let i = 0; i < before.length; i++) {
649
+ expect(after[i]).toCloselyMatchObject(before[i])
650
+ }
651
+ })
652
+
653
+ it('Restores flipped shape positions with draw shapes when shape is rotated', () => {
654
+ editor
655
+ .cancel()
656
+ .setCurrentTool('draw')
657
+ .pointerDown(0, 0)
658
+ .pointerMove(-100, -100)
659
+ .pointerMove(0, -100)
660
+ .pointerMove(100, 100)
661
+ .pointerUp()
662
+
663
+ editor.selectAll().rotateSelection(PI / 2.5)
664
+ const before = editor.getSelectedShapes()
665
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
666
+ editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
667
+ const after = editor.getSelectedShapes()
668
+ expect(after.length).toBe(before.length)
669
+ for (let i = 0; i < before.length; i++) {
670
+ expect(after[i]).toCloselyMatchObject(before[i])
671
+ }
672
+ })
@@ -10,6 +10,7 @@ import {
10
10
  } from '@tldraw/editor'
11
11
  import { vi } from 'vitest'
12
12
  import { getArrowBindings } from '../lib/shapes/arrow/shared'
13
+ import { FrameShapeUtil } from '../lib/shapes/frame/FrameShapeUtil'
13
14
  import { DEFAULT_FRAME_PADDING, fitFrameToContent, removeFrame } from '../lib/utils/frames/frames'
14
15
  import { TestEditor } from './TestEditor'
15
16
 
@@ -639,9 +640,13 @@ describe('frame shapes', () => {
639
640
 
640
641
  editor.setCurrentTool('select')
641
642
 
643
+ // Not with enter key
642
644
  editor.keyDown('Enter')
643
645
  editor.keyUp('Enter')
646
+ expect(editor.getCurrentPageState().editingShapeId).toBe(null)
644
647
 
648
+ // Just with header click (tests against header's geometry)
649
+ editor.click(105, 95)
645
650
  expect(editor.getCurrentPageState().editingShapeId).toBe(frameId)
646
651
  })
647
652
 
@@ -850,6 +855,93 @@ describe('frame shapes', () => {
850
855
  expect(editor.getSortedChildIdsForParent(insideFrameId)).toStrictEqual([rectAId, rectBId])
851
856
  expect(editor.getSortedChildIdsForParent(outsideFrameId)).toStrictEqual([insideFrameId])
852
857
  })
858
+
859
+ describe('resizeChildren configuration option', () => {
860
+ it('has default canResizeChildren behavior as false', () => {
861
+ const frameUtil = editor.getShapeUtil<TLFrameShape>('frame') as FrameShapeUtil
862
+ expect(frameUtil.options.resizeChildren).toBe(false)
863
+ expect(frameUtil.canResizeChildren()).toBe(false)
864
+ })
865
+
866
+ it('can be configured to allow resizing children', () => {
867
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: true })
868
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
869
+ expect(configuredFrameUtil.options.resizeChildren).toBe(true)
870
+ expect(configuredFrameUtil.canResizeChildren()).toBe(true)
871
+ })
872
+
873
+ it('can be configured to disallow resizing children', () => {
874
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({ resizeChildren: false })
875
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
876
+ expect(configuredFrameUtil.options.resizeChildren).toBe(false)
877
+ expect(configuredFrameUtil.canResizeChildren()).toBe(false)
878
+ })
879
+
880
+ it('maintains other options when configuring resizeChildren', () => {
881
+ const ConfiguredFrameShapeUtil = FrameShapeUtil.configure({
882
+ resizeChildren: true,
883
+ showColors: true,
884
+ })
885
+ const configuredFrameUtil = new ConfiguredFrameShapeUtil(editor)
886
+ expect(configuredFrameUtil.options.resizeChildren).toBe(true)
887
+ expect(configuredFrameUtil.options.showColors).toBe(true)
888
+ })
889
+
890
+ it('resizes children when configured with resizeChildren: true', () => {
891
+ // Create a frame with a child shape using a configured frame util
892
+ editor.setCurrentTool('frame')
893
+ editor.pointerDown(100, 100).pointerMove(200, 200).pointerUp(200, 200)
894
+
895
+ const frameId = editor.getOnlySelectedShape()!.id
896
+
897
+ // Add a child shape
898
+ editor.setCurrentTool('geo')
899
+ editor.pointerDown(125, 125).pointerMove(175, 175).pointerUp(175, 175)
900
+
901
+ const childId = editor.getOnlySelectedShape()!.id
902
+
903
+ // Get initial bounds
904
+ const initialChildBounds = editor.getShapePageBounds(childId)!
905
+
906
+ // Create a new editor with configured frame util that allows resizing children
907
+ const configuredEditor = new TestEditor({
908
+ shapeUtils: [FrameShapeUtil.configure({ resizeChildren: true })],
909
+ })
910
+
911
+ // Create the same frame and child in the new editor
912
+ configuredEditor.createShapes([
913
+ { id: frameId, type: 'frame', x: 100, y: 100, props: { w: 100, h: 100 } },
914
+ {
915
+ id: childId,
916
+ type: 'geo',
917
+ parentId: frameId,
918
+ x: 125,
919
+ y: 125,
920
+ props: { w: 50, h: 50 },
921
+ },
922
+ ])
923
+
924
+ // Resize the frame to half size
925
+ configuredEditor.select(frameId)
926
+ configuredEditor.resizeSelection({ scaleX: 0.5, scaleY: 0.5 }, 'bottom_right')
927
+
928
+ // Verify the frame was resized
929
+ const resizedFrameBounds = configuredEditor.getShapePageBounds(frameId)!
930
+ expect(resizedFrameBounds).toCloselyMatchObject({
931
+ x: 100,
932
+ y: 100,
933
+ w: 50,
934
+ h: 50,
935
+ })
936
+
937
+ // Verify the child was also resized
938
+ const resizedChildBounds = configuredEditor.getShapePageBounds(childId)!
939
+ expect(resizedChildBounds.w).toBeCloseTo(initialChildBounds.w * 0.5)
940
+ expect(resizedChildBounds.h).toBeCloseTo(initialChildBounds.h * 0.5)
941
+
942
+ configuredEditor.dispose()
943
+ })
944
+ })
853
945
  })
854
946
 
855
947
  test('arrows bound to a shape within a group within a frame are reparented if the group is moved outside of the frame', () => {
@@ -1363,13 +1455,13 @@ describe('Unparenting behavior', () => {
1363
1455
 
1364
1456
  // When the shape has a fill, it should not fall out of the frame
1365
1457
  editor.undo()
1366
- editor.updateShape<TLGeoShape>({ ...largeRect, props: { fill: 'solid' } })
1458
+ editor.updateShape({ ...largeRect, props: { fill: 'solid' } })
1367
1459
  dragOntoFrame()
1368
1460
  expect(editor.getShape(largeRect.id)!.parentId).toBe(frameId)
1369
1461
 
1370
1462
  // When the shape has a label and that label is on top of the frame, it should not fall out of the frame
1371
1463
  editor.undo()
1372
- editor.updateShape<TLGeoShape>({
1464
+ editor.updateShape({
1373
1465
  ...largeRect,
1374
1466
  props: { fill: 'none', richText: toRichText('hello') },
1375
1467
  })
@@ -3,7 +3,7 @@ import {
3
3
  Box,
4
4
  RecordProps,
5
5
  T,
6
- TLBaseShape,
6
+ TLShape,
7
7
  TLShapeId,
8
8
  createShapeId,
9
9
  } from '@tldraw/editor'
@@ -11,11 +11,19 @@ import { vi } from 'vitest'
11
11
  import { TestEditor } from './TestEditor'
12
12
  import { TL } from './test-jsx'
13
13
 
14
+ const UNCULLABLE_TYPE = 'uncullable'
15
+
16
+ declare module '@tldraw/tlschema' {
17
+ export interface TLGlobalShapePropsMap {
18
+ [UNCULLABLE_TYPE]: { w: number; h: number }
19
+ }
20
+ }
21
+
14
22
  // Custom uncullable shape type for testing canCull override
15
- type UncullableShape = TLBaseShape<'uncullable', { w: number; h: number }>
23
+ type UncullableShape = TLShape<typeof UNCULLABLE_TYPE>
16
24
 
17
25
  class UncullableShapeUtil extends BaseBoxShapeUtil<UncullableShape> {
18
- static override type = 'uncullable' as const
26
+ static override type = UNCULLABLE_TYPE
19
27
  static override props: RecordProps<UncullableShape> = {
20
28
  w: T.number,
21
29
  h: T.number,
@@ -1,4 +1,4 @@
1
- import { TLGeoShape, TLShape, createShapeId, toRichText } from '@tldraw/editor'
1
+ import { TLShape, createShapeId, toRichText } from '@tldraw/editor'
2
2
  import { TestEditor } from './TestEditor'
3
3
 
4
4
  let editor: TestEditor
@@ -146,7 +146,7 @@ describe('with hitLabels=true', () => {
146
146
  it('hits geo shape label behind overlapping hollow shape', () => {
147
147
  // label is empty
148
148
  expect(editor.getShapeAtPoint({ x: 350, y: 350 }, opts)?.id).toBe(ids.box3)
149
- editor.updateShape<TLGeoShape>({
149
+ editor.updateShape({
150
150
  id: ids.box2,
151
151
  type: 'geo',
152
152
  props: { richText: toRichText('hello') },
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Box,
3
+ ExtractShapeByProps,
3
4
  GroupShapeUtil,
4
5
  TLArrowShape,
5
6
  TLGroupShape,
@@ -35,14 +36,16 @@ const ids = {
35
36
  groupA: createShapeId('groupA'),
36
37
  }
37
38
 
39
+ type BoxShape = ExtractShapeByProps<{ fill: string }>
40
+
38
41
  const box = (
39
42
  id: TLShapeId,
40
43
  x: number,
41
44
  y: number,
42
45
  w = 10,
43
46
  h = 10,
44
- fill = 'solid'
45
- ): TLShapePartial => ({
47
+ fill: BoxShape['props']['fill'] = 'solid'
48
+ ): TLShapePartial<BoxShape> => ({
46
49
  type: 'geo',
47
50
  id,
48
51
  x,
@@ -1557,7 +1560,7 @@ describe('erasing', () => {
1557
1560
  // move to group B
1558
1561
  editor.pointerMove(65, 5)
1559
1562
 
1560
- expect(editor.getErasingShapeIds().length).toBe(2)
1563
+ expect(editor.getErasingShapeIds().length).toBe(3)
1561
1564
  })
1562
1565
  })
1563
1566
 
@@ -1980,7 +1983,7 @@ describe('Group opacity', () => {
1980
1983
  editor.setOpacityForNextShapes(0.5)
1981
1984
  editor.groupShapes(editor.getSelectedShapeIds())
1982
1985
  const group = editor.getShape(onlySelectedId())!
1983
- assert(editor.isShapeOfType<TLGroupShape>(group, 'group'))
1986
+ assert(editor.isShapeOfType(group, 'group'))
1984
1987
  expect(group.opacity).toBe(1)
1985
1988
  })
1986
1989
  })
@@ -13,25 +13,25 @@ it('Shift Key', () => {
13
13
  editor.pointerDown(0, 0)
14
14
  editor.pointerMove(100, 100, { shiftKey: true })
15
15
  editor.pointerMove(100, 100, { shiftKey: false })
16
- expect(editor.inputs.shiftKey).toBe(true)
16
+ expect(editor.inputs.getShiftKey()).toBe(true)
17
17
  vi.advanceTimersByTime(200)
18
- expect(editor.inputs.shiftKey).toBe(false)
18
+ expect(editor.inputs.getShiftKey()).toBe(false)
19
19
  })
20
20
 
21
21
  it('Alt Key', () => {
22
22
  editor.pointerDown(0, 0)
23
23
  editor.pointerMove(100, 100, { altKey: true })
24
24
  editor.pointerMove(100, 100, { altKey: false })
25
- expect(editor.inputs.altKey).toBe(true)
25
+ expect(editor.inputs.getAltKey()).toBe(true)
26
26
  vi.advanceTimersByTime(200)
27
- expect(editor.inputs.altKey).toBe(false)
27
+ expect(editor.inputs.getAltKey()).toBe(false)
28
28
  })
29
29
 
30
30
  it('Ctrl Key', () => {
31
31
  editor.pointerDown(0, 0)
32
32
  editor.pointerMove(100, 100, { ctrlKey: true })
33
33
  editor.pointerMove(100, 100, { ctrlKey: false })
34
- expect(editor.inputs.ctrlKey).toBe(true)
34
+ expect(editor.inputs.getCtrlKey()).toBe(true)
35
35
  vi.advanceTimersByTime(200)
36
- expect(editor.inputs.ctrlKey).toBe(false)
36
+ expect(editor.inputs.getCtrlKey()).toBe(false)
37
37
  })
@@ -20,6 +20,7 @@ import { NoteShapeUtil } from '../lib/shapes/note/NoteShapeUtil'
20
20
  import { TestEditor } from './TestEditor'
21
21
  import { getSnapLines } from './getSnapLines'
22
22
  import { roundedBox } from './roundedBox'
23
+ import { createDrawSegments } from './test-jsx'
23
24
 
24
25
  vi.useFakeTimers()
25
26
 
@@ -904,15 +905,12 @@ describe('When resizing a shape with children', () => {
904
905
  x: 100,
905
906
  y: 100,
906
907
  props: {
907
- segments: [
908
- {
909
- type: 'free',
910
- points: [
911
- { x: 0, y: 0, z: 0.5 },
912
- { x: 100, y: 100, z: 0.5 },
913
- ],
914
- },
915
- ],
908
+ segments: createDrawSegments([
909
+ [
910
+ { x: 0, y: 0, z: 0.5 },
911
+ { x: 100, y: 100, z: 0.5 },
912
+ ],
913
+ ]),
916
914
  },
917
915
  },
918
916
  ])
@@ -3876,10 +3874,8 @@ it('uses the cross cursor when create resizing', () => {
3876
3874
  describe('Resizing text from the right edge', () => {
3877
3875
  it('Resizes text from the right edge', () => {
3878
3876
  const id = createShapeId()
3879
- editor.createShapes<TLTextShape>([{ id, type: 'text', props: { richText: toRichText('H') } }])
3880
- editor.updateShapes<TLTextShape>([
3881
- { id, type: 'text', props: { richText: toRichText('Hello World') } },
3882
- ]) // auto size
3877
+ editor.createShapes([{ id, type: 'text', props: { richText: toRichText('H') } }])
3878
+ editor.updateShapes([{ id, type: 'text', props: { richText: toRichText('Hello World') } }]) // auto size
3883
3879
 
3884
3880
  editor.select(id)
3885
3881
 
@@ -3905,10 +3901,8 @@ describe('Resizing text from the right edge', () => {
3905
3901
  editor.updateInstanceState({ isCoarsePointer: true })
3906
3902
 
3907
3903
  const id = createShapeId()
3908
- editor.createShapes<TLTextShape>([{ id, type: 'text', props: { richText: toRichText('H') } }])
3909
- editor.updateShapes<TLTextShape>([
3910
- { id, type: 'text', props: { richText: toRichText('Hello World') } },
3911
- ]) // auto size
3904
+ editor.createShapes([{ id, type: 'text', props: { richText: toRichText('H') } }])
3905
+ editor.updateShapes([{ id, type: 'text', props: { richText: toRichText('Hello World') } }]) // auto size
3912
3906
 
3913
3907
  editor.select(id)
3914
3908
 
@@ -3954,7 +3948,7 @@ describe('When resizing near the edges of the screen', () => {
3954
3948
 
3955
3949
  describe('resizing text with autosize true', () => {
3956
3950
  it('resizes text from the right side', () => {
3957
- editor.createShape<TLTextShape>({
3951
+ editor.createShape({
3958
3952
  type: 'text',
3959
3953
  x: 0,
3960
3954
  y: 0,
@@ -3980,7 +3974,7 @@ describe('resizing text with autosize true', () => {
3980
3974
  })
3981
3975
 
3982
3976
  it('resizes text from the right side when alt key is pressed', () => {
3983
- editor.createShape<TLTextShape>({
3977
+ editor.createShape({
3984
3978
  type: 'text',
3985
3979
  x: 0,
3986
3980
  y: 0,
@@ -4007,7 +4001,7 @@ describe('resizing text with autosize true', () => {
4007
4001
  })
4008
4002
 
4009
4003
  it('resizes text from the left side', () => {
4010
- editor.createShape<TLTextShape>({
4004
+ editor.createShape({
4011
4005
  type: 'text',
4012
4006
  x: 0,
4013
4007
  y: 0,
@@ -4033,7 +4027,7 @@ describe('resizing text with autosize true', () => {
4033
4027
  })
4034
4028
 
4035
4029
  it('resizes text from the left side when alt is pressed', () => {
4036
- editor.createShape<TLTextShape>({
4030
+ editor.createShape({
4037
4031
  type: 'text',
4038
4032
  x: 0,
4039
4033
  y: 0,
@@ -4062,7 +4056,7 @@ describe('resizing text with autosize true', () => {
4062
4056
 
4063
4057
  describe('cancelling a resize operation', () => {
4064
4058
  it('undoes any changes since the start of the resize operation', () => {
4065
- editor.createShape<TLGeoShape>({
4059
+ editor.createShape({
4066
4060
  type: 'geo',
4067
4061
  x: 0,
4068
4062
  y: 0,
@@ -76,7 +76,7 @@ describe('Hovering shapes', () => {
76
76
  editor.pointerMove(50, 50)
77
77
  expect(editor.getHoveredShapeId()).toBe(null)
78
78
 
79
- editor.updateShape<TLGeoShape>({
79
+ editor.updateShape({
80
80
  id: ids.box1,
81
81
  type: 'geo',
82
82
  props: { richText: toRichText('hello') },
@@ -88,7 +88,7 @@ describe('Hovering shapes', () => {
88
88
  })
89
89
 
90
90
  it('selects a shape with a full label on pointer down', () => {
91
- editor.updateShape<TLGeoShape>({
91
+ editor.updateShape({
92
92
  id: ids.box1,
93
93
  type: 'geo',
94
94
  props: { richText: toRichText('hello') },
@@ -462,7 +462,7 @@ describe('when shape is hollow', () => {
462
462
  describe('when shape is a frame', () => {
463
463
  let frame1: TLFrameShape
464
464
  beforeEach(() => {
465
- editor.createShape<TLFrameShape>({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
465
+ editor.createShape({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
466
466
  frame1 = editor.getShape<TLFrameShape>(ids.frame1)!
467
467
  })
468
468
 
@@ -517,8 +517,8 @@ describe('when shape is a frame', () => {
517
517
  describe('When a shape is behind a frame', () => {
518
518
  beforeEach(() => {
519
519
  editor.selectAll().deleteShapes(editor.getSelectedShapeIds())
520
- editor.createShape<TLGeoShape>({ id: ids.box1, type: 'geo', x: 25, y: 25 })
521
- editor.createShape<TLFrameShape>({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
520
+ editor.createShape({ id: ids.box1, type: 'geo', x: 25, y: 25 })
521
+ editor.createShape({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
522
522
  })
523
523
 
524
524
  it('does not select the shape when clicked inside', () => {
@@ -548,8 +548,8 @@ describe('when shape is inside of a frame', () => {
548
548
  let frame1: TLFrameShape
549
549
  let box1: TLGeoShape
550
550
  beforeEach(() => {
551
- editor.createShape<TLFrameShape>({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
552
- editor.createShape<TLGeoShape>({
551
+ editor.createShape({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
552
+ editor.createShape({
553
553
  id: ids.box1,
554
554
  parentId: ids.frame1,
555
555
  type: 'geo',
@@ -703,15 +703,15 @@ describe('when a frame has multiple children', () => {
703
703
  let box2: TLGeoShape
704
704
  beforeEach(() => {
705
705
  editor
706
- .createShape<TLFrameShape>({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
707
- .createShape<TLGeoShape>({
706
+ .createShape({ id: ids.frame1, type: 'frame', props: { w: 100, h: 100 } })
707
+ .createShape({
708
708
  id: ids.box1,
709
709
  parentId: ids.frame1,
710
710
  type: 'geo',
711
711
  x: 25,
712
712
  y: 25,
713
713
  })
714
- .createShape<TLGeoShape>({
714
+ .createShape({
715
715
  id: ids.box2,
716
716
  parentId: ids.frame1,
717
717
  type: 'geo',
@@ -849,7 +849,7 @@ describe('When shapes are overlapping', () => {
849
849
  let box4: TLGeoShape
850
850
  let box5: TLGeoShape
851
851
  beforeEach(() => {
852
- editor.createShapes<TLGeoShape>([
852
+ editor.createShapes([
853
853
  {
854
854
  id: ids.box1,
855
855
  type: 'geo',
@@ -2194,7 +2194,7 @@ describe('long press', () => {
2194
2194
  it('works correctly with screenbounds offset', () => {
2195
2195
  editor.updateViewportScreenBounds(new Box(100, 100, 800, 600))
2196
2196
  editor.pointerDown(201, 202)
2197
- expect(editor.inputs.currentScreenPoint).toMatchObject({ x: 101, y: 102 })
2197
+ expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
2198
2198
  })
2199
2199
 
2200
2200
  it('works correctly with screenbounds offset', () => {
@@ -2202,7 +2202,7 @@ describe('long press', () => {
2202
2202
  editor.pointerDown(201, 202)
2203
2203
  vi.advanceTimersByTime(1000)
2204
2204
  // without the fix added in this PR, it would have been 1, 2
2205
- expect(editor.inputs.currentScreenPoint).toMatchObject({ x: 101, y: 102 })
2205
+ expect(editor.inputs.getCurrentScreenPoint()).toMatchObject({ x: 101, y: 102 })
2206
2206
  })
2207
2207
  })
2208
2208
 
@@ -470,7 +470,7 @@ describe('When interacting with a shape...', () => {
470
470
  })
471
471
 
472
472
  it('Fires handle dragging cancel events', () => {
473
- const util = editor.getShapeUtil<TLLineShape>('line')
473
+ const util = editor.getShapeUtil('line')
474
474
 
475
475
  const calls: string[] = []
476
476
 
@@ -16,16 +16,16 @@ beforeEach(() => {
16
16
 
17
17
  it('Sets cursor and state correctly', () => {
18
18
  expect(editor.getInstanceState().cursor.type).toBe('default')
19
- expect(editor.inputs.isPanning).toBe(false)
19
+ expect(editor.inputs.getIsPanning()).toBe(false)
20
20
  editor.keyDown(' ')
21
- expect(editor.inputs.isPanning).toBe(true)
21
+ expect(editor.inputs.getIsPanning()).toBe(true)
22
22
  expect(editor.getInstanceState().cursor.type).toBe('grab')
23
23
  editor.pointerDown(0, 0)
24
24
  expect(editor.getInstanceState().cursor.type).toBe('grabbing')
25
25
  editor.pointerUp(0, 0)
26
26
  expect(editor.getInstanceState().cursor.type).toBe('grab')
27
27
  editor.keyUp(' ')
28
- expect(editor.inputs.isPanning).toBe(false)
28
+ expect(editor.inputs.getIsPanning()).toBe(false)
29
29
  expect(editor.getInstanceState().cursor.type).toBe('default')
30
30
  })
31
31
 
@@ -37,16 +37,34 @@ it('When holding spacebar and clicking and dragging, it pans the camera', () =>
37
37
  editor.keyUp(' ')
38
38
  })
39
39
 
40
- it('When holding spacebar, it updates cursor and does not send events to the state or change statecharts current active state', () => {
41
- editor.pointerDown(150, 150, { target: 'canvas' })
42
- editor.pointerMove(100, 100)
43
- editor.expectShapeToMatch({ id: ids.box1, x: 50, y: 50 })
40
+ it('When spacebar is held during pointer interaction, it activates panning', () => {
41
+ // This test verifies that holding spacebar prevents pointer events from
42
+ // being sent to the state chart, and instead activates panning mode.
43
+ editor.select(ids.box1)
44
+
45
+ // Start with pointer down on the shape
46
+ editor.pointerDown(150, 150, ids.box1)
44
47
 
48
+ // Hold spacebar before moving - should activate panning
45
49
  editor.keyDown(' ')
46
- editor.pointerMove(200, 200)
47
- editor.expectCameraToBe(100, 100, 1)
48
- editor.expectShapeToMatch({ id: ids.box1, x: 50, y: 50 })
50
+ expect(editor.inputs.getIsPanning()).toBe(true)
51
+ expect(editor.getInstanceState().cursor.type).toBe('grabbing') // 'grabbing' because pointer is down
52
+
53
+ // Moving the pointer should pan the camera, not translate the shape
54
+ const initialCamera = editor.getCamera()
55
+ editor.pointerMove(100, 100)
56
+
57
+ // Camera should have moved (panning)
58
+ const newCamera = editor.getCamera()
59
+ expect(newCamera.x).not.toBe(initialCamera.x)
60
+ expect(newCamera.y).not.toBe(initialCamera.y)
61
+
62
+ // Shape should not have moved (not translating)
63
+ editor.expectShapeToMatch({ id: ids.box1, x: 100, y: 100 })
64
+
65
+ editor.pointerUp()
49
66
  editor.keyUp(' ')
67
+ expect(editor.inputs.getIsPanning()).toBe(false)
50
68
  })
51
69
 
52
70
  it('When holding spacebar, pressing the arrow keys moves over by one viewport', () => {
@@ -88,7 +88,7 @@ describe('Editor.styles', () => {
88
88
  })
89
89
 
90
90
  it('should return mixed for all mixed styles', () => {
91
- editor.updateShapes<TLGeoShape>([
91
+ editor.updateShapes([
92
92
  {
93
93
  id: defaultShapesIds.box1,
94
94
  type: 'geo',
@@ -1,4 +1,4 @@
1
- import { TLGeoShape, 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
@@ -14,7 +14,7 @@ afterEach(() => {
14
14
  it("When changing the style of a geo shape, if the text label is empty, don't measure it", () => {
15
15
  const id = createShapeId()
16
16
 
17
- editor.createShapes<TLGeoShape>([
17
+ editor.createShapes([
18
18
  {
19
19
  id,
20
20
  type: 'geo',
@@ -29,7 +29,7 @@ it("When changing the style of a geo shape, if the text label is empty, don't me
29
29
 
30
30
  const boundsBefore = editor.getShapeGeometry(id).bounds
31
31
 
32
- editor.updateShapes<TLGeoShape>([
32
+ editor.updateShapes([
33
33
  {
34
34
  id,
35
35
  type: 'geo',
@@ -43,7 +43,7 @@ it("When changing the style of a geo shape, if the text label is empty, don't me
43
43
  it('When changing the style of a geo shape, if the text label has text, measure it and possibly update the size', () => {
44
44
  const id = createShapeId()
45
45
 
46
- editor.createShapes<TLGeoShape>([
46
+ editor.createShapes([
47
47
  {
48
48
  id,
49
49
  type: 'geo',
@@ -58,7 +58,7 @@ it('When changing the style of a geo shape, if the text label has text, measure
58
58
 
59
59
  const boundsBefore = editor.getShapeGeometry(id).bounds!
60
60
 
61
- editor.updateShapes<TLGeoShape>([
61
+ editor.updateShapes([
62
62
  {
63
63
  id,
64
64
  type: 'geo',