tldraw 3.16.0-canary.a962044c3d3b → 3.16.0-canary.aaf20c977c01

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 (398) hide show
  1. package/dist-cjs/index.d.ts +299 -105
  2. package/dist-cjs/index.js +37 -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 +5 -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/elbow/ElbowArrowDebug.js +3 -3
  13. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  14. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  15. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  17. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  18. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +18 -12
  19. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  21. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  22. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  23. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  25. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  26. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  27. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  29. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  31. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  33. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  35. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  36. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  37. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  38. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  39. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +0 -2
  40. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  41. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  42. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  43. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  44. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  46. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  47. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  48. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  49. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  50. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  51. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  52. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  53. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  54. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  55. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +10 -2
  57. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  58. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  59. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  60. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  61. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  62. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  63. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  65. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
  67. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
  69. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  70. package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -45
  71. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  72. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  73. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  74. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +23 -22
  75. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  76. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +24 -21
  77. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  78. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  79. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  80. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
  81. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  83. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  84. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -22
  85. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  86. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  87. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
  89. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  90. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +188 -78
  91. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  92. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
  93. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
  95. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  96. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +17 -3
  97. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  98. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +161 -159
  99. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  100. package/dist-cjs/lib/ui/components/primitives/layout.js +30 -5
  101. package/dist-cjs/lib/ui/components/primitives/layout.js.map +2 -2
  102. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  104. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -19
  106. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  107. package/dist-cjs/lib/ui/context/actions.js +23 -10
  108. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  109. package/dist-cjs/lib/ui/context/components.js +2 -0
  110. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  111. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  112. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  113. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  114. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  115. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  116. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  117. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -0
  118. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  119. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  120. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  121. package/dist-cjs/lib/ui/version.js +3 -3
  122. package/dist-cjs/lib/ui/version.js.map +1 -1
  123. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  124. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  125. package/dist-cjs/lib/utils/export/export.js +0 -20
  126. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  127. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  128. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  129. package/dist-esm/index.d.mts +299 -105
  130. package/dist-esm/index.mjs +70 -30
  131. package/dist-esm/index.mjs.map +2 -2
  132. package/dist-esm/lib/Tldraw.mjs +14 -4
  133. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  134. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  135. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  136. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -4
  137. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  138. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  139. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  140. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  141. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  142. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  143. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  144. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  145. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  146. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +19 -12
  147. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  148. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  149. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  150. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  151. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  152. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  153. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  154. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  155. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  156. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  157. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  158. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  159. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  160. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  161. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  162. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  163. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  164. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  165. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  166. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  167. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +0 -2
  168. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  169. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  170. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  171. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  172. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  173. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  174. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  175. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  176. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  177. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  178. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  179. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  180. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  181. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  182. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  183. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  184. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +10 -2
  185. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  186. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  187. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  188. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  189. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  190. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  191. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  192. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  193. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  194. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
  195. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  196. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
  197. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  198. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +126 -0
  199. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  200. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  201. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  202. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +20 -19
  203. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  204. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +21 -18
  205. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  206. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  207. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  208. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
  209. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  210. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  211. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  212. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -22
  213. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  214. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  215. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  216. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
  217. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  218. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -80
  219. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  220. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
  221. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  222. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
  223. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  224. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +18 -4
  225. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  226. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +170 -161
  227. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  228. package/dist-esm/lib/ui/components/primitives/layout.mjs +31 -6
  229. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +2 -2
  230. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  231. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  232. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  233. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -21
  234. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  235. package/dist-esm/lib/ui/context/actions.mjs +23 -10
  236. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  237. package/dist-esm/lib/ui/context/components.mjs +2 -0
  238. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  239. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  240. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  241. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  242. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  243. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  244. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
  245. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  246. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  247. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  248. package/dist-esm/lib/ui/version.mjs +3 -3
  249. package/dist-esm/lib/ui/version.mjs.map +1 -1
  250. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  251. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  252. package/dist-esm/lib/utils/export/export.mjs +0 -20
  253. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  254. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  255. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  256. package/package.json +11 -34
  257. package/src/index.ts +51 -22
  258. package/src/lib/Tldraw.tsx +15 -2
  259. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  260. package/src/lib/defaultExternalContentHandlers.ts +12 -4
  261. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  262. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  263. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  264. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  265. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  266. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  267. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  268. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  269. package/src/lib/shapes/frame/FrameShapeUtil.tsx +29 -14
  270. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  271. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  272. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  273. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  274. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  275. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  276. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  277. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  278. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  279. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  280. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  281. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  282. package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
  283. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  284. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  285. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  286. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  287. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  288. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  289. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  290. package/src/lib/ui/TldrawUi.tsx +33 -12
  291. package/src/lib/ui/assetUrls.ts +13 -10
  292. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +13 -2
  293. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  294. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  295. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  296. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  297. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
  298. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -381
  299. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +65 -51
  300. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  301. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +28 -19
  302. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  303. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  304. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +4 -3
  305. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  306. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -24
  307. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  308. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
  309. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +208 -56
  310. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
  311. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
  312. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +25 -5
  313. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +203 -181
  314. package/src/lib/ui/components/primitives/layout.tsx +79 -5
  315. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  316. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  317. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -18
  318. package/src/lib/ui/context/actions.tsx +23 -10
  319. package/src/lib/ui/context/components.tsx +3 -0
  320. package/src/lib/ui/context/events.tsx +2 -1
  321. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  322. package/src/lib/ui/hooks/useTools.tsx +140 -10
  323. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
  324. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
  325. package/src/lib/ui/kbd-utils.ts +10 -3
  326. package/src/lib/ui/version.ts +3 -3
  327. package/src/lib/ui.css +365 -245
  328. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  329. package/src/lib/utils/export/copyAs.ts +1 -24
  330. package/src/lib/utils/export/export.ts +0 -36
  331. package/src/lib/utils/export/exportAs.ts +1 -32
  332. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  333. package/src/test/A11y.test.tsx +3 -2
  334. package/src/test/ClickManager.test.ts +7 -6
  335. package/src/test/Editor.test.tsx +20 -19
  336. package/src/test/EraserTool.test.ts +184 -13
  337. package/src/test/HandTool.test.ts +10 -9
  338. package/src/test/HighlightShape.test.ts +2 -1
  339. package/src/test/SelectTool.test.ts +3 -2
  340. package/src/test/TLUserPreferences.test.ts +4 -3
  341. package/src/test/TestEditor.ts +13 -15
  342. package/src/test/TldrawEditor.test.tsx +11 -10
  343. package/src/test/ZoomTool.test.ts +7 -6
  344. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  345. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  346. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  347. package/src/test/arrows-megabus.test.tsx +5 -4
  348. package/src/test/bindings.test.tsx +24 -37
  349. package/src/test/bookmark-shapes.test.ts +1 -8
  350. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  351. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  352. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  353. package/src/test/commands/alignShapes.test.tsx +25 -24
  354. package/src/test/commands/animationSpeed.test.ts +2 -1
  355. package/src/test/commands/centerOnPoint.test.ts +3 -2
  356. package/src/test/commands/clipboard.test.ts +3 -2
  357. package/src/test/commands/createShapes.test.ts +2 -1
  358. package/src/test/commands/deleteShapes.test.ts +2 -1
  359. package/src/test/commands/distributeShapes.test.tsx +11 -10
  360. package/src/test/commands/getSvgString.test.ts +2 -1
  361. package/src/test/commands/packShapes.test.ts +5 -4
  362. package/src/test/commands/resizeShape.test.ts +2 -1
  363. package/src/test/commands/rotateShapes.test.ts +7 -6
  364. package/src/test/commands/setCamera.test.ts +4 -3
  365. package/src/test/commands/setCurrentPage.test.ts +3 -2
  366. package/src/test/commands/stackShapes.test.ts +11 -10
  367. package/src/test/commands/stretch.test.tsx +13 -12
  368. package/src/test/createDeepLink.test.tsx +2 -1
  369. package/src/test/cropping.test.ts +3 -2
  370. package/src/test/custom-clipping.test.ts +436 -0
  371. package/src/test/drawing.test.ts +2 -1
  372. package/src/test/flipShapes.test.ts +4 -3
  373. package/src/test/frames.test.ts +25 -24
  374. package/src/test/getCulledShapes.test.tsx +3 -2
  375. package/src/test/groups.test.tsx +1 -1
  376. package/src/test/handleDeepLink.test.tsx +2 -1
  377. package/src/test/maxShapes.test.ts +3 -2
  378. package/src/test/modifiers.test.ts +5 -4
  379. package/src/test/navigation.test.ts +12 -11
  380. package/src/test/panning.test.ts +2 -1
  381. package/src/test/perf/perf.test.ts +2 -1
  382. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  383. package/src/test/resizing.test.ts +39 -38
  384. package/src/test/select.test.tsx +4 -3
  385. package/src/test/selection-omnibus.test.ts +11 -10
  386. package/src/test/shapeutils.test.ts +4 -3
  387. package/src/test/translating.test.ts +9 -8
  388. package/tldraw.css +666 -535
  389. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  390. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  391. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  392. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  393. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  394. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  395. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  396. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -114
  397. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  398. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
