tldraw 3.15.4 → 3.16.0-canary.016d4c2889b7

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 (436) hide show
  1. package/dist-cjs/index.d.ts +264 -10
  2. package/dist-cjs/index.js +32 -2
  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/TldrawCropHandles.js.map +2 -2
  7. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  8. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js +6 -4
  10. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +25 -39
  12. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +16 -4
  14. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  16. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  17. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  18. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  19. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
  20. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  21. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  22. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  24. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  25. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +18 -12
  26. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  27. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  28. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  29. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  30. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  31. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  32. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  33. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  34. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  36. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  37. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  38. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  40. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  42. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  43. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  44. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  45. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  46. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  47. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  48. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  49. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  50. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  51. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  52. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  53. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  54. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +4 -0
  55. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  56. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -15
  57. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  58. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +5 -0
  59. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  60. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  61. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  62. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  63. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  64. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  65. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  66. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  67. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  69. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  70. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  71. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  72. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +46 -6
  73. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
  74. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  75. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  77. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  79. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  80. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  81. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  83. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  84. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  85. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  86. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  87. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  89. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  90. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
  91. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  92. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  93. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  95. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  96. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  97. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  98. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  99. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  100. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  101. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  102. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  103. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  104. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  105. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  106. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  107. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  108. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  109. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  110. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  111. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  112. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -0
  113. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  114. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +30 -7
  115. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  116. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +262 -0
  117. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  118. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  119. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  120. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  122. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  123. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  124. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  125. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  126. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  127. package/dist-cjs/lib/ui/context/actions.js +45 -9
  128. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  129. package/dist-cjs/lib/ui/context/components.js +2 -0
  130. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  131. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  132. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  133. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  134. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  135. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  136. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +8 -0
  137. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  138. package/dist-cjs/lib/ui/kbd-utils.js +11 -4
  139. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  140. package/dist-cjs/lib/ui/version.js +3 -3
  141. package/dist-cjs/lib/ui/version.js.map +1 -1
  142. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +1 -1
  143. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  144. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +3 -2
  145. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  146. package/dist-esm/index.d.mts +264 -10
  147. package/dist-esm/index.mjs +50 -4
  148. package/dist-esm/index.mjs.map +2 -2
  149. package/dist-esm/lib/Tldraw.mjs +14 -4
  150. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  151. package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
  152. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  153. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  154. package/dist-esm/lib/defaultExternalContentHandlers.mjs +6 -4
  155. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  156. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +28 -39
  157. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  158. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +19 -5
  159. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  160. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  161. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  162. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  163. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  164. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
  165. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  166. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  167. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  168. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  169. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  170. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +19 -12
  171. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  172. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  173. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  174. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  175. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  176. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  177. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  178. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  179. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  180. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  181. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  182. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  183. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  184. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  185. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  186. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  187. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  188. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  189. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  190. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  191. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  192. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  193. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  194. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  195. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  196. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  197. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  198. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  199. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +4 -0
  200. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  201. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -15
  202. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  203. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +5 -0
  204. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  205. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  206. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  207. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  208. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  209. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  210. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  211. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  212. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  213. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  214. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  215. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  216. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  217. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +46 -6
  218. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
  219. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  220. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  221. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  222. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  223. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  224. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  225. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  226. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  227. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  228. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  229. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  230. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  231. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  232. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  233. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  234. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  235. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
  236. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  237. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  238. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  239. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  240. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  241. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  242. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  243. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  244. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  245. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  246. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  247. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  248. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  249. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  250. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  251. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  252. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  253. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  254. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  255. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  256. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  257. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +1 -0
  258. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  259. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +30 -7
  260. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  261. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +239 -0
  262. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  263. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  264. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  265. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  266. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  267. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  268. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  269. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  270. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  271. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  272. package/dist-esm/lib/ui/context/actions.mjs +45 -9
  273. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  274. package/dist-esm/lib/ui/context/components.mjs +2 -0
  275. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  276. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  277. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  278. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  279. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  280. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +8 -0
  281. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  282. package/dist-esm/lib/ui/kbd-utils.mjs +11 -4
  283. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  284. package/dist-esm/lib/ui/version.mjs +3 -3
  285. package/dist-esm/lib/ui/version.mjs.map +1 -1
  286. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +1 -1
  287. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  288. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +3 -2
  289. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  290. package/package.json +11 -34
  291. package/src/index.ts +35 -2
  292. package/src/lib/Tldraw.tsx +15 -2
  293. package/src/lib/canvas/TldrawCropHandles.tsx +2 -0
  294. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  295. package/src/lib/defaultExternalContentHandlers.ts +14 -5
  296. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  297. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  298. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +12 -11
  299. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +29 -42
  300. package/src/lib/shapes/arrow/arrowLabel.ts +23 -3
  301. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  302. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  303. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
  304. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  305. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  306. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  307. package/src/lib/shapes/frame/FrameShapeUtil.tsx +29 -14
  308. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  309. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  310. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  311. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  312. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  313. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  314. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  315. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  316. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  317. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  318. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  319. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  320. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  321. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  322. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  323. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  324. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  325. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +4 -0
  326. package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -24
  327. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +7 -0
  328. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  329. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -0
  330. package/src/lib/ui/TldrawUi.tsx +33 -12
  331. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  332. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  333. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  334. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  335. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +38 -6
  336. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  337. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  338. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  339. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  340. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  341. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  342. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  343. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  344. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
  345. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  346. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  347. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  348. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  349. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  350. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +17 -12
  351. package/src/lib/ui/components/menu-items.tsx +8 -0
  352. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  353. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  354. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  355. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +1 -0
  356. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +51 -12
  357. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +325 -0
  358. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  359. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  360. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  361. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  362. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  363. package/src/lib/ui/context/actions.tsx +45 -9
  364. package/src/lib/ui/context/components.tsx +3 -0
  365. package/src/lib/ui/context/events.tsx +5 -3
  366. package/src/lib/ui/hooks/menu-hooks.ts +1 -0
  367. package/src/lib/ui/hooks/useTools.tsx +140 -10
  368. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +8 -0
  369. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +8 -0
  370. package/src/lib/ui/kbd-utils.ts +12 -4
  371. package/src/lib/ui/version.ts +3 -3
  372. package/src/lib/ui.css +409 -292
  373. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +21 -7
  374. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +1 -1
  375. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +28 -7
  376. package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
  377. package/src/test/A11y.test.tsx +3 -2
  378. package/src/test/ClickManager.test.ts +7 -6
  379. package/src/test/Editor.test.tsx +20 -19
  380. package/src/test/EraserTool.test.ts +184 -13
  381. package/src/test/HandTool.test.ts +10 -9
  382. package/src/test/HighlightShape.test.ts +2 -1
  383. package/src/test/SelectTool.test.ts +40 -13
  384. package/src/test/TLUserPreferences.test.ts +4 -3
  385. package/src/test/TestEditor.ts +13 -15
  386. package/src/test/TldrawEditor.test.tsx +11 -10
  387. package/src/test/ZoomTool.test.ts +7 -6
  388. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  389. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  390. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  391. package/src/test/arrows-megabus.test.tsx +17 -10
  392. package/src/test/bindings.test.tsx +24 -37
  393. package/src/test/bookmark-shapes.test.ts +1 -8
  394. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  395. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  396. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  397. package/src/test/commands/alignShapes.test.tsx +25 -24
  398. package/src/test/commands/animationSpeed.test.ts +2 -1
  399. package/src/test/commands/centerOnPoint.test.ts +3 -2
  400. package/src/test/commands/clipboard.test.ts +3 -2
  401. package/src/test/commands/createShapes.test.ts +2 -1
  402. package/src/test/commands/deletePage.test.ts +84 -1
  403. package/src/test/commands/deleteShapes.test.ts +2 -1
  404. package/src/test/commands/distributeShapes.test.tsx +11 -10
  405. package/src/test/commands/getSvgString.test.ts +2 -1
  406. package/src/test/commands/packShapes.test.ts +5 -4
  407. package/src/test/commands/resizeShape.test.ts +2 -1
  408. package/src/test/commands/rotateShapes.test.ts +7 -6
  409. package/src/test/commands/setCamera.test.ts +4 -3
  410. package/src/test/commands/setCurrentPage.test.ts +3 -2
  411. package/src/test/commands/stackShapes.test.ts +11 -10
  412. package/src/test/commands/stretch.test.tsx +13 -12
  413. package/src/test/createDeepLink.test.tsx +2 -1
  414. package/src/test/cropping.test.ts +3 -2
  415. package/src/test/custom-clipping.test.ts +436 -0
  416. package/src/test/drawing.test.ts +2 -1
  417. package/src/test/flipShapes.test.ts +4 -3
  418. package/src/test/frames.test.ts +25 -24
  419. package/src/test/getCulledShapes.test.tsx +3 -2
  420. package/src/test/groups.test.tsx +1 -1
  421. package/src/test/handleDeepLink.test.tsx +2 -1
  422. package/src/test/inner-outer-margin.test.ts +315 -0
  423. package/src/test/maxShapes.test.ts +3 -2
  424. package/src/test/modifiers.test.ts +5 -4
  425. package/src/test/navigation.test.ts +12 -11
  426. package/src/test/panning.test.ts +2 -1
  427. package/src/test/perf/perf.test.ts +2 -1
  428. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  429. package/src/test/resizing.test.ts +39 -38
  430. package/src/test/select.test.tsx +4 -3
  431. package/src/test/selection-omnibus.test.ts +11 -10
  432. package/src/test/shapeutils.test.ts +4 -3
  433. package/src/test/translating.test.ts +9 -8
  434. package/tldraw.css +714 -603
  435. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  436. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
