tldraw 3.16.0-canary.614a556981b7 → 3.16.0-canary.62bc202550a3

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 (299) hide show
  1. package/dist-cjs/index.d.ts +227 -103
  2. package/dist-cjs/index.js +33 -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/defaultExternalContentHandlers.js +5 -4
  7. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  8. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +10 -4
  9. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  10. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -0
  11. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  13. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  14. package/dist-cjs/lib/shapes/shared/ShapeFill.js +1 -1
  15. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  16. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  17. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +0 -2
  18. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  19. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  20. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  21. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  22. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  23. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  24. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  25. package/dist-cjs/lib/ui/TldrawUi.js +13 -12
  26. package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
  27. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  28. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  29. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  30. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  31. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  32. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  33. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
  34. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  35. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
  36. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  37. package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -45
  38. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  39. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  40. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  41. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +23 -22
  42. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  43. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +24 -21
  44. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  45. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  46. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  47. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
  48. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  49. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +38 -9
  50. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  51. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  52. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  53. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
  54. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  55. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
  56. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  57. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
  58. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  59. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +2 -0
  60. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  61. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +100 -122
  62. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  63. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +0 -10
  65. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +3 -19
  67. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  68. package/dist-cjs/lib/ui/context/actions.js +23 -10
  69. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  70. package/dist-cjs/lib/ui/context/components.js +2 -0
  71. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  72. package/dist-cjs/lib/ui/context/events.js.map +1 -1
  73. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  74. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  75. package/dist-cjs/lib/ui/hooks/useTools.js +21 -3
  76. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  77. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  78. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -0
  79. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  80. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  81. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  82. package/dist-cjs/lib/ui/version.js +3 -3
  83. package/dist-cjs/lib/ui/version.js.map +1 -1
  84. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  85. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  86. package/dist-cjs/lib/utils/export/export.js +0 -20
  87. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  88. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  89. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  90. package/dist-esm/index.d.mts +227 -103
  91. package/dist-esm/index.mjs +61 -29
  92. package/dist-esm/index.mjs.map +2 -2
  93. package/dist-esm/lib/Tldraw.mjs +14 -4
  94. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  95. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -4
  96. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  97. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +10 -4
  98. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  99. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -0
  100. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  101. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  102. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  103. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +1 -1
  104. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  105. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  106. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +0 -2
  107. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  108. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  109. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  110. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  111. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  112. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  113. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  114. package/dist-esm/lib/ui/TldrawUi.mjs +13 -12
  115. package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
  116. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  117. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  118. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  119. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  120. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  121. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  122. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
  123. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  124. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
  125. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  126. package/dist-esm/lib/ui/components/{primitives/TldrawUiButtonPicker.mjs → StylePanel/StylePanelButtonPicker.mjs} +54 -43
  127. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  128. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  129. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  130. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +20 -19
  131. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  132. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +21 -18
  133. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  134. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  135. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  136. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
  137. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  138. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +38 -9
  139. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  140. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  141. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  142. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
  143. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  144. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
  145. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  146. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
  147. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  148. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +2 -0
  149. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  150. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +109 -124
  151. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  152. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  153. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +0 -10
  154. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  155. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +3 -19
  156. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  157. package/dist-esm/lib/ui/context/actions.mjs +23 -10
  158. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  159. package/dist-esm/lib/ui/context/components.mjs +2 -0
  160. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  161. package/dist-esm/lib/ui/context/events.mjs.map +1 -1
  162. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  163. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  164. package/dist-esm/lib/ui/hooks/useTools.mjs +22 -3
  165. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  166. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
  167. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  168. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  169. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  170. package/dist-esm/lib/ui/version.mjs +3 -3
  171. package/dist-esm/lib/ui/version.mjs.map +1 -1
  172. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  173. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  174. package/dist-esm/lib/utils/export/export.mjs +0 -20
  175. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  176. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  177. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  178. package/package.json +11 -34
  179. package/src/index.ts +44 -22
  180. package/src/lib/Tldraw.tsx +15 -2
  181. package/src/lib/defaultExternalContentHandlers.ts +12 -4
  182. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  183. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  184. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  185. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  186. package/src/lib/shapes/frame/FrameShapeUtil.tsx +20 -4
  187. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -0
  188. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  189. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  190. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  191. package/src/lib/shapes/shared/ShapeFill.tsx +1 -1
  192. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  193. package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
  194. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  195. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  196. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  197. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  198. package/src/lib/ui/TldrawUi.tsx +16 -10
  199. package/src/lib/ui/assetUrls.ts +13 -10
  200. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  201. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  202. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
  203. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -381
  204. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +63 -50
  205. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  206. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +28 -19
  207. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  208. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  209. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +4 -3
  210. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +32 -15
  211. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  212. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
  213. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
  214. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
  215. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +3 -0
  216. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +117 -125
  217. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  218. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +0 -10
  219. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +5 -18
  220. package/src/lib/ui/context/actions.tsx +23 -10
  221. package/src/lib/ui/context/components.tsx +3 -0
  222. package/src/lib/ui/context/events.tsx +1 -1
  223. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  224. package/src/lib/ui/hooks/useTools.tsx +25 -3
  225. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
  226. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
  227. package/src/lib/ui/kbd-utils.ts +10 -3
  228. package/src/lib/ui/version.ts +3 -3
  229. package/src/lib/ui.css +24 -8
  230. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  231. package/src/lib/utils/export/copyAs.ts +1 -24
  232. package/src/lib/utils/export/export.ts +0 -36
  233. package/src/lib/utils/export/exportAs.ts +1 -32
  234. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  235. package/src/test/A11y.test.tsx +3 -2
  236. package/src/test/ClickManager.test.ts +7 -6
  237. package/src/test/Editor.test.tsx +20 -19
  238. package/src/test/EraserTool.test.ts +184 -13
  239. package/src/test/HandTool.test.ts +10 -9
  240. package/src/test/HighlightShape.test.ts +2 -1
  241. package/src/test/SelectTool.test.ts +3 -2
  242. package/src/test/TLUserPreferences.test.ts +4 -3
  243. package/src/test/TestEditor.ts +13 -15
  244. package/src/test/TldrawEditor.test.tsx +11 -10
  245. package/src/test/ZoomTool.test.ts +7 -6
  246. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  247. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  248. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  249. package/src/test/arrows-megabus.test.tsx +5 -4
  250. package/src/test/bindings.test.tsx +24 -37
  251. package/src/test/bookmark-shapes.test.ts +1 -8
  252. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  253. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  254. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  255. package/src/test/commands/alignShapes.test.tsx +25 -24
  256. package/src/test/commands/animationSpeed.test.ts +2 -1
  257. package/src/test/commands/centerOnPoint.test.ts +3 -2
  258. package/src/test/commands/clipboard.test.ts +3 -2
  259. package/src/test/commands/createShapes.test.ts +2 -1
  260. package/src/test/commands/deleteShapes.test.ts +2 -1
  261. package/src/test/commands/distributeShapes.test.tsx +11 -10
  262. package/src/test/commands/getSvgString.test.ts +2 -1
  263. package/src/test/commands/packShapes.test.ts +5 -4
  264. package/src/test/commands/resizeShape.test.ts +2 -1
  265. package/src/test/commands/rotateShapes.test.ts +7 -6
  266. package/src/test/commands/setCamera.test.ts +4 -3
  267. package/src/test/commands/setCurrentPage.test.ts +3 -2
  268. package/src/test/commands/stackShapes.test.ts +11 -10
  269. package/src/test/commands/stretch.test.tsx +13 -12
  270. package/src/test/createDeepLink.test.tsx +2 -1
  271. package/src/test/cropping.test.ts +3 -2
  272. package/src/test/custom-clipping.test.ts +436 -0
  273. package/src/test/drawing.test.ts +2 -1
  274. package/src/test/flipShapes.test.ts +4 -3
  275. package/src/test/frames.test.ts +25 -24
  276. package/src/test/getCulledShapes.test.tsx +3 -2
  277. package/src/test/groups.test.tsx +1 -1
  278. package/src/test/handleDeepLink.test.tsx +2 -1
  279. package/src/test/maxShapes.test.ts +3 -2
  280. package/src/test/modifiers.test.ts +5 -4
  281. package/src/test/navigation.test.ts +12 -11
  282. package/src/test/panning.test.ts +2 -1
  283. package/src/test/perf/perf.test.ts +2 -1
  284. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  285. package/src/test/resizing.test.ts +39 -38
  286. package/src/test/select.test.tsx +4 -3
  287. package/src/test/selection-omnibus.test.ts +11 -10
  288. package/src/test/shapeutils.test.ts +4 -3
  289. package/src/test/translating.test.ts +9 -8
  290. package/tldraw.css +32 -8
  291. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  292. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  293. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  294. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  295. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  296. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  297. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  298. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  299. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
