tldraw 3.16.0-canary.ca347c5375a5 → 3.16.0-canary.cd9f62cbecbb

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 (278) hide show
  1. package/dist-cjs/index.d.ts +130 -6
  2. package/dist-cjs/index.js +14 -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/tools/SelectTool/childStates/Translating.js.map +2 -2
  41. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  42. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  43. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  44. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  45. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  46. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  47. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  48. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  49. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  50. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  51. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  52. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  53. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  54. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  55. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  56. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  57. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  58. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  59. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  60. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  61. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  62. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  63. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  64. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  65. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
  66. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  67. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  68. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  69. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  70. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  71. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  72. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  73. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  74. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  75. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  76. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  77. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  78. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  79. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  80. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  81. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  82. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  83. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  84. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  85. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  86. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  87. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +30 -7
  88. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  89. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +253 -0
  90. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  91. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  92. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  93. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  95. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  96. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +153 -20
  97. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  98. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  99. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  100. package/dist-cjs/lib/ui/context/actions.js +15 -0
  101. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  102. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  103. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  104. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  105. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  106. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +3 -0
  107. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  108. package/dist-cjs/lib/ui/version.js +3 -3
  109. package/dist-cjs/lib/ui/version.js.map +1 -1
  110. package/dist-esm/index.d.mts +130 -6
  111. package/dist-esm/index.mjs +25 -1
  112. package/dist-esm/index.mjs.map +2 -2
  113. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  114. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  115. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  116. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  117. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  118. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  119. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  120. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  121. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  122. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  123. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  124. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  125. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  126. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  127. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  128. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  129. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  130. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  131. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  132. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  133. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  134. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  135. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  136. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  137. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  138. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  139. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  140. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  141. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  142. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  143. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  144. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  145. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  146. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  147. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  148. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  149. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  150. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  151. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  152. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  153. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  154. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  155. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  156. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  157. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  158. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  159. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  160. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  161. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  162. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  163. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  164. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  165. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  166. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  167. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  168. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  169. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  170. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  171. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  172. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  173. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  174. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
  175. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  176. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  177. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  178. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  179. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  180. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  181. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  182. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  183. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  184. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  185. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  186. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  187. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  188. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  189. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  190. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  191. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  192. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  193. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  194. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  195. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  196. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +30 -7
  197. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  198. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +230 -0
  199. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  200. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  201. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  202. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  203. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  204. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  205. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +161 -22
  206. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  207. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  208. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  209. package/dist-esm/lib/ui/context/actions.mjs +15 -0
  210. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  211. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  212. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  213. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  214. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +3 -0
  215. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  216. package/dist-esm/lib/ui/version.mjs +3 -3
  217. package/dist-esm/lib/ui/version.mjs.map +1 -1
  218. package/package.json +3 -3
  219. package/src/index.ts +20 -0
  220. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  221. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  222. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  223. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  224. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  225. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  226. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  227. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  228. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  229. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  230. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  231. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  232. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  233. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  234. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  235. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  236. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  237. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  238. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  239. package/src/lib/ui/TldrawUi.tsx +17 -2
  240. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  241. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  242. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  243. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  244. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  245. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  246. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  247. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  248. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  249. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  250. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  251. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
  252. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  253. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  254. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  255. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  256. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  257. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +14 -11
  258. package/src/lib/ui/components/menu-items.tsx +8 -0
  259. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  260. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  261. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  262. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +51 -12
  263. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +301 -0
  264. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  265. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  266. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  267. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +220 -19
  268. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  269. package/src/lib/ui/context/actions.tsx +15 -0
  270. package/src/lib/ui/context/events.tsx +2 -0
  271. package/src/lib/ui/hooks/useTools.tsx +140 -10
  272. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +3 -0
  273. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +3 -0
  274. package/src/lib/ui/version.ts +3 -3
  275. package/src/lib/ui.css +406 -292
  276. package/src/test/arrows-megabus.test.tsx +12 -6
  277. package/src/test/inner-outer-margin.test.ts +315 -0
  278. package/tldraw.css +699 -580
