tldraw 3.16.0-internal.a478398270c6 → 3.16.0-next.15f085081fd5

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 (534) hide show
  1. package/dist-cjs/index.d.ts +316 -23
  2. package/dist-cjs/index.js +34 -2
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/Tldraw.js +12 -2
  5. package/dist-cjs/lib/Tldraw.js.map +2 -2
  6. package/dist-cjs/lib/TldrawImage.js +5 -2
  7. package/dist-cjs/lib/TldrawImage.js.map +3 -3
  8. package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
  9. package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +2 -2
  10. package/dist-cjs/lib/canvas/TldrawHandles.js +1 -1
  11. package/dist-cjs/lib/canvas/TldrawHandles.js.map +2 -2
  12. package/dist-cjs/lib/canvas/TldrawOverlays.js +1 -1
  13. package/dist-cjs/lib/canvas/TldrawOverlays.js.map +2 -2
  14. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  15. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  16. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +279 -271
  17. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  18. package/dist-cjs/lib/defaultExternalContentHandlers.js +6 -4
  19. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +27 -44
  21. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +16 -4
  23. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  25. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  26. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  27. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
  29. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  30. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -6
  31. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  34. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -17
  35. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  37. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  39. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  41. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  42. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -4
  43. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  44. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  45. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  46. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +20 -5
  47. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  49. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/PathBuilder.js +21 -3
  51. package/dist-cjs/lib/shapes/shared/PathBuilder.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -0
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +5 -2
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  57. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js +4 -3
  59. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  61. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  62. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  63. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +7 -13
  64. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  65. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  66. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  67. package/dist-cjs/lib/styles.js.map +2 -2
  68. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  69. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  70. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  71. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +7 -1
  73. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  74. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +43 -22
  75. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  76. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -15
  77. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  78. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +5 -0
  79. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  80. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +8 -0
  81. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  82. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +8 -0
  83. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +8 -0
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  86. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  87. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  88. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  89. package/dist-cjs/lib/ui/components/A11y.js +14 -12
  90. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  92. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  93. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  94. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  96. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  97. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  98. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +57 -7
  100. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -2
  102. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  104. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  106. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +4 -5
  108. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  110. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  112. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  114. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  115. package/dist-cjs/lib/ui/components/Spinner.js +2 -25
  116. package/dist-cjs/lib/ui/components/Spinner.js.map +2 -2
  117. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  118. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  119. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -139
  120. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  122. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  123. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  124. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  125. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +21 -7
  126. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +3 -3
  127. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  128. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  129. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  130. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  131. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  132. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  133. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  134. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  135. package/dist-cjs/lib/ui/components/menu-items.js +22 -0
  136. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  137. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButtonIcon.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +7 -16
  139. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  140. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  141. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  142. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
  143. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js.map +2 -2
  144. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +35 -1
  145. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
  146. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  147. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  148. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +6 -2
  149. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  150. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +31 -7
  151. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  152. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +262 -0
  153. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  154. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  155. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  156. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  157. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  159. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -22
  161. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  162. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  163. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/actions.js +72 -9
  165. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/components.js +2 -0
  167. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  168. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  169. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  171. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  172. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  173. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  174. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  175. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +12 -0
  176. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  177. package/dist-cjs/lib/ui/kbd-utils.js +11 -4
  178. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  179. package/dist-cjs/lib/ui/version.js +3 -3
  180. package/dist-cjs/lib/ui/version.js.map +1 -1
  181. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +1 -1
  182. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  183. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +3 -2
  184. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  185. package/dist-esm/index.d.mts +316 -23
  186. package/dist-esm/index.mjs +57 -5
  187. package/dist-esm/index.mjs.map +2 -2
  188. package/dist-esm/lib/Tldraw.mjs +14 -4
  189. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  190. package/dist-esm/lib/TldrawImage.mjs +5 -2
  191. package/dist-esm/lib/TldrawImage.mjs.map +2 -2
  192. package/dist-esm/lib/canvas/TldrawCropHandles.mjs +1 -1
  193. package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
  194. package/dist-esm/lib/canvas/TldrawHandles.mjs +1 -1
  195. package/dist-esm/lib/canvas/TldrawHandles.mjs.map +2 -2
  196. package/dist-esm/lib/canvas/TldrawOverlays.mjs +1 -1
  197. package/dist-esm/lib/canvas/TldrawOverlays.mjs.map +2 -2
  198. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  199. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  200. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +279 -271
  201. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  202. package/dist-esm/lib/defaultExternalContentHandlers.mjs +6 -4
  203. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  204. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +30 -44
  205. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  206. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +19 -5
  207. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  208. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  209. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  210. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  211. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  212. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
  213. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -6
  215. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  217. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  218. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -17
  219. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  221. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  223. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  225. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -4
  227. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  229. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +21 -5
  231. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  233. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/shared/PathBuilder.mjs +22 -3
  235. package/dist-esm/lib/shapes/shared/PathBuilder.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -0
  237. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +5 -2
  239. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  241. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs +4 -3
  243. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  246. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +8 -13
  248. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  250. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  251. package/dist-esm/lib/styles.mjs.map +2 -2
  252. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  253. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  254. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  255. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  256. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +7 -1
  257. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  258. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +43 -22
  259. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  260. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -15
  261. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  262. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +5 -0
  263. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  264. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +8 -0
  265. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  266. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +8 -0
  267. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  268. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +8 -0
  269. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  270. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  271. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  272. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  273. package/dist-esm/lib/ui/components/A11y.mjs +14 -12
  274. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  275. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  276. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  277. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  278. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  279. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  280. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  281. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  282. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +57 -7
  284. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -3
  286. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  288. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  290. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  291. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +4 -5
  292. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  293. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  294. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  295. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  296. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  297. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  298. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  299. package/dist-esm/lib/ui/components/Spinner.mjs +3 -26
  300. package/dist-esm/lib/ui/components/Spinner.mjs.map +2 -2
  301. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  302. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  303. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -139
  304. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  305. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  306. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  307. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  308. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +23 -9
  310. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +3 -3
  311. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  312. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  313. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  314. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  316. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  317. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  318. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/menu-items.mjs +22 -0
  320. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButtonIcon.mjs.map +2 -2
  322. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +8 -6
  323. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  324. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  325. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  326. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs +1 -1
  327. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs.map +2 -2
  328. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +36 -2
  329. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
  330. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  331. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  332. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +6 -2
  333. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +31 -7
  335. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +239 -0
  337. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  338. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  339. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  340. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  341. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  342. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -24
  345. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  346. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  347. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  348. package/dist-esm/lib/ui/context/actions.mjs +72 -9
  349. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  350. package/dist-esm/lib/ui/context/components.mjs +2 -0
  351. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  352. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  354. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  355. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  356. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  357. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  358. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +12 -0
  359. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  360. package/dist-esm/lib/ui/kbd-utils.mjs +11 -4
  361. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  362. package/dist-esm/lib/ui/version.mjs +3 -3
  363. package/dist-esm/lib/ui/version.mjs.map +1 -1
  364. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +1 -1
  365. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  366. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +3 -2
  367. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  368. package/package.json +12 -34
  369. package/src/index.ts +42 -3
  370. package/src/lib/Tldraw.tsx +15 -2
  371. package/src/lib/TldrawImage.tsx +6 -2
  372. package/src/lib/canvas/TldrawCropHandles.tsx +3 -1
  373. package/src/lib/canvas/TldrawHandles.tsx +5 -1
  374. package/src/lib/canvas/TldrawOverlays.tsx +1 -1
  375. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  376. package/src/lib/canvas/TldrawSelectionForeground.tsx +5 -1
  377. package/src/lib/defaultExternalContentHandlers.ts +14 -5
  378. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  379. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  380. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +12 -11
  381. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +30 -46
  382. package/src/lib/shapes/arrow/arrowLabel.ts +23 -3
  383. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  384. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  385. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
  386. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  387. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -7
  388. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  389. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -21
  390. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  391. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  392. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  393. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -4
  394. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  395. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  396. package/src/lib/shapes/line/LineShapeUtil.tsx +25 -6
  397. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  398. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  399. package/src/lib/shapes/shared/PathBuilder.test.tsx +1 -1
  400. package/src/lib/shapes/shared/PathBuilder.tsx +35 -1
  401. package/src/lib/shapes/shared/PlainTextLabel.tsx +1 -0
  402. package/src/lib/shapes/shared/RichTextLabel.tsx +4 -0
  403. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  404. package/src/lib/shapes/shared/SvgTextLabel.tsx +4 -2
  405. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  406. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  407. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  408. package/src/lib/shapes/text/TextShapeUtil.tsx +8 -14
  409. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  410. package/src/lib/styles.tsx +3 -1
  411. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  412. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  413. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +8 -1
  414. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +54 -30
  415. package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -24
  416. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +7 -0
  417. package/src/lib/tools/SelectTool/childStates/Resizing.ts +12 -1
  418. package/src/lib/tools/SelectTool/childStates/Rotating.ts +11 -0
  419. package/src/lib/tools/SelectTool/childStates/Translating.ts +11 -1
  420. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -0
  421. package/src/lib/ui/TldrawUi.tsx +33 -12
  422. package/src/lib/ui/components/A11y.tsx +15 -13
  423. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  424. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  425. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  426. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  427. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +46 -6
  428. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -2
  429. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  430. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  431. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +4 -5
  432. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  433. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  434. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  435. package/src/lib/ui/components/Spinner.tsx +2 -24
  436. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  437. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -106
  438. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  439. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  440. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +25 -9
  441. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  442. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  443. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  444. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +17 -12
  445. package/src/lib/ui/components/menu-items.tsx +25 -0
  446. package/src/lib/ui/components/primitives/Button/TldrawUiButtonIcon.tsx +2 -2
  447. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -35
  448. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  449. package/src/lib/ui/components/primitives/TldrawUiDialog.tsx +1 -1
  450. package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +41 -3
  451. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  452. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +6 -1
  453. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +56 -12
  454. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +325 -0
  455. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +2 -2
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  458. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  459. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +224 -23
  460. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  461. package/src/lib/ui/context/actions.tsx +74 -10
  462. package/src/lib/ui/context/components.tsx +3 -0
  463. package/src/lib/ui/context/events.tsx +6 -2
  464. package/src/lib/ui/hooks/menu-hooks.ts +1 -0
  465. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +3 -2
  466. package/src/lib/ui/hooks/useTools.tsx +142 -11
  467. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +12 -0
  468. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +12 -0
  469. package/src/lib/ui/kbd-utils.ts +12 -4
  470. package/src/lib/ui/version.ts +3 -3
  471. package/src/lib/ui.css +417 -314
  472. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +21 -7
  473. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +1 -1
  474. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +28 -7
  475. package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
  476. package/src/test/A11y.test.tsx +3 -2
  477. package/src/test/ClickManager.test.ts +7 -6
  478. package/src/test/Editor.test.tsx +21 -20
  479. package/src/test/EraserTool.test.ts +184 -13
  480. package/src/test/HandTool.test.ts +10 -9
  481. package/src/test/HighlightShape.test.ts +2 -1
  482. package/src/test/SelectTool.test.ts +40 -13
  483. package/src/test/TLUserPreferences.test.ts +4 -3
  484. package/src/test/TestEditor.ts +13 -15
  485. package/src/test/TldrawEditor.test.tsx +11 -10
  486. package/src/test/ZoomTool.test.ts +7 -6
  487. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  488. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  489. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  490. package/src/test/arrows-megabus.test.tsx +17 -10
  491. package/src/test/bindings.test.tsx +24 -37
  492. package/src/test/bookmark-shapes.test.ts +1 -8
  493. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  494. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  495. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  496. package/src/test/commands/alignShapes.test.tsx +25 -24
  497. package/src/test/commands/animationSpeed.test.ts +2 -1
  498. package/src/test/commands/centerOnPoint.test.ts +3 -2
  499. package/src/test/commands/clipboard.test.ts +3 -2
  500. package/src/test/commands/createShapes.test.ts +2 -1
  501. package/src/test/commands/deletePage.test.ts +84 -1
  502. package/src/test/commands/deleteShapes.test.ts +2 -1
  503. package/src/test/commands/distributeShapes.test.tsx +11 -10
  504. package/src/test/commands/getSvgString.test.ts +2 -1
  505. package/src/test/commands/packShapes.test.ts +5 -4
  506. package/src/test/commands/resizeShape.test.ts +2 -1
  507. package/src/test/commands/rotateShapes.test.ts +7 -6
  508. package/src/test/commands/setCamera.test.ts +4 -3
  509. package/src/test/commands/setCurrentPage.test.ts +3 -2
  510. package/src/test/commands/stackShapes.test.ts +11 -10
  511. package/src/test/commands/stretch.test.tsx +13 -12
  512. package/src/test/createDeepLink.test.tsx +2 -1
  513. package/src/test/cropping.test.ts +3 -2
  514. package/src/test/drawing.test.ts +2 -1
  515. package/src/test/flipShapes.test.ts +4 -3
  516. package/src/test/frames.test.ts +25 -24
  517. package/src/test/getCulledShapes.test.tsx +3 -2
  518. package/src/test/groups.test.tsx +2 -2
  519. package/src/test/handleDeepLink.test.tsx +2 -1
  520. package/src/test/inner-outer-margin.test.ts +315 -0
  521. package/src/test/maxShapes.test.ts +3 -2
  522. package/src/test/modifiers.test.ts +5 -4
  523. package/src/test/navigation.test.ts +264 -9
  524. package/src/test/panning.test.ts +2 -1
  525. package/src/test/perf/perf.test.ts +2 -1
  526. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  527. package/src/test/resizing.test.ts +39 -38
  528. package/src/test/select.test.tsx +4 -3
  529. package/src/test/selection-omnibus.test.ts +11 -10
  530. package/src/test/shapeutils.test.ts +398 -48
  531. package/src/test/translating.test.ts +10 -9
  532. package/tldraw.css +737 -627
  533. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  534. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