@@ -1,7 +1,9 @@
1
+ import { tltime } from '@tldraw/editor'
1
2
  import { Slider as _Slider } from 'radix-ui'
2
3
  import React, { useCallback, useEffect, useState } from 'react'
3
4
  import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
4
5
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
6
+ import { TldrawUiTooltip, tooltipManager } from './TldrawUiTooltip'
5
7
 
6
8
  /** @public */
7
9
  export interface TLUiSliderProps {
@@ -32,6 +34,7 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
32
34
  ref
33
35
  ) {
34
36
  const msg = useTranslation()
37
+ const [titleAndLabel, setTitleAndLabel] = useState('')
35
38
 
36
39
  // XXX: Radix starts out our slider with a tabIndex of 0
37
40
  // This causes some tab focusing issues, most prevelant in MobileStylePanel,
@@ -49,9 +52,25 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
49
52
  )
50
53
 
51
54
  const handlePointerDown = useCallback(() => {
55
+ tooltipManager.hideAllTooltips()
52
56
  onHistoryMark('click slider')
53
57
  }, [onHistoryMark])
54
58
 
59
+ // N.B. This is a bit silly. The Radix slider auto-focuses which
60
+ // triggers TldrawUiTooltip handleFocus when we dbl-click to edit an image,
61
+ // which in turn makes the tooltip display prematurely.
62
+ // This makes it wait until we've focused to show the tooltip.
63
+ useEffect(() => {
64
+ const timeout = tltime.setTimeout(
65
+ 'set title and label',
66
+ () => {
67
+ setTitleAndLabel(title + ' — ' + msg(label as TLUiTranslationKey))
68
+ },
69
+ 0
70
+ )
71
+ return () => clearTimeout(timeout)
72
+ }, [label, msg, title])
73
+
55
74
  // N.B. Annoying. For a11y purposes, we need Tab to work.
