tldraw 3.16.0-next.f9f54ec051f3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. package/dist-cjs/index.d.ts +446 -112
  2. package/dist-cjs/index.js +50 -14
  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/canvas/TldrawScribble.js +1 -1
  7. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +15 -4
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +6 -0
  14. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +4 -3
  16. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  17. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  18. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  19. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  21. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +4 -4
  22. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  24. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  25. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  26. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  27. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -13
  28. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  30. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  31. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +8 -2
  32. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  33. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +3 -2
  34. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  36. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  37. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  38. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  40. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  42. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  44. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
  46. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  47. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  48. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  49. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  50. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  51. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -5
  53. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  55. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  57. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  58. package/dist-cjs/lib/shapes/text/PlainTextArea.js +3 -2
  59. package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
  60. package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
  61. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  62. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  63. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  64. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  65. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  66. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  67. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  68. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  69. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  70. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +3 -1
  71. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  73. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  74. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  75. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  76. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  77. package/dist-cjs/lib/ui/components/A11y.js +1 -1
  78. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  79. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  80. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  81. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  82. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  83. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  84. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  85. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  86. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  87. package/dist-cjs/lib/ui/components/InputModeMenu.js +77 -0
  88. package/dist-cjs/lib/ui/components/InputModeMenu.js.map +7 -0
  89. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  90. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  91. package/dist-cjs/lib/ui/components/LanguageMenu.js +1 -0
  92. package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
  93. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +5 -3
  94. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +2 -1
  96. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  97. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  98. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  100. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  102. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +3 -2
  104. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  106. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  108. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +13 -4
  110. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +249 -279
  112. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +147 -0
  114. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  115. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +70 -0
  116. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  117. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
  118. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  119. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
  120. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  121. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  122. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  123. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +2 -0
  124. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  125. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  126. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  127. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  128. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  129. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  130. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  131. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +2 -1
  132. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  133. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  134. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  135. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +10 -5
  136. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  137. package/dist-cjs/lib/ui/components/menu-items.js +8 -0
  138. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  139. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
  140. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  141. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +5 -3
  142. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  143. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  144. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  145. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +18 -5
  146. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  147. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +33 -7
  148. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  149. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +317 -0
  150. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  151. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  152. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  153. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +3 -0
  154. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  155. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  156. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  157. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  159. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  160. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  161. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  162. package/dist-cjs/lib/ui/context/actions.js +44 -30
  163. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/components.js +2 -0
  165. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  167. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  168. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  169. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  170. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  171. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  172. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  173. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  174. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +14 -1
  175. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  176. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  177. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  178. package/dist-cjs/lib/ui/version.js +4 -4
  179. package/dist-cjs/lib/ui/version.js.map +1 -1
  180. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  181. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  182. package/dist-cjs/lib/utils/export/export.js +0 -20
  183. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  184. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  185. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  186. package/dist-esm/index.d.mts +446 -112
  187. package/dist-esm/index.mjs +93 -29
  188. package/dist-esm/index.mjs.map +2 -2
  189. package/dist-esm/lib/Tldraw.mjs +14 -4
  190. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  191. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  192. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  193. package/dist-esm/lib/defaultExternalContentHandlers.mjs +15 -4
  194. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  195. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  196. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  197. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  198. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  199. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +4 -3
  200. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  202. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  203. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +1 -1
  204. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +4 -5
  206. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  207. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  208. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  209. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  210. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  211. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -13
  212. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  213. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  214. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  215. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +9 -3
  216. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  217. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +4 -2
  218. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  219. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  220. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  221. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  222. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  223. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  224. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  225. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  226. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  227. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  228. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  229. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
  230. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  231. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  232. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  234. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +3 -6
  237. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  239. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  241. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/text/PlainTextArea.mjs +4 -3
  243. package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
  245. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  246. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  247. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  248. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  249. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  250. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  251. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  252. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  253. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  254. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +3 -1
  255. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  256. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  257. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  258. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  259. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  260. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  261. package/dist-esm/lib/ui/components/A11y.mjs +1 -2
  262. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  263. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  264. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  265. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  266. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  267. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  268. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  269. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  270. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  271. package/dist-esm/lib/ui/components/InputModeMenu.mjs +57 -0
  272. package/dist-esm/lib/ui/components/InputModeMenu.mjs.map +7 -0
  273. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  274. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  275. package/dist-esm/lib/ui/components/LanguageMenu.mjs +1 -0
  276. package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
  277. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +5 -5
  278. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  279. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +2 -1
  280. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  281. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  282. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  284. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  286. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +3 -3
  288. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  290. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  291. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  292. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  293. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +18 -5
  294. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  295. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +251 -283
  296. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  297. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +135 -0
  298. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  299. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +50 -0
  300. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  301. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
  302. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  303. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
  304. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  305. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  306. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  307. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +2 -0
  308. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  310. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  311. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  312. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  313. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  314. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +2 -1
  316. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  317. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  318. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  319. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +10 -5
  320. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/menu-items.mjs +8 -0
  322. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  323. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +11 -3
  324. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  325. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +6 -4
  326. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  327. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  328. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  329. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +18 -5
  330. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  331. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +33 -7
  332. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  333. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +295 -0
  334. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  335. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  336. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  337. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +3 -0
  338. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  339. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  340. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  341. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  342. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  344. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  345. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  346. package/dist-esm/lib/ui/context/actions.mjs +44 -30
  347. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  348. package/dist-esm/lib/ui/context/components.mjs +2 -0
  349. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  350. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  351. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +1 -2
  352. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  354. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  355. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  356. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  357. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +14 -1
  358. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  359. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  360. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  361. package/dist-esm/lib/ui/version.mjs +4 -4
  362. package/dist-esm/lib/ui/version.mjs.map +1 -1
  363. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  364. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  365. package/dist-esm/lib/utils/export/export.mjs +0 -20
  366. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  367. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  368. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  369. package/package.json +11 -34
  370. package/src/index.ts +71 -22
  371. package/src/lib/Tldraw.tsx +15 -2
  372. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  373. package/src/lib/defaultExternalContentHandlers.ts +26 -4
  374. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +85 -14
  375. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +103 -8
  376. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +48 -6
  377. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  378. package/src/lib/shapes/arrow/arrow-types.ts +3 -5
  379. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  380. package/src/lib/shapes/arrow/arrowTargetState.ts +36 -4
  381. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  382. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +1 -1
  383. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +4 -5
  384. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  385. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  386. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  387. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -14
  388. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  389. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +10 -3
  390. package/src/lib/shapes/geo/GeoShapeUtil.tsx +4 -2
  391. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  392. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  393. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  394. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  395. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  396. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  397. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  398. package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
  399. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  400. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  401. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  402. package/src/lib/shapes/shared/useEditablePlainText.ts +3 -10
  403. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  404. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  405. package/src/lib/shapes/text/PlainTextArea.tsx +4 -3
  406. package/src/lib/shapes/text/RichTextArea.tsx +3 -4
  407. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  408. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  409. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  410. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  411. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  412. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +6 -2
  413. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  414. package/src/lib/ui/TldrawUi.tsx +33 -12
  415. package/src/lib/ui/assetUrls.ts +13 -10
  416. package/src/lib/ui/components/A11y.tsx +1 -2
  417. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  418. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  419. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  420. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  421. package/src/lib/ui/components/InputModeMenu.tsx +65 -0
  422. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  423. package/src/lib/ui/components/LanguageMenu.tsx +1 -0
  424. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +8 -4
  425. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +2 -1
  426. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  427. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  428. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  429. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +4 -4
  430. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  431. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  432. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +30 -12
  433. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +263 -343
  434. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +73 -50
  435. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +65 -0
  436. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
  437. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  438. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  439. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -0
  440. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  441. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  442. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  443. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +1 -0
  444. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  445. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +21 -11
  446. package/src/lib/ui/components/menu-items.tsx +10 -0
  447. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +7 -3
  448. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +6 -3
  449. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  450. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +52 -32
  451. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +55 -12
  452. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +386 -0
  453. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  454. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
  455. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  458. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  459. package/src/lib/ui/context/actions.tsx +51 -32
  460. package/src/lib/ui/context/components.tsx +3 -0
  461. package/src/lib/ui/context/events.tsx +4 -1
  462. package/src/lib/ui/hooks/useClipboardEvents.ts +1 -2
  463. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  464. package/src/lib/ui/hooks/useTools.tsx +140 -10
  465. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +13 -0
  466. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +14 -1
  467. package/src/lib/ui/kbd-utils.ts +10 -3
  468. package/src/lib/ui/version.ts +4 -4
  469. package/src/lib/ui.css +448 -294
  470. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  471. package/src/lib/utils/export/copyAs.ts +1 -24
  472. package/src/lib/utils/export/export.ts +0 -36
  473. package/src/lib/utils/export/exportAs.ts +1 -32
  474. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  475. package/src/test/A11y.test.tsx +3 -2
  476. package/src/test/ClickManager.test.ts +7 -6
  477. package/src/test/Editor.test.tsx +20 -19
  478. package/src/test/EraserTool.test.ts +184 -13
  479. package/src/test/HandTool.test.ts +10 -9
  480. package/src/test/HighlightShape.test.ts +2 -1
  481. package/src/test/SelectTool.test.ts +3 -2
  482. package/src/test/TLUserPreferences.test.ts +4 -3
  483. package/src/test/TestEditor.ts +21 -17
  484. package/src/test/TldrawEditor.test.tsx +11 -10
  485. package/src/test/ZoomTool.test.ts +7 -6
  486. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  487. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  488. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  489. package/src/test/arrows-megabus.test.tsx +17 -10
  490. package/src/test/bindings.test.tsx +24 -37
  491. package/src/test/bookmark-shapes.test.ts +1 -8
  492. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  493. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  494. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  495. package/src/test/commands/alignShapes.test.tsx +25 -24
  496. package/src/test/commands/animationSpeed.test.ts +2 -1
  497. package/src/test/commands/centerOnPoint.test.ts +3 -2
  498. package/src/test/commands/clipboard.test.ts +3 -2
  499. package/src/test/commands/createShapes.test.ts +2 -1
  500. package/src/test/commands/deleteShapes.test.ts +2 -1
  501. package/src/test/commands/distributeShapes.test.tsx +11 -10
  502. package/src/test/commands/getSvgString.test.ts +2 -1
  503. package/src/test/commands/packShapes.test.ts +5 -4
  504. package/src/test/commands/resizeShape.test.ts +2 -1
  505. package/src/test/commands/rotateShapes.test.ts +7 -6
  506. package/src/test/commands/setCamera.test.ts +17 -3
  507. package/src/test/commands/setCurrentPage.test.ts +3 -2
  508. package/src/test/commands/stackShapes.test.ts +11 -10
  509. package/src/test/commands/stretch.test.tsx +13 -12
  510. package/src/test/createDeepLink.test.tsx +2 -1
  511. package/src/test/cropping.test.ts +3 -2
  512. package/src/test/custom-clipping.test.ts +436 -0
  513. package/src/test/drawing.test.ts +2 -1
  514. package/src/test/flipShapes.test.ts +4 -3
  515. package/src/test/frames.test.ts +40 -24
  516. package/src/test/getCulledShapes.test.tsx +74 -4
  517. package/src/test/groups.test.tsx +1 -1
  518. package/src/test/handleDeepLink.test.tsx +2 -1
  519. package/src/test/inner-outer-margin.test.ts +315 -0
  520. package/src/test/maxShapes.test.ts +3 -2
  521. package/src/test/modifiers.test.ts +5 -4
  522. package/src/test/navigation.test.ts +12 -11
  523. package/src/test/panning.test.ts +2 -1
  524. package/src/test/perf/perf.test.ts +2 -1
  525. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  526. package/src/test/resizing.test.ts +39 -38
  527. package/src/test/select.test.tsx +4 -3
  528. package/src/test/selection-omnibus.test.ts +11 -10
  529. package/src/test/shapeutils.test.ts +4 -3
  530. package/src/test/translating.test.ts +9 -8
  531. package/tldraw.css +756 -584
  532. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  533. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  534. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  535. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -142
  536. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  537. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  538. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  539. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  540. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  541. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  542. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
