tldraw 3.16.0-next.c30b1b5e551a → 3.16.0-next.e57e478c23e0

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 (469) hide show
  1. package/dist-cjs/index.d.ts +353 -105
  2. package/dist-cjs/index.js +46 -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/arrowLabel.js +6 -0
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
  14. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  16. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  17. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  18. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  19. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  21. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  22. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +18 -12
  23. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  25. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  26. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  27. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  29. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  30. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  31. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  33. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  35. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  37. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  38. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  39. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  40. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  41. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  42. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  43. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +0 -2
  44. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  45. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  46. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  47. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  48. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  49. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  50. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  51. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  52. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  53. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  54. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  55. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  56. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  57. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  58. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  59. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  60. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  61. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  63. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  64. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  65. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  67. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  68. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  69. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  70. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  71. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  72. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  73. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  74. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  75. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  77. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  79. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  80. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  81. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  83. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  84. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  85. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  86. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +11 -4
  87. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +249 -279
  89. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  90. package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -56
  91. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  92. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  93. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  94. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
  95. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  96. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
  97. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  98. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  99. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  100. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
  101. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  102. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  103. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  104. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  105. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  106. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  107. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  108. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
  109. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  110. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  111. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  112. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  113. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  114. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  115. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  116. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
  117. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  118. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  119. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  120. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
  121. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  122. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +32 -7
  123. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  124. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +269 -0
  125. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  126. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  127. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  128. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  129. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  130. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  131. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  132. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  133. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  134. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  135. package/dist-cjs/lib/ui/context/actions.js +38 -10
  136. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  137. package/dist-cjs/lib/ui/context/components.js +2 -0
  138. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  139. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  140. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  141. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  142. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  143. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  144. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  145. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +5 -0
  146. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  147. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  148. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  149. package/dist-cjs/lib/ui/version.js +3 -3
  150. package/dist-cjs/lib/ui/version.js.map +1 -1
  151. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  152. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  153. package/dist-cjs/lib/utils/export/export.js +0 -20
  154. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  155. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  156. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  157. package/dist-esm/index.d.mts +353 -105
  158. package/dist-esm/index.mjs +85 -29
  159. package/dist-esm/index.mjs.map +2 -2
  160. package/dist-esm/lib/Tldraw.mjs +14 -4
  161. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  162. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  163. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  164. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -4
  165. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  166. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  167. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  168. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  169. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  170. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  171. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  172. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  173. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  174. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  175. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  176. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  177. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  178. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +19 -12
  179. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  180. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  181. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  182. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  183. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  184. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  185. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  186. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  187. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  188. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  189. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  190. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  191. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  192. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  193. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  194. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  195. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  196. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  197. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  198. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  199. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +0 -2
  200. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  202. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  203. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  204. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  206. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  207. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  208. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  209. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  210. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  211. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  212. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  213. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  214. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  215. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  216. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  217. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  218. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  219. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  220. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  221. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  222. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  223. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  224. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  225. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  226. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  227. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  228. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  229. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  230. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  231. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  232. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  233. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  234. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  235. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  236. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  237. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  238. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  239. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  240. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  241. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  242. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +16 -5
  243. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  244. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +251 -283
  245. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  246. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +126 -0
  247. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  248. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  249. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  250. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
  251. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  252. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
  253. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  254. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  255. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  256. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
  257. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  258. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  259. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  260. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  261. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  262. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  263. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  264. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
  265. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  266. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  267. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  268. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  269. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  270. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  271. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  272. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
  273. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  274. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  275. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  276. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
  277. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  278. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +32 -7
  279. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  280. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +246 -0
  281. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  282. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  283. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  284. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  286. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  288. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  289. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  290. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  291. package/dist-esm/lib/ui/context/actions.mjs +38 -10
  292. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  293. package/dist-esm/lib/ui/context/components.mjs +2 -0
  294. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  295. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  296. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  297. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  298. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  299. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  300. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +5 -0
  301. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  302. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  303. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  304. package/dist-esm/lib/ui/version.mjs +3 -3
  305. package/dist-esm/lib/ui/version.mjs.map +1 -1
  306. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  307. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  308. package/dist-esm/lib/utils/export/export.mjs +0 -20
  309. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  310. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  311. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  312. package/package.json +11 -34
  313. package/src/index.ts +64 -22
  314. package/src/lib/Tldraw.tsx +15 -2
  315. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  316. package/src/lib/defaultExternalContentHandlers.ts +12 -4
  317. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  318. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  319. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  320. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  321. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  322. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  323. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  324. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  325. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  326. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  327. package/src/lib/shapes/frame/FrameShapeUtil.tsx +29 -14
  328. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  329. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  330. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  331. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  332. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  333. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  334. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  335. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  336. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  337. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  338. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  339. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  340. package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
  341. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  342. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  343. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  344. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  345. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  346. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  347. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  348. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  349. package/src/lib/ui/TldrawUi.tsx +33 -12
  350. package/src/lib/ui/assetUrls.ts +13 -10
  351. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  352. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  353. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  354. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  355. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  356. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  357. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  358. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  359. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  360. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  361. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  362. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  363. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +28 -12
  364. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +261 -343
  365. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +66 -50
  366. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  367. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
  368. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  369. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  370. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +4 -3
  371. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  372. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  373. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  374. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
  375. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  376. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +14 -11
  377. package/src/lib/ui/components/menu-items.tsx +8 -0
  378. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
  379. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  380. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
  381. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +54 -12
  382. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +335 -0
  383. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  384. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  385. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  386. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  387. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  388. package/src/lib/ui/context/actions.tsx +38 -10
  389. package/src/lib/ui/context/components.tsx +3 -0
  390. package/src/lib/ui/context/events.tsx +3 -1
  391. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  392. package/src/lib/ui/hooks/useTools.tsx +140 -10
  393. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +5 -0
  394. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +5 -0
  395. package/src/lib/ui/kbd-utils.ts +10 -3
  396. package/src/lib/ui/version.ts +3 -3
  397. package/src/lib/ui.css +424 -293
  398. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  399. package/src/lib/utils/export/copyAs.ts +1 -24
  400. package/src/lib/utils/export/export.ts +0 -36
  401. package/src/lib/utils/export/exportAs.ts +1 -32
  402. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  403. package/src/test/A11y.test.tsx +3 -2
  404. package/src/test/ClickManager.test.ts +7 -6
  405. package/src/test/Editor.test.tsx +20 -19
  406. package/src/test/EraserTool.test.ts +184 -13
  407. package/src/test/HandTool.test.ts +10 -9
  408. package/src/test/HighlightShape.test.ts +2 -1
  409. package/src/test/SelectTool.test.ts +3 -2
  410. package/src/test/TLUserPreferences.test.ts +4 -3
  411. package/src/test/TestEditor.ts +13 -15
  412. package/src/test/TldrawEditor.test.tsx +11 -10
  413. package/src/test/ZoomTool.test.ts +7 -6
  414. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  415. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  416. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  417. package/src/test/arrows-megabus.test.tsx +17 -10
  418. package/src/test/bindings.test.tsx +24 -37
  419. package/src/test/bookmark-shapes.test.ts +1 -8
  420. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  421. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  422. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  423. package/src/test/commands/alignShapes.test.tsx +25 -24
  424. package/src/test/commands/animationSpeed.test.ts +2 -1
  425. package/src/test/commands/centerOnPoint.test.ts +3 -2
  426. package/src/test/commands/clipboard.test.ts +3 -2
  427. package/src/test/commands/createShapes.test.ts +2 -1
  428. package/src/test/commands/deleteShapes.test.ts +2 -1
  429. package/src/test/commands/distributeShapes.test.tsx +11 -10
  430. package/src/test/commands/getSvgString.test.ts +2 -1
  431. package/src/test/commands/packShapes.test.ts +5 -4
  432. package/src/test/commands/resizeShape.test.ts +2 -1
  433. package/src/test/commands/rotateShapes.test.ts +7 -6
  434. package/src/test/commands/setCamera.test.ts +4 -3
  435. package/src/test/commands/setCurrentPage.test.ts +3 -2
  436. package/src/test/commands/stackShapes.test.ts +11 -10
  437. package/src/test/commands/stretch.test.tsx +13 -12
  438. package/src/test/createDeepLink.test.tsx +2 -1
  439. package/src/test/cropping.test.ts +3 -2
  440. package/src/test/custom-clipping.test.ts +436 -0
  441. package/src/test/drawing.test.ts +2 -1
  442. package/src/test/flipShapes.test.ts +4 -3
  443. package/src/test/frames.test.ts +25 -24
  444. package/src/test/getCulledShapes.test.tsx +3 -2
  445. package/src/test/groups.test.tsx +1 -1
  446. package/src/test/handleDeepLink.test.tsx +2 -1
  447. package/src/test/inner-outer-margin.test.ts +315 -0
  448. package/src/test/maxShapes.test.ts +3 -2
  449. package/src/test/modifiers.test.ts +5 -4
  450. package/src/test/navigation.test.ts +12 -11
  451. package/src/test/panning.test.ts +2 -1
  452. package/src/test/perf/perf.test.ts +2 -1
  453. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  454. package/src/test/resizing.test.ts +39 -38
  455. package/src/test/select.test.tsx +4 -3
  456. package/src/test/selection-omnibus.test.ts +11 -10
  457. package/src/test/shapeutils.test.ts +4 -3
  458. package/src/test/translating.test.ts +9 -8
  459. package/tldraw.css +725 -581
  460. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  461. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  462. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  463. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  464. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  465. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  466. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  467. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  468. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  469. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