56
75
  // For some reason, Radix has some custom behavior here
57
76
  // that interferes with tabbing past the slider and then
@@ -64,36 +83,37 @@ export const TldrawUiSlider = React.forwardRef<HTMLDivElement, TLUiSliderProps>(
64
83
 
65
84
  return (
66
85
  <div className="tlui-slider__container">
67
- <_Slider.Root
68
- data-testid={testId}
69
- className="tlui-slider"
70
- dir="ltr"
71
- min={min ?? 0}
72
- max={steps}
73
- step={1}
74
- value={value !== null ? [value] : undefined}
75
- onPointerDown={handlePointerDown}
76
- onValueChange={handleValueChange}
77
- onKeyDownCapture={handleKeyEvent}
78
- onKeyUpCapture={handleKeyEvent}
79
- title={title + ' — ' + msg(label as TLUiTranslationKey)}
80
- >
81
- <_Slider.Track className="tlui-slider__track" dir="ltr">
82
- {value !== null && <_Slider.Range className="tlui-slider__range" dir="ltr" />}
83
- </_Slider.Track>
84
- {value !== null && (
85
- <_Slider.Thumb
86
- aria-valuemin={(min ?? 0) * ariaValueModifier}
87
- aria-valuenow={value * ariaValueModifier}
88
- aria-valuemax={steps * ariaValueModifier}
89
- aria-label={title + ' — ' + msg(label as TLUiTranslationKey)}
90
- className="tlui-slider__thumb"
91
- dir="ltr"
92
- ref={ref}
93
- tabIndex={tabIndex}
94
- />
95
- )}
96
- </_Slider.Root>
86
+ <TldrawUiTooltip content={titleAndLabel}>
87
+ <_Slider.Root
88
+ data-testid={testId}
89
+ className="tlui-slider"
90
+ dir="ltr"
91
+ min={min ?? 0}
92
+ max={steps}
93
+ step={1}
94
+ value={value !== null ? [value] : undefined}
95
+ onPointerDown={handlePointerDown}
96
+ onValueChange={handleValueChange}
97
+ onKeyDownCapture={handleKeyEvent}
98
+ onKeyUpCapture={handleKeyEvent}
99
+ >
100
+ <_Slider.Track className="tlui-slider__track" dir="ltr">
101
+ {value !== null && <_Slider.Range className="tlui-slider__range" dir="ltr" />}
102
+ </_Slider.Track>
103
+ {value !== null && (
104
+ <_Slider.Thumb
105
+ aria-valuemin={(min ?? 0) * ariaValueModifier}
106
+ aria-valuenow={value * ariaValueModifier}
107
+ aria-valuemax={steps * ariaValueModifier}
108
+ aria-label={titleAndLabel}
109
+ className="tlui-slider__thumb"
110
+ dir="ltr"
111
+ ref={ref}
112
+ tabIndex={tabIndex}
113
+ />
114
+ )}
115
+ </_Slider.Root>
116
+ </TldrawUiTooltip>
97
117
  </div>
98
118
  )
99
119
  })