@@ -1,3 +1,4 @@
1
+ import { vi } from 'vitest'
1
2
  import { HandTool } from '../lib/tools/HandTool/HandTool'
2
3
  import { TestEditor, createDefaultShapes } from './TestEditor'
3
4
 
@@ -14,7 +15,7 @@ afterEach(() => {
14
15
  editor?.dispose()
15
16
  })
16
17
 
17
- jest.useFakeTimers()
18
+ vi.useFakeTimers()
18
19
 
19
20
  describe(HandTool, () => {
20
21
  it('Double taps to zoom in', () => {
@@ -22,9 +23,9 @@ describe(HandTool, () => {
22
23
  expect(editor.getZoomLevel()).toBe(1)
23
24
  editor.click()
24
25
  editor.click() // double click!
25
- jest.advanceTimersByTime(300)
26
+ vi.advanceTimersByTime(300)
26
27
  expect(editor.getZoomLevel()).not.toBe(1) // animating
27
- jest.advanceTimersByTime(300)
28
+ vi.advanceTimersByTime(300)
28
29
  expect(editor.getZoomLevel()).toBe(2) // all done
29
30
  })
30
31
 
@@ -34,9 +35,9 @@ describe(HandTool, () => {
34
35
  editor.click()
35
36
  editor.click()
36
37
  editor.click() // triple click!
37
- jest.advanceTimersByTime(300)
38
+ vi.advanceTimersByTime(300)
38
39
  expect(editor.getZoomLevel()).not.toBe(1) // animating
39
- jest.advanceTimersByTime(300)
40
+ vi.advanceTimersByTime(300)
40
41
  expect(editor.getZoomLevel()).toBe(0.5) // all done
41
42
  })
42
43
 
@@ -48,9 +49,9 @@ describe(HandTool, () => {
48
49
  editor.click()
49
50
  editor.click()
50
51
  editor.click() // quad click!
51
- jest.advanceTimersByTime(300)
52
+ vi.advanceTimersByTime(300)
52
53
  expect(editor.getZoomLevel()).not.toBe(2) // animating
53
- jest.advanceTimersByTime(300)
54
+ vi.advanceTimersByTime(300)
54
55
  expect(editor.getZoomLevel()).toBe(1) // all done
55
56
  })
56
57
 
@@ -62,9 +63,9 @@ describe(HandTool, () => {
62
63
  editor.click()
63
64
  editor.click()
64
65
  editor.click() // quad click!
65
- jest.advanceTimersByTime(300)
66
+ vi.advanceTimersByTime(300)
66
67
  expect(editor.getZoomLevel()).not.toBe(1) // animating
67
- jest.advanceTimersByTime(300)
68
+ vi.advanceTimersByTime(300)
68
69
  const z = editor.getZoomLevel()
69
70
  editor.zoomToFit() // call zoom to fit manually to compare
70
71
  expect(editor.getZoomLevel()).toBe(z) // zoom should not have changed
@@ -1,6 +1,7 @@
1
+ import { vi } from 'vitest'
1
2
  import { TestEditor } from './TestEditor'
2
3
 
3
- jest.useFakeTimers()
4
+ vi.useFakeTimers()
4
5
 
5
6
  let editor: TestEditor
6
7
 
@@ -7,6 +7,7 @@ import {
7
7
  createShapeId,
8
8
  toRichText,
9
9
  } from '@tldraw/editor'
10
+ import { vi } from 'vitest'
10
11
  import { TestEditor } from './TestEditor'
11
12
 
12
13
  let editor: TestEditor
@@ -18,7 +19,7 @@ const ids = {
18
19
  arrow1: createShapeId('arrow1'),
19
20
  }
20
21
 
21
- jest.useFakeTimers()
22
+ vi.useFakeTimers()
22
23
 
23
24
  beforeEach(() => {
24
25
  editor = new TestEditor()
@@ -160,7 +161,7 @@ describe('TLSelectTool.Translating', () => {
160
161
  // There's a timer here! We shouldn't end the clone until the timer is done
161
162
  expect(editor.getCurrentPageShapes().length).toBe(2)
162
163
 
163
- jest.advanceTimersByTime(250) // tick tock
164
+ vi.advanceTimersByTime(250) // tick tock
164
165
 
165
166
  // Timer is done! We should have ended the clone.
166
167
  expect(editor.getCurrentPageShapes().length).toBe(1)
@@ -275,17 +276,27 @@ describe('PointingLabel', () => {
275
276
  type: 'arrow',
276
277
  x: 100,
277
278
  y: 100,
278
- props: { text: 'Test Label', end: { x: 100, y: 100 } },
279
+ props: {
280
+ richText: toRichText('Test Label'),
281
+ start: { x: 0, y: 0 },
282
+ end: { x: 100, y: 0 },
283
+ },
279
284
  },
280
285
  ])
281
- const shape = editor.getShape(ids.arrow1)
282
- editor.pointerDown(150, 150, {
286
+ const shape = editor.getShape(ids.arrow1)!
287
+ // First select the shape so it's already selected
288
+ editor.select(shape.id)
289
+
290
+ // Click at the middle of the arrow where the label would be and drag to move the label
291
+ editor.pointerDown(150, 100, {
283
292
  target: 'shape',
284
293
  shape,
285
294
  })
286
- editor.pointerMove(100, 100)
295
+ editor.pointerMove(160, 100)
287
296
  editor.expectToBeIn('select.pointing_arrow_label')
288
297
 
298
+ // Continue dragging to actually move the label, then it should go to idle
299
+ editor.pointerMove(170, 100)
289
300
  editor.pointerUp()
290
301
  editor.expectToBeIn('select.idle')
291
302
  })
@@ -297,16 +308,21 @@ describe('PointingLabel', () => {
297
308
  type: 'arrow',
298
309
  x: 100,
299
310
  y: 100,
300
- props: { text: 'Test Label', end: { x: 100, y: 100 } },
311
+ props: {
312
+ richText: toRichText('Test Label'),
313
+ start: { x: 0, y: 0 },
314
+ end: { x: 100, y: 0 },
315
+ },
301
316
  },
302
317
  ])
303
318
  const shape = editor.getShape(ids.arrow1)
304
319
 
305
- editor.pointerDown(150, 150, {
320
+ // Click at the middle of the arrow where the label would be
321
+ editor.pointerDown(150, 100, {
306
322
  target: 'shape',
307
323
  shape,
308
324
  })
309
- editor.pointerMove(100, 100)
325
+ editor.pointerMove(160, 100)
310
326
  editor.expectToBeIn('select.pointing_arrow_label')
311
327
  editor.cancel()
312
328
  editor.expectToBeIn('select.idle')
@@ -314,14 +330,25 @@ describe('PointingLabel', () => {
314
330
 
315
331
  it('Doesnt go into pointing_arrow_label mode if not selecting the arrow shape', () => {
316
332
  editor.createShapes<TLArrowShape>([
317
- { id: ids.arrow1, type: 'arrow', x: 100, y: 100, props: { text: 'Test Label' } },
333
+ {
334
+ id: ids.arrow1,
335
+ type: 'arrow',
336
+ x: 100,
337
+ y: 100,
338
+ props: {
339
+ richText: toRichText(''), // Empty label
340
+ start: { x: 0, y: 0 },
341
+ end: { x: 100, y: 0 },
342
+ },
343
+ },
318
344
  ])
319
- const shape = editor.getShape(ids.arrow1)
320
- editor.pointerDown(0, 150, {
345
+ const shape = editor.getShape(ids.arrow1)!
346
+ // Click anywhere on the arrow - since there's no label, it should go to translating
347
+ editor.pointerDown(150, 100, {
321
348
  target: 'shape',
322
349
  shape,
323
350
  })
324
- editor.pointerMove(100, 100)
351
+ editor.pointerMove(155, 105)
325
352
  editor.expectToBeIn('select.translating')
326
353
 
327
354
  editor.pointerUp()
@@ -1,4 +1,5 @@
1
1
  import { TLUserPreferences, atom, createTLUser } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
 
4
5
  let editor: TestEditor
@@ -59,7 +60,7 @@ describe('TLUserPreferences', () => {
59
60
  locale: null,
60
61
  name: null,
61
62
  })
62
- const setUserPreferences = jest.fn((preferences) => userPreferences.set(preferences))
63
+ const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
63
64
 
64
65
  editor = new TestEditor({
65
66
  user: createTLUser({
@@ -80,7 +81,7 @@ describe('TLUserPreferences', () => {
80
81
  id: '123',
81
82
  name: 'blah',
82
83
  })
83
- const setUserPreferences = jest.fn((preferences) => userPreferences.set(preferences))
84
+ const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
84
85
 
85
86
  editor = new TestEditor({
86
87
  user: createTLUser({
@@ -101,7 +102,7 @@ describe('TLUserPreferences', () => {
101
102
  id: '123',
102
103
  name: 'blah',
103
104
  })
104
- const setUserPreferences = jest.fn((preferences) => userPreferences.set(preferences))
105
+ const setUserPreferences = vi.fn((preferences) => userPreferences.set(preferences))
105
106
 
106
107
  editor = new TestEditor({
107
108
  user: createTLUser({
@@ -34,6 +34,7 @@ import {
34
34
  rotateSelectionHandle,
35
35
  tlenv,
36
36
  } from '@tldraw/editor'
37
+ import { vi } from 'vitest'
37
38
  import { defaultBindingUtils } from '../lib/defaultBindingUtils'
38
39
  import { defaultShapeTools } from '../lib/defaultShapeTools'
39
40
  import { defaultShapeUtils } from '../lib/defaultShapeUtils'
@@ -42,7 +43,14 @@ import { defaultTools } from '../lib/defaultTools'
42
43
  import { defaultAddFontsFromNode, tipTapDefaultExtensions } from '../lib/utils/text/richText'
43
44
  import { shapesFromJsx } from './test-jsx'
44
45
 
45
- jest.useFakeTimers()
46
+ declare module 'vitest' {
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
48
+ interface Matchers<T = any> {
49
+ toCloselyMatchObject(expected: any, roundToNearest?: number): void
50
+ }
51
+ }
52
+
53
+ vi.useFakeTimers()
46
54
 
47
55
  Object.assign(navigator, {
48
56
  clipboard: {
@@ -55,16 +63,6 @@ Object.assign(navigator, {
55
63
  // @ts-expect-error
56
64
  window.ClipboardItem = class {}
57
65
 
58
- declare global {
59
- // eslint-disable-next-line @typescript-eslint/no-namespace
60
- namespace jest {
61
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
62
- interface Matchers<R> {
63
- toCloselyMatchObject(value: any, precision?: number): void
64
- }
65
- }
66
- }
67
-
68
66
  export class TestEditor extends Editor {
69
67
  constructor(
70
68
  options: Partial<Omit<TLEditorOptions, 'store'>> = {},
@@ -82,8 +80,8 @@ export class TestEditor extends Editor {
82
80
  right: 1080,
83
81
  }
84
82
  // make the app full screen for the sake of the insets property
85
- jest.spyOn(document.body, 'scrollWidth', 'get').mockImplementation(() => bounds.width)
86
- jest.spyOn(document.body, 'scrollHeight', 'get').mockImplementation(() => bounds.height)
83
+ vi.spyOn(document.body, 'scrollWidth', 'get').mockImplementation(() => bounds.width)
84
+ vi.spyOn(document.body, 'scrollHeight', 'get').mockImplementation(() => bounds.height)
87
85
 
88
86
  elm.tabIndex = 0
89
87
  elm.getBoundingClientRect = () => bounds as DOMRect
@@ -272,12 +270,12 @@ export class TestEditor extends Editor {
272
270
  * methods, or call mockRestore() to restore the actual implementation (e.g.
273
271
  * _transformPointerDownSpy.mockRestore())
274
272
  */
275
- _transformPointerDownSpy = jest
273
+ _transformPointerDownSpy = vi
276
274
  .spyOn(this._clickManager, 'handlePointerEvent')
277
275
  .mockImplementation((info) => {
278
276
  return info
279
277
  })
280
- _transformPointerUpSpy = jest
278
+ _transformPointerUpSpy = vi
281
279
  .spyOn(this._clickManager, 'handlePointerEvent')
282
280
  .mockImplementation((info) => {
283
281
  return info
@@ -12,6 +12,7 @@ import {
12
12
  noop,
13
13
  } from '@tldraw/editor'
14
14
  import { StrictMode } from 'react'
15
+ import { vi } from 'vitest'
15
16
  import { defaultShapeUtils } from '../lib/defaultShapeUtils'
16
17
  import { defaultTools } from '../lib/defaultTools'
17
18
  import { GeoShapeUtil } from '../lib/shapes/geo/GeoShapeUtil'
@@ -89,7 +90,7 @@ describe('<TldrawEditor />', () => {
89
90
  })
90
91
 
91
92
  it('throws if the store has different shapes to the ones passed in', async () => {
92
- const spy = jest.spyOn(console, 'error').mockImplementation(noop)
93
+ const spy = vi.spyOn(console, 'error').mockImplementation(noop)
93
94
  // expect(() =>
94
95
  // render(
95
96
  // <TldrawEditor
@@ -129,7 +130,7 @@ describe('<TldrawEditor />', () => {
129
130
 
130
131
  it('Accepts fresh versions of store and calls `onMount` for each one', async () => {
131
132
  const initialStore = createTLStore({ shapeUtils: [], bindingUtils: [] })
132
- const onMount = jest.fn()
133
+ const onMount = vi.fn()
133
134
  const rendered = await renderTldrawComponent(
134
135
  <TldrawEditor
135
136
  initialState="select"
@@ -139,8 +140,8 @@ describe('<TldrawEditor />', () => {
139
140
  />,
140
141
  { waitForPatterns: false }
141
142
  )
142
- const initialEditor = onMount.mock.lastCall[0]
143
- jest.spyOn(initialEditor, 'dispose')
143
+ const initialEditor = onMount.mock.lastCall![0]
144
+ vi.spyOn(initialEditor, 'dispose')
144
145
  expect(initialEditor.store).toBe(initialStore)
145
146
  // re-render with the same store:
146
147
  rendered.rerender(
@@ -161,7 +162,7 @@ describe('<TldrawEditor />', () => {
161
162
  await rendered.findAllByTestId('canvas')
162
163
  expect(initialEditor.dispose).toHaveBeenCalledTimes(1)
163
164
  expect(onMount).toHaveBeenCalledTimes(2)
164
- expect(onMount.mock.lastCall[0].store).toBe(newStore)
165
+ expect(onMount.mock.lastCall![0].store).toBe(newStore)
165
166
  })
166
167
 
167
168
  it('Renders the canvas and shapes', async () => {
@@ -227,7 +228,7 @@ describe('<TldrawEditor />', () => {
227
228
 
228
229
  it('renders correctly in strict mode', async () => {
229
230
  const editorInstances = new Set<Editor>()
230
- const onMount = jest.fn((editor: Editor) => {
231
+ const onMount = vi.fn((editor: Editor) => {
231
232
  editorInstances.add(editor)
232
233
  })
233
234
  await renderTldrawComponent(
@@ -245,7 +246,7 @@ describe('<TldrawEditor />', () => {
245
246
 
246
247
  it('allows updating camera options without re-creating the editor', async () => {
247
248
  const editors: Editor[] = []
248
- const onMount = jest.fn((editor: Editor) => {
249
+ const onMount = vi.fn((editor: Editor) => {
249
250
  if (!editors.includes(editor)) editors.push(editor)
250
251
  })
251
252
 
@@ -361,7 +362,7 @@ describe('<TldrawEditor />', () => {
361
362
  })
362
363
 
363
364
  it('passes through the `assets` prop when creating its own in-memory store', async () => {
364
- const myUploadFn = jest.fn()
365
+ const myUploadFn = vi.fn()
365
366
  const assetStore: TLAssetStore = { upload: myUploadFn }
366
367
 
367
368
  const { editor } = await renderTldrawComponentWithEditor(
@@ -375,7 +376,7 @@ describe('<TldrawEditor />', () => {
375
376
  })
376
377
 
377
378
  it('passes through the `assets` prop when using `persistenceKey`', async () => {
378
- const myUploadFn = jest.fn()
379
+ const myUploadFn = vi.fn()
379
380
  const assetStore: TLAssetStore = { upload: myUploadFn }
380
381
 
381
382
  const { editor } = await renderTldrawComponentWithEditor(
@@ -394,7 +395,7 @@ describe('<TldrawEditor />', () => {
394
395
  })
395
396
 
396
397
  it('will not re-create the editor if re-rendered with identical options', async () => {
397
- const onMount = jest.fn()
398
+ const onMount = vi.fn()
398
399
 
399
400
  const renderer = await renderTldrawComponent(
400
401
  <TldrawEditor onMount={onMount} options={{ maxPages: 1 }} />,
@@ -1,4 +1,5 @@
1
1
  import { createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
 
4
5
  let editor: TestEditor
@@ -7,7 +8,7 @@ const ids = {
7
8
  box1: createShapeId('box1'),
8
9
  }
9
10
 
10
- jest.useFakeTimers()
11
+ vi.useFakeTimers()
11
12
 
12
13
  beforeEach(() => {
13
14
  editor = new TestEditor()
@@ -44,7 +45,7 @@ describe('TLSelectTool.Zooming', () => {
44
45
  expect(editor.getViewportPageCenter()).toMatchObject({ x: 540, y: 360 })
45
46
  editor.click()
46
47
  editor.expectToBeIn('zoom.idle')
47
- jest.advanceTimersByTime(300)
48
+ vi.advanceTimersByTime(300)
48
49
  expect(editor.getZoomLevel()).toBe(2)
49
50
  })
50
51
 
@@ -55,7 +56,7 @@ describe('TLSelectTool.Zooming', () => {
55
56
  expect(editor.getViewportPageBounds()).toMatchObject({ x: -0, y: -0, w: 1080, h: 720 })
56
57
  expect(editor.getViewportPageCenter()).toMatchObject({ x: 540, y: 360 })
57
58
  editor.click()
58
- jest.advanceTimersByTime(300)
59
+ vi.advanceTimersByTime(300)
59
60
  expect(editor.getZoomLevel()).toBe(0.5)
60
61
  })
61
62
 
@@ -122,7 +123,7 @@ describe('TLSelectTool.Zooming', () => {
122
123
  editor.expectToBeIn('zoom.zoom_brushing')
123
124
  editor.pointerUp(change, change)
124
125
  editor.expectToBeIn('zoom.idle')
125
- jest.advanceTimersByTime(300)
126
+ vi.advanceTimersByTime(300)
126
127
  expect(editor.getZoomLevel()).toBe(2)
127
128
  expect(editor.getViewportPageBounds()).toMatchObject({
128
129
  x: change / 2,
@@ -156,7 +157,7 @@ describe('TLSelectTool.Zooming', () => {
156
157
  h: newBoundsHeight,
157
158
  })
158
159
  editor.pointerUp(newBoundsX + newBoundsWidth, newBoundsY + newBoundsHeight)
159
- jest.advanceTimersByTime(300)
160
+ vi.advanceTimersByTime(300)
160
161
  expect(editor.getZoomLevel()).toBeCloseTo(1.64)
161
162
  expect(editor.getViewportPageBounds()).toMatchInlineSnapshot(`
162
163
  Box {
@@ -195,7 +196,7 @@ describe('TLSelectTool.Zooming', () => {
195
196
  h: newBoundsHeight,
196
197
  })
197
198
  editor.pointerUp()
198
- jest.advanceTimersByTime(500)
199
+ vi.advanceTimersByTime(500)
199
200
  expect(editor.getZoomLevel()).toBeCloseTo(originalZoomLevel / 2)
200
201
  expect(editor.getViewportPageBounds()).toMatchObject({
201
202
  x: -440,
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`Draws a bunch: draw shape 1`] = `
3
+ exports[`Draws a bunch > draw shape 1`] = `
4
4
  {
5
5
  "index": "a1",
6
6
  "isLocked": false,
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`creating new shapes pencil lines will reisze the group appropriately if the new shape changes the group bounds: box shape after second resize 1`] = `
3
+ exports[`creating new shapes > pencil > lines > will reisze the group appropriately if the new shape changes the group bounds > box shape after second resize 1`] = `
4
4
  {
5
5
  "h": 40,
6
6
  "w": 40,
@@ -9,7 +9,7 @@ exports[`creating new shapes pencil lines will reisze the group appropriately if
9
9
  }
10
10
  `;
11
11
 
12
- exports[`creating new shapes pencil lines will reisze the group appropriately if the new shape changes the group bounds: group shape after second resize 1`] = `
12
+ exports[`creating new shapes > pencil > lines > will reisze the group appropriately if the new shape changes the group bounds > group shape after second resize 1`] = `
13
13
  {
14
14
  "h": 120,
15
15
  "w": 120,
@@ -18,7 +18,7 @@ exports[`creating new shapes pencil lines will reisze the group appropriately if
18
18
  }
19
19
  `;
20
20
 
21
- exports[`creating new shapes pencil lines will reisze the group appropriately if the new shape changes the group bounds: group with line shape 1`] = `
21
+ exports[`creating new shapes > pencil > lines > will reisze the group appropriately if the new shape changes the group bounds > group with line shape 1`] = `
22
22
  Box {
23
23
  "h": 110,
24
24
  "w": 110,
@@ -27,7 +27,7 @@ Box {
27
27
  }
28
28
  `;
29
29
 
30
- exports[`creating new shapes pencil lines works if the shape drawing begins outside of the current group bounds: box shape after resize 1`] = `
30
+ exports[`creating new shapes > pencil > lines > works if the shape drawing begins outside of the current group bounds > box shape after resize 1`] = `
31
31
  {
32
32
  "h": 50,
33
33
  "w": 50,
@@ -36,7 +36,7 @@ exports[`creating new shapes pencil lines works if the shape drawing begins outs
36
36
  }
37
37
  `;
38
38
 
39
- exports[`creating new shapes pencil lines works if the shape drawing begins outside of the current group bounds: group with line 1`] = `
39
+ exports[`creating new shapes > pencil > lines > works if the shape drawing begins outside of the current group bounds > group with line 1`] = `
40
40
  {
41
41
  "h": 200,
42
42
  "w": 200,
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`When resizing a shape with children Resizes a rotated draw shape: draw shape after rotating 1`] = `
3
+ exports[`When resizing a shape with children > Resizes a rotated draw shape > draw shape after rotating 1`] = `
4
4
  {
5
5
  "id": "shape:lineA",
6
6
  "index": "a3",
@@ -1,4 +1,5 @@
1
1
  import { TLArrowShape, TLShapeId, Vec, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { getArrowBindings } from '../lib/shapes/arrow/shared'
3
4
  import { TestEditor } from './TestEditor'
4
5
  import { TL } from './test-jsx'
@@ -208,7 +209,7 @@ describe('When binding an arrow to a shape', () => {
208
209
 
209
210
  editor.keyUp('Control')
210
211
  expect(bindings().end).toBeUndefined() // there's a short delay here, it should still be a point
211
- jest.advanceTimersByTime(1000) // once the timer runs out...
212
+ vi.advanceTimersByTime(1000) // once the timer runs out...
212
213
  expect(bindings().end).toBeDefined()
213
214
 
214
215
  editor.keyDown('Control') // no delay when pressing control again though
@@ -216,7 +217,7 @@ describe('When binding an arrow to a shape', () => {
216
217
 
217
218
  editor.keyUp('Control')
218
219
  editor.pointerUp()
219
- jest.advanceTimersByTime(1000) // once the timer runs out...
220
+ vi.advanceTimersByTime(1000) // once the timer runs out...
220
221
  expect(bindings().end).toBeUndefined() // still a point because interaction ended before timer ended
221
222
  })
222
223
 
@@ -237,7 +238,7 @@ describe('When binding an arrow to a shape', () => {
237
238
  // Releasing ctrl should restore binding (after timer)
238
239
  editor.keyUp('Control')
239
240
  expect(bindings().end).toBeUndefined() // Still no binding immediately
240
- jest.advanceTimersByTime(1000)
241
+ vi.advanceTimersByTime(1000)
241
242
  expect(bindings().end).toBeDefined()
242
243
  })
243
244
  })
@@ -288,11 +289,13 @@ describe('When shapes are overlapping', () => {
288
289
  editor.pointerDown(0, 50) // over nothing
289
290
  editor.pointerMove(125, 50) // over box1 only
290
291
  expect(bindings().end).toMatchObject({ toId: ids.box1 })
291
- editor.pointerMove(175, 50) // box2 is higher but box1 is filled?
292
+ editor.pointerMove(175, 50) // box2 is higher but box1 is filled, but we're on the edge ofd box 2
293
+ expect(bindings().end).toMatchObject({ toId: ids.box2 })
294
+ editor.pointerMove(175, 70) // box2 is higher but box1 is filled, and we're inside of box2
292
295
  expect(bindings().end).toMatchObject({ toId: ids.box1 })
293
- editor.pointerMove(225, 50) // box3 is higher
296
+ editor.pointerMove(225, 70) // box3 is higher
294
297
  expect(bindings().end).toMatchObject({ toId: ids.box3 })
295
- editor.pointerMove(275, 50) // box4 is higher but box 3 is filled
298
+ editor.pointerMove(275, 70) // box4 is higher but box 3 is filled
296
299
  expect(bindings().end).toMatchObject({ toId: ids.box3 })
297
300
  })
298
301
 
@@ -304,14 +307,18 @@ describe('When shapes are overlapping', () => {
304
307
  ])
305
308
  editor.setCurrentTool('arrow')
306
309
  editor.pointerDown(0, 50)
307
- editor.pointerMove(175, 50) // box1 is smaller even though it's behind box2
310
+ editor.pointerMove(175, 50) // box1 is smaller even though it's behind box2, but we're on the edge of box 2
311
+ expect(bindings().end).toMatchObject({ toId: ids.box2 })
312
+ editor.pointerMove(175, 70) // box1 is smaller even though it's behind box2
308
313
  expect(bindings().end).toMatchObject({ toId: ids.box1 })
309
- editor.pointerMove(150, 90) // box3 is smaller and at the front
314
+ editor.pointerMove(150, 90) // box3 is smaller and at the front but we're on the edge of box 2
315
+ expect(bindings().end).toMatchObject({ toId: ids.box2 })
316
+ editor.pointerMove(160, 90) // box3 is smaller and at the front and we're in box1 and box 3 and box 2
310
317
  expect(bindings().end).toMatchObject({ toId: ids.box3 })
311
318
  editor.sendToBack([ids.box3])
312
319
  editor.pointerMove(149, 90) // box3 is smaller, even when at the back
313
320
  expect(bindings().end).toMatchObject({ toId: ids.box3 })
314
- editor.pointerMove(175, 50)
321
+ editor.pointerMove(175, 60) // inside of box1 and box 2, but box 1 is smaller
315
322
  expect(bindings().end).toMatchObject({ toId: ids.box1 })
316
323
  })
317
324
  })
@@ -403,7 +410,7 @@ describe('When starting an arrow inside of multiple shapes', () => {
403
410
  editor.pointerDown(20, 20) // upper left
404
411
  expect(editor.getCurrentPageShapes().length).toBe(1)
405
412
  expect(arrow()).toBe(null)
406
- jest.advanceTimersByTime(1000)
413
+ vi.advanceTimersByTime(1000)
407
414
  editor.pointerMove(25, 20)
408
415
  expect(editor.getCurrentPageShapes().length).toBe(2)
409
416
  expect(arrow()).toMatchObject({ x: 20, y: 20 })
@@ -11,6 +11,7 @@ import {
11
11
  createBindingId,
12
12
  createShapeId,
13
13
  } from '@tldraw/editor'
14
+ import { vi } from 'vitest'
14
15
  import { TestEditor } from './TestEditor'
15
16
  import { TL } from './test-jsx'
16
17
 
@@ -23,37 +24,19 @@ const ids = {
23
24
  box4: createShapeId('box4'),
24
25
  }
25
26
 
26
- const mockOnOperationComplete = jest.fn() as jest.Mock<void, []>
27
- const mockOnBeforeDelete = jest.fn() as jest.Mock<void, [BindingOnDeleteOptions<TLUnknownBinding>]>
28
- const mockOnAfterDelete = jest.fn() as jest.Mock<void, [BindingOnDeleteOptions<TLUnknownBinding>]>
29
- const mockOnBeforeFromShapeDelete = jest.fn() as jest.Mock<
30
- void,
31
- [BindingOnShapeDeleteOptions<TLUnknownBinding>]
32
- >
33
- const mockOnBeforeToShapeDelete = jest.fn() as jest.Mock<
34
- void,
35
- [BindingOnShapeDeleteOptions<TLUnknownBinding>]
36
- >
37
- const mockOnBeforeFromShapeIsolate = jest.fn() as jest.Mock<
38
- void,
39
- [BindingOnShapeIsolateOptions<TLUnknownBinding>]
40
- >
41
- const mockOnBeforeToShapeIsolate = jest.fn() as jest.Mock<
42
- void,
43
- [BindingOnShapeIsolateOptions<TLUnknownBinding>]
44
- >
45
- const mockOnBeforeCreate = jest.fn() as jest.Mock<void, [BindingOnCreateOptions<TLUnknownBinding>]>
46
- const mockOnAfterCreate = jest.fn() as jest.Mock<void, [BindingOnCreateOptions<TLUnknownBinding>]>
47
- const mockOnBeforeChange = jest.fn() as jest.Mock<void, [BindingOnChangeOptions<TLUnknownBinding>]>
48
- const mockOnAfterChange = jest.fn() as jest.Mock<void, [BindingOnChangeOptions<TLUnknownBinding>]>
49
- const mockOnAfterChangeFromShape = jest.fn() as jest.Mock<
50
- void,
51
- [BindingOnShapeChangeOptions<TLUnknownBinding>]
52
- >
53
- const mockOnAfterChangeToShape = jest.fn() as jest.Mock<
54
- void,
55
- [BindingOnShapeChangeOptions<TLUnknownBinding>]
56
- >
27
+ const mockOnOperationComplete = vi.fn()
28
+ const mockOnBeforeDelete = vi.fn()
29
+ const mockOnAfterDelete = vi.fn()
30
+ const mockOnBeforeFromShapeDelete = vi.fn()
31
+ const mockOnBeforeToShapeDelete = vi.fn()
32
+ const mockOnBeforeFromShapeIsolate = vi.fn()
33
+ const mockOnBeforeToShapeIsolate = vi.fn()
34
+ const mockOnBeforeCreate = vi.fn()
35
+ const mockOnAfterCreate = vi.fn()
36
+ const mockOnBeforeChange = vi.fn()
37
+ const mockOnAfterChange = vi.fn()
38
+ const mockOnAfterChangeFromShape = vi.fn()
39
+ const mockOnAfterChangeToShape = vi.fn()
57
40
 
58
41
  const calls: string[] = []
59
42
 
@@ -273,9 +256,11 @@ test('copying the to shape on its own does trigger the unbind operation', () =>
273
256
  })
274
257
 
275
258
  test('cascading deletes in beforeFromShapeDelete are handled correctly', () => {
276
- mockOnBeforeFromShapeDelete.mockImplementation((options) => {
277
- editor.deleteShape(options.binding.toId)
278
- })
259
+ mockOnBeforeFromShapeDelete.mockImplementation(
260
+ (options: BindingOnShapeDeleteOptions<TLUnknownBinding>) => {
261
+ editor.deleteShape(options.binding.toId)
262
+ }
263
+ )
279
264
 
280
265
  bindShapes(ids.box1, ids.box2)
281
266
  bindShapes(ids.box2, ids.box3)
@@ -316,9 +301,11 @@ test('cascading deletes in beforeFromShapeDelete are handled correctly', () => {
316
301
  })
317
302
 
318
303
  test('cascading deletes in beforeToShapeDelete are handled correctly', () => {
319
- mockOnBeforeToShapeDelete.mockImplementation((options) => {
320
- editor.deleteShape(options.binding.fromId)
321
- })
304
+ mockOnBeforeToShapeDelete.mockImplementation(
305
+ (options: BindingOnShapeDeleteOptions<TLUnknownBinding>) => {
306
+ editor.deleteShape(options.binding.fromId)
307
+ }
308
+ )
322
309
 
323
310
  bindShapes(ids.box1, ids.box2)
324
311
  bindShapes(ids.box2, ids.box3)