@@ -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,12 +240,26 @@ 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}
233
261
  aria-pressed={isSelected ? 'true' : 'false'}
234
262
  isActive={isSelected}
235
- className="tlui-button-grid__button"
236
263
  data-testid={`tools.more.${id}`}
237
264
  data-value={id}
238
265
  disabled={disabled}
@@ -249,3 +276,178 @@ export function TldrawUiMenuItem<
249
276
  }
250
277
  }
251
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
+ }
@@ -1,6 +1,7 @@
1
1
  import { RecursivePartial, defaultUserPreferences, track, useMaybeEditor } from '@tldraw/editor'
2
2
  import { ReactNode } from 'react'
3
3
  import { TLUiAssetUrls, useDefaultUiAssetUrlsWithOverrides } from '../assetUrls'
4
+ import { TldrawUiTooltipProvider } from '../components/primitives/TldrawUiTooltip'
4
5
  import { ToolsProvider } from '../hooks/useTools'
5
6
  import { TldrawUiTranslationProvider } from '../hooks/useTranslation/useTranslation'
6
7
  import {
@@ -72,26 +73,28 @@ export const TldrawUiContextProvider = track(function TldrawUiContextProvider({
72
73
  const editor = useMaybeEditor()
73
74
  return (
74
75
  <MimeTypeContext.Provider value={mediaMimeTypes}>
75
- <AssetUrlsProvider assetUrls={useDefaultUiAssetUrlsWithOverrides(assetUrls)}>
76
- <TldrawUiTranslationProvider
77
- overrides={useMergedTranslationOverrides(overrides)}
78
- locale={editor?.user.getLocale() ?? defaultUserPreferences.locale}
79
- >
80
- <TldrawUiEventsProvider onEvent={onUiEvent}>
81
- <TldrawUiToastsProvider>
82
- <TldrawUiDialogsProvider context={'tla'}>
83
- <TldrawUiA11yProvider>
84
- <BreakPointProvider forceMobile={forceMobile}>
85
- <TldrawUiComponentsProvider overrides={components}>
86
- <InternalProviders overrides={overrides}>{children}</InternalProviders>
87
- </TldrawUiComponentsProvider>
88
- </BreakPointProvider>
89
- </TldrawUiA11yProvider>
90
- </TldrawUiDialogsProvider>
91
- </TldrawUiToastsProvider>
92
- </TldrawUiEventsProvider>
93
- </TldrawUiTranslationProvider>
94
- </AssetUrlsProvider>
76
+ <TldrawUiTooltipProvider>
77
+ <AssetUrlsProvider assetUrls={useDefaultUiAssetUrlsWithOverrides(assetUrls)}>
78
+ <TldrawUiTranslationProvider
79
+ overrides={useMergedTranslationOverrides(overrides)}
80
+ locale={editor?.user.getLocale() ?? defaultUserPreferences.locale}
81
+ >
82
+ <TldrawUiEventsProvider onEvent={onUiEvent}>
83
+ <TldrawUiToastsProvider>
84
+ <TldrawUiDialogsProvider context={'tla'}>
85
+ <TldrawUiA11yProvider>
86
+ <BreakPointProvider forceMobile={forceMobile}>
87
+ <TldrawUiComponentsProvider overrides={components}>
88
+ <InternalProviders overrides={overrides}>{children}</InternalProviders>
89
+ </TldrawUiComponentsProvider>
90
+ </BreakPointProvider>
91
+ </TldrawUiA11yProvider>
92
+ </TldrawUiDialogsProvider>
93
+ </TldrawUiToastsProvider>
94
+ </TldrawUiEventsProvider>
95
+ </TldrawUiTranslationProvider>
96
+ </AssetUrlsProvider>
97
+ </TldrawUiTooltipProvider>
95
98
  </MimeTypeContext.Provider>
96
99
  )
97
100
  })
@@ -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
  {
@@ -1266,6 +1269,21 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1266
1269
  },
1267
1270
  checkbox: true,
1268
1271
  },
1272
+ {
1273
+ id: 'toggle-ui-labels',
1274
+ label: {
1275
+ default: 'action.toggle-ui-labels',
1276
+ menu: 'action.toggle-ui-labels.menu',
1277
+ },
1278
+ readonlyOk: true,
1279
+ onSelect(source) {
1280
+ trackEvent('toggle-ui-labels', { source })
1281
+ editor.user.updateUserPreferences({
1282
+ showUiLabels: !editor.user.getShowUiLabels(),
1283
+ })
1284
+ },
1285
+ checkbox: true,
1286
+ },
1269
1287
  {
1270
1288
  id: 'toggle-edge-scrolling',
1271
1289
  label: {
@@ -1740,7 +1758,17 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
1740
1758
  }
1741
1759
 
1742
1760
  return actions
1743
- }, [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
+ ])
1744
1772
 
1745
1773
  return <ActionsContext.Provider value={asActions(actions)}>{children}</ActionsContext.Provider>
1746
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]
@@ -108,6 +108,7 @@ export interface TLUiEventMap {
108
108
  'toggle-lock': null
109
109
  'toggle-reduce-motion': null
110
110
  'toggle-keyboard-shortcuts': null
111
+ 'toggle-ui-labels': null
111
112
  'toggle-edge-scrolling': null
112
113
  'color-scheme': { value: string }
113
114
  'exit-pen-mode': null
@@ -122,10 +123,11 @@ export interface TLUiEventMap {
122
123
  'shrink-shapes': null
123
124
  'flatten-to-image': null
124
125
  'a11y-repeat-shape-announce': null
125
- 'open-url': { url: string }
126
+ 'open-url': { destinationUrl: string }
126
127
  'open-context-menu': null
127
128
  'adjust-shape-styles': null
128
129
  'copy-link': null
130
+ 'drag-tool': { id: string }
129
131
  'image-replace': null
130
132
  'video-replace': null
131
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({