@@ -0,0 +1,230 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { assert, atom, uniqueId, useMaybeEditor, useValue } from "@tldraw/editor";
3
+ import { Tooltip as _Tooltip } from "radix-ui";
4
+ import React, {
5
+ createContext,
6
+ forwardRef,
7
+ useContext,
8
+ useEffect,
9
+ useRef,
10
+ useState
11
+ } from "react";
12
+ import { useTldrawUiOrientation } from "./layout.mjs";
13
+ const DEFAULT_TOOLTIP_DELAY_MS = 700;
14
+ class TooltipManager {
15
+ static instance = null;
16
+ currentTooltip = atom("current tooltip", null);
17
+ destroyTimeoutId = null;
18
+ subscribers = /* @__PURE__ */ new Set();
19
+ static getInstance() {
20
+ if (!TooltipManager.instance) {
21
+ TooltipManager.instance = new TooltipManager();
22
+ }
23
+ return TooltipManager.instance;
24
+ }
25
+ showTooltip(tooltipId, content, targetElement, side = "bottom", sideOffset = 5) {
26
+ if (this.destroyTimeoutId) {
27
+ clearTimeout(this.destroyTimeoutId);
28
+ this.destroyTimeoutId = null;
29
+ }
30
+ this.currentTooltip.set({
31
+ id: tooltipId,
32
+ content,
33
+ side,
34
+ sideOffset,
35
+ targetElement
36
+ });
37
+ }
38
+ hideTooltip(editor, tooltipId, instant = false) {
39
+ const hide = () => {
40
+ if (this.currentTooltip.get()?.id === tooltipId) {
41
+ this.currentTooltip.set(null);
42
+ this.destroyTimeoutId = null;
43
+ }
44
+ };
45
+ if (editor && !instant) {
46
+ this.destroyTimeoutId = editor.timers.setTimeout(hide, 300);
47
+ } else {
48
+ hide();
49
+ }
50
+ }
51
+ hideAllTooltips() {
52
+ this.currentTooltip.set(null);
53
+ this.destroyTimeoutId = null;
54
+ }
55
+ getCurrentTooltipData() {
56
+ if (!this.supportsHover()) return null;
57
+ return this.currentTooltip.get();
58
+ }
59
+ supportsHoverAtom = null;
60
+ supportsHover() {
61
+ if (!this.supportsHoverAtom) {
62
+ const mediaQuery = window.matchMedia("(hover: hover)");
63
+ const supportsHover = atom("has hover", mediaQuery.matches);
64
+ this.supportsHoverAtom = supportsHover;
65
+ mediaQuery.addEventListener("change", (e) => {
66
+ supportsHover.set(e.matches);
67
+ });
68
+ }
69
+ return this.supportsHoverAtom.get();
70
+ }
71
+ }
72
+ const tooltipManager = TooltipManager.getInstance();
73
+ const TooltipSingletonContext = createContext(false);
74
+ function TldrawUiTooltipProvider({ children }) {
75
+ return /* @__PURE__ */ jsx(_Tooltip.Provider, { skipDelayDuration: 700, children: /* @__PURE__ */ jsxs(TooltipSingletonContext.Provider, { value: true, children: [
76
+ children,
77
+ /* @__PURE__ */ jsx(TooltipSingleton, {})
78
+ ] }) });
79
+ }
80
+ function TooltipSingleton() {
81
+ const editor = useMaybeEditor();
82
+ const [isOpen, setIsOpen] = useState(false);
83
+ const triggerRef = useRef(null);
84
+ const isFirstShowRef = useRef(true);
85
+ const showTimeoutRef = useRef(null);
86
+ const currentTooltip = useValue(
87
+ "current tooltip",
88
+ () => tooltipManager.getCurrentTooltipData(),
89
+ []
90
+ );
91
+ useEffect(() => {
92
+ if (showTimeoutRef.current) {
93
+ clearTimeout(showTimeoutRef.current);
94
+ showTimeoutRef.current = null;
95
+ }
96
+ if (currentTooltip && triggerRef.current) {
97
+ const activeRect = currentTooltip.targetElement.getBoundingClientRect();
98
+ const trigger = triggerRef.current;
99
+ trigger.style.position = "fixed";
100
+ trigger.style.left = `${activeRect.left}px`;
101
+ trigger.style.top = `${activeRect.top}px`;
102
+ trigger.style.width = `${activeRect.width}px`;
103
+ trigger.style.height = `${activeRect.height}px`;
104
+ trigger.style.pointerEvents = "none";
105
+ trigger.style.zIndex = "9999";
106
+ if (isFirstShowRef.current && editor) {
107
+ showTimeoutRef.current = editor.timers.setTimeout(() => {
108
+ setIsOpen(true);
109
+ isFirstShowRef.current = false;
110
+ }, editor.options.tooltipDelayMs);
111
+ } else {
112
+ setIsOpen(true);
113
+ }
114
+ } else {
115
+ setIsOpen(false);
116
+ isFirstShowRef.current = true;
117
+ }
118
+ }, [editor, currentTooltip]);
119
+ if (!currentTooltip) {
120
+ return null;
121
+ }
122
+ return /* @__PURE__ */ jsxs(_Tooltip.Root, { open: isOpen, delayDuration: 0, children: [
123
+ /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, children: /* @__PURE__ */ jsx("div", { ref: triggerRef }) }),
124
+ /* @__PURE__ */ jsxs(
125
+ _Tooltip.Content,
126
+ {
127
+ className: "tlui-tooltip",
128
+ side: currentTooltip.side,
129
+ sideOffset: currentTooltip.sideOffset,
130
+ avoidCollisions: true,
131
+ collisionPadding: 8,
132
+ dir: "ltr",
133
+ children: [
134
+ currentTooltip.content,
135
+ /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
136
+ ]
137
+ }
138
+ )
139
+ ] });
140
+ }
141
+ const TldrawUiTooltip = forwardRef(
142
+ ({ children, content, side, sideOffset = 5, disabled = false }, ref) => {
143
+ const editor = useMaybeEditor();
144
+ const tooltipId = useRef(uniqueId());
145
+ const hasProvider = useContext(TooltipSingletonContext);
146
+ const orientationCtx = useTldrawUiOrientation();
147
+ const sideToUse = side ?? orientationCtx.tooltipSide;
148
+ useEffect(() => {
149
+ const currentTooltipId = tooltipId.current;
150
+ return () => {
151
+ if (hasProvider) {
152
+ tooltipManager.hideTooltip(editor, currentTooltipId, true);
153
+ }
154
+ };
155
+ }, [editor, hasProvider]);
156
+ if (disabled || !content) {
157
+ return /* @__PURE__ */ jsx(Fragment, { children });
158
+ }
159
+ if (!hasProvider) {
160
+ return /* @__PURE__ */ jsxs(
161
+ _Tooltip.Root,
162
+ {
163
+ delayDuration: editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS,
164
+ disableHoverableContent: true,
165
+ children: [
166
+ /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, ref, children }),
167
+ /* @__PURE__ */ jsxs(
168
+ _Tooltip.Content,
169
+ {
170
+ className: "tlui-tooltip",
171
+ side: sideToUse,
172
+ sideOffset,
173
+ avoidCollisions: true,
174
+ collisionPadding: 8,
175
+ dir: "ltr",
176
+ children: [
177
+ content,
178
+ /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
179
+ ]
180
+ }
181
+ )
182
+ ]
183
+ }
184
+ );
185
+ }
186
+ const child = React.Children.only(children);
187
+ assert(React.isValidElement(child), "TldrawUiTooltip children must be a single element");
188
+ const handleMouseEnter = (event) => {
189
+ child.props.onMouseEnter?.(event);
190
+ tooltipManager.showTooltip(
191
+ tooltipId.current,
192
+ content,
193
+ event.currentTarget,
194
+ sideToUse,
195
+ sideOffset
196
+ );
197
+ };
198
+ const handleMouseLeave = (event) => {
199
+ child.props.onMouseLeave?.(event);
200
+ tooltipManager.hideTooltip(editor, tooltipId.current);
201
+ };
202
+ const handleFocus = (event) => {
203
+ child.props.onFocus?.(event);
204
+ tooltipManager.showTooltip(
205
+ tooltipId.current,
206
+ content,
207
+ event.currentTarget,
208
+ sideToUse,
209
+ sideOffset
210
+ );
211
+ };
212
+ const handleBlur = (event) => {
213
+ child.props.onBlur?.(event);
214
+ tooltipManager.hideTooltip(editor, tooltipId.current);
215
+ };
216
+ const childrenWithHandlers = React.cloneElement(children, {
217
+ onMouseEnter: handleMouseEnter,
218
+ onMouseLeave: handleMouseLeave,
219
+ onFocus: handleFocus,
220
+ onBlur: handleBlur
221
+ });
222
+ return childrenWithHandlers;
223
+ }
224
+ );
225
+ export {
226
+ TldrawUiTooltip,
227
+ TldrawUiTooltipProvider,
228
+ tooltipManager
229
+ };
230
+ //# sourceMappingURL=TldrawUiTooltip.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/lib/ui/components/primitives/TldrawUiTooltip.tsx"],
4
+ "sourcesContent": ["import { assert, Atom, atom, Editor, uniqueId, useMaybeEditor, useValue } from '@tldraw/editor'\nimport { Tooltip as _Tooltip } from 'radix-ui'\nimport React, {\n\tcreateContext,\n\tforwardRef,\n\tReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { useTldrawUiOrientation } from './layout'\n\nconst DEFAULT_TOOLTIP_DELAY_MS = 700\n\n/** @public */\nexport interface TldrawUiTooltipProps {\n\tchildren: React.ReactNode\n\tcontent?: string | React.ReactNode\n\tside?: 'top' | 'right' | 'bottom' | 'left'\n\tsideOffset?: number\n\tdisabled?: boolean\n}\n\n// Singleton tooltip manager\nclass TooltipManager {\n\tprivate static instance: TooltipManager | null = null\n\tprivate currentTooltip = atom<{\n\t\tid: string\n\t\tcontent: ReactNode\n\t\tside: 'top' | 'right' | 'bottom' | 'left'\n\t\tsideOffset: number\n\t\ttargetElement: HTMLElement\n\t} | null>('current tooltip', null)\n\tprivate destroyTimeoutId: number | null = null\n\tprivate subscribers: Set<() => void> = new Set()\n\n\tstatic getInstance(): TooltipManager {\n\t\tif (!TooltipManager.instance) {\n\t\t\tTooltipManager.instance = new TooltipManager()\n\t\t}\n\t\treturn TooltipManager.instance\n\t}\n\n\tshowTooltip(\n\t\ttooltipId: string,\n\t\tcontent: string | React.ReactNode,\n\t\ttargetElement: HTMLElement,\n\t\tside: 'top' | 'right' | 'bottom' | 'left' = 'bottom',\n\t\tsideOffset: number = 5\n\t) {\n\t\t// Clear any existing destroy timeout\n\t\tif (this.destroyTimeoutId) {\n\t\t\tclearTimeout(this.destroyTimeoutId)\n\t\t\tthis.destroyTimeoutId = null\n\t\t}\n\n\t\t// Update current tooltip\n\t\tthis.currentTooltip.set({\n\t\t\tid: tooltipId,\n\t\t\tcontent,\n\t\t\tside,\n\t\t\tsideOffset,\n\t\t\ttargetElement,\n\t\t})\n\t}\n\n\thideTooltip(editor: Editor | null, tooltipId: string, instant: boolean = false) {\n\t\tconst hide = () => {\n\t\t\t// Only hide if this is the current tooltip\n\t\t\tif (this.currentTooltip.get()?.id === tooltipId) {\n\t\t\t\tthis.currentTooltip.set(null)\n\t\t\t\tthis.destroyTimeoutId = null\n\t\t\t}\n\t\t}\n\n\t\tif (editor && !instant) {\n\t\t\t// Start destroy timeout (1 second)\n\t\t\tthis.destroyTimeoutId = editor.timers.setTimeout(hide, 300)\n\t\t} else {\n\t\t\thide()\n\t\t}\n\t}\n\n\thideAllTooltips() {\n\t\tthis.currentTooltip.set(null)\n\t\tthis.destroyTimeoutId = null\n\t}\n\n\tgetCurrentTooltipData() {\n\t\tif (!this.supportsHover()) return null\n\t\treturn this.currentTooltip.get()\n\t}\n\n\tprivate supportsHoverAtom: Atom<boolean> | null = null\n\tsupportsHover() {\n\t\tif (!this.supportsHoverAtom) {\n\t\t\tconst mediaQuery = window.matchMedia('(hover: hover)')\n\t\t\tconst supportsHover = atom('has hover', mediaQuery.matches)\n\t\t\tthis.supportsHoverAtom = supportsHover\n\t\t\tmediaQuery.addEventListener('change', (e) => {\n\t\t\t\tsupportsHover.set(e.matches)\n\t\t\t})\n\t\t}\n\t\treturn this.supportsHoverAtom.get()\n\t}\n}\n\nexport const tooltipManager = TooltipManager.getInstance()\n\n// Context for the tooltip singleton\nconst TooltipSingletonContext = createContext<boolean>(false)\n\n/** @public */\nexport interface TldrawUiTooltipProviderProps {\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderProps) {\n\treturn (\n\t\t<_Tooltip.Provider skipDelayDuration={700}>\n\t\t\t<TooltipSingletonContext.Provider value={true}>\n\t\t\t\t{children}\n\t\t\t\t<TooltipSingleton />\n\t\t\t</TooltipSingletonContext.Provider>\n\t\t</_Tooltip.Provider>\n\t)\n}\n\n// The singleton tooltip component that renders once\nfunction TooltipSingleton() {\n\tconst editor = useMaybeEditor()\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst triggerRef = useRef<HTMLDivElement>(null)\n\tconst isFirstShowRef = useRef(true)\n\tconst showTimeoutRef = useRef<number | null>(null)\n\n\tconst currentTooltip = useValue(\n\t\t'current tooltip',\n\t\t() => tooltipManager.getCurrentTooltipData(),\n\t\t[]\n\t)\n\n\t// Update open state and trigger position\n\tuseEffect(() => {\n\t\t// Clear any existing show timeout\n\t\tif (showTimeoutRef.current) {\n\t\t\tclearTimeout(showTimeoutRef.current)\n\t\t\tshowTimeoutRef.current = null\n\t\t}\n\n\t\tif (currentTooltip && triggerRef.current) {\n\t\t\t// Position the invisible trigger element over the active element\n\t\t\tconst activeRect = currentTooltip.targetElement.getBoundingClientRect()\n\t\t\tconst trigger = triggerRef.current\n\n\t\t\ttrigger.style.position = 'fixed'\n\t\t\ttrigger.style.left = `${activeRect.left}px`\n\t\t\ttrigger.style.top = `${activeRect.top}px`\n\t\t\ttrigger.style.width = `${activeRect.width}px`\n\t\t\ttrigger.style.height = `${activeRect.height}px`\n\t\t\ttrigger.style.pointerEvents = 'none'\n\t\t\ttrigger.style.zIndex = '9999'\n\n\t\t\t// Handle delay for first show\n\t\t\tif (isFirstShowRef.current && editor) {\n\t\t\t\tshowTimeoutRef.current = editor.timers.setTimeout(() => {\n\t\t\t\t\tsetIsOpen(true)\n\t\t\t\t\tisFirstShowRef.current = false\n\t\t\t\t}, editor.options.tooltipDelayMs)\n\t\t\t} else {\n\t\t\t\t// Subsequent tooltips show immediately\n\t\t\t\tsetIsOpen(true)\n\t\t\t}\n\t\t} else {\n\t\t\t// Hide tooltip immediately\n\t\t\tsetIsOpen(false)\n\t\t\t// Reset first show state after tooltip is hidden\n\t\t\tisFirstShowRef.current = true\n\t\t}\n\t}, [editor, currentTooltip])\n\n\tif (!currentTooltip) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<_Tooltip.Root open={isOpen} delayDuration={0}>\n\t\t\t<_Tooltip.Trigger asChild>\n\t\t\t\t<div ref={triggerRef} />\n\t\t\t</_Tooltip.Trigger>\n\t\t\t<_Tooltip.Content\n\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\tside={currentTooltip.side}\n\t\t\t\tsideOffset={currentTooltip.sideOffset}\n\t\t\t\tavoidCollisions\n\t\t\t\tcollisionPadding={8}\n\t\t\t\tdir=\"ltr\"\n\t\t\t>\n\t\t\t\t{currentTooltip.content}\n\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t</_Tooltip.Content>\n\t\t</_Tooltip.Root>\n\t)\n}\n\n/** @public @react */\nexport const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProps>(\n\t({ children, content, side, sideOffset = 5, disabled = false }, ref) => {\n\t\tconst editor = useMaybeEditor()\n\t\tconst tooltipId = useRef<string>(uniqueId())\n\t\tconst hasProvider = useContext(TooltipSingletonContext)\n\n\t\tconst orientationCtx = useTldrawUiOrientation()\n\t\tconst sideToUse = side ?? orientationCtx.tooltipSide\n\n\t\tuseEffect(() => {\n\t\t\tconst currentTooltipId = tooltipId.current\n\t\t\treturn () => {\n\t\t\t\tif (hasProvider) {\n\t\t\t\t\ttooltipManager.hideTooltip(editor, currentTooltipId, true)\n\t\t\t\t}\n\t\t\t}\n\t\t}, [editor, hasProvider])\n\n\t\t// Don't show tooltip if disabled, no content, or UI labels are disabled\n\t\tif (disabled || !content) {\n\t\t\treturn <>{children}</>\n\t\t}\n\n\t\t// Fallback to old behavior if no provider\n\t\tif (!hasProvider) {\n\t\t\treturn (\n\t\t\t\t<_Tooltip.Root\n\t\t\t\t\tdelayDuration={editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS}\n\t\t\t\t\tdisableHoverableContent\n\t\t\t\t>\n\t\t\t\t\t<_Tooltip.Trigger asChild ref={ref}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</_Tooltip.Trigger>\n\t\t\t\t\t<_Tooltip.Content\n\t\t\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\t\t\tside={sideToUse}\n\t\t\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t\t\t</_Tooltip.Content>\n\t\t\t\t</_Tooltip.Root>\n\t\t\t)\n\t\t}\n\n\t\tconst child = React.Children.only(children)\n\t\tassert(React.isValidElement(child), 'TldrawUiTooltip children must be a single element')\n\n\t\tconst handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\tchild.props.onMouseEnter?.(event)\n\t\t\ttooltipManager.showTooltip(\n\t\t\t\ttooltipId.current,\n\t\t\t\tcontent,\n\t\t\t\tevent.currentTarget as HTMLElement,\n\t\t\t\tsideToUse,\n\t\t\t\tsideOffset\n\t\t\t)\n\t\t}\n\n\t\tconst handleMouseLeave = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\tchild.props.onMouseLeave?.(event)\n\t\t\ttooltipManager.hideTooltip(editor, tooltipId.current)\n\t\t}\n\n\t\tconst handleFocus = (event: React.FocusEvent<HTMLElement>) => {\n\t\t\tchild.props.onFocus?.(event)\n\t\t\ttooltipManager.showTooltip(\n\t\t\t\ttooltipId.current,\n\t\t\t\tcontent,\n\t\t\t\tevent.currentTarget as HTMLElement,\n\t\t\t\tsideToUse,\n\t\t\t\tsideOffset\n\t\t\t)\n\t\t}\n\n\t\tconst handleBlur = (event: React.FocusEvent<HTMLElement>) => {\n\t\t\tchild.props.onBlur?.(event)\n\t\t\ttooltipManager.hideTooltip(editor, tooltipId.current)\n\t\t}\n\n\t\tconst childrenWithHandlers = React.cloneElement(children as React.ReactElement, {\n\t\t\tonMouseEnter: handleMouseEnter,\n\t\t\tonMouseLeave: handleMouseLeave,\n\t\t\tonFocus: handleFocus,\n\t\t\tonBlur: handleBlur,\n\t\t})\n\n\t\treturn childrenWithHandlers\n\t}\n)\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,46 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import classNames from "classnames";
3
+ import { Slot } from "radix-ui";
4
+ import { createContext, forwardRef, useContext } from "react";
5
+ const TldrawUiOrientationContext = createContext({
6
+ orientation: "horizontal",
7
+ tooltipSide: "bottom"
8
+ });
9
+ function TldrawUiOrientationProvider({
10
+ children,
11
+ orientation,
12
+ tooltipSide
13
+ }) {
14
+ const prevContext = useTldrawUiOrientation();
15
+ const tooltipSideToUse = tooltipSide ?? (orientation === prevContext.orientation ? prevContext.tooltipSide : orientation === "horizontal" ? "bottom" : "right");
16
+ return /* @__PURE__ */ jsx(TldrawUiOrientationContext.Provider, { value: { orientation, tooltipSide: tooltipSideToUse }, children });
17
+ }
18
+ function useTldrawUiOrientation() {
19
+ return useContext(TldrawUiOrientationContext);
20
+ }
21
+ const TldrawUiRow = forwardRef(
22
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
23
+ const Component = asChild ? Slot.Root : "div";
24
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "horizontal", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-row", className), ...props }) });
25
+ }
26
+ );
27
+ const TldrawUiColumn = forwardRef(
28
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
29
+ const Component = asChild ? Slot.Root : "div";
30
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "vertical", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-column", className), ...props }) });
31
+ }
32
+ );
33
+ const TldrawUiGrid = forwardRef(
34
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
35
+ const Component = asChild ? Slot.Root : "div";
36
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "horizontal", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-grid", className), ...props }) });
37
+ }
38
+ );
39
+ export {
40
+ TldrawUiColumn,
41
+ TldrawUiGrid,
42
+ TldrawUiOrientationProvider,
43
+ TldrawUiRow,
44
+ useTldrawUiOrientation
45
+ };
46
+ //# sourceMappingURL=layout.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/lib/ui/components/primitives/layout.tsx"],
4
+ "sourcesContent": ["import classNames from 'classnames'\nimport { Slot } from 'radix-ui'\nimport { HTMLAttributes, ReactNode, createContext, forwardRef, useContext } from 'react'\n\n/** @public */\nexport interface TldrawUiOrientationContext {\n\torientation: 'horizontal' | 'vertical'\n\ttooltipSide: 'top' | 'right' | 'bottom' | 'left'\n}\n\nconst TldrawUiOrientationContext = createContext<TldrawUiOrientationContext>({\n\torientation: 'horizontal',\n\ttooltipSide: 'bottom',\n})\n\n/** @public */\nexport interface TldrawUiOrientationProviderProps {\n\tchildren: ReactNode\n\torientation: 'horizontal' | 'vertical'\n\ttooltipSide?: 'top' | 'right' | 'bottom' | 'left'\n}\n/** @public @react */\nexport function TldrawUiOrientationProvider({\n\tchildren,\n\torientation,\n\ttooltipSide,\n}: TldrawUiOrientationProviderProps) {\n\tconst prevContext = useTldrawUiOrientation()\n\t// generally, we want tooltip side to cascade down through the layout - apart from when the\n\t// orientation changes. If the tooltip side is \"bottom\", and then I include some vertical layout\n\t// elements, keeping the tooltip side as bottom will cause the tooltip to overlap elements\n\t// stacked on top of each other. In the absence of a tooltip side, we pick a default side based\n\t// on the orientation whenever the orientation changes.\n\tconst tooltipSideToUse =\n\t\ttooltipSide ??\n\t\t(orientation === prevContext.orientation\n\t\t\t? prevContext.tooltipSide\n\t\t\t: orientation === 'horizontal'\n\t\t\t\t? 'bottom'\n\t\t\t\t: 'right')\n\n\treturn (\n\t\t<TldrawUiOrientationContext.Provider value={{ orientation, tooltipSide: tooltipSideToUse }}>\n\t\t\t{children}\n\t\t</TldrawUiOrientationContext.Provider>\n\t)\n}\n\n/** @public */\nexport function useTldrawUiOrientation() {\n\treturn useContext(TldrawUiOrientationContext)\n}\n\n/** @public */\nexport interface TLUiLayoutProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode\n\ttooltipSide?: 'top' | 'right' | 'bottom' | 'left'\n\tasChild?: boolean\n}\n\n/**\n * A row, usually of UI controls like buttons, select dropdown, checkboxes, etc.\n *\n * @public @react\n */\nexport const TldrawUiRow = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"horizontal\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-row', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n\n/**\n * A column, usually of UI controls like buttons, select dropdown, checkboxes, etc.\n *\n * @public @react\n */\nexport const TldrawUiColumn = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"vertical\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-column', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n\n/**\n * A tight grid 4 elements wide, usually of UI controls like buttons, select dropdown, checkboxes,\n * etc.\n *\n * @public @react */\nexport const TldrawUiGrid = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"horizontal\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-grid', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n"],
5
+ "mappings": "AA0CE;AA1CF,OAAO,gBAAgB;AACvB,SAAS,YAAY;AACrB,SAAoC,eAAe,YAAY,kBAAkB;AAQjF,MAAM,6BAA6B,cAA0C;AAAA,EAC5E,aAAa;AAAA,EACb,aAAa;AACd,CAAC;AASM,SAAS,4BAA4B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACD,GAAqC;AACpC,QAAM,cAAc,uBAAuB;AAM3C,QAAM,mBACL,gBACC,gBAAgB,YAAY,cAC1B,YAAY,cACZ,gBAAgB,eACf,WACA;AAEL,SACC,oBAAC,2BAA2B,UAA3B,EAAoC,OAAO,EAAE,aAAa,aAAa,iBAAiB,GACvF,UACF;AAEF;AAGO,SAAS,yBAAyB;AACxC,SAAO,WAAW,0BAA0B;AAC7C;AAcO,MAAM,cAAc;AAAA,EAC1B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,cAAa,aACrD,8BAAC,aAAU,KAAU,WAAW,WAAW,YAAY,SAAS,GAAI,GAAG,OAAO,GAC/E;AAAA,EAEF;AACD;AAOO,MAAM,iBAAiB;AAAA,EAC7B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,YAAW,aACnD,8BAAC,aAAU,KAAU,WAAW,WAAW,eAAe,SAAS,GAAI,GAAG,OAAO,GAClF;AAAA,EAEF;AACD;AAOO,MAAM,eAAe;AAAA,EAC3B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,cAAa,aACrD,8BAAC,aAAU,KAAU,WAAW,WAAW,aAAa,SAAS,GAAI,GAAG,OAAO,GAChF;AAAA,EAEF;AACD;",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx"],
4
- "sourcesContent": ["import { createContext, useContext } from 'react'\nimport { TLUiEventSource } from '../../../context/events'\n\n/** @public */\nexport type TLUiMenuContextType =\n\t| 'panel'\n\t| 'menu'\n\t| 'small-icons'\n\t| 'context-menu'\n\t| 'icons'\n\t| 'keyboard-shortcuts'\n\t| 'helper-buttons'\n\t| 'toolbar'\n\t| 'toolbar-overflow'\n\nconst menuContext = createContext<{\n\ttype: TLUiMenuContextType\n\tsourceId: TLUiEventSource\n} | null>(null)\n\n/** @public */\nexport function useTldrawUiMenuContext() {\n\tconst context = useContext(menuContext)\n\tif (!context) {\n\t\tthrow new Error('useTldrawUiMenuContext must be used within a TldrawUiMenuContextProvider')\n\t}\n\treturn context\n}\n\n/** @public */\nexport interface TLUiMenuContextProviderProps {\n\ttype: TLUiMenuContextType\n\tsourceId: TLUiEventSource\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiMenuContextProvider({\n\ttype,\n\tsourceId,\n\tchildren,\n}: TLUiMenuContextProviderProps) {\n\treturn <menuContext.Provider value={{ type, sourceId }}>{children}</menuContext.Provider>\n}\n"],
5
- "mappings": "AA0CQ;AA1CR,SAAS,eAAe,kBAAkB;AAe1C,MAAM,cAAc,cAGV,IAAI;AAGP,SAAS,yBAAyB;AACxC,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC3F;AACA,SAAO;AACR;AAUO,SAAS,4BAA4B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACD,GAAiC;AAChC,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,MAAM,SAAS,GAAI,UAAS;AACnE;",
4
+ "sourcesContent": ["import { createContext, useContext } from 'react'\nimport { TLUiEventSource } from '../../../context/events'\n\n/** @public */\nexport type TLUiMenuContextType =\n\t| 'menu'\n\t| 'small-icons'\n\t| 'context-menu'\n\t| 'icons'\n\t| 'keyboard-shortcuts'\n\t| 'helper-buttons'\n\t| 'toolbar'\n\t| 'toolbar-overflow'\n\nconst menuContext = createContext<{\n\ttype: TLUiMenuContextType\n\tsourceId: TLUiEventSource\n} | null>(null)\n\n/** @public */\nexport function useTldrawUiMenuContext() {\n\tconst context = useContext(menuContext)\n\tif (!context) {\n\t\tthrow new Error('useTldrawUiMenuContext must be used within a TldrawUiMenuContextProvider')\n\t}\n\treturn context\n}\n\n/** @public */\nexport interface TLUiMenuContextProviderProps {\n\ttype: TLUiMenuContextType\n\tsourceId: TLUiEventSource\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiMenuContextProvider({\n\ttype,\n\tsourceId,\n\tchildren,\n}: TLUiMenuContextProviderProps) {\n\treturn <menuContext.Provider value={{ type, sourceId }}>{children}</menuContext.Provider>\n}\n"],
5
+ "mappings": "AAyCQ;AAzCR,SAAS,eAAe,kBAAkB;AAc1C,MAAM,cAAc,cAGV,IAAI;AAGP,SAAS,yBAAyB;AACxC,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC3F;AACA,SAAO;AACR;AAUO,SAAS,4BAA4B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACD,GAAiC;AAChC,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,MAAM,SAAS,GAAI,UAAS;AACnE;",
6
6
  "names": []