@@ -94,6 +94,7 @@ export interface TLUiToolbarToggleGroupProps extends React.HTMLAttributes<HTMLDi
94
94
  // TODO: fix up this type later
95
95
  defaultValue?: any
96
96
  type: 'single' | 'multiple'
97
+ asChild?: boolean
97
98
  }
98
99
 
99
100
  /** @public @react */
@@ -101,10 +102,12 @@ export const TldrawUiToolbarToggleGroup = ({
101
102
  children,
102
103
  className,
103
104
  type,
105
+ asChild,
104
106
  ...props
105
107
  }: TLUiToolbarToggleGroupProps) => {
106
108
  return (
107
109
  <_Toolbar.ToggleGroup
110
+ asChild={asChild}
108
111
  type={type}
109
112
  {...props}
110
113
  // TODO: this fixes a bug in Radix until they fix it.
@@ -1,7 +1,14 @@
1
- import { assert, Editor, uniqueId, useMaybeEditor, Vec } from '@tldraw/editor'
1
+ import { assert, Atom, atom, Editor, uniqueId, useMaybeEditor, useValue } from '@tldraw/editor'
2
2
  import { Tooltip as _Tooltip } from 'radix-ui'
3
- import React, { createContext, forwardRef, useContext, useEffect, useRef, useState } from 'react'
4
- import { usePrefersReducedMotion } from '../../../shapes/shared/usePrefersReducedMotion'
3
+ import React, {
4
+ createContext,
5
+ forwardRef,
6
+ ReactNode,
7
+ useContext,
8
+ useEffect,
9
+ useRef,
10
+ useState,
11
+ } from 'react'
5
12
  import { useTldrawUiOrientation } from './layout'
6
13
 
7
14
  const DEFAULT_TOOLTIP_DELAY_MS = 700
@@ -13,19 +20,23 @@ export interface TldrawUiTooltipProps {
13
20
  side?: 'top' | 'right' | 'bottom' | 'left'
14
21
  sideOffset?: number
15
22
  disabled?: boolean
23
+ showOnMobile?: boolean
24
+ delayDuration?: number
16
25
  }
17
26
 
18
27
  // Singleton tooltip manager
19
28
  class TooltipManager {
20
29
  private static instance: TooltipManager | null = null
21
- private currentTooltipId: string | null = null
22
- private currentContent: string | React.ReactNode = ''
23
- private currentSide: 'top' | 'right' | 'bottom' | 'left' = 'bottom'
24
- private currentSideOffset: number = 5
30
+ private currentTooltip = atom<{
31
+ id: string
32
+ content: ReactNode
33
+ side: 'top' | 'right' | 'bottom' | 'left'
34
+ sideOffset: number
35
+ showOnMobile: boolean
36
+ targetElement: HTMLElement
37
+ delayDuration: number
38
+ } | null>('current tooltip', null)
25
39
  private destroyTimeoutId: number | null = null
26
- private subscribers: Set<() => void> = new Set()
27
- private activeElement: HTMLElement | null = null
28
- private editor: Editor | null = null
29
40
 
30
41
  static getInstance(): TooltipManager {
31
42
  if (!TooltipManager.instance) {
@@ -34,25 +45,14 @@ class TooltipManager {
34
45
  return TooltipManager.instance
35
46
  }
36
47
 
37
- setEditor(editor: Editor | null) {
38
- this.editor = editor
39
- }
40
-
41
- subscribe(callback: () => void): () => void {
42
- this.subscribers.add(callback)
43
- return () => this.subscribers.delete(callback)
44
- }
45
-
46
- private notify() {
47
- this.subscribers.forEach((callback) => callback())
48
- }
49
-
50
48
  showTooltip(
51
49
  tooltipId: string,
52
50
  content: string | React.ReactNode,
53
- element: HTMLElement,
54
- side: 'top' | 'right' | 'bottom' | 'left' = 'bottom',
55
- sideOffset: number = 5
51
+ targetElement: HTMLElement,
52
+ side: 'top' | 'right' | 'bottom' | 'left',
53
+ sideOffset: number,
54
+ showOnMobile: boolean,
55
+ delayDuration: number
56
56
  ) {
57
57
  // Clear any existing destroy timeout
58
58
  if (this.destroyTimeoutId) {
@@ -61,51 +61,57 @@ class TooltipManager {
61
61
  }
62
62
 
63
63
  // Update current tooltip
64
- this.currentTooltipId = tooltipId
65
- this.currentContent = content
66
- this.currentSide = side
67
- this.currentSideOffset = sideOffset
68
- this.activeElement = element
69
-
70
- this.notify()
64
+ this.currentTooltip.set({
65
+ id: tooltipId,
66
+ content,
67
+ side,
68
+ sideOffset,
69
+ showOnMobile,
70
+ targetElement,
71
+ delayDuration,
72
+ })
71
73
  }
72
74
 
73
- hideTooltip(tooltipId: string, instant: boolean = false) {
75
+ hideTooltip(editor: Editor | null, tooltipId: string, instant: boolean = false) {
74
76
  const hide = () => {
75
77
  // Only hide if this is the current tooltip
76
- if (this.currentTooltipId === tooltipId) {
77
- this.currentTooltipId = null
78
- this.currentContent = ''
79
- this.activeElement = null
78
+ if (this.currentTooltip.get()?.id === tooltipId) {
79
+ this.currentTooltip.set(null)
80
80
  this.destroyTimeoutId = null
81
- this.notify()
82
81
  }
83
82
  }
84
83
 
85
- if (instant) {
86
- hide()
87
- } else if (this.editor) {
84
+ if (editor && !instant) {
88
85
  // Start destroy timeout (1 second)
89
- this.destroyTimeoutId = this.editor.timers.setTimeout(hide, 300)
86
+ this.destroyTimeoutId = editor.timers.setTimeout(hide, 300)
87
+ } else {
88
+ hide()
90
89
  }
91
90
  }
92
91
 
93
92
  hideAllTooltips() {
94
- this.currentTooltipId = null
95
- this.currentContent = ''
96
- this.activeElement = null
93
+ this.currentTooltip.set(null)
97
94
  this.destroyTimeoutId = null
98
- this.notify()
99
95
  }
100
96
 
101
97
  getCurrentTooltipData() {
102
- return {
103
- id: this.currentTooltipId,
104
- content: this.currentContent,
105
- side: this.currentSide,
106
- sideOffset: this.currentSideOffset,
107
- element: this.activeElement,
98
+ const currentTooltip = this.currentTooltip.get()
99
+ if (!currentTooltip) return null
100
+ if (!this.supportsHover() && !currentTooltip.showOnMobile) return null
101
+ return currentTooltip
102
+ }
103
+
104
+ private supportsHoverAtom: Atom<boolean> | null = null
105
+ supportsHover() {
106
+ if (!this.supportsHoverAtom) {
107
+ const mediaQuery = window.matchMedia('(hover: hover)')
108
+ const supportsHover = atom('has hover', mediaQuery.matches)
109
+ this.supportsHoverAtom = supportsHover
110
+ mediaQuery.addEventListener('change', (e) => {
111
+ supportsHover.set(e.matches)
112
+ })
108
113
  }
114
+ return this.supportsHoverAtom.get()
109
115
  }
110
116
  }
111
117
 
@@ -133,66 +139,34 @@ export function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderPro
133
139
 
134
140
  // The singleton tooltip component that renders once
135
141
  function TooltipSingleton() {
136
- const editor = useMaybeEditor()
137
- const [, forceUpdate] = useState({})
138
142
  const [isOpen, setIsOpen] = useState(false)
139
143
  const triggerRef = useRef<HTMLDivElement>(null)
140
- const previousPositionRef = useRef<{ x: number; y: number } | null>(null)
141
- const prefersReducedMotion = usePrefersReducedMotion()
142
- const [shouldAnimate, setShouldAnimate] = useState(false)
143
144
  const isFirstShowRef = useRef(true)
144
- const showTimeoutRef = useRef<number | null>(null)
145
-
146
- // Set editor in tooltip manager
147
- useEffect(() => {
148
- tooltipManager.setEditor(editor)
149
- }, [editor])
145
+ const editor = useMaybeEditor()
150
146
 
151
- // Subscribe to tooltip manager updates
152
- useEffect(() => {
153
- const unsubscribe = tooltipManager.subscribe(() => {
154
- forceUpdate({})
155
- })
156
- return unsubscribe
157
- }, [])
147
+ const currentTooltip = useValue(
148
+ 'current tooltip',
149
+ () => tooltipManager.getCurrentTooltipData(),
150
+ []
151
+ )
158
152
 
159
- const tooltipData = tooltipManager.getCurrentTooltipData()
153
+ const cameraState = useValue('camera state', () => editor?.getCameraState(), [editor])
160
154
 
161
- // Update open state and trigger position
155
+ // Hide tooltip when camera is moving (panning/zooming)
162
156
  useEffect(() => {
163
- const shouldBeOpen = Boolean(tooltipData.id && tooltipData.element)
164
-
165
- // Clear any existing show timeout
166
- if (showTimeoutRef.current) {
167
- clearTimeout(showTimeoutRef.current)
168
- showTimeoutRef.current = null
157
+ if (cameraState === 'moving' && isOpen && currentTooltip) {
158
+ tooltipManager.hideTooltip(editor, currentTooltip.id, true)
169
159
  }
160
+ }, [cameraState, isOpen, currentTooltip, editor])
170
161
 
171
- if (shouldBeOpen && tooltipData.element && triggerRef.current) {
162
+ // Update open state and trigger position
163
+ useEffect(() => {
164
+ let timer: ReturnType<typeof setTimeout> | null = null
165
+ if (currentTooltip && triggerRef.current) {
172
166
  // Position the invisible trigger element over the active element
173
- const activeRect = tooltipData.element.getBoundingClientRect()
167
+ const activeRect = currentTooltip.targetElement.getBoundingClientRect()
174
168
  const trigger = triggerRef.current
175
169
 
176
- const newPosition = {
177
- x: activeRect.left + activeRect.width / 2,
178
- y: activeRect.top + activeRect.height / 2,
179
- }
180
-
181
- // Determine if we should animate
182
- let shouldAnimateCheck = false
183
- if (previousPositionRef.current) {
184
- const isNearPrevious = Vec.DistMin(previousPositionRef.current, newPosition, 200)
185
- // Only animate if the distance is less than 200px (nearby tooltips)
186
- shouldAnimateCheck =
187
- !prefersReducedMotion &&
188
- isNearPrevious &&
189
- Math.abs(newPosition.y - previousPositionRef.current.y) < 50
190
- }
191
- // Don't animate on initial show (previousPositionRef.current is null)
192
-
193
- setShouldAnimate(isFirstShowRef.current ? false : shouldAnimateCheck)
194
- previousPositionRef.current = newPosition
195
-
196
170
  trigger.style.position = 'fixed'
197
171
  trigger.style.left = `${activeRect.left}px`
198
172
  trigger.style.top = `${activeRect.top}px`
@@ -202,27 +176,31 @@ function TooltipSingleton() {
202
176
  trigger.style.zIndex = '9999'
203
177
 
204
178
  // Handle delay for first show
205
- if (isFirstShowRef.current && editor) {
206
- showTimeoutRef.current = editor.timers.setTimeout(() => {
179
+ if (isFirstShowRef.current) {
180
+ // eslint-disable-next-line no-restricted-globals
181
+ timer = setTimeout(() => {
207
182
  setIsOpen(true)
208
183
  isFirstShowRef.current = false
209
- }, editor.options.tooltipDelayMs)
184
+ }, currentTooltip.delayDuration)
210
185
  } else {
211
186
  // Subsequent tooltips show immediately
212
187
  setIsOpen(true)
213
188
  }
214
- } else if (!shouldBeOpen) {
189
+ } else {
215
190
  // Hide tooltip immediately
216
191
  setIsOpen(false)
217
- // Reset position tracking when tooltip closes
218
- previousPositionRef.current = null
219
- setShouldAnimate(false)
220
192
  // Reset first show state after tooltip is hidden
221
193
  isFirstShowRef.current = true
222
194
  }
223
- }, [tooltipData.id, tooltipData.element, editor, prefersReducedMotion])
224
195
 
225
- if (!tooltipData.id) {
196
+ return () => {
197
+ if (timer !== null) {
198
+ clearTimeout(timer)
199
+ }
200
+ }
201
+ }, [currentTooltip])
202
+
203
+ if (!currentTooltip) {
226
204
  return null
227
205
  }
228
206
 
@@ -233,14 +211,13 @@ function TooltipSingleton() {
233
211
  </_Tooltip.Trigger>
234
212
  <_Tooltip.Content
235
213
  className="tlui-tooltip"
236
- data-should-animate={shouldAnimate}
237
- side={tooltipData.side}
238
- sideOffset={tooltipData.sideOffset}
214
+ side={currentTooltip.side}
215
+ sideOffset={currentTooltip.sideOffset}
239
216
  avoidCollisions
240
217
  collisionPadding={8}
241
218
  dir="ltr"
242
219
  >
243
- {tooltipData.content}
220
+ {currentTooltip.content}
244
221
  <_Tooltip.Arrow className="tlui-tooltip__arrow" />
245
222
  </_Tooltip.Content>
246
223
  </_Tooltip.Root>
@@ -249,7 +226,18 @@ function TooltipSingleton() {
249
226
 
250
227
  /** @public @react */
251
228
  export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProps>(
252
- ({ children, content, side, sideOffset = 5, disabled = false }, ref) => {
229
+ (
230
+ {
231
+ children,
232
+ content,
233
+ side,
234
+ sideOffset = 5,
235
+ disabled = false,
236
+ showOnMobile = false,
237
+ delayDuration,
238
+ },
239
+ ref
240
+ ) => {
253
241
  const editor = useMaybeEditor()
254
242
  const tooltipId = useRef<string>(uniqueId())
255
243
  const hasProvider = useContext(TooltipSingletonContext)
@@ -261,23 +249,23 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
261
249
  const currentTooltipId = tooltipId.current
262
250
  return () => {
263
251
  if (hasProvider) {
264
- tooltipManager.hideTooltip(currentTooltipId, true)
252
+ tooltipManager.hideTooltip(editor, currentTooltipId, true)
265
253
  }
266
254
  }
267
- }, [hasProvider])
255
+ }, [editor, hasProvider])
268
256
 
269
257
  // Don't show tooltip if disabled, no content, or UI labels are disabled
270
258
  if (disabled || !content) {
271
259
  return <>{children}</>
272
260
  }
273
261
 
262
+ const delayDurationToUse =
263
+ delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS)
264
+
274
265
  // Fallback to old behavior if no provider
275
266
  if (!hasProvider) {
276
267
  return (
277
- <_Tooltip.Root
278
- delayDuration={editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS}
279
- disableHoverableContent
280
- >
268
+ <_Tooltip.Root delayDuration={delayDurationToUse} disableHoverableContent>
281
269
  <_Tooltip.Trigger asChild ref={ref}>
282
270
  {children}
283
271
  </_Tooltip.Trigger>
@@ -306,13 +294,15 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
306
294
  content,
307
295
  event.currentTarget as HTMLElement,
308
296
  sideToUse,
309
- sideOffset
297
+ sideOffset,
298
+ showOnMobile,
299
+ delayDurationToUse
310
300
  )
311
301
  }
312
302
 
313
303
  const handleMouseLeave = (event: React.MouseEvent<HTMLElement>) => {
314
304
  child.props.onMouseLeave?.(event)
315
- tooltipManager.hideTooltip(tooltipId.current)
305
+ tooltipManager.hideTooltip(editor, tooltipId.current)
316
306
  }
317
307
 
318
308
  const handleFocus = (event: React.FocusEvent<HTMLElement>) => {
@@ -322,13 +312,15 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
322
312
  content,
323
313
  event.currentTarget as HTMLElement,
324
314
  sideToUse,
325
- sideOffset
315
+ sideOffset,
316
+ showOnMobile,
317
+ delayDurationToUse
326
318
  )
327
319
  }
328
320
 
329
321
  const handleBlur = (event: React.FocusEvent<HTMLElement>) => {
330
322
  child.props.onBlur?.(event)
331
- tooltipManager.hideTooltip(tooltipId.current)
323
+ tooltipManager.hideTooltip(editor, tooltipId.current)
332
324
  }
333
325
 
334
326
  const childrenWithHandlers = React.cloneElement(children as React.ReactElement, {
@@ -3,7 +3,6 @@ import { TLUiEventSource } from '../../../context/events'
3
3
 
4
4
  /** @public */
5
5
  export type TLUiMenuContextType =
6
- | 'panel'
7
6
  | 'menu'
8
7
  | 'small-icons'
9
8
  | 'context-menu'
@@ -27,16 +27,6 @@ export function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGr
27
27
  const labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined
28
28
 
29
29
  switch (menu.type) {
30
- case 'panel': {
31
- return (
32
- <div
33
- className={classNames('tlui-menu__group', className)}
34
- data-testid={`${menu.sourceId}-group.${id}`}
35
- >
36
- {children}
37
- </div>
38
- )
39
- }
40
30
  case 'menu': {
41
31
  return (
42
32
  <TldrawUiDropdownMenuGroup
@@ -120,7 +120,6 @@ export function TldrawUiMenuItem<
120
120
  type="menu"
121
121
  data-testid={`${sourceId}.${id}`}
122
122
  disabled={disabled}
123
- title={titleStr}
124
123
  onClick={(e) => {
125
124
  if (noClose) {
126
125
  preventDefault(e)
@@ -146,7 +145,6 @@ export function TldrawUiMenuItem<
146
145
  return (
147
146
  <_ContextMenu.Item
148
147
  dir="ltr"
149
- title={titleStr}
150
148
  draggable={false}
151
149
  className="tlui-button tlui-button__menu"
152
150
  data-testid={`${sourceId}.${id}`}
@@ -168,20 +166,6 @@ export function TldrawUiMenuItem<
168
166
  </_ContextMenu.Item>
169
167
  )
170
168
  }
171
- case 'panel': {
172
- return (
173
- <TldrawUiButton
174
- data-testid={`${sourceId}.${id}`}
175
- type="menu"
176
- title={titleStr}
177
- disabled={disabled}
178
- onClick={() => onSelect(sourceId)}
179
- >
180
- <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>
181
- {spinner ? <Spinner /> : icon && <TldrawUiButtonIcon icon={icon} />}
182
- </TldrawUiButton>
183
- )
184
- }
185
169
  case 'small-icons':
186
170
  case 'icons': {
187
171
  return (
@@ -332,8 +316,8 @@ function useDraggableEvents(
332
316
  if (
333
317
  distanceSq >
334
318
  (editor.getInstanceState().isCoarsePointer
335
- ? editor.options.coarseDragDistanceSquared
336
- : editor.options.dragDistanceSquared)
319
+ ? editor.options.uiCoarseDragDistanceSquared
320
+ : editor.options.uiDragDistanceSquared)
337
321
  ) {
338
322
  const screenSpaceStart = state.screenSpaceStart
339
323
  state = {
@@ -342,6 +326,8 @@ function useDraggableEvents(
342
326
  }
343
327
 
344
328
  editor.run(() => {
329
+ editor.setCurrentTool('select')
330
+
345
331
  // Set origin point
346
332
  editor.dispatch({
347
333
  type: 'pointer',
@@ -364,6 +350,7 @@ function useDraggableEvents(
364
350
  })
365
351
 
366
352
  tooltipManager.hideAllTooltips()
353
+ editor.getContainer().focus()
367
354
  })
368
355
  }
369
356
  }