tldraw 3.16.0-canary.ffdf566dd0a8 → 3.16.0-internal.51e99e128bd4

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 (310) hide show
  1. package/dist-cjs/index.d.ts +173 -5
  2. package/dist-cjs/index.js +12 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  9. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  10. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  13. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  14. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
  15. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  17. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  18. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  19. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  21. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  22. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  23. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
  25. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
  26. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  27. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  29. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  31. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  32. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  33. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  34. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  36. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  37. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  38. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  39. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  40. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  41. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  42. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  43. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  44. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  45. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  46. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  47. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  48. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  49. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  50. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  51. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  52. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  53. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  54. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  55. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  57. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  58. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  59. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  61. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +14 -14
  63. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  65. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  67. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  68. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  69. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  70. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  71. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  72. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  73. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  74. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +2 -2
  75. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  77. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  78. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  79. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  80. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  81. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  82. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +19 -4
  83. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  84. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +153 -152
  85. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  86. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  87. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  88. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  89. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  90. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  92. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  93. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  94. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  95. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  96. package/dist-cjs/lib/ui/version.js +3 -3
  97. package/dist-cjs/lib/ui/version.js.map +1 -1
  98. package/dist-esm/index.d.mts +173 -5
  99. package/dist-esm/index.mjs +19 -1
  100. package/dist-esm/index.mjs.map +2 -2
  101. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  102. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  103. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  104. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  105. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  106. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  107. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  108. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  109. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  110. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  111. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  112. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  113. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  114. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  115. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  116. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  117. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  118. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  119. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  120. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  121. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  122. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  123. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  124. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  125. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  126. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  127. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  128. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  129. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  130. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  131. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  132. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  133. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  134. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  135. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  136. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  137. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  138. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  139. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  140. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  141. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  142. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  143. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  144. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  145. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  146. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  147. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  148. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  149. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  150. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  151. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  152. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  153. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  154. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  155. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  156. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  157. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  158. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  159. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +14 -14
  160. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  161. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  162. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  163. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  164. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  165. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  166. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  167. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  168. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  169. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  170. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  171. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +2 -2
  172. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  173. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  174. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  175. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  176. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  177. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  178. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  179. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +19 -4
  180. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  181. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +162 -154
  182. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  183. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  184. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  185. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  186. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  187. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  188. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  189. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  190. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  191. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  192. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  193. package/dist-esm/lib/ui/version.mjs +3 -3
  194. package/dist-esm/lib/ui/version.mjs.map +1 -1
  195. package/package.json +11 -34
  196. package/src/index.ts +15 -0
  197. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  198. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  199. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  200. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  201. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  202. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  203. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  204. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  205. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  206. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  207. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  208. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  209. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  210. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  211. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  212. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  213. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  214. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  215. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  216. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  217. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  218. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  219. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  220. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  221. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  222. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  223. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  224. package/src/lib/ui/TldrawUi.tsx +17 -2
  225. package/src/lib/ui/assetUrls.ts +13 -10
  226. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  227. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  228. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  229. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  230. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  231. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  232. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  233. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  234. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +39 -43
  235. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  236. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  237. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  238. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  239. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  240. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +2 -2
  241. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  242. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  243. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  244. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +32 -9
  245. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +186 -172
  246. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  247. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  248. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  249. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  250. package/src/lib/ui/context/events.tsx +1 -0
  251. package/src/lib/ui/hooks/useTools.tsx +140 -10
  252. package/src/lib/ui/version.ts +3 -3
  253. package/src/lib/ui.css +363 -305
  254. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  255. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  256. package/src/test/A11y.test.tsx +3 -2
  257. package/src/test/ClickManager.test.ts +7 -6
  258. package/src/test/Editor.test.tsx +20 -19
  259. package/src/test/EraserTool.test.ts +184 -13
  260. package/src/test/HandTool.test.ts +10 -9
  261. package/src/test/HighlightShape.test.ts +2 -1
  262. package/src/test/SelectTool.test.ts +3 -2
  263. package/src/test/TLUserPreferences.test.ts +4 -3
  264. package/src/test/TestEditor.ts +13 -15
  265. package/src/test/TldrawEditor.test.tsx +11 -10
  266. package/src/test/ZoomTool.test.ts +7 -6
  267. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  268. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  269. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  270. package/src/test/arrows-megabus.test.tsx +5 -4
  271. package/src/test/bindings.test.tsx +24 -37
  272. package/src/test/bookmark-shapes.test.ts +1 -8
  273. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  274. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  275. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  276. package/src/test/commands/alignShapes.test.tsx +25 -24
  277. package/src/test/commands/animationSpeed.test.ts +2 -1
  278. package/src/test/commands/centerOnPoint.test.ts +3 -2
  279. package/src/test/commands/clipboard.test.ts +3 -2
  280. package/src/test/commands/createShapes.test.ts +2 -1
  281. package/src/test/commands/deleteShapes.test.ts +2 -1
  282. package/src/test/commands/distributeShapes.test.tsx +11 -10
  283. package/src/test/commands/getSvgString.test.ts +2 -1
  284. package/src/test/commands/packShapes.test.ts +5 -4
  285. package/src/test/commands/resizeShape.test.ts +2 -1
  286. package/src/test/commands/rotateShapes.test.ts +7 -6
  287. package/src/test/commands/setCamera.test.ts +4 -3
  288. package/src/test/commands/setCurrentPage.test.ts +3 -2
  289. package/src/test/commands/stackShapes.test.ts +11 -10
  290. package/src/test/commands/stretch.test.tsx +13 -12
  291. package/src/test/createDeepLink.test.tsx +2 -1
  292. package/src/test/cropping.test.ts +3 -2
  293. package/src/test/drawing.test.ts +2 -1
  294. package/src/test/flipShapes.test.ts +4 -3
  295. package/src/test/frames.test.ts +25 -24
  296. package/src/test/getCulledShapes.test.tsx +3 -2
  297. package/src/test/groups.test.tsx +1 -1
  298. package/src/test/handleDeepLink.test.tsx +2 -1
  299. package/src/test/maxShapes.test.ts +3 -2
  300. package/src/test/modifiers.test.ts +5 -4
  301. package/src/test/navigation.test.ts +12 -11
  302. package/src/test/panning.test.ts +2 -1
  303. package/src/test/perf/perf.test.ts +2 -1
  304. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  305. package/src/test/resizing.test.ts +39 -38
  306. package/src/test/select.test.tsx +4 -3
  307. package/src/test/selection-omnibus.test.ts +11 -10
  308. package/src/test/shapeutils.test.ts +4 -3
  309. package/src/test/translating.test.ts +9 -8
  310. package/tldraw.css +656 -595