@@ -3,6 +3,7 @@ import { ReactNode } from 'react'
3
3
  import { unwrapLabel } from '../../../context/actions'
4
4
  import { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'
5
5
  import { useTranslation } from '../../../hooks/useTranslation/useTranslation'
6
+ import { TldrawUiColumn, TldrawUiGrid, TldrawUiRow, useTldrawUiOrientation } from '../layout'
6
7
  import { TldrawUiDropdownMenuGroup } from '../TldrawUiDropdownMenu'
7
8
  import { useTldrawUiMenuContext } from './TldrawUiMenuContext'
8
9
 
@@ -19,25 +20,19 @@ export interface TLUiMenuGroupProps<TranslationKey extends string = string> {
19
20
 
20
21
  /** @public @react */
21
22
  export function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGroupProps) {
22
- const { type: menuType, sourceId } = useTldrawUiMenuContext()
23
+ const menu = useTldrawUiMenuContext()
24
+ const { orientation } = useTldrawUiOrientation()
23
25
  const msg = useTranslation()
24
- const labelToUse = unwrapLabel(label, menuType)
26
+ const labelToUse = unwrapLabel(label, menu.type)
25
27
  const labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined
26
28
 
27
- switch (menuType) {
28
- case 'panel': {
29
- return (
30
- <div
31
- className={classNames('tlui-menu__group', className)}
32
- data-testid={`${sourceId}-group.${id}`}
33
- >
34
- {children}
35
- </div>
36
- )
37
- }
29
+ switch (menu.type) {
38
30
  case 'menu': {
39
31
  return (
40
- <TldrawUiDropdownMenuGroup className={className} data-testid={`${sourceId}-group.${id}`}>
32
+ <TldrawUiDropdownMenuGroup
33
+ className={className}
34
+ data-testid={`${menu.sourceId}-group.${id}`}
35
+ >
41
36
  {children}
42
37
  </TldrawUiDropdownMenuGroup>
43
38
  )
@@ -47,7 +42,7 @@ export function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGr
47
42
  <div
48
43
  dir="ltr"
49
44
  className={classNames('tlui-menu__group', className)}
50
- data-testid={`${sourceId}-group.${id}`}
45
+ data-testid={`${menu.sourceId}-group.${id}`}
51
46
  >
52
47
  {children}
53
48
  </div>
@@ -56,12 +51,30 @@ export function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGr
56
51
  case 'keyboard-shortcuts': {
57
52
  // todo: if groups need a label, let's give em a label
58
53
  return (
59
- <div className="tlui-shortcuts-dialog__group" data-testid={`${sourceId}-group.${id}`}>
54
+ <div className="tlui-shortcuts-dialog__group" data-testid={`${menu.sourceId}-group.${id}`}>
60
55
  <h2 className="tlui-shortcuts-dialog__group__title">{labelStr}</h2>
61
56
  <div className="tlui-shortcuts-dialog__group__content">{children}</div>
62
57
  </div>
63
58
  )
64
59
  }
60
+ case 'toolbar': {
61
+ const Layout = orientation === 'horizontal' ? TldrawUiRow : TldrawUiColumn
62
+ return (
63
+ <Layout className="tlui-main-toolbar__group" data-testid={`${menu.sourceId}-group.${id}`}>
64
+ {children}
65
+ </Layout>
66
+ )
67
+ }
68
+ case 'toolbar-overflow': {
69
+ return (
70
+ <TldrawUiGrid
71
+ className="tlui-main-toolbar__group"
72
+ data-testid={`${menu.sourceId}-group.${id}`}
73
+ >
74
+ {children}
75
+ </TldrawUiGrid>
76
+ )
77
+ }
65
78
  default: {
66
79
  return children
67
80
  }
@@ -1,9 +1,18 @@
1
- import { exhaustiveSwitchError, preventDefault } from '@tldraw/editor'
1
+ import {
2
+ exhaustiveSwitchError,
3
+ getPointerInfo,
4
+ preventDefault,
5
+ TLPointerEventInfo,
6
+ useEditor,
7
+ Vec,
8
+ VecModel,
9
+ } from '@tldraw/editor'
2
10
  import { ContextMenu as _ContextMenu } from 'radix-ui'
3
- import { useState } from 'react'
11
+ import { useMemo, useState } from 'react'
4
12
  import { unwrapLabel } from '../../../context/actions'
5
13
  import { TLUiEventSource } from '../../../context/events'
6
14
  import { useReadonly } from '../../../hooks/useReadonly'
15
+ import { TLUiToolItem } from '../../../hooks/useTools'
7
16
  import { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'
8
17
  import { useTranslation } from '../../../hooks/useTranslation/useTranslation'
9
18
  import { kbdStr } from '../../../kbd-utils'
@@ -15,6 +24,7 @@ import { TldrawUiDropdownMenuItem } from '../TldrawUiDropdownMenu'
15
24
  import { TLUiIconJsx } from '../TldrawUiIcon'
16
25
  import { TldrawUiKbd } from '../TldrawUiKbd'
17
26
  import { TldrawUiToolbarButton } from '../TldrawUiToolbar'
27
+ import { tooltipManager } from '../TldrawUiTooltip'
18
28
  import { useTldrawUiMenuContext } from './TldrawUiMenuContext'
19
29
 
20
30
  /** @public */
@@ -63,6 +73,10 @@ export interface TLUiMenuItemProps<
63
73
  * Whether the item is selected.
64
74
  */
65
75
  isSelected?: boolean
76
+ /**
77
+ * The function to call when the item is dragged. If this is provided, the item will be draggable.
78
+ */
79
+ onDragStart?(source: TLUiEventSource, info: TLPointerEventInfo): void
66
80
  }
67
81
 
68
82
  /** @public @react */
@@ -81,6 +95,7 @@ export function TldrawUiMenuItem<
81
95
  onSelect,
82
96
  noClose,
83
97
  isSelected,
98
+ onDragStart,
84
99
  }: TLUiMenuItemProps<TranslationKey, IconType>) {
85
100
  const { type: menuType, sourceId } = useTldrawUiMenuContext()
86
101
 
@@ -105,7 +120,6 @@ export function TldrawUiMenuItem<
105
120
  type="menu"
106
121
  data-testid={`${sourceId}.${id}`}
107
122
  disabled={disabled}
108
- title={titleStr}
109
123
  onClick={(e) => {
110
124
  if (noClose) {
111
125
  preventDefault(e)
@@ -131,7 +145,6 @@ export function TldrawUiMenuItem<
131
145
  return (
132
146
  <_ContextMenu.Item
133
147
  dir="ltr"
134
- title={titleStr}
135
148
  draggable={false}
136
149
  className="tlui-button tlui-button__menu"
137
150
  data-testid={`${sourceId}.${id}`}
@@ -153,20 +166,6 @@ export function TldrawUiMenuItem<
153
166
  </_ContextMenu.Item>
154
167
  )
155
168
  }
156
- case 'panel': {
157
- return (
158
- <TldrawUiButton
159
- data-testid={`${sourceId}.${id}`}
160
- type="menu"
161
- title={titleStr}
162
- disabled={disabled}
163
- onClick={() => onSelect(sourceId)}
164
- >
165
- <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>
166
- {spinner ? <Spinner /> : icon && <TldrawUiButtonIcon icon={icon} />}
167
- </TldrawUiButton>
168
- )
169
- }
170
169
  case 'small-icons':
171
170
  case 'icons': {
172
171
  return (
@@ -207,6 +206,20 @@ export function TldrawUiMenuItem<
207
206
  )
208
207
  }
209
208
  case 'toolbar': {
209
+ if (onDragStart) {
210
+ return (
211
+ <DraggableToolbarButton
212
+ id={id}
213
+ icon={icon}
214
+ onSelect={onSelect}
215
+ onDragStart={onDragStart}
216
+ labelToUse={labelToUse}
217
+ titleStr={titleStr}
218
+ disabled={disabled}
219
+ isSelected={isSelected}
220
+ />
221
+ )
222
+ }
210
223
  return (
211
224
  <TldrawUiToolbarButton
212
225
  aria-label={labelStr}
@@ -227,6 +240,21 @@ export function TldrawUiMenuItem<
227
240
  )
228
241
  }
229
242
  case 'toolbar-overflow': {
243
+ if (onDragStart) {
244
+ return (
245
+ <DraggableToolbarButton
246
+ id={id}
247
+ icon={icon}
248
+ onSelect={onSelect}
249
+ onDragStart={onDragStart}
250
+ labelToUse={labelToUse}
251
+ titleStr={titleStr}
252
+ disabled={disabled}
253
+ isSelected={isSelected}
254
+ overflow
255
+ />
256
+ )
257
+ }
230
258
  return (
231
259
  <TldrawUiToolbarButton
232
260
  aria-label={labelStr}
@@ -248,3 +276,178 @@ export function TldrawUiMenuItem<
248
276
  }
249
277
  }
250
278
  }
279
+
280
+ function useDraggableEvents(
281
+ onDragStart: TLUiToolItem['onDragStart'],
282
+ onSelect: TLUiToolItem['onSelect']
283
+ ) {
284
+ const editor = useEditor()
285
+ const events = useMemo(() => {
286
+ let state = { name: 'idle' } as
287
+ | {
288
+ name: 'idle'
289
+ }
290
+ | {
291
+ name: 'pointing'
292
+ screenSpaceStart: VecModel
293
+ }
294
+ | {
295
+ name: 'dragging'
296
+ screenSpaceStart: VecModel
297
+ }
298
+ | {
299
+ name: 'dragged'
300
+ }
301
+
302
+ function handlePointerDown(e: React.PointerEvent<HTMLButtonElement>) {
303
+ state = {
304
+ name: 'pointing',
305
+ screenSpaceStart: { x: e.clientX, y: e.clientY },
306
+ }
307
+
308
+ e.currentTarget.setPointerCapture(e.pointerId)
309
+ }
310
+
311
+ function handlePointerMove(e: React.PointerEvent<HTMLButtonElement>) {
312
+ if ((e as any).isSpecialRedispatchedEvent) return
313
+
314
+ if (state.name === 'pointing') {
315
+ const distanceSq = Vec.Dist2(state.screenSpaceStart, { x: e.clientX, y: e.clientY })
316
+ if (
317
+ distanceSq >
318
+ (editor.getInstanceState().isCoarsePointer
319
+ ? editor.options.uiCoarseDragDistanceSquared
320
+ : editor.options.uiDragDistanceSquared)
321
+ ) {
322
+ const screenSpaceStart = state.screenSpaceStart
323
+ state = {
324
+ name: 'dragging',
325
+ screenSpaceStart,
326
+ }
327
+
328
+ editor.run(() => {
329
+ editor.setCurrentTool('select')
330
+
331
+ // Set origin point
332
+ editor.dispatch({
333
+ type: 'pointer',
334
+ target: 'canvas',
335
+ name: 'pointer_down',
336
+ ...getPointerInfo(e),
337
+ point: screenSpaceStart,
338
+ })
339
+
340
+ // Pointer down potentially selects shapes, so we need to deselect them.
341
+ editor.selectNone()
342
+
343
+ // start drag
344
+ onDragStart?.('toolbar', {
345
+ type: 'pointer',
346
+ target: 'canvas',
347
+ name: 'pointer_move',
348
+ ...getPointerInfo(e),
349
+ point: screenSpaceStart,
350
+ })
351
+
352
+ tooltipManager.hideAllTooltips()
353
+ editor.getContainer().focus()
354
+ })
355
+ }
356
+ }
357
+ }
358
+
359
+ function handlePointerUp(e: React.PointerEvent<HTMLButtonElement>) {
360
+ if ((e as any).isSpecialRedispatchedEvent) return
361
+
362
+ e.currentTarget.releasePointerCapture(e.pointerId)
363
+
364
+ editor.dispatch({
365
+ type: 'pointer',
366
+ target: 'canvas',
367
+ name: 'pointer_up',
368
+ ...getPointerInfo(e),
369
+ })
370
+ }
371
+
372
+ function handleClick() {
373
+ if (state.name === 'dragging' || state.name === 'dragged') {
374
+ state = { name: 'idle' }
375
+ return true
376
+ }
377
+
378
+ state = { name: 'idle' }
379
+ onSelect?.('toolbar')
380
+ }
381
+
382
+ return {
383
+ onPointerDown: handlePointerDown,
384
+ onPointerMove: handlePointerMove,
385
+ onPointerUp: handlePointerUp,
386
+ onClick: handleClick,
387
+ }
388
+ }, [onDragStart, editor, onSelect])
389
+
390
+ return events
391
+ }
392
+
393
+ function DraggableToolbarButton({
394
+ id,
395
+ labelToUse,
396
+ titleStr,
397
+ disabled,
398
+ isSelected,
399
+ icon,
400
+ onSelect,
401
+ onDragStart,
402
+ overflow,
403
+ }: {
404
+ id: string
405
+ disabled: boolean
406
+ labelToUse?: string
407
+ titleStr?: string
408
+ isSelected?: boolean
409
+ icon: TLUiMenuItemProps['icon']
410
+ onSelect: TLUiMenuItemProps['onSelect']
411
+ onDragStart: TLUiMenuItemProps['onDragStart']
412
+ overflow?: boolean
413
+ }) {
414
+ const events = useDraggableEvents(onDragStart, onSelect)
415
+
416
+ if (overflow) {
417
+ return (
418
+ <TldrawUiToolbarButton
419
+ aria-label={labelToUse}
420
+ aria-pressed={isSelected ? 'true' : 'false'}
421
+ isActive={isSelected}
422
+ className="tlui-button-grid__button"
423
+ data-testid={`tools.more.${id}`}
424
+ data-value={id}
425
+ disabled={disabled}
426
+ title={titleStr}
427
+ type="icon"
428
+ {...events}
429
+ >
430
+ <TldrawUiButtonIcon icon={icon!} />
431
+ </TldrawUiToolbarButton>
432
+ )
433
+ }
434
+
435
+ return (
436
+ <TldrawUiToolbarButton
437
+ aria-label={labelToUse}
438
+ aria-pressed={isSelected ? 'true' : 'false'}
439
+ data-testid={`tools.${id}`}
440
+ data-value={id}
441
+ disabled={disabled}
442
+ onTouchStart={(e) => {
443
+ preventDefault(e)
444
+ onSelect('toolbar')
445
+ }}
446
+ title={titleStr}
447
+ type="tool"
448
+ {...events}
449
+ >
450
+ <TldrawUiButtonIcon icon={icon!} />
451
+ </TldrawUiToolbarButton>
452
+ )
453
+ }
@@ -36,6 +36,7 @@ import { useTranslation } from '../hooks/useTranslation/useTranslation'
36
36
  import { TLUiIconType } from '../icon-types'
37
37
  import { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'
38
38
  import { useA11y } from './a11y'
39
+ import { useTldrawUiComponents } from './components'
39
40
  import { TLUiEventSource, useUiEvents } from './events'
40
41
 
41
42
  /** @public */
@@ -98,6 +99,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
98
99
  const _editor = useMaybeEditor()
99
100
  const showCollaborationUi = useShowCollaborationUi()
100
101
  const helpers = useDefaultHelpers()
102
+ const components = useTldrawUiComponents()
101
103
  const trackEvent = useUiEvents()
102
104
  const a11y = useA11y()
103
105
  const msg = useTranslation()
@@ -176,7 +178,9 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
176
178
  kbd: 'cmd+alt+/,ctrl+alt+/',
177
179
  onSelect(source) {
178
180
  trackEvent('open-kbd-shortcuts', { source })
179
- helpers.addDialog({ component: DefaultKeyboardShortcutsDialog })
181
+ helpers.addDialog({
182
+ component: components.KeyboardShortcutsDialog ?? DefaultKeyboardShortcutsDialog,
183
+ })
180
184
  },
181
185
  },
182
186
  {
@@ -221,7 +225,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
221
225
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
222
226
  if (ids.length === 0) return
223
227
  trackEvent('export-as', { format: 'svg', source })
224
- helpers.exportAs(ids, 'svg', getExportName(editor, defaultDocumentName))
228
+ helpers.exportAs(ids, { format: 'svg', name: getExportName(editor, defaultDocumentName) })
225
229
  },
226
230
  },
227
231
  {
@@ -237,7 +241,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
237
241
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
238
242
  if (ids.length === 0) return
239
243
  trackEvent('export-as', { format: 'png', source })
240
- helpers.exportAs(ids, 'png', getExportName(editor, defaultDocumentName))
244
+ helpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })
241
245
  },
242
246
  },
243
247
  {
@@ -253,11 +257,10 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
253
257
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())
254
258
  if (ids.length === 0) return
255
259
  trackEvent('export-all-as', { format: 'svg', source })
256
- helpers.exportAs(
257
- Array.from(editor.getCurrentPageShapeIds()),
258
- 'svg',
259
- getExportName(editor, defaultDocumentName)
260
- )
260
+ helpers.exportAs(Array.from(editor.getCurrentPageShapeIds()), {
261
+ format: 'svg',
262
+ name: getExportName(editor, defaultDocumentName),
263
+ })
261
264
  },