@@ -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)
@@ -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,14 +80,20 @@ 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
90
88
 
91
- const shapeUtilsWithDefaults = [...defaultShapeUtils, ...(options.shapeUtils ?? [])]
92
- const bindingUtilsWithDefaults = [...defaultBindingUtils, ...(options.bindingUtils ?? [])]
89
+ const shapeUtilsWithDefaults = [
90
+ ...defaultShapeUtils.filter((s) => !options.shapeUtils?.some((su) => su.type === s.type)),
91
+ ...(options.shapeUtils ?? []),
92
+ ]
93
+ const bindingUtilsWithDefaults = [
94
+ ...defaultBindingUtils.filter((b) => !options.bindingUtils?.some((bu) => bu.type === b.type)),
95
+ ...(options.bindingUtils ?? []),
96
+ ]
93
97
 
94
98
  super({
95
99
  ...options,
@@ -272,12 +276,12 @@ export class TestEditor extends Editor {
272
276
  * methods, or call mockRestore() to restore the actual implementation (e.g.
273
277
  * _transformPointerDownSpy.mockRestore())
274
278
  */
275
- _transformPointerDownSpy = jest
279
+ _transformPointerDownSpy = vi
276
280
  .spyOn(this._clickManager, 'handlePointerEvent')
277
281
  .mockImplementation((info) => {
278
282
  return info
279
283
  })
280
- _transformPointerUpSpy = jest
284
+ _transformPointerUpSpy = vi
281
285
  .spyOn(this._clickManager, 'handlePointerEvent')
282
286
  .mockImplementation((info) => {
283
287
  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)
@@ -1,8 +1,5 @@
1
1
  import { TLBookmarkShape, createShapeId } from '@tldraw/editor'
2
- import {
3
- BookmarkShapeUtil,
4
- getHumanReadableAddress,
5
- } from '../lib/shapes/bookmark/BookmarkShapeUtil'
2
+ import { getHumanReadableAddress } from '../lib/shapes/bookmark/BookmarkShapeUtil'
6
3
  import { TestEditor } from './TestEditor'
7
4
 
8
5
  let editor: TestEditor
@@ -14,10 +11,6 @@ afterEach(() => {
14
11
  editor?.dispose()
15
12
  })
16
13
 
17
- describe(BookmarkShapeUtil, () => {
18
- return
19
- })
20
-
21
14
  describe('The URL formatter', () => {
22
15
  it('Formats URLs as human-readable', () => {
23
16
  const ids = {