tldraw 3.16.0-canary.fa3749606e52 → 3.16.0-next.282b7be564ae

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 (275) hide show
  1. package/dist-cjs/index.d.ts +100 -5
  2. package/dist-cjs/index.js +13 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  9. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  11. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  12. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  13. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  14. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  15. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  16. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
  17. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  18. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  19. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  20. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  21. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  23. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  24. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  25. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
  27. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
  28. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  29. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  31. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  33. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  34. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  35. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  36. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  37. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  38. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  39. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  40. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  41. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  42. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  43. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  44. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  45. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  46. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  47. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  48. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  49. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  50. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  51. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  52. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  53. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  54. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  55. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  57. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  58. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  59. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  61. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  63. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
  65. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  67. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  69. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  70. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  71. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  72. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  73. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  74. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  75. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  76. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  77. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  79. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  80. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  81. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  82. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  83. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  84. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  85. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  86. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +30 -7
  87. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +268 -0
  89. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  90. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  91. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  92. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  93. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  94. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +11 -26
  96. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  97. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  98. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  99. package/dist-cjs/lib/ui/context/actions.js +15 -0
  100. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  101. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  102. package/dist-cjs/lib/ui/hooks/useTools.js +21 -3
  103. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  104. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  105. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +3 -0
  106. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  107. package/dist-cjs/lib/ui/version.js +3 -3
  108. package/dist-cjs/lib/ui/version.js.map +1 -1
  109. package/dist-esm/index.d.mts +100 -5
  110. package/dist-esm/index.mjs +23 -1
  111. package/dist-esm/index.mjs.map +2 -2
  112. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  113. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  114. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  115. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  116. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  117. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  118. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  119. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  120. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  121. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  122. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  123. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  124. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  125. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  126. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  127. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  128. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  129. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  130. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  131. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  132. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  133. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  134. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  135. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  136. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  137. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  138. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  139. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  140. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  141. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  142. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  143. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  144. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  145. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  146. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  147. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  148. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  149. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  150. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  151. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  152. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  153. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  154. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  155. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  156. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  157. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  158. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  159. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  160. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  161. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  162. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  163. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  164. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  165. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  166. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  167. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  168. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  169. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  170. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  171. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  172. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
  173. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  174. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  175. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  176. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  177. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  178. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  179. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  180. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  181. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  182. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  183. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  184. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  185. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  186. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  187. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  188. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  189. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  190. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  191. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  192. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  193. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  194. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +30 -7
  195. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  196. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +245 -0
  197. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  198. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  199. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  200. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  201. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  202. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  203. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +11 -26
  204. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  205. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  206. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  207. package/dist-esm/lib/ui/context/actions.mjs +15 -0
  208. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  209. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  210. package/dist-esm/lib/ui/hooks/useTools.mjs +22 -3
  211. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  212. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +3 -0
  213. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  214. package/dist-esm/lib/ui/version.mjs +3 -3
  215. package/dist-esm/lib/ui/version.mjs.map +1 -1
  216. package/package.json +3 -3
  217. package/src/index.ts +18 -0
  218. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  219. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  220. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  221. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  222. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  223. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  224. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  225. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  226. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  227. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  228. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  229. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  230. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  231. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  232. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  233. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  234. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  235. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  236. package/src/lib/ui/TldrawUi.tsx +17 -2
  237. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  238. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  239. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  240. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  241. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  242. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  243. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  244. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  245. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  246. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  247. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  248. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
  249. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  250. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  251. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  252. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  253. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  254. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +14 -11
  255. package/src/lib/ui/components/menu-items.tsx +8 -0
  256. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  257. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  258. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  259. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +51 -12
  260. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +327 -0
  261. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  262. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  263. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  264. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +15 -25
  265. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  266. package/src/lib/ui/context/actions.tsx +15 -0
  267. package/src/lib/ui/context/events.tsx +1 -0
  268. package/src/lib/ui/hooks/useTools.tsx +25 -3
  269. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +3 -0
  270. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +3 -0
  271. package/src/lib/ui/version.ts +3 -3
  272. package/src/lib/ui.css +406 -292
  273. package/src/test/arrows-megabus.test.tsx +12 -6
  274. package/src/test/inner-outer-margin.test.ts +315 -0
  275. package/tldraw.css +699 -580