@@ -1,11 +1,12 @@
1
1
  import { PI, TLShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from '../TestEditor'
3
4
  import { TL } from '../test-jsx'
4
5
 
5
6
  let editor: TestEditor
6
7
  let ids: Record<string, TLShapeId>
7
8
 
8
- jest.useFakeTimers()
9
+ vi.useFakeTimers()
9
10
 
10
11
  function createVideoShape() {
11
12
  return editor.createShapesFromJsx(<TL.video ref="video1" x={0} y={0} w={160} h={90} />).video1
@@ -26,10 +27,10 @@ beforeEach(() => {
26
27
  describe('when less than two shapes are selected', () => {
27
28
  it('does nothing', () => {
28
29
  editor.setSelectedShapes([ids.boxB])
29
- const fn = jest.fn()
30
+ const fn = vi.fn()
30
31
  editor.store.listen(fn)
31
32
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
32
- jest.advanceTimersByTime(1000)
33
+ vi.advanceTimersByTime(1000)
33
34
 
34
35
  expect(fn).not.toHaveBeenCalled()
35
36
  })
@@ -39,7 +40,7 @@ describe('when multiple shapes are selected', () => {
39
40
  it('stretches horizontally', () => {
40
41
  editor.selectAll()
41
42
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
42
- jest.advanceTimersByTime(1000)
43
+ vi.advanceTimersByTime(1000)
43
44
  editor.expectShapeToMatch(
44
45
  { id: ids.boxA, x: 0, y: 0, props: { w: 500 } },
45
46
  { id: ids.boxB, x: 0, y: 100, props: { w: 500 } },
@@ -52,7 +53,7 @@ describe('when multiple shapes are selected', () => {
52
53
  editor.selectAll()
53
54
  expect(editor.getSelectedShapes().length).toBe(4)
54
55
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
55
- jest.advanceTimersByTime(1000)
56
+ vi.advanceTimersByTime(1000)
56
57
  const newHeight = (500 * 9) / 16
57
58
  editor.expectShapeToMatch(
58
59
  { id: ids.boxA, x: 0, y: 0, props: { w: 500 } },
@@ -65,7 +66,7 @@ describe('when multiple shapes are selected', () => {
65
66
  it('stretches vertically', () => {
66
67
  editor.selectAll()
67
68
  editor.stretchShapes(editor.getSelectedShapeIds(), 'vertical')
68
- jest.advanceTimersByTime(1000)
69
+ vi.advanceTimersByTime(1000)
69
70
  editor.expectShapeToMatch(
70
71
  { id: ids.boxA, x: 0, y: 0, props: { h: 500 } },
71
72
  { id: ids.boxB, x: 100, y: 0, props: { h: 500 } },
@@ -78,7 +79,7 @@ describe('when multiple shapes are selected', () => {
78
79
  editor.selectAll()
79
80
  expect(editor.getSelectedShapes().length).toBe(4)
80
81
  editor.stretchShapes(editor.getSelectedShapeIds(), 'vertical')
81
- jest.advanceTimersByTime(1000)
82
+ vi.advanceTimersByTime(1000)
82
83
  const newWidth = (500 * 16) / 9
83
84
  editor.expectShapeToMatch(
84
85
  { id: ids.boxA, x: 0, y: 0, props: { h: 500 } },
@@ -91,7 +92,7 @@ describe('when multiple shapes are selected', () => {
91
92
  it('does, undoes and redoes command', () => {
92
93
  editor.markHistoryStoppingPoint('stretch')
93
94
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
94
- jest.advanceTimersByTime(1000)
95
+ vi.advanceTimersByTime(1000)
95
96
 
96
97
  editor.expectShapeToMatch({ id: ids.boxB, x: 0, props: { w: 500 } })
97
98
  editor.undo()
@@ -106,7 +107,7 @@ describe('When shapes are the child of another shape.', () => {
106
107
  editor.reparentShapes([ids.boxB], ids.boxA)
107
108
  editor.select(ids.boxB, ids.boxC)
108
109
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
109
- jest.advanceTimersByTime(1000)
110
+ vi.advanceTimersByTime(1000)
110
111
  editor.expectShapeToMatch(
111
112
  { id: ids.boxB, x: 100, y: 100, props: { w: 400 } },
112
113
  { id: ids.boxC, x: 100, y: 400, props: { w: 400 } }
@@ -117,7 +118,7 @@ describe('When shapes are the child of another shape.', () => {
117
118
  editor.reparentShapes([ids.boxB], ids.boxA)
118
119
  editor.select(ids.boxB, ids.boxC)
119
120
  editor.stretchShapes(editor.getSelectedShapeIds(), 'vertical')
120
- jest.advanceTimersByTime(1000)
121
+ vi.advanceTimersByTime(1000)
121
122
  editor.expectShapeToMatch(
122
123
  { id: ids.boxB, x: 100, y: 100, props: { h: 400 } },
123
124
  { id: ids.boxC, x: 400, y: 100, props: { h: 400 } }
@@ -140,7 +141,7 @@ describe('When shapes are the child of a rotated shape.', () => {
140
141
 
141
142
  editor.select(ids.boxA, ids.boxC)
142
143
  editor.stretchShapes(editor.getSelectedShapeIds(), 'horizontal')
143
- jest.advanceTimersByTime(1000)
144
+ vi.advanceTimersByTime(1000)
144
145
  editor.expectShapeToMatch(
145
146
  {
146
147
  id: ids.boxA,
@@ -184,7 +185,7 @@ describe('When shapes are the child of a rotated shape.', () => {
184
185
  editor.selectAll()
185
186
 
186
187
  editor.stretchShapes(editor.getSelectedShapeIds(), 'vertical')
187
- jest.advanceTimersByTime(1000)
188
+ vi.advanceTimersByTime(1000)
188
189
  editor.expectShapeToMatch(
189
190
  {
190
191
  id: ids.boxA,
@@ -1,7 +1,8 @@
1
1
  import { PageRecordType, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
 
4
- jest.useFakeTimers()
5
+ vi.useFakeTimers()
5
6
 
6
7
  let editor: TestEditor
7
8
 
@@ -1,8 +1,9 @@
1
1
  import { createShapeId, TLImageShape } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { MIN_CROP_SIZE } from '../lib/shapes/shared/crop'
3
4
  import { TestEditor } from './TestEditor'
4
5
 
5
- jest.useFakeTimers()
6
+ vi.useFakeTimers()
6
7
 
7
8
  let editor: TestEditor
8
9
 
@@ -495,7 +496,7 @@ describe('When in the select.crop.translating_crop state', () => {
495
496
  })
496
497
 
497
498
  editor.keyUp('Shift')
498
- jest.advanceTimersByTime(500)
499
+ vi.advanceTimersByTime(500)
499
500
 
500
501
  const afterShiftUp = editor.getShape<TLImageShape>(ids.imageB)!.props.crop!
501
502
 
@@ -1,8 +1,9 @@
1
1
  import { TLDrawShape, TLHighlightShape, last } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
  import { TEST_DRAW_SHAPE_SCREEN_POINTS } from './drawing.data'
4
5
 
5
- jest.useFakeTimers()
6
+ vi.useFakeTimers()
6
7
 
7
8
  let editor: TestEditor
8
9
 
@@ -10,12 +10,13 @@ import {
10
10
  createBindingId,
11
11
  createShapeId,
12
12
  } from '@tldraw/editor'
13
+ import { vi } from 'vitest'
13
14
  import { getArrowBindings } from '../lib/shapes/arrow/shared'
14
15
  import { TestEditor } from './TestEditor'
15
16
 
16
17
  let editor: TestEditor
17
18
 
18
- jest.useFakeTimers()
19
+ vi.useFakeTimers()
19
20
 
20
21
  const ids = {
21
22
  boxA: createShapeId('boxA'),
@@ -297,7 +298,7 @@ describe('When one shape is selected', () => {
297
298
  })
298
299
 
299
300
  it('Flips the direct child shape positions if the shape is a group', async () => {
300
- const fn = jest.fn()
301
+ const fn = vi.fn()
301
302
 
302
303
  editor.selectAll()
303
304
  editor.groupShapes(editor.getSelectedShapeIds()) // this will also select the new group
@@ -306,7 +307,7 @@ describe('When one shape is selected', () => {
306
307
  editor.flipShapes(editor.getSelectedShapeIds(), 'horizontal')
307
308
 
308
309
  // The change event should have been called
309
- jest.runOnlyPendingTimers()
310
+ vi.runOnlyPendingTimers()
310
311
  expect(fn).toHaveBeenCalled()
311
312
 
312
313
  editor.expectShapeToMatch(
@@ -8,13 +8,14 @@ import {
8
8
  createShapeId,
9
9
  toRichText,
10
10
  } from '@tldraw/editor'
11
+ import { vi } from 'vitest'
11
12
  import { getArrowBindings } from '../lib/shapes/arrow/shared'
12
13
  import { DEFAULT_FRAME_PADDING, fitFrameToContent, removeFrame } from '../lib/utils/frames/frames'
13
14
  import { TestEditor } from './TestEditor'
14
15
 
15
16
  let editor: TestEditor
16
17
 
17
- jest.useFakeTimers()
18
+ vi.useFakeTimers()
18
19
 
19
20
  beforeEach(() => {
20
21
  editor = new TestEditor()
@@ -335,7 +336,7 @@ describe('frame shapes', () => {
335
336
  // move to the center of the frame
336
337
  editor.pointerMove(100, 100)
337
338
 
338
- jest.advanceTimersByTime(300)
339
+ vi.advanceTimersByTime(300)
339
340
 
340
341
  // Expect the shape to be inside the frame
341
342
  expect(editor.getOnlySelectedShape()!.id).toBe(ids.boxA)
@@ -343,13 +344,13 @@ describe('frame shapes', () => {
343
344
 
344
345
  // Move out of the frame
345
346
  editor.pointerMove(275, 275)
346
- jest.advanceTimersByTime(250)
347
+ vi.advanceTimersByTime(250)
347
348
 
348
349
  expect(editor.getOnlySelectedShape()!.parentId).toBe(editor.getCurrentPageId())
349
350
 
350
351
  // Move back into the frame
351
352
  editor.pointerMove(150, 150)
352
- jest.advanceTimersByTime(250)
353
+ vi.advanceTimersByTime(250)
353
354
 
354
355
  // Expect the shape to be inside the frame again
355
356
  expect(editor.getOnlySelectedShape()!.parentId).toBe(frameId)
@@ -384,7 +385,7 @@ describe('frame shapes', () => {
384
385
 
385
386
  editor.setCurrentTool('select').select(box1.id).pointerDown(127, 127).pointerMove(132, 127)
386
387
 
387
- jest.advanceTimersByTime(250)
388
+ vi.advanceTimersByTime(250)
388
389
 
389
390
  expect(editor.getOnlySelectedShape()!.id).toBe(box1.id)
390
391
  if (editor.getShape(box1)?.parentId !== frame.id) {
@@ -403,14 +404,14 @@ describe('frame shapes', () => {
403
404
  editor.pointerMove(175, 175)
404
405
  expect(editor.getOnlySelectedShape()!.parentId).toBe(frame.id)
405
406
 
406
- jest.advanceTimersByTime(250)
407
+ vi.advanceTimersByTime(250)
407
408
  expect(editor.getOnlySelectedShape()!.parentId).toBe(frame.id)
408
409
 
409
410
  // Let's try that
410
411
  editor.pointerMove(1750, 1750)
411
- jest.advanceTimersByTime(200)
412
+ vi.advanceTimersByTime(200)
412
413
  editor.pointerMove(175, 175)
413
- jest.advanceTimersByTime(200)
414
+ vi.advanceTimersByTime(200)
414
415
 
415
416
  // yay
416
417
  expect(editor.getHintingShapeIds()).toHaveLength(1)
@@ -958,7 +959,7 @@ describe('When dragging a shape inside a group inside a frame', () => {
958
959
  editor.pointerMove(150, 150).pointerDown(150, 150).pointerMove(140, 140)
959
960
 
960
961
  expect(editor.getOnlySelectedShapeId()).toBe(ids.box1)
961
- jest.advanceTimersByTime(300)
962
+ vi.advanceTimersByTime(300)
962
963
 
963
964
  expect(editor.getShape(ids.box1)!.parentId).toBe(ids.group1)
964
965
  })
@@ -973,7 +974,7 @@ it('Drags into a frame', () => {
973
974
  editor.pointerDown(550, 550)
974
975
  editor.pointerMove(250, 250)
975
976
 
976
- jest.advanceTimersByTime(200)
977
+ vi.advanceTimersByTime(200)
977
978
 
978
979
  expect(editor.getShape(box1)!.parentId).toBe(frame.id)
979
980
  })
@@ -992,7 +993,7 @@ it('Allows dragging grouped shapes into frames if every shape in the group is in
992
993
  editor.pointerDown(1100, 1100)
993
994
  editor.pointerMove(250, 250)
994
995
 
995
- jest.advanceTimersByTime(250)
996
+ vi.advanceTimersByTime(250)
996
997
 
997
998
  expect(editor.getHintingShapeIds()).toMatchObject([frame.id])
998
999
 
@@ -1068,7 +1069,7 @@ describe('When dragging a shape', () => {
1068
1069
  editor.pointerMove(30, 50)
1069
1070
  editor.pointerUp(30, 50)
1070
1071
  const parent = editor.getShape(rectId)?.parentId
1071
- jest.advanceTimersByTime(200)
1072
+ vi.advanceTimersByTime(200)
1072
1073
  expect(parent).toBe(frameId)
1073
1074
  })
1074
1075
 
@@ -1185,7 +1186,7 @@ describe('Unparenting behavior', () => {
1185
1186
  // expect(editor.getShape(rect.id)!.parentId).toBe(frame.id)
1186
1187
  // editor.pointerDown(90, 50)
1187
1188
  // editor.pointerMove(110, 50)
1188
- // jest.advanceTimersByTime(200)
1189
+ // vi.advanceTimersByTime(200)
1189
1190
  // expect(editor.getShape(rect.id)!.parentId).toBe(editor.getCurrentPageId())
1190
1191
  // editor.pointerUp(110, 50)
1191
1192
  // expect(editor.getShape(rect.id)!.parentId).toBe(editor.getCurrentPageId())
@@ -1199,7 +1200,7 @@ describe('Unparenting behavior', () => {
1199
1200
  expect(editor.getShape(rect.id)!.parentId).toBe(frame.id)
1200
1201
  editor.pointerDown(90, 50)
1201
1202
  editor.pointerMove(110, 50)
1202
- jest.advanceTimersByTime(200)
1203
+ vi.advanceTimersByTime(200)
1203
1204
  expect(editor.getShape(rect.id)!.parentId).toBe(editor.getCurrentPageId())
1204
1205
  editor.pointerUp(110, 50)
1205
1206
  expect(editor.getShape(rect.id)!.parentId).toBe(editor.getCurrentPageId())
@@ -1299,7 +1300,7 @@ describe('Unparenting behavior', () => {
1299
1300
  expect(editor.getShape(triangle.id)!.parentId).toBe(frame.id)
1300
1301
 
1301
1302
  // But after a delay, the triangle is reparented because it's not overlapping
1302
- jest.advanceTimersByTime(200)
1303
+ vi.advanceTimersByTime(200)
1303
1304
  expect(editor.getShape(triangle.id)!.parentId).toBe(editor.getCurrentPageId())
1304
1305
 
1305
1306
  editor.pointerMove(50, 50)
@@ -1308,7 +1309,7 @@ describe('Unparenting behavior', () => {
1308
1309
  expect(editor.getShape(triangle.id)!.parentId).toBe(editor.getCurrentPageId())
1309
1310
 
1310
1311
  // But after a delay, the triangle is reparented because it's overlapping
1311
- jest.advanceTimersByTime(200)
1312
+ vi.advanceTimersByTime(200)
1312
1313
  expect(editor.getShape(triangle.id)!.parentId).toBe(frame.id)
1313
1314
  })
1314
1315
 
@@ -1348,12 +1349,12 @@ describe('Unparenting behavior', () => {
1348
1349
  expect(editor.isIn('select.translating')).toBe(true)
1349
1350
 
1350
1351
  // Wait for reparenting to happen
1351
- jest.advanceTimersByTime(250)
1352
+ vi.advanceTimersByTime(250)
1352
1353
  expect(editor.getShape(largeRect.id)!.parentId).toBe(frameId)
1353
1354
 
1354
1355
  // The large rectangle should now be reparented to the frame, even though the frame covers it
1355
1356
  editor.pointerUp(250, 250)
1356
- jest.advanceTimersByTime(250)
1357
+ vi.advanceTimersByTime(250)
1357
1358
  }
1358
1359
 
1359
1360
  // When the shape has no fill and an empty label, it should fall out of the frame
@@ -1503,7 +1504,7 @@ describe('When dragging groups or shapes within a group', () => {
1503
1504
  editor.pointerDown(1100, 1100)
1504
1505
  editor.pointerMove(250, 250)
1505
1506
 
1506
- jest.advanceTimersByTime(200)
1507
+ vi.advanceTimersByTime(200)
1507
1508
 
1508
1509
  expect(editor.getShape(group)!.parentId).toBe(frame.id)
1509
1510
  })
@@ -1526,14 +1527,14 @@ describe('When dragging groups or shapes within a group', () => {
1526
1527
  editor.select(rect1ID)
1527
1528
  editor.pointerDown(15, 15)
1528
1529
  editor.pointerMove(100, 100)
1529
- jest.advanceTimersByTime(200)
1530
+ vi.advanceTimersByTime(200)
1530
1531
 
1531
1532
  expect(editor.getShape(rect1ID)?.parentId).toBe(group.id)
1532
1533
  expect(editor.getShape(rect2ID)?.parentId).toBe(group.id)
1533
1534
  expect(group.parentId).toBe(frame.id)
1534
1535
 
1535
1536
  editor.pointerUp(100, 100)
1536
- jest.advanceTimersByTime(200)
1537
+ vi.advanceTimersByTime(200)
1537
1538
 
1538
1539
  expect(editor.getShape(rect1ID)?.parentId).toBe(group.id)
1539
1540
  expect(editor.getShape(rect2ID)?.parentId).toBe(group.id)
@@ -1558,7 +1559,7 @@ describe('When dragging groups or shapes within a group', () => {
1558
1559
  editor.pointerDown(15, 15)
1559
1560
  editor.pointerMove(200, 200)
1560
1561
 
1561
- jest.advanceTimersByTime(200)
1562
+ vi.advanceTimersByTime(200)
1562
1563
  expect(editor.getShape(rect1ID)?.parentId).toBe(group.id)
1563
1564
  expect(editor.getShape(rect2ID)?.parentId).toBe(group.id)
1564
1565
  expect(editor.getShape(group.id)?.parentId).toBe(editor.getCurrentPageId())
@@ -1587,7 +1588,7 @@ describe('When dragging groups or shapes within a group', () => {
1587
1588
  editor.pointerDown(15, 15)
1588
1589
  editor.pointerMove(200, 200)
1589
1590
 
1590
- jest.advanceTimersByTime(200)
1591
+ vi.advanceTimersByTime(200)
1591
1592
  expect(editor.getShape(rect1ID)?.parentId).toBe(group.id)
1592
1593
  expect(editor.getShape(rect2ID)?.parentId).toBe(group.id)
1593
1594
  expect(editor.getShape(group.id)?.parentId).toBe(editor.getCurrentPageId())
@@ -1638,7 +1639,7 @@ describe('When dragging groups or shapes within a group', () => {
1638
1639
  editor.pointerDown(215, 215)
1639
1640
  editor.pointerMove(15, 15)
1640
1641
 
1641
- jest.advanceTimersByTime(200)
1642
+ vi.advanceTimersByTime(200)
1642
1643
  expect(editor.getShape(rect1ID)?.parentId).toBe(group.id)
1643
1644
  expect(editor.getShape(rect2ID)?.parentId).toBe(group.id)
1644
1645
  expect(editor.getShape(group.id)?.parentId).toBe(frameID)
@@ -1,4 +1,5 @@
1
1
  import { Box, TLShapeId, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
  import { TL } from './test-jsx'
4
5
 
@@ -28,13 +29,13 @@ it('lists shapes in viewport', () => {
28
29
 
29
30
  // Move the camera 201 pixels to the right and 201 pixels down
30
31
  editor.pan({ x: -201, y: -201 })
31
- jest.advanceTimersByTime(500)
32
+ vi.advanceTimersByTime(500)
32
33
 
33
34
  // A is now outside of the viewport, like D
34
35
  expect(editor.getCulledShapes()).toStrictEqual(new Set([ids.A, ids.D]))
35
36
 
36
37
  editor.pan({ x: -900, y: -900 })
37
- jest.advanceTimersByTime(500)
38
+ vi.advanceTimersByTime(500)
38
39
  // Now all shapes are outside of the viewport, except for D (which is clipped)
39
40
  expect(editor.getCulledShapes()).toStrictEqual(new Set([ids.A, ids.B, ids.C]))
40
41
 
@@ -1070,7 +1070,7 @@ describe('the select tool', () => {
1070
1070
  // that we're doing hit testing manually—we'll catch that it was inside a shape
1071
1071
 
1072
1072
  // editor.keyUp('Shift')
1073
- // jest.advanceTimersByTime(200)
1073
+ // vi.advanceTimersByTime(200)
1074
1074
 
1075
1075
  // expect(editor.selectedShapeIds.includes(ids.boxA)).toBe(false)
1076
1076
  // expect(editor.selectedShapeIds.includes(ids.boxB)).toBe(true)
@@ -1,8 +1,9 @@
1
1
  import { PageRecordType, TLDeepLink, createDeepLinkString, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from './TestEditor'
3
4
  import { TL } from './test-jsx'
4
5
 
5
- jest.useFakeTimers()
6
+ vi.useFakeTimers()
6
7
 
7
8
  let editor: TestEditor
8
9
 
@@ -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
@@ -82,7 +83,7 @@ describe('Maximum shapes behavior', () => {
82
83
  })
83
84
 
84
85
  it('should emit max-shapes event when limit is reached', () => {
85
- const maxShapesHandler = jest.fn()
86
+ const maxShapesHandler = vi.fn()
86
87
  editor.addListener('max-shapes', maxShapesHandler)
87
88
 
88
89
  // Set up the note tool
@@ -282,7 +283,7 @@ describe('Maximum shapes behavior', () => {
282
283
  expect(editor.getCurrentPageShapeIds().size).toBe(5)
283
284
 
284
285
  // Try to create one more shape
285
- const maxShapesHandler = jest.fn()
286
+ const maxShapesHandler = vi.fn()
286
287
  editor.addListener('max-shapes', maxShapesHandler)
287
288
 
288
289
  const extraShapeId = createShapeId('extra-shape')
@@ -1,3 +1,4 @@
1
+ import { vi } from 'vitest'
1
2
  import { TestEditor } from './TestEditor'
2
3
 
3
4
  let editor: TestEditor
@@ -6,14 +7,14 @@ beforeEach(() => {
6
7
  editor = new TestEditor()
7
8
  })
8
9
 
9
- jest.useFakeTimers()
10
+ vi.useFakeTimers()
10
11
 
11
12
  it('Shift Key', () => {
12
13
  editor.pointerDown(0, 0)
13
14
  editor.pointerMove(100, 100, { shiftKey: true })
14
15
  editor.pointerMove(100, 100, { shiftKey: false })
15
16
  expect(editor.inputs.shiftKey).toBe(true)
16
- jest.advanceTimersByTime(200)
17
+ vi.advanceTimersByTime(200)
17
18
  expect(editor.inputs.shiftKey).toBe(false)
18
19
  })
19
20
 
@@ -22,7 +23,7 @@ it('Alt Key', () => {
22
23
  editor.pointerMove(100, 100, { altKey: true })
23
24
  editor.pointerMove(100, 100, { altKey: false })
24
25
  expect(editor.inputs.altKey).toBe(true)
25
- jest.advanceTimersByTime(200)
26
+ vi.advanceTimersByTime(200)
26
27
  expect(editor.inputs.altKey).toBe(false)
27
28
  })
28
29
 
@@ -31,6 +32,6 @@ it('Ctrl Key', () => {
31
32
  editor.pointerMove(100, 100, { ctrlKey: true })
32
33
  editor.pointerMove(100, 100, { ctrlKey: false })
33
34
  expect(editor.inputs.ctrlKey).toBe(true)
34
- jest.advanceTimersByTime(200)
35
+ vi.advanceTimersByTime(200)
35
36
  expect(editor.inputs.ctrlKey).toBe(false)
36
37
  })
@@ -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
@@ -54,7 +55,7 @@ describe('Shape navigation', () => {
54
55
  ])
55
56
 
56
57
  // Mock canTabTo to return false for the second shape
57
- jest.spyOn(editor.getShapeUtil('geo'), 'canTabTo').mockImplementation((shape) => {
58
+ vi.spyOn(editor.getShapeUtil('geo'), 'canTabTo').mockImplementation((shape) => {
58
59
  return shape.id !== ids.box2
59
60
  })
60
61
 
@@ -100,7 +101,7 @@ describe('Shape navigation', () => {
100
101
  editor.select(ids.box1)
101
102
 
102
103
  // Spy on zoomToSelectionIfOffscreen method
103
- const zoomSpy = jest.spyOn(editor, 'zoomToSelectionIfOffscreen')
104
+ const zoomSpy = vi.spyOn(editor, 'zoomToSelectionIfOffscreen')
104
105
 
105
106
  // Navigate to next shape (offscreen)
106
107
  editor.selectAdjacentShape('next')
@@ -119,7 +120,7 @@ describe('Shape navigation', () => {
119
120
  ])
120
121
 
121
122
  // Mock a culled shape (not rendered)
122
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
123
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
123
124
  // Return normal bounds for box1, null for box2 as if it's culled/not rendered
124
125
  if (shape?.id === ids.box2) {
125
126
  // Still return bounds, but pretend it was calculated even though shape is culled
@@ -150,7 +151,7 @@ describe('Shape navigation', () => {
150
151
  ])
151
152
 
152
153
  // Setup shape centers for the test
153
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
154
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
154
155
  if (shape?.id === ids.boxA) {
155
156
  return { center: { x: 10, y: 110 } } as any
156
157
  }
@@ -182,7 +183,7 @@ describe('Shape navigation', () => {
182
183
  ])
183
184
 
184
185
  // Setup shape centers for the test
185
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
186
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
186
187
  if (shape?.id === ids.center) {
187
188
  return { center: { x: 100, y: 100 } } as any
188
189
  }
@@ -219,7 +220,7 @@ describe('Shape navigation', () => {
219
220
  ])
220
221
 
221
222
  // Setup shape centers
222
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
223
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
223
224
  if (shape?.id === ids.center) return { center: { x: 200, y: 200 } } as any
224
225
  if (shape?.id === ids.right) return { center: { x: 300, y: 200 } } as any
225
226
  if (shape?.id === ids.left) return { center: { x: 100, y: 200 } } as any
@@ -258,7 +259,7 @@ describe('Shape navigation', () => {
258
259
  ])
259
260
 
260
261
  // Setup shape centers
261
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
262
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
262
263
  if (shape?.id === ids.center) return { center: { x: 200, y: 200 } } as any
263
264
  if (shape?.id === ids.nearRight) return { center: { x: 250, y: 200 } } as any
264
265
  if (shape?.id === ids.farRight) return { center: { x: 350, y: 200 } } as any
@@ -284,7 +285,7 @@ describe('Shape navigation', () => {
284
285
  ])
285
286
 
286
287
  // Setup shape centers
287
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
288
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
288
289
  if (shape?.id === ids.box1) return { center: { x: 50, y: 50 } } as any
289
290
  if (shape?.id === ids.box2) return { center: { x: 150, y: 50 } } as any
290
291
  if (shape?.id === ids.box3) return { center: { x: 150, y: 150 } } as any
@@ -485,7 +486,7 @@ describe('Shape navigation', () => {
485
486
  ])
486
487
 
487
488
  // Setup shape centers for consistent testing
488
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
489
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
489
490
  const positions = {
490
491
  [ids.box1]: { x: 25, y: 115 },
491
492
  [ids.box2]: { x: 65, y: 115 },
@@ -612,7 +613,7 @@ describe('Shape navigation', () => {
612
613
  ])
613
614
 
614
615
  // Setup shape centers for consistent testing
615
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
616
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
616
617
  const positions = {
617
618
  [ids.box1]: { x: 115, y: 25 },
618
619
  [ids.box2]: { x: 115, y: 65 },
@@ -1006,7 +1007,7 @@ describe('Shape navigation', () => {
1006
1007
  ])
1007
1008
 
1008
1009
  // Setup shape centers
1009
- jest.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
1010
+ vi.spyOn(editor, 'getShapePageBounds').mockImplementation((shape: any) => {
1010
1011
  if (shape?.id === ids.row1Shape1) return { center: { x: 50, y: 50 } } as any
1011
1012
  if (shape?.id === ids.row1Shape2) return { center: { x: 150, y: 50 } } as any
1012
1013
  if (shape?.id === ids.row1Shape3) return { center: { x: 250, y: 50 } } as any
@@ -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
 
@@ -1,10 +1,11 @@
1
1
  import { TLShapePartial, Vec, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from '../TestEditor'
3
4
  import { PerformanceMeasurer } from './PerformanceMeasurer'
4
5
 
5
6
  let editor = new TestEditor()
6
7
 
7
- jest.useRealTimers()
8
+ vi.useRealTimers()
8
9
 
9
10
  describe.skip('Example perf tests', () => {
10
11
  it('measures Editor.createShape vs Editor.createShapes', () => {