@@ -1,4 +1,5 @@
1
1
  import {
2
+ isAccelKey,
2
3
  StateNode,
3
4
  TLFrameShape,
4
5
  TLGroupShape,
@@ -9,7 +10,11 @@ import {
9
10
  export class Pointing extends StateNode {
10
11
  static override id = 'pointing'
11
12
 
13
+ _isHoldingAccelKey = false
14
+
12
15
  override onEnter() {
16
+ this._isHoldingAccelKey = isAccelKey(this.editor.inputs)
17
+
13
18
  const zoomLevel = this.editor.getZoomLevel()
14
19
  const currentPageShapesSorted = this.editor.getCurrentPageRenderingShapesSorted()
15
20
  const {
@@ -45,12 +50,25 @@ export class Pointing extends StateNode {
45
50
  }
46
51
 
47
52
  erasing.add(hitShape.id)
53
+
54
+ // If the user is holding the meta / ctrl key, stop after the first shape
55
+ if (this._isHoldingAccelKey) {
56
+ break
57
+ }
48
58
  }
49
59
  }
50
60
 
51
61
  this.editor.setErasingShapes([...erasing])
52
62
  }
53
63
 
64
+ override onKeyUp() {
65
+ this._isHoldingAccelKey = isAccelKey(this.editor.inputs)
66
+ }
67
+
68
+ override onKeyDown() {
69
+ this._isHoldingAccelKey = isAccelKey(this.editor.inputs)
70
+ }
71
+
54
72
  override onLongPress(info: TLPointerEventInfo) {
55
73
  this.startErasing(info)
56
74
  }
@@ -62,6 +80,8 @@ export class Pointing extends StateNode {
62
80
  }
63
81
 
64
82
  override onPointerMove(info: TLPointerEventInfo) {
83
+ if (this._isHoldingAccelKey) return
84
+
65
85
  if (this.editor.inputs.isDragging) {
66
86
  this.startErasing(info)
67
87
  }
@@ -120,6 +120,7 @@ export class DraggingHandle extends StateNode {
120
120
  const handleDragInfo = {
121
121
  handle: this.initialHandle,
122
122
  isPrecise: this.isPrecise,
123
+ isCreatingShape: !!this.info.isCreating,
123
124
  initial: shape,
124
125
  }
125
126
  const util = this.editor.getShapeUtil(shape)
@@ -204,6 +205,7 @@ export class DraggingHandle extends StateNode {
204
205
  const handleDragInfo = {
205
206
  handle: this.initialHandle,
206
207
  isPrecise: this.isPrecise,
208
+ isCreatingShape: !!this.info.isCreating,
207
209
  initial: this.info.shape,
208
210
  }
209
211
  const endChanges = util.onHandleDragEnd?.(shape, handleDragInfo)
@@ -231,6 +233,7 @@ export class DraggingHandle extends StateNode {
231
233
  const handleDragInfo = {
232
234
  handle: this.initialHandle,
233
235
  isPrecise: this.isPrecise,
236
+ isCreatingShape: !!this.info.isCreating,
234
237
  initial: this.info.shape,
235
238
  }
236
239
  util.onHandleDragCancel?.(shape, handleDragInfo)
@@ -304,6 +307,7 @@ export class DraggingHandle extends StateNode {
304
307
  const changes = util.onHandleDrag?.(shape, {
305
308
  handle: nextHandle,
306
309
  isPrecise: this.isPrecise || altKey,
310
+ isCreatingShape: !!this.info.isCreating,
307
311
  initial: initial,
308
312
  })
309
313
 
@@ -1,9 +1,7 @@
1
1
  import {
2
2
  Editor,
3
- Group2d,
4
3
  StateNode,
5
4
  TLAdjacentDirection,
6
- TLArrowShape,
7
5
  TLClickEventInfo,
8
6
  TLGroupShape,
9
7
  TLKeyboardEventInfo,
@@ -18,6 +16,7 @@ import {
18
16
  pointInPolygon,
19
17
  toRichText,
20
18
  } from '@tldraw/editor'
19
+ import { isOverArrowLabel } from '../../../shapes/arrow/arrowLabel'
21
20
  import { getHitShapeOnCanvasPointerDown } from '../../selection-logic/getHitShapeOnCanvasPointerDown'
22
21
  import { getShouldEnterCropMode } from '../../selection-logic/getShouldEnterCropModeOnPointerDown'
23
22
  import { selectOnCanvasPointerUp } from '../../selection-logic/selectOnCanvasPointerUp'
@@ -98,12 +97,6 @@ export class Idle extends StateNode {
98
97
  case 'shape': {
99
98
  const { shape } = info
100
99
 
101
- if (this.isOverArrowLabelTest(shape)) {
102
- // We're moving the label on a shape.
103
- this.parent.transition('pointing_arrow_label', info)
104
- break
105
- }
106
-
107
100
  if (this.editor.isShapeOrAncestorLocked(shape)) {
108
101
  this.parent.transition('pointing_canvas', info)
109
102
  break
@@ -595,22 +588,7 @@ export class Idle extends StateNode {
595
588
  isOverArrowLabelTest(shape: TLShape | undefined) {
596
589
  if (!shape) return false
597
590
 
598
- // todo: Extract into general hit test for arrows
599
- if (this.editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {
600
- const pointInShapeSpace = this.editor.getPointInShapeSpace(
601
- shape,
602
- this.editor.inputs.currentPagePoint
603
- )
604
- // How should we handle multiple labels? Do shapes ever have multiple labels?
605
- const labelGeometry = this.editor.getShapeGeometry<Group2d>(shape).children[1]
606
- // Knowing what we know about arrows... if the shape has no text in its label,
607
- // then the label geometry should not be there.
608
- if (labelGeometry && pointInPolygon(pointInShapeSpace, labelGeometry.vertices)) {
609
- return true
610
- }
611
- }
612
-
613
- return false
591
+ return isOverArrowLabel(this.editor, shape)
614
592
  }
615
593
 
616
594
  handleDoubleClickOnCanvas(info: TLClickEventInfo) {
@@ -1,4 +1,5 @@
1
1
  import { StateNode, TLPointerEventInfo, TLShape } from '@tldraw/editor'
2
+ import { isOverArrowLabel } from '../../../shapes/arrow/arrowLabel'
2
3
  import { getTextLabels } from '../../../utils/shapes/shapes'
3
4
 
4
5
  export class PointingShape extends StateNode {
@@ -210,6 +211,12 @@ export class PointingShape extends StateNode {
210
211
 
211
212
  override onPointerMove(info: TLPointerEventInfo) {
212
213
  if (this.editor.inputs.isDragging) {
214
+ if (isOverArrowLabel(this.editor, this.hitShape)) {
215
+ // We're moving the label on a shape.
216
+ this.parent.transition('pointing_arrow_label', { ...info, shape: this.hitShape })
217
+ return
218
+ }
219
+
213
220
  if (this.didCtrlOnEnter) {
214
221
  this.parent.transition('brushing', info)
215
222
  } else {
@@ -28,7 +28,6 @@ export type TranslatingInfo = TLPointerEventInfo & {
28
28
  isCreating?: boolean
29
29
  creatingMarkId?: string
30
30
  onCreate?(): void
31
- didStartInPit?: boolean
32
31
  onInteractionEnd?: string
33
32
  }
34
33
 
@@ -1,5 +1,6 @@
1
1
  import { Editor, TLShape } from '@tldraw/editor'
2
2
 
3
+ /** @public */
3
4
  export function getHitShapeOnCanvasPointerDown(
4
5
  editor: Editor,
5
6
  hitLabels = false
@@ -1,12 +1,11 @@
1
1
  import { tlenv, useEditor, useReactor, useValue } from '@tldraw/editor'
2
2
  import classNames from 'classnames'
3
- import React, { ReactNode, useRef, useState } from 'react'
3
+ import React, { ReactNode, useMemo, useRef, useState } from 'react'
4
4
  import { TLUiAssetUrlOverrides } from './assetUrls'
5
5
  import { SkipToMainContent } from './components/A11y'
6
- import { FollowingIndicator } from './components/FollowingIndicator'
7
6
  import { TldrawUiButton } from './components/primitives/Button/TldrawUiButton'
8
7
  import { TldrawUiButtonIcon } from './components/primitives/Button/TldrawUiButtonIcon'
9
- import { PORTRAIT_BREAKPOINT } from './constants'
8
+ import { PORTRAIT_BREAKPOINT, PORTRAIT_BREAKPOINTS } from './constants'
10
9
  import {
11
10
  TLUiContextProviderProps,
12
11
  TldrawUiContextProvider,
@@ -108,10 +107,6 @@ const TldrawUiContent = React.memo(function TldrawUI() {
108
107
  NavigationPanel,
109
108
  HelperButtons,
110
109
  DebugPanel,
111
- CursorChatBubble,
112
- RichTextToolbar,
113
- ImageToolbar,
114
- VideoToolbar,
115
110
  Toasts,
116
111
  Dialogs,
117
112
  A11y,
@@ -160,6 +155,19 @@ const TldrawUiContent = React.memo(function TldrawUI() {
160
155
 
161
156
  const { 'toggle-focus-mode': toggleFocus } = useActions()
162
157
 
158
+ const { breakpointsAbove, breakpointsBelow } = useMemo(() => {
159
+ const breakpointsAbove = []
160
+ const breakpointsBelow = []
161
+ for (let bp = 0; bp < PORTRAIT_BREAKPOINTS.length; bp++) {
162
+ if (bp <= breakpoint) {
163
+ breakpointsAbove.push(bp)
164
+ } else {
165
+ breakpointsBelow.push(bp)
166
+ }
167
+ }
168
+ return { breakpointsAbove, breakpointsBelow }
169
+ }, [breakpoint])
170
+
163
171
  return (
164
172
  <div
165
173
  className={classNames('tlui-layout', {
@@ -169,6 +177,8 @@ const TldrawUiContent = React.memo(function TldrawUI() {
169
177
  // But when the virtual keyboard is closing we want to wait a bit before showing it again.
170
178
  data-iseditinganything={hideToolbarWhileEditing}
171
179
  data-breakpoint={breakpoint}
180
+ data-breakpoints-above={breakpointsAbove.join(' ')}
181
+ data-breakpoints-below={breakpointsBelow.join(' ')}
172
182
  >
173
183
  <SkipToMainContent />
174
184
  {isFocusMode ? (
@@ -208,13 +218,24 @@ const TldrawUiContent = React.memo(function TldrawUI() {
208
218
  </div>
209
219
  </>
210
220
  )}
211
- {RichTextToolbar && <RichTextToolbar />}
212
- {ImageToolbar && <ImageToolbar />}
213
- {VideoToolbar && <VideoToolbar />}
214
221
  {Toasts && <Toasts />}
215
222
  {Dialogs && <Dialogs />}
216
- <FollowingIndicator />
217
- {CursorChatBubble && <CursorChatBubble />}
218
223
  </div>
219
224
  )
220
225
  })
226
+
227
+ /** @public @react */
228
+ export function TldrawUiInFrontOfTheCanvas() {
229
+ const { RichTextToolbar, ImageToolbar, VideoToolbar, CursorChatBubble, FollowingIndicator } =
230
+ useTldrawUiComponents()
231
+
232
+ return (
233
+ <>
234
+ {RichTextToolbar && <RichTextToolbar />}
235
+ {ImageToolbar && <ImageToolbar />}
236
+ {VideoToolbar && <VideoToolbar />}
237
+ {FollowingIndicator && <FollowingIndicator />}
238
+ {CursorChatBubble && <CursorChatBubble />}
239
+ </>
240
+ )
241
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ ToggleKeyboardShortcutsItem,
3
+ ToggleReduceMotionItem,
4
+ ToggleUiLabelsItem,
5
+ } from './menu-items'
6
+ import { TldrawUiMenuGroup } from './primitives/menus/TldrawUiMenuGroup'
7
+ import { TldrawUiMenuSubmenu } from './primitives/menus/TldrawUiMenuSubmenu'
8
+
9
+ /** @public @react */
10
+ export function AccessibilityMenu() {
11
+ return (
12
+ <TldrawUiMenuSubmenu id="help menu accessibility" label="menu.accessibility">
13
+ <TldrawUiMenuGroup id="accessibility">
14
+ <ToggleReduceMotionItem />
15
+ <ToggleKeyboardShortcutsItem />
16
+ <ToggleUiLabelsItem />
17
+ </TldrawUiMenuGroup>
18
+ </TldrawUiMenuSubmenu>
19
+ )
20
+ }
@@ -11,6 +11,7 @@ import {
11
11
  TldrawUiPopoverTrigger,
12
12
  } from '../primitives/TldrawUiPopover'
13
13
  import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
14
+ import { useTldrawUiOrientation } from '../primitives/layout'
14
15
  import { TldrawUiMenuContextProvider } from '../primitives/menus/TldrawUiMenuContext'
15
16
  import { DefaultActionsMenuContent } from './DefaultActionsMenuContent'
16
17
 
@@ -26,6 +27,7 @@ export const DefaultActionsMenu = memo(function DefaultActionsMenu({
26
27
  const msg = useTranslation()
27
28
  const breakpoint = useBreakpoint()
28
29
  const isReadonlyMode = useReadonly()
30
+ const { orientation } = useTldrawUiOrientation()
29
31
 
30
32
  const ref = useRef<HTMLDivElement>(null)
31
33
  usePassThroughWheelEvents(ref)
@@ -52,18 +54,28 @@ export const DefaultActionsMenu = memo(function DefaultActionsMenu({
52
54
  data-testid="actions-menu.button"
53
55
  title={msg('actions-menu.title')}
54
56
  >
55
- <TldrawUiButtonIcon icon="dots-vertical" small />
57
+ <TldrawUiButtonIcon
58
+ icon={orientation === 'horizontal' ? 'dots-vertical' : 'dots-horizontal'}
59
+ small
60
+ />
56
61
  </TldrawUiToolbarButton>
57
62
  </TldrawUiPopoverTrigger>
58
63
  <TldrawUiPopoverContent
59
- side={breakpoint >= PORTRAIT_BREAKPOINT.TABLET ? 'bottom' : 'top'}
64
+ side={
65
+ orientation === 'horizontal'
66
+ ? breakpoint >= PORTRAIT_BREAKPOINT.TABLET
67
+ ? 'bottom'
68
+ : 'top'
69
+ : 'right'
70
+ }
60
71
  sideOffset={6}
61
72
  >
62
73
  <TldrawUiToolbar
63
74
  ref={ref}
64
75
  label={msg('actions-menu.title')}
65
- className="tlui-actions-menu tlui-buttons__grid"
76
+ className="tlui-actions-menu"
66
77
  data-testid="actions-menu.content"
78
+ orientation="grid"
67
79
  >
68
80
  <TldrawUiMenuContextProvider type="icons" sourceId="actions-menu">
69
81
  {content}
@@ -1,6 +1,7 @@
1
1
  import { useEditor, usePresence, useValue } from '@tldraw/editor'
2
2
 
3
- export function FollowingIndicator() {
3
+ /** @public @react */
4
+ export function DefaultFollowingIndicator() {
4
5
  const editor = useEditor()
5
6
  const followingUserId = useValue('follow', () => editor.getInstanceState().followingUserId, [
6
7
  editor,
@@ -5,6 +5,7 @@ import { useBreakpoint } from '../context/breakpoints'
5
5
  import { useTldrawUiComponents } from '../context/components'
6
6
  import { useTranslation } from '../hooks/useTranslation/useTranslation'
7
7
  import { TldrawUiToolbar } from './primitives/TldrawUiToolbar'
8
+ import { TldrawUiRow } from './primitives/layout'
8
9
 
9
10
  /** @public @react */
10
11
  export const DefaultMenuPanel = memo(function MenuPanel() {
@@ -32,16 +33,16 @@ export const DefaultMenuPanel = memo(function MenuPanel() {
32
33
 
33
34
  return (
34
35
  <nav ref={ref} className="tlui-menu-zone">
35
- <div className="tlui-buttons__horizontal">
36
+ <TldrawUiRow>
36
37
  {MainMenu && <MainMenu />}
37
38
  {PageMenu && !isSinglePageMode && <PageMenu />}
38
39
  {showQuickActions ? (
39
- <TldrawUiToolbar className="tlui-buttons__horizontal" label={msg('actions-menu.title')}>
40
+ <TldrawUiToolbar orientation="horizontal" label={msg('actions-menu.title')}>
40
41
  {QuickActions && <QuickActions />}
41
42
  {ActionsMenu && <ActionsMenu />}
42
43
  </TldrawUiToolbar>
43
44
  ) : null}
44
- </div>
45
+ </TldrawUiRow>
45
46
  </nav>
46
47
  )
47
48
  })
@@ -123,7 +123,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
123
123
  <TldrawUiMenuItem
124
124
  id="text-header"
125
125
  label="tool.rich-text-header"
126
- kbd="cmd+shift+[[1-6]]"
126
+ kbd="cmd+alt+[[1-6]]"
127
127
  onSelect={() => {
128
128
  /* do nothing */
129
129
  }}
@@ -157,7 +157,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
157
157
  <TldrawUiMenuItem
158
158
  id="a11y-select-next-shape-direction"
159
159
  label="a11y.select-shape-direction"
160
- kbd="cmd+↑→↓←"
160
+ kbd="cmd+[[↑→↓←]]"
161
161
  onSelect={() => {
162
162
  /* do nothing */
163
163
  }}
@@ -165,7 +165,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
165
165
  <TldrawUiMenuItem
166
166
  id="a11y-select-next-shape-container"
167
167
  label="a11y.enter-leave-container"
168
- kbd="cmd+shift+↑→"
168
+ kbd="cmd+shift+[[↑→]]"
169
169
  onSelect={() => {
170
170
  /* do nothing */
171
171
  }}
@@ -173,7 +173,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
173
173
  <TldrawUiMenuItem
174
174
  id="a11y-pan-camera"
175
175
  label="a11y.pan-camera"
176
- kbd="[[Space]]+↑→↓←"
176
+ kbd="[[Space]]+[[↑→↓←]]"
177
177
  onSelect={() => {
178
178
  /* do nothing */
179
179
  }}
@@ -197,7 +197,7 @@ export function DefaultKeyboardShortcutsDialogContent() {
197
197
  <TldrawUiMenuItem
198
198
  id="a11y-move-shape"
199
199
  label="a11y.move-shape"
200
- kbd="↑→↓←"
200
+ kbd="[[↑→↓←]]"
201
201
  onSelect={() => {
202
202
  /* do nothing */
203
203
  }}
@@ -205,7 +205,39 @@ export function DefaultKeyboardShortcutsDialogContent() {
205
205
  <TldrawUiMenuItem
206
206
  id="a11y-move-shape-faster"
207
207
  label="a11y.move-shape-faster"
208
- kbd="shift+↑→↓←"
208
+ kbd="shift+[[↑→↓←]]"
209
+ onSelect={() => {
210
+ /* do nothing */
211
+ }}
212
+ />
213
+ <TldrawUiMenuItem
214
+ id="a11y-rotate-shape-cw"
215
+ label="a11y.rotate-shape-cw"
216
+ kbd="shift+﹥"
217
+ onSelect={() => {
218
+ /* do nothing */
219
+ }}
220
+ />
221
+ <TldrawUiMenuItem
222
+ id="a11y-rotate-shape-cw-fine"
223
+ label="a11y.rotate-shape-cw-fine"
224
+ kbd="shift+alt+﹥"
225
+ onSelect={() => {
226
+ /* do nothing */
227
+ }}
228
+ />
229
+ <TldrawUiMenuItem
230
+ id="a11y-rotate-shape-ccw"
231
+ label="a11y.rotate-shape-ccw"
232
+ kbd="shift+﹤"
233
+ onSelect={() => {
234
+ /* do nothing */
235
+ }}
236
+ />
237
+ <TldrawUiMenuItem
238
+ id="a11y-rotate-shape-ccw-fine"
239
+ label="a11y.rotate-shape-ccw-fine"
240
+ kbd="shift+alt+﹤"
209
241
  onSelect={() => {
210
242
  /* do nothing */
211
243
  }}
@@ -1,4 +1,5 @@
1
1
  import { useCanRedo, useCanUndo } from '../../hooks/menu-hooks'
2
+ import { AccessibilityMenu } from '../AccessibilityMenu'
2
3
  import { ColorSchemeMenu } from '../ColorSchemeMenu'
3
4
  import { KeyboardShortcutsMenuItem } from '../HelpMenu/DefaultHelpMenuContent'
4
5
  import { LanguageMenu } from '../LanguageMenu'
@@ -19,10 +20,8 @@ import {
19
20
  ToggleEdgeScrollingItem,
20
21
  ToggleFocusModeItem,
21
22
  ToggleGridItem,
22
- ToggleKeyboardShortcutsItem,
23
23
  ToggleLockMenuItem,
24
24
  TogglePasteAtCursorItem,
25
- ToggleReduceMotionItem,
26
25
  ToggleSnapModeItem,
27
26
  ToggleToolLockItem,
28
27
  ToggleTransparentBgMenuItem,
@@ -161,8 +160,6 @@ export function PreferencesGroup() {
161
160
  <ToggleWrapModeItem />
162
161
  <ToggleFocusModeItem />
163
162
  <ToggleEdgeScrollingItem />
164
- <ToggleReduceMotionItem />
165
- <ToggleKeyboardShortcutsItem />
166
163
  <ToggleDynamicSizeModeItem />
167
164
  <TogglePasteAtCursorItem />
168
165
  <ToggleDebugModeItem />
@@ -170,6 +167,9 @@ export function PreferencesGroup() {
170
167
  <TldrawUiMenuGroup id="color-scheme">
171
168
  <ColorSchemeMenu />
172
169
  </TldrawUiMenuGroup>
170
+ <TldrawUiMenuGroup id="accessibility-menu">
171
+ <AccessibilityMenu />
172
+ </TldrawUiMenuGroup>
173
173
  </TldrawUiMenuSubmenu>
174
174
  <LanguageMenu />
175
175
  <KeyboardShortcutsMenuItem />
@@ -46,10 +46,10 @@ export class MinimapManager {
46
46
  const style = getComputedStyle(this.editor.getContainer())
47
47
 
48
48
  return {
49
- shapeFill: getRgba(style.getPropertyValue('--color-text-3').trim()),
50
- selectFill: getRgba(style.getPropertyValue('--color-selected').trim()),
51
- viewportFill: getRgba(style.getPropertyValue('--color-muted-1').trim()),
52
- background: getRgba(style.getPropertyValue('--color-low').trim()),
49
+ shapeFill: getRgba(style.getPropertyValue('--tl-color-text-3').trim()),
50
+ selectFill: getRgba(style.getPropertyValue('--tl-color-selected').trim()),
51
+ viewportFill: getRgba(style.getPropertyValue('--tl-color-muted-1').trim()),
52
+ background: getRgba(style.getPropertyValue('--tl-color-low').trim()),
53
53
  }
54
54
  }
55
55
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  DefaultColorStyle,
3
3
  TLDefaultColorStyle,
4
+ getColorValue,
4
5
  getDefaultColorTheme,
5
6
  useEditor,
6
7
  useValue,
@@ -16,18 +17,20 @@ import {
16
17
  TldrawUiPopoverContent,
17
18
  TldrawUiPopoverTrigger,
18
19
  } from './primitives/TldrawUiPopover'
20
+ import { useTldrawUiOrientation } from './primitives/layout'
19
21
 
20
22
  /** @public @react */
21
23
  export function MobileStylePanel() {
22
24
  const editor = useEditor()
23
25
  const msg = useTranslation()
24
-
26
+ const { orientation } = useTldrawUiOrientation()
25
27
  const relevantStyles = useRelevantStyles()
26
28
  const color = relevantStyles?.get(DefaultColorStyle)
27
29
  const theme = getDefaultColorTheme({ isDarkMode: editor.user.getIsDarkMode() })
28
- const currentColor = (
29
- color?.type === 'shared' ? theme[color.value as TLDefaultColorStyle] : theme.black
30
- ).solid
30
+ const currentColor =
31
+ color?.type === 'shared'
32
+ ? getColorValue(theme, color.value as TLDefaultColorStyle, 'solid')
33
+ : getColorValue(theme, 'black', 'solid')
31
34
 
32
35
  const disableStylePanel = useValue(
33
36
  'disable style panel',
@@ -54,7 +57,7 @@ export function MobileStylePanel() {
54
57
  type="tool"
55
58
  data-testid="mobile-styles.button"
56
59
  style={{
57
- color: disableStylePanel ? 'var(--color-muted-1)' : currentColor,
60
+ color: disableStylePanel ? 'var(--tl-color-muted-1)' : currentColor,
58
61
  }}
59
62
  title={msg('style-panel.title')}
60
63
  disabled={disableStylePanel}
@@ -64,7 +67,7 @@ export function MobileStylePanel() {
64
67
  />
65
68
  </TldrawUiButton>
66
69
  </TldrawUiPopoverTrigger>
67
- <TldrawUiPopoverContent side="top" align="end">
70
+ <TldrawUiPopoverContent side={orientation === 'horizontal' ? 'top' : 'right'} align="end">
68
71
  {StylePanel && <StylePanel isMobile />}
69
72
  </TldrawUiPopoverContent>
70
73
  </TldrawUiPopover>
@@ -33,7 +33,7 @@ export const DefaultNavigationPanel = memo(function DefaultNavigationPanel() {
33
33
 
34
34
  return (
35
35
  <div ref={ref} className="tlui-navigation-panel">
36
- <TldrawUiToolbar className="tlui-buttons__horizontal" label={msg('navigation-zone.title')}>
36
+ <TldrawUiToolbar orientation="horizontal" label={msg('navigation-zone.title')}>
37
37
  {ZoomMenu && breakpoint < PORTRAIT_BREAKPOINT.TABLET ? (
38
38
  <ZoomMenu />
39
39
  ) : (
@@ -24,6 +24,7 @@ import {
24
24
  TldrawUiPopoverContent,
25
25
  TldrawUiPopoverTrigger,
26
26
  } from '../primitives/TldrawUiPopover'
27
+ import { TldrawUiRow } from '../primitives/layout'
27
28
  import { PageItemInput } from './PageItemInput'
28
29
  import { PageItemSubmenu } from './PageItemSubmenu'
29
30
  import { onMovePage } from './edit-pages-shared'
@@ -329,7 +330,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
329
330
  <div className="tlui-page-menu__header">
330
331
  <div className="tlui-page-menu__header__title">{msg('page-menu.title')}</div>
331
332
  {!isReadonlyMode && (
332
- <div className="tlui-buttons__horizontal">
333
+ <TldrawUiRow>
333
334
  <TldrawUiButton
334
335
  type="icon"
335
336
  data-testid="page-menu.edit"
@@ -351,7 +352,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
351
352
  >
352
353
  <TldrawUiButtonIcon icon="plus" />
353
354
  </TldrawUiButton>
354
- </div>
355
+ </TldrawUiRow>
355
356
  )}
356
357
  </div>
357
358
  <div
@@ -5,6 +5,7 @@ import { useTranslation } from '../../hooks/useTranslation/useTranslation'
5
5
  import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
6
6
  import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
7
7
  import { TldrawUiIcon } from '../primitives/TldrawUiIcon'
8
+ import { TldrawUiRow } from '../primitives/layout'
8
9
 
9
10
  export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId: string }) {
10
11
  const editor = useEditor()
@@ -29,8 +30,8 @@ export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId
29
30
  if (!presence) return null
30
31
 
31
32
  return (
32
- <div
33
- className="tlui-people-menu__item tlui-buttons__horizontal"
33
+ <TldrawUiRow
34
+ className="tlui-people-menu__item"
34
35
  data-follow={youAreFollowingThem || theyAreFollowingYou}
35
36
  >
36
37
  <TldrawUiButton
@@ -61,6 +62,6 @@ export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId
61
62
  icon={theyAreFollowingYou ? 'leading' : youAreFollowingThem ? 'following' : 'follow'}
62
63
  />
63
64
  </TldrawUiButton>
64
- </div>
65
+ </TldrawUiRow>
65
66
  )
66
67
  })
@@ -5,6 +5,7 @@ import { useUiEvents } from '../../context/events'
5
5
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
6
6
  import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
7
7
  import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
8
+ import { TldrawUiGrid } from '../primitives/layout'
8
9
 
9
10
  export const UserPresenceColorPicker = track(function UserPresenceColorPicker() {
10
11
  const editor = useEditor()
@@ -100,7 +101,7 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
100
101
  side="left"
101
102
  sideOffset={8}
102
103
  >
103
- <div className={'tlui-buttons__grid'}>
104
+ <TldrawUiGrid>
104
105
  {USER_COLORS.map((item: string) => (
105
106
  <TldrawUiButton
106
107
  type="icon"
@@ -110,7 +111,6 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
110
111
  aria-label={item}
111
112
  isActive={value === item}
112
113
  title={item}
113
- className={'tlui-button-grid__button'}
114
114
  style={{ color: item }}
115
115
  onPointerEnter={handleButtonPointerEnter}
116
116
  onPointerDown={handleButtonPointerDown}
@@ -120,7 +120,7 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
120
120
  <TldrawUiButtonIcon icon="color" />
121
121
  </TldrawUiButton>
122
122
  ))}
123
- </div>
123
+ </TldrawUiGrid>
124
124
  </_Popover.Content>
125
125
  </_Popover.Portal>
126
126
  </_Popover.Root>
@@ -1,4 +1,4 @@
1
- import { useEditor, usePassThroughWheelEvents } from '@tldraw/editor'
1
+ import { useEditor, usePassThroughWheelEvents, useValue } from '@tldraw/editor'
2
2
  import classNames from 'classnames'
3
3
  import { ReactNode, memo, useCallback, useEffect, useRef } from 'react'
4
4
  import { useRelevantStyles } from '../../hooks/useRelevantStyles'
@@ -16,6 +16,7 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
16
16
  children,
17
17
  }: TLUiStylePanelProps) {
18
18
  const editor = useEditor()
19
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
19
20
 
20
21
  const ref = useRef<HTMLDivElement>(null)
21
22
  usePassThroughWheelEvents(ref)
@@ -50,6 +51,7 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
50
51
  ref={ref}
51
52
  className={classNames('tlui-style-panel', { 'tlui-style-panel__wrapper': !isMobile })}
52
53
  data-ismobile={isMobile}
54
+ data-show-ui-labels={showUiLabels}
53
55
  onPointerLeave={handlePointerOut}
54
56
  >
55
57
  {content}