@@ -35,6 +35,11 @@ import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiTo
35
35
  import { DoubleDropdownPicker } from './DoubleDropdownPicker'
36
36
  import { DropdownPicker } from './DropdownPicker'
37
37
 
38
+ // Local component for style panel subheadings
39
+ function StylePanelSubheading({ children }: { children: React.ReactNode }) {
40
+ return <h3 className="tlui-style-panel__subheading">{children}</h3>
41
+ }
42
+
38
43
  /** @public */
39
44
  export interface TLUiStylePanelContentProps {
40
45
  styles: ReturnType<typeof useRelevantStyles>
@@ -115,6 +120,7 @@ export function CommonStylePickerSet({ styles, theme }: ThemeStylePickerSetProps
115
120
  const editor = useEditor()
116
121
 
117
122
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
123
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
118
124
 
119
125
  const handleValueChange = useStyleChangeCallback()
120
126
 
@@ -129,70 +135,90 @@ export function CommonStylePickerSet({ styles, theme }: ThemeStylePickerSetProps
129
135
  <>
130
136
  <div className="tlui-style-panel__section__common" data-testid="style.panel">
131
137
  {color === undefined ? null : (
132
- <TldrawUiToolbar label={msg('style-panel.color')}>
133
- <TldrawUiButtonPicker
134
- title={msg('style-panel.color')}
135
- uiType="color"
136
- style={DefaultColorStyle}
137
- items={STYLES.color}
138
- value={color}
139
- onValueChange={handleValueChange}
140
- theme={theme}
141
- onHistoryMark={onHistoryMark}
142
- />
143
- </TldrawUiToolbar>
144
- )}
145
- <OpacitySlider />
146
- </div>
147
- {showPickers && (
148
- <div className="tlui-style-panel__section">
149
- {fill === undefined ? null : (
150
- <TldrawUiToolbar label={msg('style-panel.fill')}>
138
+ <>
139
+ {showUiLabels && (
140
+ <StylePanelSubheading>{msg('style-panel.color')}</StylePanelSubheading>
141
+ )}
142
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.color')}>
151
143
  <TldrawUiButtonPicker
152
- title={msg('style-panel.fill')}
153
- uiType="fill"
154
- style={DefaultFillStyle}
155
- items={STYLES.fill}
156
- value={fill}
144
+ title={msg('style-panel.color')}
145
+ uiType="color"
146
+ style={DefaultColorStyle}
147
+ items={STYLES.color}
148
+ value={color}
157
149
  onValueChange={handleValueChange}
158
150
  theme={theme}
159
151
  onHistoryMark={onHistoryMark}
160
152
  />
161
153
  </TldrawUiToolbar>
154
+ </>
155
+ )}
156
+ <OpacitySlider />
157
+ </div>
158
+ {showPickers && (
159
+ <div className="tlui-style-panel__section">
160
+ {fill === undefined ? null : (
161
+ <>
162
+ {showUiLabels && (
163
+ <StylePanelSubheading>{msg('style-panel.fill')}</StylePanelSubheading>
164
+ )}
165
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.fill')}>
166
+ <TldrawUiButtonPicker
167
+ title={msg('style-panel.fill')}
168
+ uiType="fill"
169
+ style={DefaultFillStyle}
170
+ items={STYLES.fill}
171
+ value={fill}
172
+ onValueChange={handleValueChange}
173
+ theme={theme}
174
+ onHistoryMark={onHistoryMark}
175
+ />
176
+ </TldrawUiToolbar>
177
+ </>
162
178
  )}
163
179
  {dash === undefined ? null : (
164
- <TldrawUiToolbar label={msg('style-panel.dash')}>
165
- <TldrawUiButtonPicker
166
- title={msg('style-panel.dash')}
167
- uiType="dash"
168
- style={DefaultDashStyle}
169
- items={STYLES.dash}
170
- value={dash}
171
- onValueChange={handleValueChange}
172
- theme={theme}
173
- onHistoryMark={onHistoryMark}
174
- />
175
- </TldrawUiToolbar>
180
+ <>
181
+ {showUiLabels && (
182
+ <StylePanelSubheading>{msg('style-panel.dash')}</StylePanelSubheading>
183
+ )}
184
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.dash')}>
185
+ <TldrawUiButtonPicker
186
+ title={msg('style-panel.dash')}
187
+ uiType="dash"
188
+ style={DefaultDashStyle}
189
+ items={STYLES.dash}
190
+ value={dash}
191
+ onValueChange={handleValueChange}
192
+ theme={theme}
193
+ onHistoryMark={onHistoryMark}
194
+ />
195
+ </TldrawUiToolbar>
196
+ </>
176
197
  )}
177
198
  {size === undefined ? null : (
178
- <TldrawUiToolbar label={msg('style-panel.size')}>
179
- <TldrawUiButtonPicker
180
- title={msg('style-panel.size')}
181
- uiType="size"
182
- style={DefaultSizeStyle}
183
- items={STYLES.size}
184
- value={size}
185
- onValueChange={(style, value) => {
186
- handleValueChange(style, value)
187
- const selectedShapeIds = editor.getSelectedShapeIds()
188
- if (selectedShapeIds.length > 0) {
189
- kickoutOccludedShapes(editor, selectedShapeIds)
190
- }
191
- }}
192
- theme={theme}
193
- onHistoryMark={onHistoryMark}
194
- />
195
- </TldrawUiToolbar>
199
+ <>
200
+ {showUiLabels && (
201
+ <StylePanelSubheading>{msg('style-panel.size')}</StylePanelSubheading>
202
+ )}
203
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.size')}>
204
+ <TldrawUiButtonPicker
205
+ title={msg('style-panel.size')}
206
+ uiType="size"
207
+ style={DefaultSizeStyle}
208
+ items={STYLES.size}
209
+ value={size}
210
+ onValueChange={(style, value) => {
211
+ handleValueChange(style, value)
212
+ const selectedShapeIds = editor.getSelectedShapeIds()
213
+ if (selectedShapeIds.length > 0) {
214
+ kickoutOccludedShapes(editor, selectedShapeIds)
215
+ }
216
+ }}
217
+ theme={theme}
218
+ onHistoryMark={onHistoryMark}
219
+ />
220
+ </TldrawUiToolbar>
221
+ </>
196
222
  )}
197
223
  </div>
198
224
  )}
@@ -207,6 +233,8 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
207
233
 
208
234
  const editor = useEditor()
209
235
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
236
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
237
+ const labelStr = showUiLabels && msg('style-panel.font')
210
238
 
211
239
  const font = styles.get(DefaultFontStyle)
212
240
  const textAlign = styles.get(DefaultTextAlignStyle)
@@ -219,33 +247,37 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
219
247
  return (
220
248
  <div className="tlui-style-panel__section">
221
249
  {font === undefined ? null : (
222
- <TldrawUiToolbar label={msg('style-panel.font')}>
223
- <TldrawUiButtonPicker
224
- title={msg('style-panel.font')}
225
- uiType="font"
226
- style={DefaultFontStyle}
227
- items={STYLES.font}
228
- value={font}
229
- onValueChange={handleValueChange}
230
- theme={theme}
231
- onHistoryMark={onHistoryMark}
232
- />
233
- </TldrawUiToolbar>
250
+ <>
251
+ {labelStr && <StylePanelSubheading>{labelStr}</StylePanelSubheading>}
252
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.font')}>
253
+ <TldrawUiButtonPicker
254
+ title={msg('style-panel.font')}
255
+ uiType="font"
256
+ style={DefaultFontStyle}
257
+ items={STYLES.font}
258
+ value={font}
259
+ onValueChange={handleValueChange}
260
+ theme={theme}
261
+ onHistoryMark={onHistoryMark}
262
+ />
263
+ </TldrawUiToolbar>
264
+ </>
234
265
  )}
235
266
 
236
267
  {textAlign === undefined ? null : (
237
- <TldrawUiToolbar label={msg('style-panel.align')} className="tlui-style-panel__row">
238
- <TldrawUiButtonPicker
239
- title={msg('style-panel.align')}
240
- uiType="align"
241
- style={DefaultTextAlignStyle}
242
- items={STYLES.textAlign}
243
- value={textAlign}
244
- onValueChange={handleValueChange}
245
- theme={theme}
246
- onHistoryMark={onHistoryMark}
247
- />
248
- <div className="tlui-style-panel__row__extra-button">
268
+ <>
269
+ {showUiLabels && <StylePanelSubheading>{msg('style-panel.align')}</StylePanelSubheading>}
270
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.align')}>
271
+ <TldrawUiButtonPicker
272
+ title={msg('style-panel.align')}
273
+ uiType="align"
274
+ style={DefaultTextAlignStyle}
275
+ items={STYLES.textAlign}
276
+ value={textAlign}
277
+ onValueChange={handleValueChange}
278
+ theme={theme}
279
+ onHistoryMark={onHistoryMark}
280
+ />
249
281
  <TldrawUiToolbarButton
250
282
  type="icon"
251
283
  title={msg('style-panel.vertical-align')}
@@ -254,23 +286,26 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
254
286
  >
255
287
  <TldrawUiButtonIcon icon="vertical-align-middle" />
256
288
  </TldrawUiToolbarButton>
257
- </div>
258
- </TldrawUiToolbar>
289
+ </TldrawUiToolbar>
290
+ </>
259
291
  )}
260
292
 
261
293
  {labelAlign === undefined ? null : (
262
- <TldrawUiToolbar label={msg('style-panel.label-align')} className="tlui-style-panel__row">
263
- <TldrawUiButtonPicker
264
- title={msg('style-panel.label-align')}
265
- uiType="align"
266
- style={DefaultHorizontalAlignStyle}
267
- items={STYLES.horizontalAlign}
268
- value={labelAlign}
269
- onValueChange={handleValueChange}
270
- theme={theme}
271
- onHistoryMark={onHistoryMark}
272
- />
273
- <div className="tlui-style-panel__row__extra-button">
294
+ <>
295
+ {showUiLabels && (
296
+ <StylePanelSubheading>{msg('style-panel.label-align')}</StylePanelSubheading>
297
+ )}
298
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.label-align')}>
299
+ <TldrawUiButtonPicker
300
+ title={msg('style-panel.label-align')}
301
+ uiType="align"
302
+ style={DefaultHorizontalAlignStyle}
303
+ items={STYLES.horizontalAlign}
304
+ value={labelAlign}
305
+ onValueChange={handleValueChange}
306
+ theme={theme}
307
+ onHistoryMark={onHistoryMark}
308
+ />
274
309
  {verticalLabelAlign === undefined ? (
275
310
  <TldrawUiToolbarButton
276
311
  type="icon"
@@ -292,8 +327,8 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
292
327
  onValueChange={handleValueChange}
293
328
  />
294
329
  )}
295
- </div>
296
- </TldrawUiToolbar>
330
+ </TldrawUiToolbar>
331
+ </>
297
332
  )}
298
333
  </div>
299
334
  )
@@ -309,7 +344,7 @@ export function GeoStylePickerSet({ styles }: StylePickerSetProps) {
309
344
  }
310
345
 
311
346
  return (
312
- <TldrawUiToolbar label={msg('style-panel.geo')}>
347
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.geo')}>
313
348
  <DropdownPicker
314
349
  id="geo"
315
350
  type="menu"
@@ -335,7 +370,7 @@ export function SplineStylePickerSet({ styles }: StylePickerSetProps) {
335
370
  }
336
371
 
337
372
  return (
338
- <TldrawUiToolbar label={msg('style-panel.spline')}>
373
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.spline')}>
339
374
  <DropdownPicker
340
375
  id="spline"
341
376
  type="menu"
@@ -361,7 +396,7 @@ export function ArrowStylePickerSet({ styles }: StylePickerSetProps) {
361
396
  }
362
397
 
363
398
  return (
364
- <TldrawUiToolbar label={msg('style-panel.arrow-kind')}>
399
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.arrow-kind')}>
365
400
  <DropdownPicker
366
401
  id="arrow-kind"
367
402
  type="menu"
@@ -410,6 +445,7 @@ export function OpacitySlider() {
410
445
  const editor = useEditor()
411
446
 
412
447
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
448
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
413
449
 
414
450
  const opacity = useValue('opacity', () => editor.getSharedOpacity(), [editor])
415
451
  const trackEvent = useUiEvents()
@@ -443,15 +479,18 @@ export function OpacitySlider() {
443
479
  )
444
480
 
445
481
  return (
446
- <TldrawUiSlider
447
- data-testid="style.opacity"
448
- value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
449
- label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
450
- onValueChange={handleOpacityValueChange}
451
- steps={tldrawSupportedOpacities.length - 1}
452
- title={msg('style-panel.opacity')}
453
- onHistoryMark={onHistoryMark}
454
- ariaValueModifier={25}
455
- />
482
+ <>
483
+ {showUiLabels && <StylePanelSubheading>{msg('style-panel.opacity')}</StylePanelSubheading>}
484
+ <TldrawUiSlider
485
+ data-testid="style.opacity"
486
+ value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
487
+ label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
488
+ onValueChange={handleOpacityValueChange}
489
+ steps={tldrawSupportedOpacities.length - 1}
490
+ title={msg('style-panel.opacity')}
491
+ onHistoryMark={onHistoryMark}
492
+ ariaValueModifier={25}
493
+ />
494
+ </>
456
495
  )
457
496
  }
@@ -68,7 +68,7 @@ function DoubleDropdownPickerInner<T extends string>({
68
68
  <div title={msg(label)} className="tlui-style-panel__double-select-picker-label">
69
69
  {msg(label)}
70
70
  </div>
71
- <TldrawUiToolbar label={msg(label)} className="tlui-buttons__horizontal">
71
+ <TldrawUiToolbar orientation="horizontal" label={msg(label)}>
72
72
  <TldrawUiPopover id={idA} open={isOpenA} onOpenChange={setIsOpenA}>
73
73
  <TldrawUiPopoverTrigger>
74
74
  <TldrawUiToolbarButton
@@ -86,7 +86,7 @@ function DoubleDropdownPickerInner<T extends string>({
86
86
  </TldrawUiToolbarButton>
87
87
  </TldrawUiPopoverTrigger>
88
88
  <TldrawUiPopoverContent side="left" align="center" sideOffset={80} alignOffset={0}>
89
- <TldrawUiToolbar label={msg(labelA)} className="tlui-buttons__grid">
89
+ <TldrawUiToolbar orientation="grid" label={msg(labelA)}>
90
90
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
91
91
  {itemsA.map((item) => {
92
92
  return (
@@ -126,7 +126,7 @@ function DoubleDropdownPickerInner<T extends string>({
126
126
  </TldrawUiToolbarButton>
127
127
  </TldrawUiPopoverTrigger>
128
128
  <TldrawUiPopoverContent side="left" align="center" sideOffset={116} alignOffset={0}>
129
- <TldrawUiToolbar label={msg(labelB)} className="tlui-buttons__grid">
129
+ <TldrawUiToolbar orientation="grid" label={msg(labelB)}>
130
130
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
131
131
  {itemsB.map((item) => {
132
132
  return (
@@ -1,5 +1,4 @@
1
1
  import { SharedStyle, StyleProp, tlmenus, useEditor } from '@tldraw/editor'
2
- import classNames from 'classnames'
3
2
  import * as React from 'react'
4
3
  import { StyleValuesForUi } from '../../../styles'
5
4
  import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
@@ -57,7 +56,12 @@ function DropdownPickerInner<T extends string>({
57
56
 
58
57
  const popoverId = `style panel ${id}`
59
58
  return (
60
- <TldrawUiPopover id={popoverId} open={isOpen} onOpenChange={setIsOpen}>
59
+ <TldrawUiPopover
60
+ id={popoverId}
61
+ open={isOpen}
62
+ onOpenChange={setIsOpen}
63
+ className="tlui-style-panel__dropdown-picker"
64
+ >
61
65
  <TldrawUiPopoverTrigger>
62
66
  <TldrawUiToolbarButton
63
67
  type={type}
@@ -70,10 +74,7 @@ function DropdownPickerInner<T extends string>({
70
74
  </TldrawUiToolbarButton>
71
75
  </TldrawUiPopoverTrigger>
72
76
  <TldrawUiPopoverContent side="left" align="center">
73
- <TldrawUiToolbar
74
- label={labelStr}
75
- className={classNames('tlui-buttons__grid', `tlui-buttons__${stylePanelType}`)}
76
- >
77
+ <TldrawUiToolbar orientation="grid" label={labelStr}>
77
78
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
78
79
  {items.map((item) => {
79
80
  return (
@@ -272,7 +272,7 @@ export const DefaultImageToolbarContent = track(function DefaultImageToolbarCont
272
272
  type="icon"
273
273
  onClick={onManipulatingEnd}
274
274
  data-testid="tool.image-confirm"
275
- style={{ borderLeft: '1px solid var(--color-divider)', marginLeft: '2px' }}
275
+ style={{ borderLeft: '1px solid var(--tl-color-divider)', marginLeft: '2px' }}
276
276
  >
277
277
  <TldrawUiButtonIcon small icon="check" />
278
278
  </TldrawUiButton>
@@ -1,4 +1,5 @@
1
1
  import { useEditor, usePassThroughWheelEvents, useValue } from '@tldraw/editor'
2
+ import classNames from 'classnames'
2
3
  import { ReactNode, memo, useRef } from 'react'
3
4
  import { PORTRAIT_BREAKPOINT } from '../../constants'
4
5
  import { useBreakpoint } from '../../context/breakpoints'
@@ -6,6 +7,7 @@ import { useTldrawUiComponents } from '../../context/components'
6
7
  import { useReadonly } from '../../hooks/useReadonly'
7
8
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
8
9
  import { MobileStylePanel } from '../MobileStylePanel'
10
+ import { TldrawUiOrientationProvider } from '../primitives/layout'
9
11
  import { TldrawUiToolbar } from '../primitives/TldrawUiToolbar'
10
12
  import { DefaultToolbarContent } from './DefaultToolbarContent'
11
13
  import { OverflowingToolbar } from './OverflowingToolbar'
@@ -14,6 +16,11 @@ import { ToggleToolLockedButton } from './ToggleToolLockedButton'
14
16
  /** @public */
15
17
  export interface DefaultToolbarProps {
16
18
  children?: ReactNode
19
+ orientation?: 'horizontal' | 'vertical'
20
+ minItems?: number
21
+ minSizePx?: number
22
+ maxItems?: number
23
+ maxSizePx?: number
17
24
  }
18
25
 
19
26
  /**
@@ -24,7 +31,14 @@ export interface DefaultToolbarProps {
24
31
  * @public
25
32
  * @react
26
33
  */
27
- export const DefaultToolbar = memo(function DefaultToolbar({ children }: DefaultToolbarProps) {
34
+ export const DefaultToolbar = memo(function DefaultToolbar({
35
+ children,
36
+ orientation = 'horizontal',
37
+ minItems = 4,
38
+ minSizePx = 310,
39
+ maxItems = 8,
40
+ maxSizePx = 470,
41
+ }: DefaultToolbarProps) {
28
42
  const editor = useEditor()
29
43
  const msg = useTranslation()
30
44
  const breakpoint = useBreakpoint()
@@ -44,31 +58,49 @@ export const DefaultToolbar = memo(function DefaultToolbar({ children }: Default
44
58
  : breakpoint < PORTRAIT_BREAKPOINT.TABLET
45
59
 
46
60
  return (
47
- <div ref={ref} className="tlui-toolbar">
48
- <div className="tlui-toolbar__inner">
49
- <div className="tlui-toolbar__left">
50
- {!isReadonlyMode && (
51
- <div className="tlui-toolbar__extras">
52
- {showQuickActions && (
53
- <TldrawUiToolbar
54
- className="tlui-toolbar__extras__controls tlui-buttons__horizontal"
55
- label={msg('actions-menu.title')}
56
- >
57
- {QuickActions && <QuickActions />}
58
- {ActionsMenu && <ActionsMenu />}
59
- </TldrawUiToolbar>
60
- )}
61
- <ToggleToolLockedButton activeToolId={activeToolId} />
61
+ <TldrawUiOrientationProvider
62
+ orientation={orientation}
63
+ tooltipSide={orientation === 'horizontal' ? 'top' : 'right'}
64
+ >
65
+ <div
66
+ ref={ref}
67
+ className={classNames('tlui-main-toolbar', `tlui-main-toolbar--${orientation}`)}
68
+ >
69
+ <div className="tlui-main-toolbar__inner">
70
+ <div className="tlui-main-toolbar__left">
71
+ {!isReadonlyMode && (
72
+ <div className="tlui-main-toolbar__extras">
73
+ {showQuickActions && (
74
+ <TldrawUiToolbar
75
+ orientation={orientation}
76
+ className="tlui-main-toolbar__extras__controls"
77
+ label={msg('actions-menu.title')}
78
+ >
79
+ {QuickActions && <QuickActions />}
80
+ {ActionsMenu && <ActionsMenu />}
81
+ </TldrawUiToolbar>
82
+ )}
83
+ <ToggleToolLockedButton activeToolId={activeToolId} />
84
+ </div>
85
+ )}
86
+ <OverflowingToolbar
87
+ orientation={orientation}
88
+ sizingParentClassName="tlui-main-toolbar"
89
+ minItems={minItems}
90
+ maxItems={maxItems}
91
+ minSizePx={minSizePx}
92
+ maxSizePx={maxSizePx}
93
+ >
94
+ {children ?? <DefaultToolbarContent />}
95
+ </OverflowingToolbar>
96
+ </div>
97
+ {breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM && !isReadonlyMode && (
98
+ <div className="tlui-main-toolbar__tools tlui-main-toolbar__mobile-style-panel">
99
+ <MobileStylePanel />
62
100
  </div>
63
101
  )}
64
- <OverflowingToolbar>{children ?? <DefaultToolbarContent />}</OverflowingToolbar>
65
102
  </div>
66
- {breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM && !isReadonlyMode && (
67
- <div className="tlui-toolbar__tools">
68
- <MobileStylePanel />
69
- </div>
70
- )}
71
103
  </div>
72
- </div>
104
+ </TldrawUiOrientationProvider>
73
105
  )
74
106
  })