262
265
  },
263
266
  {
@@ -272,7 +275,7 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
272
275
  const ids = Array.from(editor.getCurrentPageShapeIds().values())
273
276
  if (ids.length === 0) return
274
277
  trackEvent('export-all-as', { format: 'png', source })
275
- helpers.exportAs(ids, 'png', getExportName(editor, defaultDocumentName))
278
+ helpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })
276
279
  },
277
280
  },
278
281
  {
@@ -1755,7 +1758,17 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1755
1758
  }
1756
1759
 
1757
1760
  return actions
1758
- }, [helpers, _editor, trackEvent, overrides, defaultDocumentName, showCollaborationUi, msg, a11y])
1761
+ }, [
1762
+ helpers,
1763
+ _editor,
1764
+ trackEvent,
1765
+ overrides,
1766
+ defaultDocumentName,
1767
+ showCollaborationUi,
1768
+ msg,
1769
+ a11y,
1770
+ components,
1771
+ ])
1759
1772
 
1760
1773
  return <ActionsContext.Provider value={asActions(actions)}>{children}</ActionsContext.Provider>
1761
1774
  }
@@ -12,6 +12,7 @@ import {
12
12
  import { CursorChatBubble } from '../components/CursorChatBubble'
13
13
  import { DefaultDebugMenu } from '../components/DebugMenu/DefaultDebugMenu'
14
14
  import { DefaultDebugPanel } from '../components/DefaultDebugPanel'
15
+ import { DefaultFollowingIndicator } from '../components/DefaultFollowingIndicator'
15
16
  import { DefaultMenuPanel } from '../components/DefaultMenuPanel'
16
17
  import { DefaultDialogs } from '../components/Dialogs'
17
18
  import { TLUiHelpMenuProps } from '../components/HelpMenu/DefaultHelpMenu'
@@ -72,6 +73,7 @@ export interface TLUiComponents {
72
73
  Dialogs?: ComponentType | null
73
74
  Toasts?: ComponentType | null
74
75
  A11y?: ComponentType | null
76
+ FollowingIndicator?: ComponentType | null
75
77
  }
76
78
 
77
79
  const TldrawUiComponentsContext = createContext<TLUiComponents | null>(null)
@@ -119,6 +121,7 @@ export function TldrawUiComponentsProvider({
119
121
  Dialogs: DefaultDialogs,
120
122
  Toasts: DefaultToasts,
121
123
  A11y: DefaultA11yAnnouncer,
124
+ FollowingIndicator: DefaultFollowingIndicator,
122
125
  ..._overrides,
123
126
  }),
124
127
  [_overrides, showCollaborationUi]
@@ -123,10 +123,11 @@ export interface TLUiEventMap {
123
123
  'shrink-shapes': null
124
124
  'flatten-to-image': null
125
125
  'a11y-repeat-shape-announce': null
126
- 'open-url': { url: string }
126
+ 'open-url': { destinationUrl: string }
127
127
  'open-context-menu': null
128
128
  'adjust-shape-styles': null
129
129
  'copy-link': null
130
+ 'drag-tool': { id: string }
130
131
  'image-replace': null
131
132
  'video-replace': null
132
133
  'open-kbd-shortcuts': null
@@ -11,12 +11,13 @@ export function useExportAs() {
11
11
  const msg = useTranslation()
12
12
 
13
13
  return useCallback(
14
- (ids: TLShapeId[], format: TLExportType = 'png', name: string | undefined) => {
14
+ (ids: TLShapeId[], opts: { format?: TLExportType; name?: string; scale?: number } = {}) => {
15
15
  assert(editor, 'useExportAs: editor is required')
16
+ const { format = 'png', name, scale = 1 } = opts
16
17
  exportAs(editor, ids, {
17
18
  format,
18
19
  name,
19
- scale: 1,
20
+ scale,
20
21
  }).catch((e) => {
21
22
  console.error(e.message)
22
23
  addToast({