tldraw 3.16.0-canary.f60032f16651 → 3.16.0-canary.fa03b5a9ad13

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 (533) hide show
  1. package/dist-cjs/index.d.ts +412 -112
  2. package/dist-cjs/index.js +49 -14
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/Tldraw.js +12 -2
  5. package/dist-cjs/lib/Tldraw.js.map +2 -2
  6. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  7. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +15 -4
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/arrow-types.js.map +1 -1
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +6 -0
  14. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
  15. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +3 -2
  16. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  17. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  18. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  19. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +1 -1
  20. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  21. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +4 -4
  22. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  24. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  25. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  26. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  27. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -13
  28. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  30. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  31. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +8 -2
  32. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  33. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +3 -2
  34. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  36. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  37. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  38. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  40. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  42. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  44. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  45. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
  46. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  47. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  48. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  49. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  50. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  51. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -5
  53. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  55. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  57. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  58. package/dist-cjs/lib/shapes/text/PlainTextArea.js +3 -2
  59. package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
  60. package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
  61. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  62. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  63. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  64. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  65. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  66. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  67. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  68. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  69. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  70. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +3 -1
  71. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  72. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  73. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  74. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  75. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/A11y.js +1 -1
  77. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  79. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  80. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  81. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  83. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  84. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  85. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  86. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  87. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  88. package/dist-cjs/lib/ui/components/LanguageMenu.js +1 -0
  89. package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
  90. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  91. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  92. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +2 -1
  93. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  95. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  96. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  97. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  98. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  99. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  100. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +3 -2
  101. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  102. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  103. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  104. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  105. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  106. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +11 -4
  107. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  108. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +249 -279
  109. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  110. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +147 -0
  111. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  112. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  113. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  114. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
  115. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  116. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
  117. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  118. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  119. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  120. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +2 -0
  121. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  122. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  123. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  124. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  125. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  126. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  127. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  128. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +2 -1
  129. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  130. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  131. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  132. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +10 -5
  133. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  134. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  135. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  136. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
  137. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +5 -3
  139. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  140. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  141. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  142. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +18 -5
  143. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  144. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +33 -7
  145. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  146. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +306 -0
  147. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  148. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  149. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  150. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +3 -0
  151. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  152. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  153. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  154. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  155. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +19 -33
  156. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  157. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  158. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  159. package/dist-cjs/lib/ui/context/actions.js +44 -10
  160. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  161. package/dist-cjs/lib/ui/context/components.js +2 -0
  162. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  163. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  164. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  165. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  166. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  167. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  168. package/dist-cjs/lib/ui/hooks/useTools.js +22 -4
  169. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  171. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +8 -1
  172. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  173. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  174. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  175. package/dist-cjs/lib/ui/version.js +3 -3
  176. package/dist-cjs/lib/ui/version.js.map +1 -1
  177. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  178. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  179. package/dist-cjs/lib/utils/export/export.js +0 -20
  180. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  181. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  182. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  183. package/dist-esm/index.d.mts +412 -112
  184. package/dist-esm/index.mjs +91 -29
  185. package/dist-esm/index.mjs.map +2 -2
  186. package/dist-esm/lib/Tldraw.mjs +14 -4
  187. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  188. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  189. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  190. package/dist-esm/lib/defaultExternalContentHandlers.mjs +15 -4
  191. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  192. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  193. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  194. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  195. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  196. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +3 -2
  197. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  198. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  199. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  200. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +1 -1
  201. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  202. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +4 -5
  203. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  204. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  205. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  206. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  207. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  208. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -13
  209. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  210. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  211. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  212. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +9 -3
  213. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +4 -2
  215. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  217. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  218. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  219. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  221. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  223. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  225. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
  227. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  229. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  231. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  233. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +3 -6
  234. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  235. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  236. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  237. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  238. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  239. package/dist-esm/lib/shapes/text/PlainTextArea.mjs +4 -3
  240. package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
  241. package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
  242. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  243. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  244. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  246. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  247. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  248. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  249. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  250. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  251. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +3 -1
  252. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  253. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  254. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  255. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  256. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  257. package/dist-esm/lib/ui/components/A11y.mjs +1 -2
  258. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  259. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  260. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  261. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  262. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  263. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  264. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  265. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  266. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  267. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  268. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  269. package/dist-esm/lib/ui/components/LanguageMenu.mjs +1 -0
  270. package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
  271. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  272. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  273. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +2 -1
  274. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  275. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  276. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  277. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  278. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  279. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  280. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  281. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +3 -3
  282. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  284. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  286. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +16 -5
  288. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +251 -283
  290. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  291. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +135 -0
  292. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  293. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  294. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  295. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
  296. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  297. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
  298. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  299. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  300. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  301. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +2 -0
  302. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  303. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  304. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  305. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  306. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  307. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  308. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +2 -1
  310. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  311. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  312. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  313. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +10 -5
  314. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  316. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  317. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +11 -3
  318. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +6 -4
  320. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  322. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  323. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +18 -5
  324. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  325. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +33 -7
  326. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  327. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +284 -0
  328. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  329. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  330. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  331. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +3 -0
  332. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  333. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  335. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +19 -33
  337. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  338. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  339. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  340. package/dist-esm/lib/ui/context/actions.mjs +44 -10
  341. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  342. package/dist-esm/lib/ui/context/components.mjs +2 -0
  343. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  344. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  345. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +1 -2
  346. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  347. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  348. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  349. package/dist-esm/lib/ui/hooks/useTools.mjs +23 -4
  350. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  351. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +8 -1
  352. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  353. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  354. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  355. package/dist-esm/lib/ui/version.mjs +3 -3
  356. package/dist-esm/lib/ui/version.mjs.map +1 -1
  357. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  358. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  359. package/dist-esm/lib/utils/export/export.mjs +0 -20
  360. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  361. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  362. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  363. package/package.json +11 -34
  364. package/src/index.ts +69 -22
  365. package/src/lib/Tldraw.tsx +15 -2
  366. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  367. package/src/lib/defaultExternalContentHandlers.ts +26 -4
  368. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +85 -14
  369. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +103 -8
  370. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +48 -6
  371. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  372. package/src/lib/shapes/arrow/arrow-types.ts +3 -5
  373. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  374. package/src/lib/shapes/arrow/arrowTargetState.ts +34 -3
  375. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  376. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +1 -1
  377. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +4 -5
  378. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  379. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  380. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  381. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -14
  382. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  383. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +10 -3
  384. package/src/lib/shapes/geo/GeoShapeUtil.tsx +4 -2
  385. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  386. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  387. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  388. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  389. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  390. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  391. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  392. package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
  393. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  394. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  395. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  396. package/src/lib/shapes/shared/useEditablePlainText.ts +3 -10
  397. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  398. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  399. package/src/lib/shapes/text/PlainTextArea.tsx +4 -3
  400. package/src/lib/shapes/text/RichTextArea.tsx +3 -4
  401. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  402. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  403. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  404. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  405. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  406. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +6 -2
  407. package/src/lib/ui/TldrawUi.tsx +33 -12
  408. package/src/lib/ui/assetUrls.ts +13 -10
  409. package/src/lib/ui/components/A11y.tsx +1 -2
  410. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  411. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  412. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  413. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  414. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  415. package/src/lib/ui/components/LanguageMenu.tsx +1 -0
  416. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  417. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +2 -1
  418. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  419. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  420. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  421. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +4 -4
  422. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  423. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  424. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +28 -12
  425. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +261 -343
  426. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +73 -50
  427. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  428. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
  429. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  430. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  431. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -0
  432. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  433. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  434. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  435. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +1 -0
  436. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  437. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +21 -11
  438. package/src/lib/ui/components/menu-items.tsx +8 -0
  439. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +7 -3
  440. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +6 -3
  441. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  442. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +52 -32
  443. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +55 -12
  444. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +379 -0
  445. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  446. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
  447. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  448. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  449. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +27 -36
  450. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  451. package/src/lib/ui/context/actions.tsx +51 -10
  452. package/src/lib/ui/context/components.tsx +3 -0
  453. package/src/lib/ui/context/events.tsx +2 -1
  454. package/src/lib/ui/hooks/useClipboardEvents.ts +1 -2
  455. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  456. package/src/lib/ui/hooks/useTools.tsx +26 -4
  457. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +7 -0
  458. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +8 -1
  459. package/src/lib/ui/kbd-utils.ts +10 -3
  460. package/src/lib/ui/version.ts +3 -3
  461. package/src/lib/ui.css +448 -294
  462. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  463. package/src/lib/utils/export/copyAs.ts +1 -24
  464. package/src/lib/utils/export/export.ts +0 -36
  465. package/src/lib/utils/export/exportAs.ts +1 -32
  466. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  467. package/src/test/A11y.test.tsx +3 -2
  468. package/src/test/ClickManager.test.ts +7 -6
  469. package/src/test/Editor.test.tsx +20 -19
  470. package/src/test/EraserTool.test.ts +184 -13
  471. package/src/test/HandTool.test.ts +10 -9
  472. package/src/test/HighlightShape.test.ts +2 -1
  473. package/src/test/SelectTool.test.ts +3 -2
  474. package/src/test/TLUserPreferences.test.ts +4 -3
  475. package/src/test/TestEditor.ts +21 -17
  476. package/src/test/TldrawEditor.test.tsx +11 -10
  477. package/src/test/ZoomTool.test.ts +7 -6
  478. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  479. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  480. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  481. package/src/test/arrows-megabus.test.tsx +5 -4
  482. package/src/test/bindings.test.tsx +24 -37
  483. package/src/test/bookmark-shapes.test.ts +1 -8
  484. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  485. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  486. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  487. package/src/test/commands/alignShapes.test.tsx +25 -24
  488. package/src/test/commands/animationSpeed.test.ts +2 -1
  489. package/src/test/commands/centerOnPoint.test.ts +3 -2
  490. package/src/test/commands/clipboard.test.ts +3 -2
  491. package/src/test/commands/createShapes.test.ts +2 -1
  492. package/src/test/commands/deleteShapes.test.ts +2 -1
  493. package/src/test/commands/distributeShapes.test.tsx +11 -10
  494. package/src/test/commands/getSvgString.test.ts +2 -1
  495. package/src/test/commands/packShapes.test.ts +5 -4
  496. package/src/test/commands/resizeShape.test.ts +2 -1
  497. package/src/test/commands/rotateShapes.test.ts +7 -6
  498. package/src/test/commands/setCamera.test.ts +4 -3
  499. package/src/test/commands/setCurrentPage.test.ts +3 -2
  500. package/src/test/commands/stackShapes.test.ts +11 -10
  501. package/src/test/commands/stretch.test.tsx +13 -12
  502. package/src/test/createDeepLink.test.tsx +2 -1
  503. package/src/test/cropping.test.ts +3 -2
  504. package/src/test/custom-clipping.test.ts +436 -0
  505. package/src/test/drawing.test.ts +2 -1
  506. package/src/test/flipShapes.test.ts +4 -3
  507. package/src/test/frames.test.ts +40 -24
  508. package/src/test/getCulledShapes.test.tsx +74 -4
  509. package/src/test/groups.test.tsx +1 -1
  510. package/src/test/handleDeepLink.test.tsx +2 -1
  511. package/src/test/maxShapes.test.ts +3 -2
  512. package/src/test/modifiers.test.ts +5 -4
  513. package/src/test/navigation.test.ts +12 -11
  514. package/src/test/panning.test.ts +2 -1
  515. package/src/test/perf/perf.test.ts +2 -1
  516. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  517. package/src/test/resizing.test.ts +39 -38
  518. package/src/test/select.test.tsx +4 -3
  519. package/src/test/selection-omnibus.test.ts +11 -10
  520. package/src/test/shapeutils.test.ts +4 -3
  521. package/src/test/translating.test.ts +9 -8
  522. package/tldraw.css +756 -584
  523. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  524. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  525. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  526. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -142
  527. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  528. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  529. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  530. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  531. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  532. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  533. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
@@ -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
  }
@@ -19,6 +19,7 @@ import { TldrawUiButtonLabel } from "../Button/TldrawUiButtonLabel.mjs";
19
19
  import { TldrawUiDropdownMenuItem } from "../TldrawUiDropdownMenu.mjs";
20
20
  import { TldrawUiKbd } from "../TldrawUiKbd.mjs";
21
21
  import { TldrawUiToolbarButton } from "../TldrawUiToolbar.mjs";
22
+ import { tooltipManager } from "../TldrawUiTooltip.mjs";
22
23
  import { useTldrawUiMenuContext } from "./TldrawUiMenuContext.mjs";
23
24
  function TldrawUiMenuItem({
24
25
  disabled = false,
@@ -51,7 +52,6 @@ function TldrawUiMenuItem({
51
52
  type: "menu",
52
53
  "data-testid": `${sourceId}.${id}`,
53
54
  disabled,
54
- title: titleStr,
55
55
  onClick: (e) => {
56
56
  if (noClose) {
57
57
  preventDefault(e);
@@ -76,7 +76,6 @@ function TldrawUiMenuItem({
76
76
  _ContextMenu.Item,
77
77
  {
78
78
  dir: "ltr",
79
- title: titleStr,
80
79
  draggable: false,
81
80
  className: "tlui-button tlui-button__menu",
82
81
  "data-testid": `${sourceId}.${id}`,
@@ -97,22 +96,6 @@ function TldrawUiMenuItem({
97
96
  }
98
97
  );
99
98
  }
100
- case "panel": {
101
- return /* @__PURE__ */ jsxs(
102
- TldrawUiButton,
103
- {
104
- "data-testid": `${sourceId}.${id}`,
105
- type: "menu",
106
- title: titleStr,
107
- disabled,
108
- onClick: () => onSelect(sourceId),
109
- children: [
110
- /* @__PURE__ */ jsx(TldrawUiButtonLabel, { children: labelStr }),
111
- spinner ? /* @__PURE__ */ jsx(Spinner, {}) : icon && /* @__PURE__ */ jsx(TldrawUiButtonIcon, { icon })
112
- ]
113
- }
114
- );
115
- }
116
99
  case "small-icons":
117
100
  case "icons": {
118
101
  return /* @__PURE__ */ jsx(
@@ -154,7 +137,7 @@ function TldrawUiMenuItem({
154
137
  icon,
155
138
  onSelect,
156
139
  onDragStart,
157
- labelToUse,
140
+ labelStr,
158
141
  titleStr,
159
142
  disabled,
160
143
  isSelected
@@ -189,7 +172,7 @@ function TldrawUiMenuItem({
189
172
  icon,
190
173
  onSelect,
191
174
  onDragStart,
192
- labelToUse,
175
+ labelStr,
193
176
  titleStr,
194
177
  disabled,
195
178
  isSelected,
@@ -203,7 +186,6 @@ function TldrawUiMenuItem({
203
186
  "aria-label": labelStr,
204
187
  "aria-pressed": isSelected ? "true" : "false",
205
188
  isActive: isSelected,
206
- className: "tlui-button-grid__button",
207
189
  "data-testid": `tools.more.${id}`,
208
190
  "data-value": id,
209
191
  disabled,
@@ -226,35 +208,39 @@ function useDraggableEvents(onDragStart, onSelect) {
226
208
  function handlePointerDown(e) {
227
209
  state = {
228
210
  name: "pointing",
229
- start: editor.inputs.currentPagePoint.clone()
211
+ screenSpaceStart: { x: e.clientX, y: e.clientY }
230
212
  };
231
213
  e.currentTarget.setPointerCapture(e.pointerId);
232
214
  }
233
215
  function handlePointerMove(e) {
234
216
  if (e.isSpecialRedispatchedEvent) return;
235
217
  if (state.name === "pointing") {
236
- const distance = Vec.Dist2(state.start, editor.inputs.currentPagePoint);
237
- if (distance > (editor.getInstanceState().isCoarsePointer ? editor.options.coarseDragDistanceSquared : editor.options.dragDistanceSquared)) {
238
- const start = state.start;
218
+ const distanceSq = Vec.Dist2(state.screenSpaceStart, { x: e.clientX, y: e.clientY });
219
+ if (distanceSq > (editor.getInstanceState().isCoarsePointer ? editor.options.uiCoarseDragDistanceSquared : editor.options.uiDragDistanceSquared)) {
220
+ const screenSpaceStart = state.screenSpaceStart;
239
221
  state = {
240
222
  name: "dragging",
241
- start
223
+ screenSpaceStart
242
224
  };
243
225
  editor.run(() => {
226
+ editor.setCurrentTool("select");
244
227
  editor.dispatch({
245
228
  type: "pointer",
246
229
  target: "canvas",
247
230
  name: "pointer_down",
248
- ...getPointerInfo(e),
249
- point: start
231
+ ...getPointerInfo(editor, e),
232
+ point: screenSpaceStart
250
233
  });
251
234
  editor.selectNone();
252
235
  onDragStart?.("toolbar", {
253
236
  type: "pointer",
254
237
  target: "canvas",
255
238
  name: "pointer_move",
256
- ...getPointerInfo(e)
239
+ ...getPointerInfo(editor, e),
240
+ point: screenSpaceStart
257
241
  });
242
+ tooltipManager.hideAllTooltips();
243
+ editor.getContainer().focus();
258
244
  });
259
245
  }
260
246
  }
@@ -266,7 +252,7 @@ function useDraggableEvents(onDragStart, onSelect) {
266
252
  type: "pointer",
267
253
  target: "canvas",
268
254
  name: "pointer_up",
269
- ...getPointerInfo(e)
255
+ ...getPointerInfo(editor, e)
270
256
  });
271
257
  }
272
258
  function handleClick() {
@@ -288,7 +274,7 @@ function useDraggableEvents(onDragStart, onSelect) {
288
274
  }
289
275
  function DraggableToolbarButton({
290
276
  id,
291
- labelToUse,
277
+ labelStr,
292
278
  titleStr,
293
279
  disabled,
294
280
  isSelected,
@@ -302,7 +288,7 @@ function DraggableToolbarButton({
302
288
  return /* @__PURE__ */ jsx(
303
289
  TldrawUiToolbarButton,
304
290
  {
305
- "aria-label": labelToUse,
291
+ "aria-label": labelStr,
306
292
  "aria-pressed": isSelected ? "true" : "false",
307
293
  isActive: isSelected,
308
294
  className: "tlui-button-grid__button",
@@ -319,7 +305,7 @@ function DraggableToolbarButton({
319
305
  return /* @__PURE__ */ jsx(
320
306
  TldrawUiToolbarButton,
321
307
  {
322
- "aria-label": labelToUse,
308
+ "aria-label": labelStr,
323
309
  "aria-pressed": isSelected ? "true" : "false",
324
310
  "data-testid": `tools.${id}`,
325
311
  "data-value": id,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx"],
4
- "sourcesContent": ["import {\n\texhaustiveSwitchError,\n\tgetPointerInfo,\n\tpreventDefault,\n\tTLPointerEventInfo,\n\tuseEditor,\n\tVec,\n} from '@tldraw/editor'\nimport { ContextMenu as _ContextMenu } from 'radix-ui'\nimport { useMemo, useState } from 'react'\nimport { unwrapLabel } from '../../../context/actions'\nimport { TLUiEventSource } from '../../../context/events'\nimport { useReadonly } from '../../../hooks/useReadonly'\nimport { TLUiToolItem } from '../../../hooks/useTools'\nimport { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../../../hooks/useTranslation/useTranslation'\nimport { kbdStr } from '../../../kbd-utils'\nimport { Spinner } from '../../Spinner'\nimport { TldrawUiButton } from '../Button/TldrawUiButton'\nimport { TldrawUiButtonIcon } from '../Button/TldrawUiButtonIcon'\nimport { TldrawUiButtonLabel } from '../Button/TldrawUiButtonLabel'\nimport { TldrawUiDropdownMenuItem } from '../TldrawUiDropdownMenu'\nimport { TLUiIconJsx } from '../TldrawUiIcon'\nimport { TldrawUiKbd } from '../TldrawUiKbd'\nimport { TldrawUiToolbarButton } from '../TldrawUiToolbar'\nimport { useTldrawUiMenuContext } from './TldrawUiMenuContext'\n\n/** @public */\nexport interface TLUiMenuItemProps<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n> {\n\tid: string\n\t/**\n\t * The icon to display on the item. Icons are only shown in certain menu types.\n\t */\n\ticon?: IconType | TLUiIconJsx\n\t/**\n\t * An icon to display to the left of the menu item.\n\t */\n\ticonLeft?: IconType | TLUiIconJsx\n\t/**\n\t * The keyboard shortcut to display on the item.\n\t */\n\tkbd?: 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\t/**\n\t * If the editor is in readonly mode and the item is not marked as readonlyok, it will not be rendered.\n\t */\n\treadonlyOk?: boolean\n\t/**\n\t * The function to call when the item is clicked.\n\t */\n\tonSelect(source: TLUiEventSource): Promise<void> | void\n\t/**\n\t * Whether this item should be disabled.\n\t */\n\tdisabled?: boolean\n\t/**\n\t * Prevent the menu from closing when the item is clicked\n\t */\n\tnoClose?: boolean\n\t/**\n\t * Whether to show a spinner on the item.\n\t */\n\tspinner?: boolean\n\t/**\n\t * Whether the item is selected.\n\t */\n\tisSelected?: boolean\n\t/**\n\t * The function to call when the item is dragged. If this is provided, the item will be draggable.\n\t */\n\tonDragStart?(source: TLUiEventSource, info: TLPointerEventInfo): void\n}\n\n/** @public @react */\nexport function TldrawUiMenuItem<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n>({\n\tdisabled = false,\n\tspinner = false,\n\treadonlyOk = false,\n\tid,\n\tkbd,\n\tlabel,\n\ticon,\n\ticonLeft,\n\tonSelect,\n\tnoClose,\n\tisSelected,\n\tonDragStart,\n}: TLUiMenuItemProps<TranslationKey, IconType>) {\n\tconst { type: menuType, sourceId } = useTldrawUiMenuContext()\n\n\tconst msg = useTranslation()\n\n\tconst [disableClicks, setDisableClicks] = useState(false)\n\n\tconst isReadonlyMode = useReadonly()\n\tif (isReadonlyMode && !readonlyOk) return null\n\n\tconst labelToUse = unwrapLabel(label, menuType)\n\tconst kbdToUse = kbd ? kbdStr(kbd) : undefined\n\n\tconst labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined\n\tconst titleStr = labelStr && kbdToUse ? `${labelStr} ${kbdToUse}` : labelStr\n\n\tswitch (menuType) {\n\t\tcase 'menu': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiDropdownMenuItem>\n\t\t\t\t\t<TldrawUiButton\n\t\t\t\t\t\ttype=\"menu\"\n\t\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\tif (noClose) {\n\t\t\t\t\t\t\t\tpreventDefault(e)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (disableClicks) {\n\t\t\t\t\t\t\t\tsetDisableClicks(false)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonSelect(sourceId)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}\n\t\t\t\t\t\t<TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>\n\t\t\t\t\t\t{kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}\n\t\t\t\t\t</TldrawUiButton>\n\t\t\t\t</TldrawUiDropdownMenuItem>\n\t\t\t)\n\t\t}\n\t\tcase 'context-menu': {\n\t\t\t// Hide disabled context menu items\n\t\t\tif (disabled) return null\n\n\t\t\treturn (\n\t\t\t\t<_ContextMenu.Item\n\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\tdraggable={false}\n\t\t\t\t\tclassName=\"tlui-button tlui-button__menu\"\n\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\tif (noClose) preventDefault(e)\n\t\t\t\t\t\tif (disableClicks) {\n\t\t\t\t\t\t\tsetDisableClicks(false)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonSelect(sourceId)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"tlui-button__label\" draggable={false}>\n\t\t\t\t\t\t{labelStr}\n\t\t\t\t\t</span>\n\t\t\t\t\t{iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}\n\t\t\t\t\t{kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}\n\t\t\t\t\t{spinner && <Spinner />}\n\t\t\t\t</_ContextMenu.Item>\n\t\t\t)\n\t\t}\n\t\tcase 'panel': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiButton\n\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\ttype=\"menu\"\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect(sourceId)}\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>\n\t\t\t\t\t{spinner ? <Spinner /> : icon && <TldrawUiButtonIcon icon={icon} />}\n\t\t\t\t</TldrawUiButton>\n\t\t\t)\n\t\t}\n\t\tcase 'small-icons':\n\t\tcase 'icons': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\ttype=\"icon\"\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect(sourceId)}\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} small />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tcase 'keyboard-shortcuts': {\n\t\t\tif (!kbd) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Menu item '${label}' isn't shown in the keyboard shortcuts dialog because it doesn't have a keyboard shortcut.`\n\t\t\t\t)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair\" data-testid={`${sourceId}.${id}`}>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair__key\">{labelStr}</div>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair__value\">\n\t\t\t\t\t\t<TldrawUiKbd visibleOnMobileLayout>{kbd}</TldrawUiKbd>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'helper-buttons': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiButton type=\"low\" onClick={() => onSelect(sourceId)}>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t\t<TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>\n\t\t\t\t</TldrawUiButton>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar': {\n\t\t\tif (onDragStart) {\n\t\t\t\treturn (\n\t\t\t\t\t<DraggableToolbarButton\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\tonDragStart={onDragStart}\n\t\t\t\t\t\tlabelToUse={labelToUse}\n\t\t\t\t\t\ttitleStr={titleStr}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\taria-label={labelStr}\n\t\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\t\tdata-testid={`tools.${id}`}\n\t\t\t\t\tdata-value={id}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect('toolbar')}\n\t\t\t\t\tonTouchStart={(e) => {\n\t\t\t\t\t\tpreventDefault(e)\n\t\t\t\t\t\tonSelect('toolbar')\n\t\t\t\t\t}}\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\ttype=\"tool\"\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar-overflow': {\n\t\t\tif (onDragStart) {\n\t\t\t\treturn (\n\t\t\t\t\t<DraggableToolbarButton\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\tonDragStart={onDragStart}\n\t\t\t\t\t\tlabelToUse={labelToUse}\n\t\t\t\t\t\ttitleStr={titleStr}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\toverflow\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\taria-label={labelStr}\n\t\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\t\tisActive={isSelected}\n\t\t\t\t\tclassName=\"tlui-button-grid__button\"\n\t\t\t\t\tdata-testid={`tools.more.${id}`}\n\t\t\t\t\tdata-value={id}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect('toolbar')}\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\ttype=\"icon\"\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tdefault: {\n\t\t\tthrow exhaustiveSwitchError(menuType)\n\t\t}\n\t}\n}\n\nfunction useDraggableEvents(\n\tonDragStart: TLUiToolItem['onDragStart'],\n\tonSelect: TLUiToolItem['onSelect']\n) {\n\tconst editor = useEditor()\n\tconst events = useMemo(() => {\n\t\tlet state = { name: 'idle' } as\n\t\t\t| {\n\t\t\t\t\tname: 'idle'\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'pointing'\n\t\t\t\t\tstart: Vec\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'dragging'\n\t\t\t\t\tstart: Vec\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'dragged'\n\t\t\t }\n\n\t\tfunction handlePointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tstate = {\n\t\t\t\tname: 'pointing',\n\t\t\t\tstart: editor.inputs.currentPagePoint.clone(),\n\t\t\t}\n\n\t\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t\t}\n\n\t\tfunction handlePointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\n\t\t\tif (state.name === 'pointing') {\n\t\t\t\tconst distance = Vec.Dist2(state.start, editor.inputs.currentPagePoint)\n\t\t\t\tif (\n\t\t\t\t\tdistance >\n\t\t\t\t\t(editor.getInstanceState().isCoarsePointer\n\t\t\t\t\t\t? editor.options.coarseDragDistanceSquared\n\t\t\t\t\t\t: editor.options.dragDistanceSquared)\n\t\t\t\t) {\n\t\t\t\t\tconst start = state.start\n\t\t\t\t\tstate = {\n\t\t\t\t\t\tname: 'dragging',\n\t\t\t\t\t\tstart,\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\t// Set origin point\n\t\t\t\t\t\teditor.dispatch({\n\t\t\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t\t\t\tname: 'pointer_down',\n\t\t\t\t\t\t\t...getPointerInfo(e),\n\t\t\t\t\t\t\tpoint: start,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\t// Pointer down potentially selects shapes, so we need to deselect them.\n\t\t\t\t\t\teditor.selectNone()\n\n\t\t\t\t\t\t// start drag\n\t\t\t\t\t\tonDragStart?.('toolbar', {\n\t\t\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t\t\t\tname: 'pointer_move',\n\t\t\t\t\t\t\t...getPointerInfo(e),\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction handlePointerUp(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\n\t\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\n\t\t\teditor.dispatch({\n\t\t\t\ttype: 'pointer',\n\t\t\t\ttarget: 'canvas',\n\t\t\t\tname: 'pointer_up',\n\t\t\t\t...getPointerInfo(e),\n\t\t\t})\n\t\t}\n\n\t\tfunction handleClick() {\n\t\t\tif (state.name === 'dragging' || state.name === 'dragged') {\n\t\t\t\tstate = { name: 'idle' }\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tstate = { name: 'idle' }\n\t\t\tonSelect?.('toolbar')\n\t\t}\n\n\t\treturn {\n\t\t\tonPointerDown: handlePointerDown,\n\t\t\tonPointerMove: handlePointerMove,\n\t\t\tonPointerUp: handlePointerUp,\n\t\t\tonClick: handleClick,\n\t\t}\n\t}, [onDragStart, editor, onSelect])\n\n\treturn events\n}\n\nfunction DraggableToolbarButton({\n\tid,\n\tlabelToUse,\n\ttitleStr,\n\tdisabled,\n\tisSelected,\n\ticon,\n\tonSelect,\n\tonDragStart,\n\toverflow,\n}: {\n\tid: string\n\tdisabled: boolean\n\tlabelToUse?: string\n\ttitleStr?: string\n\tisSelected?: boolean\n\ticon: TLUiMenuItemProps['icon']\n\tonSelect: TLUiMenuItemProps['onSelect']\n\tonDragStart: TLUiMenuItemProps['onDragStart']\n\toverflow?: boolean\n}) {\n\tconst events = useDraggableEvents(onDragStart, onSelect)\n\n\tif (overflow) {\n\t\treturn (\n\t\t\t<TldrawUiToolbarButton\n\t\t\t\taria-label={labelToUse}\n\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\tisActive={isSelected}\n\t\t\t\tclassName=\"tlui-button-grid__button\"\n\t\t\t\tdata-testid={`tools.more.${id}`}\n\t\t\t\tdata-value={id}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttitle={titleStr}\n\t\t\t\ttype=\"icon\"\n\t\t\t\t{...events}\n\t\t\t>\n\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t</TldrawUiToolbarButton>\n\t\t)\n\t}\n\n\treturn (\n\t\t<TldrawUiToolbarButton\n\t\t\taria-label={labelToUse}\n\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\tdata-testid={`tools.${id}`}\n\t\t\tdata-value={id}\n\t\t\tdisabled={disabled}\n\t\t\tonTouchStart={(e) => {\n\t\t\t\tpreventDefault(e)\n\t\t\t\tonSelect('toolbar')\n\t\t\t}}\n\t\t\ttitle={titleStr}\n\t\t\ttype=\"tool\"\n\t\t\t{...events}\n\t\t>\n\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t</TldrawUiToolbarButton>\n\t)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\texhaustiveSwitchError,\n\tgetPointerInfo,\n\tpreventDefault,\n\tTLPointerEventInfo,\n\tuseEditor,\n\tVec,\n\tVecModel,\n} from '@tldraw/editor'\nimport { ContextMenu as _ContextMenu } from 'radix-ui'\nimport { useMemo, useState } from 'react'\nimport { unwrapLabel } from '../../../context/actions'\nimport { TLUiEventSource } from '../../../context/events'\nimport { useReadonly } from '../../../hooks/useReadonly'\nimport { TLUiToolItem } from '../../../hooks/useTools'\nimport { TLUiTranslationKey } from '../../../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../../../hooks/useTranslation/useTranslation'\nimport { kbdStr } from '../../../kbd-utils'\nimport { Spinner } from '../../Spinner'\nimport { TldrawUiButton } from '../Button/TldrawUiButton'\nimport { TldrawUiButtonIcon } from '../Button/TldrawUiButtonIcon'\nimport { TldrawUiButtonLabel } from '../Button/TldrawUiButtonLabel'\nimport { TldrawUiDropdownMenuItem } from '../TldrawUiDropdownMenu'\nimport { TLUiIconJsx } from '../TldrawUiIcon'\nimport { TldrawUiKbd } from '../TldrawUiKbd'\nimport { TldrawUiToolbarButton } from '../TldrawUiToolbar'\nimport { tooltipManager } from '../TldrawUiTooltip'\nimport { useTldrawUiMenuContext } from './TldrawUiMenuContext'\n\n/** @public */\nexport interface TLUiMenuItemProps<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n> {\n\tid: string\n\t/**\n\t * The icon to display on the item. Icons are only shown in certain menu types.\n\t */\n\ticon?: IconType | TLUiIconJsx\n\t/**\n\t * An icon to display to the left of the menu item.\n\t */\n\ticonLeft?: IconType | TLUiIconJsx\n\t/**\n\t * The keyboard shortcut to display on the item.\n\t */\n\tkbd?: 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\t/**\n\t * If the editor is in readonly mode and the item is not marked as readonlyok, it will not be rendered.\n\t */\n\treadonlyOk?: boolean\n\t/**\n\t * The function to call when the item is clicked.\n\t */\n\tonSelect(source: TLUiEventSource): Promise<void> | void\n\t/**\n\t * Whether this item should be disabled.\n\t */\n\tdisabled?: boolean\n\t/**\n\t * Prevent the menu from closing when the item is clicked\n\t */\n\tnoClose?: boolean\n\t/**\n\t * Whether to show a spinner on the item.\n\t */\n\tspinner?: boolean\n\t/**\n\t * Whether the item is selected.\n\t */\n\tisSelected?: boolean\n\t/**\n\t * The function to call when the item is dragged. If this is provided, the item will be draggable.\n\t */\n\tonDragStart?(source: TLUiEventSource, info: TLPointerEventInfo): void\n}\n\n/** @public @react */\nexport function TldrawUiMenuItem<\n\tTranslationKey extends string = string,\n\tIconType extends string = string,\n>({\n\tdisabled = false,\n\tspinner = false,\n\treadonlyOk = false,\n\tid,\n\tkbd,\n\tlabel,\n\ticon,\n\ticonLeft,\n\tonSelect,\n\tnoClose,\n\tisSelected,\n\tonDragStart,\n}: TLUiMenuItemProps<TranslationKey, IconType>) {\n\tconst { type: menuType, sourceId } = useTldrawUiMenuContext()\n\n\tconst msg = useTranslation()\n\n\tconst [disableClicks, setDisableClicks] = useState(false)\n\n\tconst isReadonlyMode = useReadonly()\n\tif (isReadonlyMode && !readonlyOk) return null\n\n\tconst labelToUse = unwrapLabel(label, menuType)\n\tconst kbdToUse = kbd ? kbdStr(kbd) : undefined\n\n\tconst labelStr = labelToUse ? msg(labelToUse as TLUiTranslationKey) : undefined\n\tconst titleStr = labelStr && kbdToUse ? `${labelStr} ${kbdToUse}` : labelStr\n\n\tswitch (menuType) {\n\t\tcase 'menu': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiDropdownMenuItem>\n\t\t\t\t\t<TldrawUiButton\n\t\t\t\t\t\ttype=\"menu\"\n\t\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\tif (noClose) {\n\t\t\t\t\t\t\t\tpreventDefault(e)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (disableClicks) {\n\t\t\t\t\t\t\t\tsetDisableClicks(false)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonSelect(sourceId)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}\n\t\t\t\t\t\t<TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>\n\t\t\t\t\t\t{kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}\n\t\t\t\t\t</TldrawUiButton>\n\t\t\t\t</TldrawUiDropdownMenuItem>\n\t\t\t)\n\t\t}\n\t\tcase 'context-menu': {\n\t\t\t// Hide disabled context menu items\n\t\t\tif (disabled) return null\n\n\t\t\treturn (\n\t\t\t\t<_ContextMenu.Item\n\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\tdraggable={false}\n\t\t\t\t\tclassName=\"tlui-button tlui-button__menu\"\n\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\tif (noClose) preventDefault(e)\n\t\t\t\t\t\tif (disableClicks) {\n\t\t\t\t\t\t\tsetDisableClicks(false)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonSelect(sourceId)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"tlui-button__label\" draggable={false}>\n\t\t\t\t\t\t{labelStr}\n\t\t\t\t\t</span>\n\t\t\t\t\t{iconLeft && <TldrawUiButtonIcon icon={iconLeft} small />}\n\t\t\t\t\t{kbd && <TldrawUiKbd>{kbd}</TldrawUiKbd>}\n\t\t\t\t\t{spinner && <Spinner />}\n\t\t\t\t</_ContextMenu.Item>\n\t\t\t)\n\t\t}\n\t\tcase 'small-icons':\n\t\tcase 'icons': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\tdata-testid={`${sourceId}.${id}`}\n\t\t\t\t\ttype=\"icon\"\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect(sourceId)}\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} small />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tcase 'keyboard-shortcuts': {\n\t\t\tif (!kbd) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Menu item '${label}' isn't shown in the keyboard shortcuts dialog because it doesn't have a keyboard shortcut.`\n\t\t\t\t)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair\" data-testid={`${sourceId}.${id}`}>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair__key\">{labelStr}</div>\n\t\t\t\t\t<div className=\"tlui-shortcuts-dialog__key-pair__value\">\n\t\t\t\t\t\t<TldrawUiKbd visibleOnMobileLayout>{kbd}</TldrawUiKbd>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\t\tcase 'helper-buttons': {\n\t\t\treturn (\n\t\t\t\t<TldrawUiButton type=\"low\" onClick={() => onSelect(sourceId)}>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t\t<TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>\n\t\t\t\t</TldrawUiButton>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar': {\n\t\t\tif (onDragStart) {\n\t\t\t\treturn (\n\t\t\t\t\t<DraggableToolbarButton\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\tonDragStart={onDragStart}\n\t\t\t\t\t\tlabelStr={labelStr}\n\t\t\t\t\t\ttitleStr={titleStr}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\taria-label={labelStr}\n\t\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\t\tdata-testid={`tools.${id}`}\n\t\t\t\t\tdata-value={id}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect('toolbar')}\n\t\t\t\t\tonTouchStart={(e) => {\n\t\t\t\t\t\tpreventDefault(e)\n\t\t\t\t\t\tonSelect('toolbar')\n\t\t\t\t\t}}\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\ttype=\"tool\"\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tcase 'toolbar-overflow': {\n\t\t\tif (onDragStart) {\n\t\t\t\treturn (\n\t\t\t\t\t<DraggableToolbarButton\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\tonDragStart={onDragStart}\n\t\t\t\t\t\tlabelStr={labelStr}\n\t\t\t\t\t\ttitleStr={titleStr}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\toverflow\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<TldrawUiToolbarButton\n\t\t\t\t\taria-label={labelStr}\n\t\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\t\tisActive={isSelected}\n\t\t\t\t\tdata-testid={`tools.more.${id}`}\n\t\t\t\t\tdata-value={id}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => onSelect('toolbar')}\n\t\t\t\t\ttitle={titleStr}\n\t\t\t\t\ttype=\"icon\"\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t\t</TldrawUiToolbarButton>\n\t\t\t)\n\t\t}\n\t\tdefault: {\n\t\t\tthrow exhaustiveSwitchError(menuType)\n\t\t}\n\t}\n}\n\nfunction useDraggableEvents(\n\tonDragStart: TLUiToolItem['onDragStart'],\n\tonSelect: TLUiToolItem['onSelect']\n) {\n\tconst editor = useEditor()\n\tconst events = useMemo(() => {\n\t\tlet state = { name: 'idle' } as\n\t\t\t| {\n\t\t\t\t\tname: 'idle'\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'pointing'\n\t\t\t\t\tscreenSpaceStart: VecModel\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'dragging'\n\t\t\t\t\tscreenSpaceStart: VecModel\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tname: 'dragged'\n\t\t\t }\n\n\t\tfunction handlePointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tstate = {\n\t\t\t\tname: 'pointing',\n\t\t\t\tscreenSpaceStart: { x: e.clientX, y: e.clientY },\n\t\t\t}\n\n\t\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t\t}\n\n\t\tfunction handlePointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\n\t\t\tif (state.name === 'pointing') {\n\t\t\t\tconst distanceSq = Vec.Dist2(state.screenSpaceStart, { x: e.clientX, y: e.clientY })\n\t\t\t\tif (\n\t\t\t\t\tdistanceSq >\n\t\t\t\t\t(editor.getInstanceState().isCoarsePointer\n\t\t\t\t\t\t? editor.options.uiCoarseDragDistanceSquared\n\t\t\t\t\t\t: editor.options.uiDragDistanceSquared)\n\t\t\t\t) {\n\t\t\t\t\tconst screenSpaceStart = state.screenSpaceStart\n\t\t\t\t\tstate = {\n\t\t\t\t\t\tname: 'dragging',\n\t\t\t\t\t\tscreenSpaceStart,\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.setCurrentTool('select')\n\n\t\t\t\t\t\t// Set origin point\n\t\t\t\t\t\teditor.dispatch({\n\t\t\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t\t\t\tname: 'pointer_down',\n\t\t\t\t\t\t\t...getPointerInfo(editor, e),\n\t\t\t\t\t\t\tpoint: screenSpaceStart,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\t// Pointer down potentially selects shapes, so we need to deselect them.\n\t\t\t\t\t\teditor.selectNone()\n\n\t\t\t\t\t\t// start drag\n\t\t\t\t\t\tonDragStart?.('toolbar', {\n\t\t\t\t\t\t\ttype: 'pointer',\n\t\t\t\t\t\t\ttarget: 'canvas',\n\t\t\t\t\t\t\tname: 'pointer_move',\n\t\t\t\t\t\t\t...getPointerInfo(editor, e),\n\t\t\t\t\t\t\tpoint: screenSpaceStart,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\ttooltipManager.hideAllTooltips()\n\t\t\t\t\t\teditor.getContainer().focus()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction handlePointerUp(e: React.PointerEvent<HTMLButtonElement>) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\n\t\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\n\t\t\teditor.dispatch({\n\t\t\t\ttype: 'pointer',\n\t\t\t\ttarget: 'canvas',\n\t\t\t\tname: 'pointer_up',\n\t\t\t\t...getPointerInfo(editor, e),\n\t\t\t})\n\t\t}\n\n\t\tfunction handleClick() {\n\t\t\tif (state.name === 'dragging' || state.name === 'dragged') {\n\t\t\t\tstate = { name: 'idle' }\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tstate = { name: 'idle' }\n\t\t\tonSelect?.('toolbar')\n\t\t}\n\n\t\treturn {\n\t\t\tonPointerDown: handlePointerDown,\n\t\t\tonPointerMove: handlePointerMove,\n\t\t\tonPointerUp: handlePointerUp,\n\t\t\tonClick: handleClick,\n\t\t}\n\t}, [onDragStart, editor, onSelect])\n\n\treturn events\n}\n\nfunction DraggableToolbarButton({\n\tid,\n\tlabelStr,\n\ttitleStr,\n\tdisabled,\n\tisSelected,\n\ticon,\n\tonSelect,\n\tonDragStart,\n\toverflow,\n}: {\n\tid: string\n\tdisabled: boolean\n\tlabelStr?: string\n\ttitleStr?: string\n\tisSelected?: boolean\n\ticon: TLUiMenuItemProps['icon']\n\tonSelect: TLUiMenuItemProps['onSelect']\n\tonDragStart: TLUiMenuItemProps['onDragStart']\n\toverflow?: boolean\n}) {\n\tconst events = useDraggableEvents(onDragStart, onSelect)\n\n\tif (overflow) {\n\t\treturn (\n\t\t\t<TldrawUiToolbarButton\n\t\t\t\taria-label={labelStr}\n\t\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\t\tisActive={isSelected}\n\t\t\t\tclassName=\"tlui-button-grid__button\"\n\t\t\t\tdata-testid={`tools.more.${id}`}\n\t\t\t\tdata-value={id}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttitle={titleStr}\n\t\t\t\ttype=\"icon\"\n\t\t\t\t{...events}\n\t\t\t>\n\t\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t\t</TldrawUiToolbarButton>\n\t\t)\n\t}\n\n\treturn (\n\t\t<TldrawUiToolbarButton\n\t\t\taria-label={labelStr}\n\t\t\taria-pressed={isSelected ? 'true' : 'false'}\n\t\t\tdata-testid={`tools.${id}`}\n\t\t\tdata-value={id}\n\t\t\tdisabled={disabled}\n\t\t\tonTouchStart={(e) => {\n\t\t\t\tpreventDefault(e)\n\t\t\t\tonSelect('toolbar')\n\t\t\t}}\n\t\t\ttitle={titleStr}\n\t\t\ttype=\"tool\"\n\t\t\t{...events}\n\t\t>\n\t\t\t<TldrawUiButtonIcon icon={icon!} />\n\t\t</TldrawUiToolbarButton>\n\t)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { defaultUserPreferences, track, useMaybeEditor } from "@tldraw/editor";
3
3
  import { useDefaultUiAssetUrlsWithOverrides } from "../assetUrls.mjs";
4
+ import { TldrawUiTooltipProvider } from "../components/primitives/TldrawUiTooltip.mjs";
4
5
  import { ToolsProvider } from "../hooks/useTools.mjs";
5
6
  import { TldrawUiTranslationProvider } from "../hooks/useTranslation/useTranslation.mjs";
6
7
  import {
@@ -26,14 +27,14 @@ const TldrawUiContextProvider = track(function TldrawUiContextProvider2({
26
27
  children
27
28
  }) {
28
29
  const editor = useMaybeEditor();
29
- return /* @__PURE__ */ jsx(MimeTypeContext.Provider, { value: mediaMimeTypes, children: /* @__PURE__ */ jsx(AssetUrlsProvider, { assetUrls: useDefaultUiAssetUrlsWithOverrides(assetUrls), children: /* @__PURE__ */ jsx(
30
+ return /* @__PURE__ */ jsx(MimeTypeContext.Provider, { value: mediaMimeTypes, children: /* @__PURE__ */ jsx(TldrawUiTooltipProvider, { children: /* @__PURE__ */ jsx(AssetUrlsProvider, { assetUrls: useDefaultUiAssetUrlsWithOverrides(assetUrls), children: /* @__PURE__ */ jsx(
30
31
  TldrawUiTranslationProvider,
31
32
  {
32
33
  overrides: useMergedTranslationOverrides(overrides),
33
34
  locale: editor?.user.getLocale() ?? defaultUserPreferences.locale,
34
35
  children: /* @__PURE__ */ jsx(TldrawUiEventsProvider, { onEvent: onUiEvent, children: /* @__PURE__ */ jsx(TldrawUiToastsProvider, { children: /* @__PURE__ */ jsx(TldrawUiDialogsProvider, { context: "tla", children: /* @__PURE__ */ jsx(TldrawUiA11yProvider, { children: /* @__PURE__ */ jsx(BreakPointProvider, { forceMobile, children: /* @__PURE__ */ jsx(TldrawUiComponentsProvider, { overrides: components, children: /* @__PURE__ */ jsx(InternalProviders, { overrides, children }) }) }) }) }) }) })
35
36
  }
36
- ) }) });
37
+ ) }) }) });
37
38
  });
38
39
  function InternalProviders({
39
40
  overrides,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/ui/context/TldrawUiContextProvider.tsx"],
4
- "sourcesContent": ["import { RecursivePartial, defaultUserPreferences, track, useMaybeEditor } from '@tldraw/editor'\nimport { ReactNode } from 'react'\nimport { TLUiAssetUrls, useDefaultUiAssetUrlsWithOverrides } from '../assetUrls'\nimport { ToolsProvider } from '../hooks/useTools'\nimport { TldrawUiTranslationProvider } from '../hooks/useTranslation/useTranslation'\nimport {\n\tMimeTypeContext,\n\tTLUiOverrides,\n\tuseMergedOverrides,\n\tuseMergedTranslationOverrides,\n} from '../overrides'\nimport { TldrawUiA11yProvider } from './a11y'\nimport { ActionsProvider } from './actions'\nimport { AssetUrlsProvider } from './asset-urls'\nimport { BreakPointProvider } from './breakpoints'\nimport { TLUiComponents, TldrawUiComponentsProvider } from './components'\nimport { TldrawUiDialogsProvider } from './dialogs'\nimport { TLUiEventHandler, TldrawUiEventsProvider } from './events'\nimport { TldrawUiToastsProvider } from './toasts'\n\n/** @public */\nexport interface TLUiContextProviderProps {\n\t/**\n\t * Urls for where to find fonts and other assets for the UI.\n\t */\n\tassetUrls?: RecursivePartial<TLUiAssetUrls>\n\n\t/**\n\t * Overrides for the UI.\n\t */\n\toverrides?: TLUiOverrides | TLUiOverrides[]\n\n\t/**\n\t * Overrides for the UI components.\n\t */\n\tcomponents?: TLUiComponents\n\n\t/**\n\t * Callback for when an event occurs in the UI.\n\t */\n\tonUiEvent?: TLUiEventHandler\n\n\t/**\n\t * Whether to always should the mobile breakpoints.\n\t */\n\tforceMobile?: boolean\n\n\t/**\n\t * The component's children.\n\t */\n\tchildren?: ReactNode\n\n\t/**\n\t * Supported mime types for media files.\n\t */\n\tmediaMimeTypes?: string[]\n}\n\n/** @public @react */\nexport const TldrawUiContextProvider = track(function TldrawUiContextProvider({\n\toverrides,\n\tcomponents,\n\tassetUrls,\n\tonUiEvent,\n\tforceMobile,\n\tmediaMimeTypes,\n\tchildren,\n}: TLUiContextProviderProps) {\n\t// To allow mounting the sidebar without an editor running, we use a 'maybe' editor here\n\t// The sidebar makes use of toasts and dialogs etc, which typically require an editor to be present\n\t// but we are overriding the providers to allow them to be used without an editor.\n\tconst editor = useMaybeEditor()\n\treturn (\n\t\t<MimeTypeContext.Provider value={mediaMimeTypes}>\n\t\t\t<AssetUrlsProvider assetUrls={useDefaultUiAssetUrlsWithOverrides(assetUrls)}>\n\t\t\t\t<TldrawUiTranslationProvider\n\t\t\t\t\toverrides={useMergedTranslationOverrides(overrides)}\n\t\t\t\t\tlocale={editor?.user.getLocale() ?? defaultUserPreferences.locale}\n\t\t\t\t>\n\t\t\t\t\t<TldrawUiEventsProvider onEvent={onUiEvent}>\n\t\t\t\t\t\t<TldrawUiToastsProvider>\n\t\t\t\t\t\t\t<TldrawUiDialogsProvider context={'tla'}>\n\t\t\t\t\t\t\t\t<TldrawUiA11yProvider>\n\t\t\t\t\t\t\t\t\t<BreakPointProvider forceMobile={forceMobile}>\n\t\t\t\t\t\t\t\t\t\t<TldrawUiComponentsProvider overrides={components}>\n\t\t\t\t\t\t\t\t\t\t\t<InternalProviders overrides={overrides}>{children}</InternalProviders>\n\t\t\t\t\t\t\t\t\t\t</TldrawUiComponentsProvider>\n\t\t\t\t\t\t\t\t\t</BreakPointProvider>\n\t\t\t\t\t\t\t\t</TldrawUiA11yProvider>\n\t\t\t\t\t\t\t</TldrawUiDialogsProvider>\n\t\t\t\t\t\t</TldrawUiToastsProvider>\n\t\t\t\t\t</TldrawUiEventsProvider>\n\t\t\t\t</TldrawUiTranslationProvider>\n\t\t\t</AssetUrlsProvider>\n\t\t</MimeTypeContext.Provider>\n\t)\n})\n\nfunction InternalProviders({\n\toverrides,\n\tchildren,\n}: Omit<TLUiContextProviderProps, 'assetBaseUrl'>) {\n\tconst mergedOverrides = useMergedOverrides(overrides)\n\treturn (\n\t\t<ActionsProvider overrides={mergedOverrides.actions}>\n\t\t\t<ToolsProvider overrides={mergedOverrides.tools}>{children}</ToolsProvider>\n\t\t</ActionsProvider>\n\t)\n}\n"],
5
- "mappings": "AAqFW;AArFX,SAA2B,wBAAwB,OAAO,sBAAsB;AAEhF,SAAwB,0CAA0C;AAClE,SAAS,qBAAqB;AAC9B,SAAS,mCAAmC;AAC5C;AAAA,EACC;AAAA,EAEA;AAAA,EACA;AAAA,OACM;AACP,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAyB,kCAAkC;AAC3D,SAAS,+BAA+B;AACxC,SAA2B,8BAA8B;AACzD,SAAS,8BAA8B;AAyChC,MAAM,0BAA0B,MAAM,SAASA,yBAAwB;AAAA,EAC7E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAA6B;AAI5B,QAAM,SAAS,eAAe;AAC9B,SACC,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,gBAChC,8BAAC,qBAAkB,WAAW,mCAAmC,SAAS,GACzE;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,8BAA8B,SAAS;AAAA,MAClD,QAAQ,QAAQ,KAAK,UAAU,KAAK,uBAAuB;AAAA,MAE3D,8BAAC,0BAAuB,SAAS,WAChC,8BAAC,0BACA,8BAAC,2BAAwB,SAAS,OACjC,8BAAC,wBACA,8BAAC,sBAAmB,aACnB,8BAAC,8BAA2B,WAAW,YACtC,8BAAC,qBAAkB,WAAuB,UAAS,GACpD,GACD,GACD,GACD,GACD,GACD;AAAA;AAAA,EACD,GACD,GACD;AAEF,CAAC;AAED,SAAS,kBAAkB;AAAA,EAC1B;AAAA,EACA;AACD,GAAmD;AAClD,QAAM,kBAAkB,mBAAmB,SAAS;AACpD,SACC,oBAAC,mBAAgB,WAAW,gBAAgB,SAC3C,8BAAC,iBAAc,WAAW,gBAAgB,OAAQ,UAAS,GAC5D;AAEF;",
4
+ "sourcesContent": ["import { RecursivePartial, defaultUserPreferences, track, useMaybeEditor } from '@tldraw/editor'\nimport { ReactNode } from 'react'\nimport { TLUiAssetUrls, useDefaultUiAssetUrlsWithOverrides } from '../assetUrls'\nimport { TldrawUiTooltipProvider } from '../components/primitives/TldrawUiTooltip'\nimport { ToolsProvider } from '../hooks/useTools'\nimport { TldrawUiTranslationProvider } from '../hooks/useTranslation/useTranslation'\nimport {\n\tMimeTypeContext,\n\tTLUiOverrides,\n\tuseMergedOverrides,\n\tuseMergedTranslationOverrides,\n} from '../overrides'\nimport { TldrawUiA11yProvider } from './a11y'\nimport { ActionsProvider } from './actions'\nimport { AssetUrlsProvider } from './asset-urls'\nimport { BreakPointProvider } from './breakpoints'\nimport { TLUiComponents, TldrawUiComponentsProvider } from './components'\nimport { TldrawUiDialogsProvider } from './dialogs'\nimport { TLUiEventHandler, TldrawUiEventsProvider } from './events'\nimport { TldrawUiToastsProvider } from './toasts'\n\n/** @public */\nexport interface TLUiContextProviderProps {\n\t/**\n\t * Urls for where to find fonts and other assets for the UI.\n\t */\n\tassetUrls?: RecursivePartial<TLUiAssetUrls>\n\n\t/**\n\t * Overrides for the UI.\n\t */\n\toverrides?: TLUiOverrides | TLUiOverrides[]\n\n\t/**\n\t * Overrides for the UI components.\n\t */\n\tcomponents?: TLUiComponents\n\n\t/**\n\t * Callback for when an event occurs in the UI.\n\t */\n\tonUiEvent?: TLUiEventHandler\n\n\t/**\n\t * Whether to always should the mobile breakpoints.\n\t */\n\tforceMobile?: boolean\n\n\t/**\n\t * The component's children.\n\t */\n\tchildren?: ReactNode\n\n\t/**\n\t * Supported mime types for media files.\n\t */\n\tmediaMimeTypes?: string[]\n}\n\n/** @public @react */\nexport const TldrawUiContextProvider = track(function TldrawUiContextProvider({\n\toverrides,\n\tcomponents,\n\tassetUrls,\n\tonUiEvent,\n\tforceMobile,\n\tmediaMimeTypes,\n\tchildren,\n}: TLUiContextProviderProps) {\n\t// To allow mounting the sidebar without an editor running, we use a 'maybe' editor here\n\t// The sidebar makes use of toasts and dialogs etc, which typically require an editor to be present\n\t// but we are overriding the providers to allow them to be used without an editor.\n\tconst editor = useMaybeEditor()\n\treturn (\n\t\t<MimeTypeContext.Provider value={mediaMimeTypes}>\n\t\t\t<TldrawUiTooltipProvider>\n\t\t\t\t<AssetUrlsProvider assetUrls={useDefaultUiAssetUrlsWithOverrides(assetUrls)}>\n\t\t\t\t\t<TldrawUiTranslationProvider\n\t\t\t\t\t\toverrides={useMergedTranslationOverrides(overrides)}\n\t\t\t\t\t\tlocale={editor?.user.getLocale() ?? defaultUserPreferences.locale}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TldrawUiEventsProvider onEvent={onUiEvent}>\n\t\t\t\t\t\t\t<TldrawUiToastsProvider>\n\t\t\t\t\t\t\t\t<TldrawUiDialogsProvider context={'tla'}>\n\t\t\t\t\t\t\t\t\t<TldrawUiA11yProvider>\n\t\t\t\t\t\t\t\t\t\t<BreakPointProvider forceMobile={forceMobile}>\n\t\t\t\t\t\t\t\t\t\t\t<TldrawUiComponentsProvider overrides={components}>\n\t\t\t\t\t\t\t\t\t\t\t\t<InternalProviders overrides={overrides}>{children}</InternalProviders>\n\t\t\t\t\t\t\t\t\t\t\t</TldrawUiComponentsProvider>\n\t\t\t\t\t\t\t\t\t\t</BreakPointProvider>\n\t\t\t\t\t\t\t\t\t</TldrawUiA11yProvider>\n\t\t\t\t\t\t\t\t</TldrawUiDialogsProvider>\n\t\t\t\t\t\t\t</TldrawUiToastsProvider>\n\t\t\t\t\t\t</TldrawUiEventsProvider>\n\t\t\t\t\t</TldrawUiTranslationProvider>\n\t\t\t\t</AssetUrlsProvider>\n\t\t\t</TldrawUiTooltipProvider>\n\t\t</MimeTypeContext.Provider>\n\t)\n})\n\nfunction InternalProviders({\n\toverrides,\n\tchildren,\n}: Omit<TLUiContextProviderProps, 'assetBaseUrl'>) {\n\tconst mergedOverrides = useMergedOverrides(overrides)\n\treturn (\n\t\t<ActionsProvider overrides={mergedOverrides.actions}>\n\t\t\t<ToolsProvider overrides={mergedOverrides.tools}>{children}</ToolsProvider>\n\t\t</ActionsProvider>\n\t)\n}\n"],
5
+ "mappings": "AAuFY;AAvFZ,SAA2B,wBAAwB,OAAO,sBAAsB;AAEhF,SAAwB,0CAA0C;AAClE,SAAS,+BAA+B;AACxC,SAAS,qBAAqB;AAC9B,SAAS,mCAAmC;AAC5C;AAAA,EACC;AAAA,EAEA;AAAA,EACA;AAAA,OACM;AACP,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAyB,kCAAkC;AAC3D,SAAS,+BAA+B;AACxC,SAA2B,8BAA8B;AACzD,SAAS,8BAA8B;AAyChC,MAAM,0BAA0B,MAAM,SAASA,yBAAwB;AAAA,EAC7E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAA6B;AAI5B,QAAM,SAAS,eAAe;AAC9B,SACC,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,gBAChC,8BAAC,2BACA,8BAAC,qBAAkB,WAAW,mCAAmC,SAAS,GACzE;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,8BAA8B,SAAS;AAAA,MAClD,QAAQ,QAAQ,KAAK,UAAU,KAAK,uBAAuB;AAAA,MAE3D,8BAAC,0BAAuB,SAAS,WAChC,8BAAC,0BACA,8BAAC,2BAAwB,SAAS,OACjC,8BAAC,wBACA,8BAAC,sBAAmB,aACnB,8BAAC,8BAA2B,WAAW,YACtC,8BAAC,qBAAkB,WAAuB,UAAS,GACpD,GACD,GACD,GACD,GACD,GACD;AAAA;AAAA,EACD,GACD,GACD,GACD;AAEF,CAAC;AAED,SAAS,kBAAkB;AAAA,EAC1B;AAAA,EACA;AACD,GAAmD;AAClD,QAAM,kBAAkB,mBAAmB,SAAS;AACpD,SACC,oBAAC,mBAAgB,WAAW,gBAAgB,SAC3C,8BAAC,iBAAc,WAAW,gBAAgB,OAAQ,UAAS,GAC5D;AAEF;",
6
6
  "names": ["TldrawUiContextProvider"]
7
7
  }
@@ -24,6 +24,7 @@ import { flattenShapesToImages } from "../hooks/useFlatten.mjs";
24
24
  import { useTranslation } from "../hooks/useTranslation/useTranslation.mjs";
25
25
  import { useDefaultHelpers } from "../overrides.mjs";
26
26
  import { useA11y } from "./a11y.mjs";
27
+ import { useTldrawUiComponents } from "./components.mjs";
27
28
  import { useUiEvents } from "./events.mjs";
28
29
  const ActionsContext = React.createContext(null);
29
30
  function supportsDownloadingOriginal(shape, editor) {
@@ -43,6 +44,7 @@ function ActionsProvider({ overrides, children }) {
43
44
  const _editor = useMaybeEditor();
44
45
  const showCollaborationUi = useShowCollaborationUi();
45
46
  const helpers = useDefaultHelpers();
47
+ const components = useTldrawUiComponents();
46
48
  const trackEvent = useUiEvents();
47
49
  const a11y = useA11y();
48
50
  const msg = useTranslation();
@@ -104,7 +106,9 @@ function ActionsProvider({ overrides, children }) {
104
106
  kbd: "cmd+alt+/,ctrl+alt+/",
105
107
  onSelect(source) {
106
108
  trackEvent("open-kbd-shortcuts", { source });
107
- helpers.addDialog({ component: DefaultKeyboardShortcutsDialog });
109
+ helpers.addDialog({
110
+ component: components.KeyboardShortcutsDialog ?? DefaultKeyboardShortcutsDialog
111
+ });
108
112
  }
109
113
  },
110
114
  {
@@ -149,7 +153,7 @@ function ActionsProvider({ overrides, children }) {
149
153
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values());
150
154
  if (ids.length === 0) return;
151
155
  trackEvent("export-as", { format: "svg", source });
152
- helpers.exportAs(ids, "svg", getExportName(editor, defaultDocumentName));
156
+ helpers.exportAs(ids, { format: "svg", name: getExportName(editor, defaultDocumentName) });
153
157
  }
154
158
  },
155
159
  {
@@ -165,7 +169,7 @@ function ActionsProvider({ overrides, children }) {
165
169
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values());
166
170
  if (ids.length === 0) return;
167
171
  trackEvent("export-as", { format: "png", source });
168
- helpers.exportAs(ids, "png", getExportName(editor, defaultDocumentName));
172
+ helpers.exportAs(ids, { format: "png", name: getExportName(editor, defaultDocumentName) });
169
173
  }
170
174
  },
171
175
  {
@@ -181,11 +185,10 @@ function ActionsProvider({ overrides, children }) {
181
185
  if (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values());
182
186
  if (ids.length === 0) return;
183
187
  trackEvent("export-all-as", { format: "svg", source });
184
- helpers.exportAs(
185
- Array.from(editor.getCurrentPageShapeIds()),
186
- "svg",
187
- getExportName(editor, defaultDocumentName)
188
- );
188
+ helpers.exportAs(Array.from(editor.getCurrentPageShapeIds()), {
189
+ format: "svg",
190
+ name: getExportName(editor, defaultDocumentName)
191
+ });
189
192
  }
190
193
  },
191
194
  {
@@ -200,7 +203,7 @@ function ActionsProvider({ overrides, children }) {
200
203
  const ids = Array.from(editor.getCurrentPageShapeIds().values());
201
204
  if (ids.length === 0) return;
202
205
  trackEvent("export-all-as", { format: "png", source });
203
- helpers.exportAs(ids, "png", getExportName(editor, defaultDocumentName));
206
+ helpers.exportAs(ids, { format: "png", name: getExportName(editor, defaultDocumentName) });
204
207
  }
205
208
  },
206
209
  {
@@ -1124,6 +1127,21 @@ function ActionsProvider({ overrides, children }) {
1124
1127
  },
1125
1128
  checkbox: true
1126
1129
  },
1130
+ {
1131
+ id: "toggle-ui-labels",
1132
+ label: {
1133
+ default: "action.toggle-ui-labels",
1134
+ menu: "action.toggle-ui-labels.menu"
1135
+ },
1136
+ readonlyOk: true,
1137
+ onSelect(source) {
1138
+ trackEvent("toggle-ui-labels", { source });
1139
+ editor.user.updateUserPreferences({
1140
+ showUiLabels: !editor.user.getShowUiLabels()
1141
+ });
1142
+ },
1143
+ checkbox: true
1144
+ },
1127
1145
  {
1128
1146
  id: "toggle-edge-scrolling",
1129
1147
  label: {
@@ -1410,6 +1428,12 @@ function ActionsProvider({ overrides, children }) {
1410
1428
  isRequiredA11yAction: true,
1411
1429
  onSelect: async (source) => {
1412
1430
  if (!canApplySelectionAction()) return;
1431
+ const onlySelectedShape = editor.getOnlySelectedShape();
1432
+ if (onlySelectedShape && (editor.isShapeOfType(onlySelectedShape, "image") || editor.isShapeOfType(onlySelectedShape, "video"))) {
1433
+ const firstToolbarButton = editor.getContainer().querySelector(".tlui-contextual-toolbar button:first-child");
1434
+ firstToolbarButton?.focus();
1435
+ return;
1436
+ }
1413
1437
  const firstButton = editor.getContainer().querySelector(".tlui-style-panel button");
1414
1438
  firstButton?.focus();
1415
1439
  trackEvent("adjust-shape-styles", { source });
@@ -1551,7 +1575,17 @@ function ActionsProvider({ overrides, children }) {
1551
1575
  return overrides(editor, actions2, helpers);
1552
1576
  }
1553
1577
  return actions2;
1554
- }, [helpers, _editor, trackEvent, overrides, defaultDocumentName, showCollaborationUi, msg, a11y]);
1578
+ }, [
1579
+ helpers,
1580
+ _editor,
1581
+ trackEvent,
1582
+ overrides,
1583
+ defaultDocumentName,
1584
+ showCollaborationUi,
1585
+ msg,
1586
+ a11y,
1587
+ components
1588
+ ]);
1555
1589
  return /* @__PURE__ */ jsx(ActionsContext.Provider, { value: asActions(actions), children });
1556
1590
  }
1557
1591
  function useActions() {