7
7
  }
@@ -2,44 +2,57 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import classNames from "classnames";
3
3
  import { unwrapLabel } from "../../../context/actions.mjs";
4
4
  import { useTranslation } from "../../../hooks/useTranslation/useTranslation.mjs";
5
+ import { TldrawUiColumn, TldrawUiGrid, TldrawUiRow, useTldrawUiOrientation } from "../layout.mjs";
5
6
  import { TldrawUiDropdownMenuGroup } from "../TldrawUiDropdownMenu.mjs";
6
7
  import { useTldrawUiMenuContext } from "./TldrawUiMenuContext.mjs";
7
8
  function TldrawUiMenuGroup({ id, label, className, children }) {
8
- const { type: menuType, sourceId } = useTldrawUiMenuContext();
9
+ const menu = useTldrawUiMenuContext();
10
+ const { orientation } = useTldrawUiOrientation();
9
11
  const msg = useTranslation();
10
- const labelToUse = unwrapLabel(label, menuType);
12
+ const labelToUse = unwrapLabel(label, menu.type);
11
13
  const labelStr = labelToUse ? msg(labelToUse) : void 0;
12
- switch (menuType) {
13
- case "panel": {
14
+ switch (menu.type) {
15
+ case "menu": {
14
16
  return /* @__PURE__ */ jsx(
15
- "div",
17
+ TldrawUiDropdownMenuGroup,
16
18
  {
17
- className: classNames("tlui-menu__group", className),
18
- "data-testid": `${sourceId}-group.${id}`,
19
+ className,
20
+ "data-testid": `${menu.sourceId}-group.${id}`,
19
21
  children
20
22
  }
21
23
  );
22
24
  }
23
- case "menu": {
24
- return /* @__PURE__ */ jsx(TldrawUiDropdownMenuGroup, { className, "data-testid": `${sourceId}-group.${id}`, children });
25
- }
26
25
  case "context-menu": {
27
26
  return /* @__PURE__ */ jsx(
28
27
  "div",
29
28
  {
30
29
  dir: "ltr",
31
30
  className: classNames("tlui-menu__group", className),
32
- "data-testid": `${sourceId}-group.${id}`,
31
+ "data-testid": `${menu.sourceId}-group.${id}`,
33
32
  children
34
33
  }
35
34
  );
36
35
  }
37
36
  case "keyboard-shortcuts": {
38
- return /* @__PURE__ */ jsxs("div", { className: "tlui-shortcuts-dialog__group", "data-testid": `${sourceId}-group.${id}`, children: [
37
+ return /* @__PURE__ */ jsxs("div", { className: "tlui-shortcuts-dialog__group", "data-testid": `${menu.sourceId}-group.${id}`, children: [
39
38
  /* @__PURE__ */ jsx("h2", { className: "tlui-shortcuts-dialog__group__title", children: labelStr }),
40
39
  /* @__PURE__ */ jsx("div", { className: "tlui-shortcuts-dialog__group__content", children })
41
40
  ] });
42
41
  }
42
+ case "toolbar": {
43
+ const Layout = orientation === "horizontal" ? TldrawUiRow : TldrawUiColumn;
44
+ return /* @__PURE__ */ jsx(Layout, { className: "tlui-main-toolbar__group", "data-testid": `${menu.sourceId}-group.${id}`, children });
45
+ }
46
+ case "toolbar-overflow": {
47
+ return /* @__PURE__ */ jsx(
48
+ TldrawUiGrid,
49
+ {
50
+ className: "tlui-main-toolbar__group",
51
+ "data-testid": `${menu.sourceId}-group.${id}`,
52
+ children
53
+ }
54
+ );
55
+ }
43
56
  default: {
44
57
  return children;
45
58
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx"],
4
- "sourcesContent": ["import classNames from 'classnames'\nimport { ReactNode } from 'react'\nimport { unwrapLabel } from '../../../context/actions'\nimport { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../../../hooks/useTranslation/useTranslation'\nimport { TldrawUiDropdownMenuGroup } from '../TldrawUiDropdownMenu'\nimport { useTldrawUiMenuContext } from './TldrawUiMenuContext'\n\n/** @public */\nexport interface TLUiMenuGroupProps<TranslationKey extends string = string> {\n\tid: string\n\t/**\n\t * The label to display on the item. If it's a string, it will be translated. If it's an object, the keys will be used as the language keys and the values will be translated.\n\t */\n\tlabel?: TranslationKey | { [key: string]: TranslationKey }\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGroupProps) {\n\tconst { type: menuType, sourceId } = useTldrawUiMenuContext()\n\tconst msg = useTranslation()\n\tconst labelToUse = unwrapLabel(label, menuType)\n\tconst labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined\n\n\tswitch (menuType) {\n\t\tcase 'panel': {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={classNames('tlui-menu__group', className)}\n\t\t\t\t\tdata-testid={`${sourceId}-group.${id}`}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'menu': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiDropdownMenuGroup className={className} data-testid={`${sourceId}-group.${id}`}>\n\t\t\t\t\t{children}\n\t\t\t\t</TldrawUiDropdownMenuGroup>\n\t\t\t)\n\t\t}\n\t\tcase 'context-menu': {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\tclassName={classNames('tlui-menu__group', className)}\n\t\t\t\t\tdata-testid={`${sourceId}-group.${id}`}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'keyboard-shortcuts': {\n\t\t\t// todo: if groups need a label, let's give em a label\n\t\t\treturn (\n\t\t\t\t<div className=\"tlui-shortcuts-dialog__group\" data-testid={`${sourceId}-group.${id}`}>\n\t\t\t\t\t<h2 className=\"tlui-shortcuts-dialog__group__title\">{labelStr}</h2>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__group__content\">{children}</div>\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tdefault: {\n\t\t\treturn children\n\t\t}\n\t}\n}\n"],
5
- "mappings": "AA6BI,cA6BA,YA7BA;AA7BJ,OAAO,gBAAgB;AAEvB,SAAS,mBAAmB;AAE5B,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAC1C,SAAS,8BAA8B;AAchC,SAAS,kBAAkB,EAAE,IAAI,OAAO,WAAW,SAAS,GAAuB;AACzF,QAAM,EAAE,MAAM,UAAU,SAAS,IAAI,uBAAuB;AAC5D,QAAM,MAAM,eAAe;AAC3B,QAAM,aAAa,YAAY,OAAO,QAAQ;AAC9C,QAAM,WAAW,aAAa,IAAI,UAAgC,IAAI;AAEtE,UAAQ,UAAU;AAAA,IACjB,KAAK,SAAS;AACb,aACC;AAAA,QAAC;AAAA;AAAA,UACA,WAAW,WAAW,oBAAoB,SAAS;AAAA,UACnD,eAAa,GAAG,QAAQ,UAAU,EAAE;AAAA,UAEnC;AAAA;AAAA,MACF;AAAA,IAEF;AAAA,IACA,KAAK,QAAQ;AACZ,aACC,oBAAC,6BAA0B,WAAsB,eAAa,GAAG,QAAQ,UAAU,EAAE,IACnF,UACF;AAAA,IAEF;AAAA,IACA,KAAK,gBAAgB;AACpB,aACC;AAAA,QAAC;AAAA;AAAA,UACA,KAAI;AAAA,UACJ,WAAW,WAAW,oBAAoB,SAAS;AAAA,UACnD,eAAa,GAAG,QAAQ,UAAU,EAAE;AAAA,UAEnC;AAAA;AAAA,MACF;AAAA,IAEF;AAAA,IACA,KAAK,sBAAsB;AAE1B,aACC,qBAAC,SAAI,WAAU,gCAA+B,eAAa,GAAG,QAAQ,UAAU,EAAE,IACjF;AAAA,4BAAC,QAAG,WAAU,uCAAuC,oBAAS;AAAA,QAC9D,oBAAC,SAAI,WAAU,yCAAyC,UAAS;AAAA,SAClE;AAAA,IAEF;AAAA,IACA,SAAS;AACR,aAAO;AAAA,IACR;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["import classNames from 'classnames'\nimport { ReactNode } from 'react'\nimport { unwrapLabel } from '../../../context/actions'\nimport { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../../../hooks/useTranslation/useTranslation'\nimport { TldrawUiColumn, TldrawUiGrid, TldrawUiRow, useTldrawUiOrientation } from '../layout'\nimport { TldrawUiDropdownMenuGroup } from '../TldrawUiDropdownMenu'\nimport { useTldrawUiMenuContext } from './TldrawUiMenuContext'\n\n/** @public */\nexport interface TLUiMenuGroupProps<TranslationKey extends string = string> {\n\tid: string\n\t/**\n\t * The label to display on the item. If it's a string, it will be translated. If it's an object, the keys will be used as the language keys and the values will be translated.\n\t */\n\tlabel?: TranslationKey | { [key: string]: TranslationKey }\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGroupProps) {\n\tconst menu = useTldrawUiMenuContext()\n\tconst { orientation } = useTldrawUiOrientation()\n\tconst msg = useTranslation()\n\tconst labelToUse = unwrapLabel(label, menu.type)\n\tconst labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined\n\n\tswitch (menu.type) {\n\t\tcase 'menu': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiDropdownMenuGroup\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tdata-testid={`${menu.sourceId}-group.${id}`}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</TldrawUiDropdownMenuGroup>\n\t\t\t)\n\t\t}\n\t\tcase 'context-menu': {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\tclassName={classNames('tlui-menu__group', className)}\n\t\t\t\t\tdata-testid={`${menu.sourceId}-group.${id}`}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'keyboard-shortcuts': {\n\t\t\t// todo: if groups need a label, let's give em a label\n\t\t\treturn (\n\t\t\t\t<div className=\"tlui-shortcuts-dialog__group\" data-testid={`${menu.sourceId}-group.${id}`}>\n\t\t\t\t\t<h2 className=\"tlui-shortcuts-dialog__group__title\">{labelStr}</h2>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__group__content\">{children}</div>\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar': {\n\t\t\tconst Layout = orientation === 'horizontal' ? TldrawUiRow : TldrawUiColumn\n\t\t\treturn (\n\t\t\t\t<Layout className=\"tlui-main-toolbar__group\" data-testid={`${menu.sourceId}-group.${id}`}>\n\t\t\t\t\t{children}\n\t\t\t\t</Layout>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar-overflow': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiGrid\n\t\t\t\t\tclassName=\"tlui-main-toolbar__group\"\n\t\t\t\t\tdata-testid={`${menu.sourceId}-group.${id}`}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</TldrawUiGrid>\n\t\t\t)\n\t\t}\n\t\tdefault: {\n\t\t\treturn children\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "AA+BI,cAsBA,YAtBA;AA/BJ,OAAO,gBAAgB;AAEvB,SAAS,mBAAmB;AAE5B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB,cAAc,aAAa,8BAA8B;AAClF,SAAS,iCAAiC;AAC1C,SAAS,8BAA8B;AAchC,SAAS,kBAAkB,EAAE,IAAI,OAAO,WAAW,SAAS,GAAuB;AACzF,QAAM,OAAO,uBAAuB;AACpC,QAAM,EAAE,YAAY,IAAI,uBAAuB;AAC/C,QAAM,MAAM,eAAe;AAC3B,QAAM,aAAa,YAAY,OAAO,KAAK,IAAI;AAC/C,QAAM,WAAW,aAAa,IAAI,UAAgC,IAAI;AAEtE,UAAQ,KAAK,MAAM;AAAA,IAClB,KAAK,QAAQ;AACZ,aACC;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,eAAa,GAAG,KAAK,QAAQ,UAAU,EAAE;AAAA,UAExC;AAAA;AAAA,MACF;AAAA,IAEF;AAAA,IACA,KAAK,gBAAgB;AACpB,aACC;AAAA,QAAC;AAAA;AAAA,UACA,KAAI;AAAA,UACJ,WAAW,WAAW,oBAAoB,SAAS;AAAA,UACnD,eAAa,GAAG,KAAK,QAAQ,UAAU,EAAE;AAAA,UAExC;AAAA;AAAA,MACF;AAAA,IAEF;AAAA,IACA,KAAK,sBAAsB;AAE1B,aACC,qBAAC,SAAI,WAAU,gCAA+B,eAAa,GAAG,KAAK,QAAQ,UAAU,EAAE,IACtF;AAAA,4BAAC,QAAG,WAAU,uCAAuC,oBAAS;AAAA,QAC9D,oBAAC,SAAI,WAAU,yCAAyC,UAAS;AAAA,SAClE;AAAA,IAEF;AAAA,IACA,KAAK,WAAW;AACf,YAAM,SAAS,gBAAgB,eAAe,cAAc;AAC5D,aACC,oBAAC,UAAO,WAAU,4BAA2B,eAAa,GAAG,KAAK,QAAQ,UAAU,EAAE,IACpF,UACF;AAAA,IAEF;AAAA,IACA,KAAK,oBAAoB;AACxB,aACC;AAAA,QAAC;AAAA;AAAA,UACA,WAAU;AAAA,UACV,eAAa,GAAG,KAAK,QAAQ,UAAU,EAAE;AAAA,UAExC;AAAA;AAAA,MACF;AAAA,IAEF;AAAA,IACA,SAAS;AACR,aAAO;AAAA,IACR;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }