tldraw 3.16.0-canary.a03de714c746 → 3.16.0-canary.a2604843117c

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 (501) hide show
  1. package/dist-cjs/index.d.ts +338 -113
  2. package/dist-cjs/index.js +40 -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/bookmark/BookmarkShapeUtil.js +4 -4
  20. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  21. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  22. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  23. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  24. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  25. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -13
  26. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  27. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  28. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  29. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +8 -2
  30. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  31. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +3 -2
  32. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  34. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  35. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  36. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  37. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  38. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  40. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  41. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  42. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  43. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
  44. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  45. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  46. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  47. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  48. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  49. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -5
  51. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  53. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  54. package/dist-cjs/lib/shapes/text/PlainTextArea.js +3 -2
  55. package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
  56. package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
  57. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  58. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  59. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  60. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  61. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  62. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  63. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  64. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  65. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  66. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  67. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  68. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  69. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  70. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  71. package/dist-cjs/lib/ui/components/A11y.js +1 -1
  72. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  73. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  74. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  75. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  76. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  77. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  78. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  79. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  80. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  81. package/dist-cjs/lib/ui/components/LanguageMenu.js +1 -0
  82. package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
  83. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +2 -1
  84. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  85. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  86. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  87. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  88. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  89. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  90. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +3 -2
  92. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  93. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  94. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  96. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  97. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
  98. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
  100. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +147 -0
  102. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  103. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  104. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  105. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
  106. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  107. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
  108. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  109. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  110. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  111. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +2 -0
  112. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  114. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  115. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  116. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  117. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  118. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  119. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +2 -1
  120. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  122. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  123. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +8 -4
  124. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  125. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
  126. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  127. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +5 -3
  128. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  129. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  130. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  131. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +18 -5
  132. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  133. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +22 -4
  134. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  135. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +196 -157
  136. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  137. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  138. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  139. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +3 -0
  140. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  141. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  142. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  143. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  144. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  145. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  146. package/dist-cjs/lib/ui/context/actions.js +29 -10
  147. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  148. package/dist-cjs/lib/ui/context/components.js +2 -0
  149. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  150. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  151. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  152. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  153. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  154. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  155. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  156. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  157. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  158. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +6 -2
  159. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  160. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  161. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  162. package/dist-cjs/lib/ui/version.js +3 -3
  163. package/dist-cjs/lib/ui/version.js.map +1 -1
  164. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  165. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  166. package/dist-cjs/lib/utils/export/export.js +0 -20
  167. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  168. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  169. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  170. package/dist-esm/index.d.mts +338 -113
  171. package/dist-esm/index.mjs +75 -29
  172. package/dist-esm/index.mjs.map +2 -2
  173. package/dist-esm/lib/Tldraw.mjs +14 -4
  174. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  175. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  176. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  177. package/dist-esm/lib/defaultExternalContentHandlers.mjs +15 -4
  178. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  179. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  180. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  181. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  182. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  183. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +3 -2
  184. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  185. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  186. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  187. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +4 -5
  188. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  189. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  190. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  191. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  192. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  193. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -13
  194. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  195. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  196. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  197. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +9 -3
  198. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  199. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +4 -2
  200. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  201. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  202. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  203. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  204. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  205. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  206. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  207. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  208. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  209. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  210. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  211. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
  212. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  213. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  214. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  215. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  216. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  217. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  218. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +3 -6
  219. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  221. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/text/PlainTextArea.mjs +4 -3
  223. package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
  225. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  227. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  229. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  230. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  231. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  232. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  233. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  234. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  235. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  236. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  237. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  238. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  239. package/dist-esm/lib/ui/components/A11y.mjs +1 -2
  240. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  241. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  242. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  243. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  244. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  245. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  246. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  247. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  248. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  249. package/dist-esm/lib/ui/components/LanguageMenu.mjs +1 -0
  250. package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
  251. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +2 -1
  252. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  253. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  254. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  255. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  256. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  257. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  258. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  259. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +3 -3
  260. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  261. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  262. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  263. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  264. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  265. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
  266. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  267. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
  268. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  269. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +135 -0
  270. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  271. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  272. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  273. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
  274. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  275. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
  276. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  277. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  278. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  279. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +2 -0
  280. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  281. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  282. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  284. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  286. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +2 -1
  288. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  290. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  291. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +8 -4
  292. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  293. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +11 -3
  294. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  295. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +6 -4
  296. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  297. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  298. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  299. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +18 -5
  300. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  301. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +22 -4
  302. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  303. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +206 -159
  304. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  305. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  306. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  307. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +3 -0
  308. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  310. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  311. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  312. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  313. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  314. package/dist-esm/lib/ui/context/actions.mjs +29 -10
  315. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  316. package/dist-esm/lib/ui/context/components.mjs +2 -0
  317. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  318. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  319. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +1 -2
  320. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  321. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  322. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  323. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  324. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  325. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +6 -2
  326. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  327. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  328. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  329. package/dist-esm/lib/ui/version.mjs +3 -3
  330. package/dist-esm/lib/ui/version.mjs.map +1 -1
  331. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  332. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  333. package/dist-esm/lib/utils/export/export.mjs +0 -20
  334. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  335. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  336. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  337. package/package.json +11 -34
  338. package/src/index.ts +56 -22
  339. package/src/lib/Tldraw.tsx +15 -2
  340. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  341. package/src/lib/defaultExternalContentHandlers.ts +26 -4
  342. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +85 -14
  343. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +6 -5
  344. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +48 -6
  345. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  346. package/src/lib/shapes/arrow/arrow-types.ts +3 -5
  347. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  348. package/src/lib/shapes/arrow/arrowTargetState.ts +4 -3
  349. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  350. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +4 -5
  351. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  352. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  353. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  354. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -14
  355. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  356. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +10 -3
  357. package/src/lib/shapes/geo/GeoShapeUtil.tsx +4 -2
  358. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  359. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  360. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  361. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  362. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  363. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  364. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  365. package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
  366. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  367. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  368. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  369. package/src/lib/shapes/shared/useEditablePlainText.ts +3 -10
  370. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  371. package/src/lib/shapes/text/PlainTextArea.tsx +4 -3
  372. package/src/lib/shapes/text/RichTextArea.tsx +3 -4
  373. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  374. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  375. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  376. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  377. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  378. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  379. package/src/lib/ui/TldrawUi.tsx +33 -12
  380. package/src/lib/ui/assetUrls.ts +13 -10
  381. package/src/lib/ui/components/A11y.tsx +1 -2
  382. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  383. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  384. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  385. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  386. package/src/lib/ui/components/LanguageMenu.tsx +1 -0
  387. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +2 -1
  388. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  389. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  390. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  391. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +4 -4
  392. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  393. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  394. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
  395. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -385
  396. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +73 -50
  397. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  398. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
  399. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  400. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  401. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -0
  402. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  403. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  404. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  405. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +1 -0
  406. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  407. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +11 -4
  408. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +7 -3
  409. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +6 -3
  410. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  411. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +52 -32
  412. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +37 -10
  413. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +244 -178
  414. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  415. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
  416. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  417. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  418. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  419. package/src/lib/ui/context/actions.tsx +36 -10
  420. package/src/lib/ui/context/components.tsx +3 -0
  421. package/src/lib/ui/context/events.tsx +2 -1
  422. package/src/lib/ui/hooks/useClipboardEvents.ts +1 -2
  423. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  424. package/src/lib/ui/hooks/useTools.tsx +140 -10
  425. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +4 -0
  426. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +6 -2
  427. package/src/lib/ui/kbd-utils.ts +10 -3
  428. package/src/lib/ui/version.ts +3 -3
  429. package/src/lib/ui.css +395 -306
  430. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  431. package/src/lib/utils/export/copyAs.ts +1 -24
  432. package/src/lib/utils/export/export.ts +0 -36
  433. package/src/lib/utils/export/exportAs.ts +1 -32
  434. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  435. package/src/test/A11y.test.tsx +3 -2
  436. package/src/test/ClickManager.test.ts +7 -6
  437. package/src/test/Editor.test.tsx +20 -19
  438. package/src/test/EraserTool.test.ts +184 -13
  439. package/src/test/HandTool.test.ts +10 -9
  440. package/src/test/HighlightShape.test.ts +2 -1
  441. package/src/test/SelectTool.test.ts +3 -2
  442. package/src/test/TLUserPreferences.test.ts +4 -3
  443. package/src/test/TestEditor.ts +13 -15
  444. package/src/test/TldrawEditor.test.tsx +11 -10
  445. package/src/test/ZoomTool.test.ts +7 -6
  446. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  447. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  448. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  449. package/src/test/arrows-megabus.test.tsx +5 -4
  450. package/src/test/bindings.test.tsx +24 -37
  451. package/src/test/bookmark-shapes.test.ts +1 -8
  452. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  453. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  454. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  455. package/src/test/commands/alignShapes.test.tsx +25 -24
  456. package/src/test/commands/animationSpeed.test.ts +2 -1
  457. package/src/test/commands/centerOnPoint.test.ts +3 -2
  458. package/src/test/commands/clipboard.test.ts +3 -2
  459. package/src/test/commands/createShapes.test.ts +2 -1
  460. package/src/test/commands/deleteShapes.test.ts +2 -1
  461. package/src/test/commands/distributeShapes.test.tsx +11 -10
  462. package/src/test/commands/getSvgString.test.ts +2 -1
  463. package/src/test/commands/packShapes.test.ts +5 -4
  464. package/src/test/commands/resizeShape.test.ts +2 -1
  465. package/src/test/commands/rotateShapes.test.ts +7 -6
  466. package/src/test/commands/setCamera.test.ts +4 -3
  467. package/src/test/commands/setCurrentPage.test.ts +3 -2
  468. package/src/test/commands/stackShapes.test.ts +11 -10
  469. package/src/test/commands/stretch.test.tsx +13 -12
  470. package/src/test/createDeepLink.test.tsx +2 -1
  471. package/src/test/cropping.test.ts +3 -2
  472. package/src/test/custom-clipping.test.ts +436 -0
  473. package/src/test/drawing.test.ts +2 -1
  474. package/src/test/flipShapes.test.ts +4 -3
  475. package/src/test/frames.test.ts +25 -24
  476. package/src/test/getCulledShapes.test.tsx +74 -4
  477. package/src/test/groups.test.tsx +1 -1
  478. package/src/test/handleDeepLink.test.tsx +2 -1
  479. package/src/test/maxShapes.test.ts +3 -2
  480. package/src/test/modifiers.test.ts +5 -4
  481. package/src/test/navigation.test.ts +12 -11
  482. package/src/test/panning.test.ts +2 -1
  483. package/src/test/perf/perf.test.ts +2 -1
  484. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  485. package/src/test/resizing.test.ts +39 -38
  486. package/src/test/select.test.tsx +4 -3
  487. package/src/test/selection-omnibus.test.ts +11 -10
  488. package/src/test/shapeutils.test.ts +4 -3
  489. package/src/test/translating.test.ts +9 -8
  490. package/tldraw.css +703 -598
  491. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  492. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  493. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  494. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -142
  495. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  496. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  497. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  498. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  499. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  500. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  501. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
@@ -1,68 +1,84 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { uniqueId, useMaybeEditor, Vec } from "@tldraw/editor";
2
+ import { assert, atom, uniqueId, useMaybeEditor, useValue } from "@tldraw/editor";
3
3
  import { Tooltip as _Tooltip } from "radix-ui";
4
- import React, { createContext, useContext, useEffect, useRef, useState } from "react";
5
- import { usePrefersReducedMotion } from "../../../shapes/shared/usePrefersReducedMotion.mjs";
4
+ import React, {
5
+ createContext,
6
+ forwardRef,
7
+ useContext,
8
+ useEffect,
9
+ useLayoutEffect,
10
+ useRef,
11
+ useState
12
+ } from "react";
13
+ import { useTldrawUiOrientation } from "./layout.mjs";
6
14
  const DEFAULT_TOOLTIP_DELAY_MS = 700;
7
15
  class TooltipManager {
8
16
  static instance = null;
9
- currentTooltipId = null;
10
- currentContent = "";
11
- currentSide = "bottom";
12
- currentSideOffset = 5;
17
+ currentTooltip = atom("current tooltip", null);
13
18
  destroyTimeoutId = null;
14
- subscribers = /* @__PURE__ */ new Set();
15
- activeElement = null;
16
- editor = null;
17
19
  static getInstance() {
18
20
  if (!TooltipManager.instance) {
19
21
  TooltipManager.instance = new TooltipManager();
20
22
  }
21
23
  return TooltipManager.instance;
22
24
  }
23
- setEditor(editor) {
24
- this.editor = editor;
25
- }
26
- subscribe(callback) {
27
- this.subscribers.add(callback);
28
- return () => this.subscribers.delete(callback);
29
- }
30
- notify() {
31
- this.subscribers.forEach((callback) => callback());
32
- }
33
- showTooltip(tooltipId, content, element, side = "bottom", sideOffset = 5) {
25
+ showTooltip(tooltipId, content, targetElement, side, sideOffset, showOnMobile, delayDuration) {
34
26
  if (this.destroyTimeoutId) {
35
27
  clearTimeout(this.destroyTimeoutId);
36
28
  this.destroyTimeoutId = null;
37
29
  }
38
- this.currentTooltipId = tooltipId;
39
- this.currentContent = content;
40
- this.currentSide = side;
41
- this.currentSideOffset = sideOffset;
42
- this.activeElement = element;
43
- this.notify();
30
+ this.currentTooltip.set({
31
+ id: tooltipId,
32
+ content,
33
+ side,
34
+ sideOffset,
35
+ showOnMobile,
36
+ targetElement,
37
+ delayDuration
38
+ });
44
39
  }
45
- hideTooltip(tooltipId) {
46
- if (this.currentTooltipId === tooltipId) {
47
- if (this.editor) {
48
- this.destroyTimeoutId = this.editor.timers.setTimeout(() => {
49
- this.currentTooltipId = null;
50
- this.currentContent = "";
51
- this.activeElement = null;
52
- this.destroyTimeoutId = null;
53
- this.notify();
54
- }, 300);
40
+ updateCurrentTooltip(tooltipId, update) {
41
+ this.currentTooltip.update((tooltip) => {
42
+ if (tooltip?.id === tooltipId) {
43
+ return update(tooltip);
55
44
  }
45
+ return tooltip;
46
+ });
47
+ }
48
+ hideTooltip(editor, tooltipId, instant = false) {
49
+ const hide = () => {
50
+ if (this.currentTooltip.get()?.id === tooltipId) {
51
+ this.currentTooltip.set(null);
52
+ this.destroyTimeoutId = null;
53
+ }
54
+ };
55
+ if (editor && !instant) {
56
+ this.destroyTimeoutId = editor.timers.setTimeout(hide, 300);
57
+ } else {
58
+ hide();
56
59
  }
57
60
  }
61
+ hideAllTooltips() {
62
+ this.currentTooltip.set(null);
63
+ this.destroyTimeoutId = null;
64
+ }
58
65
  getCurrentTooltipData() {
59
- return {
60
- id: this.currentTooltipId,
61
- content: this.currentContent,
62
- side: this.currentSide,
63
- sideOffset: this.currentSideOffset,
64
- element: this.activeElement
65
- };
66
+ const currentTooltip = this.currentTooltip.get();
67
+ if (!currentTooltip) return null;
68
+ if (!this.supportsHover() && !currentTooltip.showOnMobile) return null;
69
+ return currentTooltip;
70
+ }
71
+ supportsHoverAtom = null;
72
+ supportsHover() {
73
+ if (!this.supportsHoverAtom) {
74
+ const mediaQuery = window.matchMedia("(hover: hover)");
75
+ const supportsHover = atom("has hover", mediaQuery.matches);
76
+ this.supportsHoverAtom = supportsHover;
77
+ mediaQuery.addEventListener("change", (e) => {
78
+ supportsHover.set(e.matches);
79
+ });
80
+ }
81
+ return this.supportsHoverAtom.get();
66
82
  }
67
83
  }
68
84
  const tooltipManager = TooltipManager.getInstance();
@@ -74,45 +90,38 @@ function TldrawUiTooltipProvider({ children }) {
74
90
  ] }) });
75
91
  }
76
92
  function TooltipSingleton() {
77
- const editor = useMaybeEditor();
78
- const [, forceUpdate] = useState({});
79
93
  const [isOpen, setIsOpen] = useState(false);
80
94
  const triggerRef = useRef(null);
81
- const previousPositionRef = useRef(null);
82
- const prefersReducedMotion = usePrefersReducedMotion();
83
- const [shouldAnimate, setShouldAnimate] = useState(false);
84
95
  const isFirstShowRef = useRef(true);
85
- const showTimeoutRef = useRef(null);
86
- useEffect(() => {
87
- tooltipManager.setEditor(editor);
88
- }, [editor]);
96
+ const editor = useMaybeEditor();
97
+ const currentTooltip = useValue(
98
+ "current tooltip",
99
+ () => tooltipManager.getCurrentTooltipData(),
100
+ []
101
+ );
102
+ const cameraState = useValue("camera state", () => editor?.getCameraState(), [editor]);
89
103
  useEffect(() => {
90
- const unsubscribe = tooltipManager.subscribe(() => {
91
- forceUpdate({});
92
- });
93
- return unsubscribe;
94
- }, []);
95
- const tooltipData = tooltipManager.getCurrentTooltipData();
104
+ if (cameraState === "moving" && isOpen && currentTooltip) {
105
+ tooltipManager.hideTooltip(editor, currentTooltip.id, true);
106
+ }
107
+ }, [cameraState, isOpen, currentTooltip, editor]);
96
108
  useEffect(() => {
97
- const shouldBeOpen = Boolean(tooltipData.id && tooltipData.element);
98
- if (showTimeoutRef.current) {
99
- clearTimeout(showTimeoutRef.current);
100
- showTimeoutRef.current = null;
109
+ function handleKeyDown(event) {
110
+ if (event.key === "Escape" && currentTooltip && isOpen) {
111
+ tooltipManager.hideTooltip(editor, currentTooltip.id);
112
+ event.stopPropagation();
113
+ }
101
114
  }
102
- if (shouldBeOpen && tooltipData.element && triggerRef.current) {
103
- const activeRect = tooltipData.element.getBoundingClientRect();
115
+ document.addEventListener("keydown", handleKeyDown, { capture: true });
116
+ return () => {
117
+ document.removeEventListener("keydown", handleKeyDown, { capture: true });
118
+ };
119
+ }, [editor, currentTooltip, isOpen]);
120
+ useEffect(() => {
121
+ let timer = null;
122
+ if (currentTooltip && triggerRef.current) {
123
+ const activeRect = currentTooltip.targetElement.getBoundingClientRect();
104
124
  const trigger = triggerRef.current;
105
- const newPosition = {
106
- x: activeRect.left + activeRect.width / 2,
107
- y: activeRect.top + activeRect.height / 2
108
- };
109
- let shouldAnimateCheck = false;
110
- if (previousPositionRef.current) {
111
- const isNearPrevious = Vec.DistMin(previousPositionRef.current, newPosition, 200);
112
- shouldAnimateCheck = !prefersReducedMotion && isNearPrevious && Math.abs(newPosition.y - previousPositionRef.current.y) < 50;
113
- }
114
- setShouldAnimate(isFirstShowRef.current ? false : shouldAnimateCheck);
115
- previousPositionRef.current = newPosition;
116
125
  trigger.style.position = "fixed";
117
126
  trigger.style.left = `${activeRect.left}px`;
118
127
  trigger.style.top = `${activeRect.top}px`;
@@ -120,22 +129,25 @@ function TooltipSingleton() {
120
129
  trigger.style.height = `${activeRect.height}px`;
121
130
  trigger.style.pointerEvents = "none";
122
131
  trigger.style.zIndex = "9999";
123
- if (isFirstShowRef.current && editor) {
124
- showTimeoutRef.current = editor.timers.setTimeout(() => {
132
+ if (isFirstShowRef.current) {
133
+ timer = setTimeout(() => {
125
134
  setIsOpen(true);
126
135
  isFirstShowRef.current = false;
127
- }, editor.options.tooltipDelayMs);
136
+ }, currentTooltip.delayDuration);
128
137
  } else {
129
138
  setIsOpen(true);
130
139
  }
131
- } else if (!shouldBeOpen) {
140
+ } else {
132
141
  setIsOpen(false);
133
- previousPositionRef.current = null;
134
- setShouldAnimate(false);
135
142
  isFirstShowRef.current = true;
136
143
  }
137
- }, [tooltipData.id, tooltipData.element, editor, prefersReducedMotion]);
138
- if (!tooltipData.id) {
144
+ return () => {
145
+ if (timer !== null) {
146
+ clearTimeout(timer);
147
+ }
148
+ };
149
+ }, [currentTooltip]);
150
+ if (!currentTooltip) {
139
151
  return null;
140
152
  }
141
153
  return /* @__PURE__ */ jsxs(_Tooltip.Root, { open: isOpen, delayDuration: 0, children: [
@@ -144,94 +156,129 @@ function TooltipSingleton() {
144
156
  _Tooltip.Content,
145
157
  {
146
158
  className: "tlui-tooltip",
147
- "data-should-animate": shouldAnimate,
148
- side: tooltipData.side,
149
- sideOffset: tooltipData.sideOffset,
159
+ side: currentTooltip.side,
160
+ sideOffset: currentTooltip.sideOffset,
150
161
  avoidCollisions: true,
151
162
  collisionPadding: 8,
152
163
  dir: "ltr",
153
164
  children: [
154
- tooltipData.content,
165
+ currentTooltip.content,
155
166
  /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
156
167
  ]
157
168
  }
158
169
  )
159
170
  ] });
160
171
  }
161
- function TldrawUiTooltip({
162
- children,
163
- content,
164
- side = "bottom",
165
- sideOffset = 5,
166
- disabled = false
167
- }) {
168
- const editor = useMaybeEditor();
169
- const tooltipId = useRef(uniqueId());
170
- const hasProvider = useContext(TooltipSingletonContext);
171
- if (disabled || !content) {
172
- return /* @__PURE__ */ jsx(Fragment, { children });
173
- }
174
- if (!hasProvider) {
175
- return /* @__PURE__ */ jsxs(
176
- _Tooltip.Root,
177
- {
178
- delayDuration: editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS,
179
- disableHoverableContent: true,
180
- children: [
181
- /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, children }),
182
- /* @__PURE__ */ jsxs(
183
- _Tooltip.Content,
184
- {
185
- className: "tlui-tooltip",
186
- side,
187
- sideOffset,
188
- avoidCollisions: true,
189
- collisionPadding: 8,
190
- dir: "ltr",
191
- children: [
192
- content,
193
- /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
194
- ]
195
- }
196
- )
197
- ]
172
+ const TldrawUiTooltip = forwardRef(
173
+ ({
174
+ children,
175
+ content,
176
+ side,
177
+ sideOffset = 5,
178
+ disabled = false,
179
+ showOnMobile = false,
180
+ delayDuration
181
+ }, ref) => {
182
+ const editor = useMaybeEditor();
183
+ const tooltipId = useRef(uniqueId());
184
+ const hasProvider = useContext(TooltipSingletonContext);
185
+ const showUiLabels = useValue("showUiLabels", () => editor?.user.getShowUiLabels(), [editor]);
186
+ const orientationCtx = useTldrawUiOrientation();
187
+ const sideToUse = side ?? orientationCtx.tooltipSide;
188
+ useEffect(() => {
189
+ const currentTooltipId = tooltipId.current;
190
+ return () => {
191
+ if (hasProvider) {
192
+ tooltipManager.hideTooltip(editor, currentTooltipId, true);
193
+ }
194
+ };
195
+ }, [editor, hasProvider]);
196
+ useLayoutEffect(() => {
197
+ if (hasProvider && tooltipManager.getCurrentTooltipData()?.id === tooltipId.current) {
198
+ tooltipManager.updateCurrentTooltip(tooltipId.current, (tooltip) => ({
199
+ ...tooltip,
200
+ content,
201
+ side: sideToUse,
202
+ sideOffset,
203
+ showOnMobile
204
+ }));
198
205
  }
199
- );
206
+ }, [content, sideToUse, sideOffset, showOnMobile, hasProvider]);
207
+ if (disabled || !content) {
208
+ return /* @__PURE__ */ jsx(Fragment, { children });
209
+ }
210
+ let delayDurationToUse;
211
+ if (showUiLabels) {
212
+ delayDurationToUse = 0;
213
+ } else {
214
+ delayDurationToUse = delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS);
215
+ }
216
+ if (!hasProvider || showUiLabels) {
217
+ return /* @__PURE__ */ jsxs(_Tooltip.Root, { delayDuration: delayDurationToUse, disableHoverableContent: !showUiLabels, children: [
218
+ /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, ref, children }),
219
+ /* @__PURE__ */ jsxs(
220
+ _Tooltip.Content,
221
+ {
222
+ className: "tlui-tooltip",
223
+ side: sideToUse,
224
+ sideOffset,
225
+ avoidCollisions: true,
226
+ collisionPadding: 8,
227
+ dir: "ltr",
228
+ children: [
229
+ content,
230
+ /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
231
+ ]
232
+ }
233
+ )
234
+ ] });
235
+ }
236
+ const child = React.Children.only(children);
237
+ assert(React.isValidElement(child), "TldrawUiTooltip children must be a single element");
238
+ const handleMouseEnter = (event) => {
239
+ child.props.onMouseEnter?.(event);
240
+ tooltipManager.showTooltip(
241
+ tooltipId.current,
242
+ content,
243
+ event.currentTarget,
244
+ sideToUse,
245
+ sideOffset,
246
+ showOnMobile,
247
+ delayDurationToUse
248
+ );
249
+ };
250
+ const handleMouseLeave = (event) => {
251
+ child.props.onMouseLeave?.(event);
252
+ tooltipManager.hideTooltip(editor, tooltipId.current);
253
+ };
254
+ const handleFocus = (event) => {
255
+ child.props.onFocus?.(event);
256
+ tooltipManager.showTooltip(
257
+ tooltipId.current,
258
+ content,
259
+ event.currentTarget,
260
+ sideToUse,
261
+ sideOffset,
262
+ showOnMobile,
263
+ delayDurationToUse
264
+ );
265
+ };
266
+ const handleBlur = (event) => {
267
+ child.props.onBlur?.(event);
268
+ tooltipManager.hideTooltip(editor, tooltipId.current);
269
+ };
270
+ const childrenWithHandlers = React.cloneElement(children, {
271
+ onMouseEnter: handleMouseEnter,
272
+ onMouseLeave: handleMouseLeave,
273
+ onFocus: handleFocus,
274
+ onBlur: handleBlur
275
+ });
276
+ return childrenWithHandlers;
200
277
  }
201
- const handleMouseEnter = (event) => {
202
- tooltipManager.showTooltip(
203
- tooltipId.current,
204
- content,
205
- event.currentTarget,
206
- side,
207
- sideOffset
208
- );
209
- };
210
- const handleMouseLeave = () => {
211
- tooltipManager.hideTooltip(tooltipId.current);
212
- };
213
- const handleFocus = (event) => {
214
- tooltipManager.showTooltip(
215
- tooltipId.current,
216
- content,
217
- event.currentTarget,
218
- side,
219
- sideOffset
220
- );
221
- };
222
- const handleBlur = () => {
223
- tooltipManager.hideTooltip(tooltipId.current);
224
- };
225
- const childrenWithHandlers = React.cloneElement(children, {
226
- onMouseEnter: handleMouseEnter,
227
- onMouseLeave: handleMouseLeave,
228
- onFocus: handleFocus,
229
- onBlur: handleBlur
230
- });
231
- return childrenWithHandlers;
232
- }
278
+ );
233
279
  export {
234
280
  TldrawUiTooltip,
235
- TldrawUiTooltipProvider
281
+ TldrawUiTooltipProvider,
282
+ tooltipManager
236
283
  };
237
284
  //# sourceMappingURL=TldrawUiTooltip.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/ui/components/primitives/TldrawUiTooltip.tsx"],
4
- "sourcesContent": ["import { Editor, uniqueId, useMaybeEditor, Vec } from '@tldraw/editor'\nimport { Tooltip as _Tooltip } from 'radix-ui'\nimport React, { createContext, useContext, useEffect, useRef, useState } from 'react'\nimport { usePrefersReducedMotion } from '../../../shapes/shared/usePrefersReducedMotion'\n\nconst DEFAULT_TOOLTIP_DELAY_MS = 700\n\n/** @public */\nexport interface TldrawUiTooltipProps {\n\tchildren: React.ReactNode\n\tcontent?: string | React.ReactNode\n\tside?: 'top' | 'right' | 'bottom' | 'left'\n\tsideOffset?: number\n\tdisabled?: boolean\n}\n\n// Singleton tooltip manager\nclass TooltipManager {\n\tprivate static instance: TooltipManager | null = null\n\tprivate currentTooltipId: string | null = null\n\tprivate currentContent: string | React.ReactNode = ''\n\tprivate currentSide: 'top' | 'right' | 'bottom' | 'left' = 'bottom'\n\tprivate currentSideOffset: number = 5\n\tprivate destroyTimeoutId: number | null = null\n\tprivate subscribers: Set<() => void> = new Set()\n\tprivate activeElement: HTMLElement | null = null\n\tprivate editor: Editor | null = null\n\n\tstatic getInstance(): TooltipManager {\n\t\tif (!TooltipManager.instance) {\n\t\t\tTooltipManager.instance = new TooltipManager()\n\t\t}\n\t\treturn TooltipManager.instance\n\t}\n\n\tsetEditor(editor: Editor | null) {\n\t\tthis.editor = editor\n\t}\n\n\tsubscribe(callback: () => void): () => void {\n\t\tthis.subscribers.add(callback)\n\t\treturn () => this.subscribers.delete(callback)\n\t}\n\n\tprivate notify() {\n\t\tthis.subscribers.forEach((callback) => callback())\n\t}\n\n\tshowTooltip(\n\t\ttooltipId: string,\n\t\tcontent: string | React.ReactNode,\n\t\telement: HTMLElement,\n\t\tside: 'top' | 'right' | 'bottom' | 'left' = 'bottom',\n\t\tsideOffset: number = 5\n\t) {\n\t\t// Clear any existing destroy timeout\n\t\tif (this.destroyTimeoutId) {\n\t\t\tclearTimeout(this.destroyTimeoutId)\n\t\t\tthis.destroyTimeoutId = null\n\t\t}\n\n\t\t// Update current tooltip\n\t\tthis.currentTooltipId = tooltipId\n\t\tthis.currentContent = content\n\t\tthis.currentSide = side\n\t\tthis.currentSideOffset = sideOffset\n\t\tthis.activeElement = element\n\n\t\tthis.notify()\n\t}\n\n\thideTooltip(tooltipId: string) {\n\t\t// Only hide if this is the current tooltip\n\t\tif (this.currentTooltipId === tooltipId) {\n\t\t\t// Start destroy timeout (1 second)\n\t\t\tif (this.editor) {\n\t\t\t\tthis.destroyTimeoutId = this.editor.timers.setTimeout(() => {\n\t\t\t\t\tthis.currentTooltipId = null\n\t\t\t\t\tthis.currentContent = ''\n\t\t\t\t\tthis.activeElement = null\n\t\t\t\t\tthis.destroyTimeoutId = null\n\t\t\t\t\tthis.notify()\n\t\t\t\t}, 300)\n\t\t\t}\n\t\t}\n\t}\n\n\tgetCurrentTooltipData() {\n\t\treturn {\n\t\t\tid: this.currentTooltipId,\n\t\t\tcontent: this.currentContent,\n\t\t\tside: this.currentSide,\n\t\t\tsideOffset: this.currentSideOffset,\n\t\t\telement: this.activeElement,\n\t\t}\n\t}\n}\n\nconst tooltipManager = TooltipManager.getInstance()\n\n// Context for the tooltip singleton\nconst TooltipSingletonContext = createContext<boolean>(false)\n\n/** @public */\nexport interface TldrawUiTooltipProviderProps {\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderProps) {\n\treturn (\n\t\t<_Tooltip.Provider skipDelayDuration={700}>\n\t\t\t<TooltipSingletonContext.Provider value={true}>\n\t\t\t\t{children}\n\t\t\t\t<TooltipSingleton />\n\t\t\t</TooltipSingletonContext.Provider>\n\t\t</_Tooltip.Provider>\n\t)\n}\n\n// The singleton tooltip component that renders once\nfunction TooltipSingleton() {\n\tconst editor = useMaybeEditor()\n\tconst [, forceUpdate] = useState({})\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst triggerRef = useRef<HTMLDivElement>(null)\n\tconst previousPositionRef = useRef<{ x: number; y: number } | null>(null)\n\tconst prefersReducedMotion = usePrefersReducedMotion()\n\tconst [shouldAnimate, setShouldAnimate] = useState(false)\n\tconst isFirstShowRef = useRef(true)\n\tconst showTimeoutRef = useRef<number | null>(null)\n\n\t// Set editor in tooltip manager\n\tuseEffect(() => {\n\t\ttooltipManager.setEditor(editor)\n\t}, [editor])\n\n\t// Subscribe to tooltip manager updates\n\tuseEffect(() => {\n\t\tconst unsubscribe = tooltipManager.subscribe(() => {\n\t\t\tforceUpdate({})\n\t\t})\n\t\treturn unsubscribe\n\t}, [])\n\n\tconst tooltipData = tooltipManager.getCurrentTooltipData()\n\n\t// Update open state and trigger position\n\tuseEffect(() => {\n\t\tconst shouldBeOpen = Boolean(tooltipData.id && tooltipData.element)\n\n\t\t// Clear any existing show timeout\n\t\tif (showTimeoutRef.current) {\n\t\t\tclearTimeout(showTimeoutRef.current)\n\t\t\tshowTimeoutRef.current = null\n\t\t}\n\n\t\tif (shouldBeOpen && tooltipData.element && triggerRef.current) {\n\t\t\t// Position the invisible trigger element over the active element\n\t\t\tconst activeRect = tooltipData.element.getBoundingClientRect()\n\t\t\tconst trigger = triggerRef.current\n\n\t\t\tconst newPosition = {\n\t\t\t\tx: activeRect.left + activeRect.width / 2,\n\t\t\t\ty: activeRect.top + activeRect.height / 2,\n\t\t\t}\n\n\t\t\t// Determine if we should animate\n\t\t\tlet shouldAnimateCheck = false\n\t\t\tif (previousPositionRef.current) {\n\t\t\t\tconst isNearPrevious = Vec.DistMin(previousPositionRef.current, newPosition, 200)\n\t\t\t\t// Only animate if the distance is less than 200px (nearby tooltips)\n\t\t\t\tshouldAnimateCheck =\n\t\t\t\t\t!prefersReducedMotion &&\n\t\t\t\t\tisNearPrevious &&\n\t\t\t\t\tMath.abs(newPosition.y - previousPositionRef.current.y) < 50\n\t\t\t}\n\t\t\t// Don't animate on initial show (previousPositionRef.current is null)\n\n\t\t\tsetShouldAnimate(isFirstShowRef.current ? false : shouldAnimateCheck)\n\t\t\tpreviousPositionRef.current = newPosition\n\n\t\t\ttrigger.style.position = 'fixed'\n\t\t\ttrigger.style.left = `${activeRect.left}px`\n\t\t\ttrigger.style.top = `${activeRect.top}px`\n\t\t\ttrigger.style.width = `${activeRect.width}px`\n\t\t\ttrigger.style.height = `${activeRect.height}px`\n\t\t\ttrigger.style.pointerEvents = 'none'\n\t\t\ttrigger.style.zIndex = '9999'\n\n\t\t\t// Handle delay for first show\n\t\t\tif (isFirstShowRef.current && editor) {\n\t\t\t\tshowTimeoutRef.current = editor.timers.setTimeout(() => {\n\t\t\t\t\tsetIsOpen(true)\n\t\t\t\t\tisFirstShowRef.current = false\n\t\t\t\t}, editor.options.tooltipDelayMs)\n\t\t\t} else {\n\t\t\t\t// Subsequent tooltips show immediately\n\t\t\t\tsetIsOpen(true)\n\t\t\t}\n\t\t} else if (!shouldBeOpen) {\n\t\t\t// Hide tooltip immediately\n\t\t\tsetIsOpen(false)\n\t\t\t// Reset position tracking when tooltip closes\n\t\t\tpreviousPositionRef.current = null\n\t\t\tsetShouldAnimate(false)\n\t\t\t// Reset first show state after tooltip is hidden\n\t\t\tisFirstShowRef.current = true\n\t\t}\n\t}, [tooltipData.id, tooltipData.element, editor, prefersReducedMotion])\n\n\tif (!tooltipData.id) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<_Tooltip.Root open={isOpen} delayDuration={0}>\n\t\t\t<_Tooltip.Trigger asChild>\n\t\t\t\t<div ref={triggerRef} />\n\t\t\t</_Tooltip.Trigger>\n\t\t\t<_Tooltip.Content\n\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\tdata-should-animate={shouldAnimate}\n\t\t\t\tside={tooltipData.side}\n\t\t\t\tsideOffset={tooltipData.sideOffset}\n\t\t\t\tavoidCollisions\n\t\t\t\tcollisionPadding={8}\n\t\t\t\tdir=\"ltr\"\n\t\t\t>\n\t\t\t\t{tooltipData.content}\n\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t</_Tooltip.Content>\n\t\t</_Tooltip.Root>\n\t)\n}\n\n/** @public @react */\nexport function TldrawUiTooltip({\n\tchildren,\n\tcontent,\n\tside = 'bottom',\n\tsideOffset = 5,\n\tdisabled = false,\n}: TldrawUiTooltipProps) {\n\tconst editor = useMaybeEditor()\n\tconst tooltipId = useRef<string>(uniqueId())\n\tconst hasProvider = useContext(TooltipSingletonContext)\n\n\t// Don't show tooltip if disabled, no content, or UI labels are disabled\n\tif (disabled || !content) {\n\t\treturn <>{children}</>\n\t}\n\n\t// Fallback to old behavior if no provider\n\tif (!hasProvider) {\n\t\treturn (\n\t\t\t<_Tooltip.Root\n\t\t\t\tdelayDuration={editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS}\n\t\t\t\tdisableHoverableContent\n\t\t\t>\n\t\t\t\t<_Tooltip.Trigger asChild>{children}</_Tooltip.Trigger>\n\t\t\t\t<_Tooltip.Content\n\t\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\t\tside={side}\n\t\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t\tavoidCollisions\n\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t>\n\t\t\t\t\t{content}\n\t\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t\t</_Tooltip.Content>\n\t\t\t</_Tooltip.Root>\n\t\t)\n\t}\n\n\tconst handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {\n\t\ttooltipManager.showTooltip(\n\t\t\ttooltipId.current,\n\t\t\tcontent,\n\t\t\tevent.currentTarget as HTMLElement,\n\t\t\tside,\n\t\t\tsideOffset\n\t\t)\n\t}\n\n\tconst handleMouseLeave = () => {\n\t\ttooltipManager.hideTooltip(tooltipId.current)\n\t}\n\n\tconst handleFocus = (event: React.FocusEvent<HTMLElement>) => {\n\t\ttooltipManager.showTooltip(\n\t\t\ttooltipId.current,\n\t\t\tcontent,\n\t\t\tevent.currentTarget as HTMLElement,\n\t\t\tside,\n\t\t\tsideOffset\n\t\t)\n\t}\n\n\tconst handleBlur = () => {\n\t\ttooltipManager.hideTooltip(tooltipId.current)\n\t}\n\n\tconst childrenWithHandlers = React.cloneElement(children as React.ReactElement, {\n\t\tonMouseEnter: handleMouseEnter,\n\t\tonMouseLeave: handleMouseLeave,\n\t\tonFocus: handleFocus,\n\t\tonBlur: handleBlur,\n\t})\n\n\treturn childrenWithHandlers\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { assert, Atom, atom, Editor, uniqueId, useMaybeEditor, useValue } from '@tldraw/editor'\nimport { Tooltip as _Tooltip } from 'radix-ui'\nimport React, {\n\tcreateContext,\n\tforwardRef,\n\tReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { useTldrawUiOrientation } from './layout'\n\nconst DEFAULT_TOOLTIP_DELAY_MS = 700\n\n/** @public */\nexport interface TldrawUiTooltipProps {\n\tchildren: React.ReactNode\n\tcontent?: string | React.ReactNode\n\tside?: 'top' | 'right' | 'bottom' | 'left'\n\tsideOffset?: number\n\tdisabled?: boolean\n\tshowOnMobile?: boolean\n\tdelayDuration?: number\n}\n\ninterface CurrentTooltip {\n\tid: string\n\tcontent: ReactNode\n\tside: 'top' | 'right' | 'bottom' | 'left'\n\tsideOffset: number\n\tshowOnMobile: boolean\n\ttargetElement: HTMLElement\n\tdelayDuration: number\n}\n\n// Singleton tooltip manager\nclass TooltipManager {\n\tprivate static instance: TooltipManager | null = null\n\tprivate currentTooltip = atom<CurrentTooltip | null>('current tooltip', null)\n\tprivate destroyTimeoutId: number | null = null\n\n\tstatic getInstance(): TooltipManager {\n\t\tif (!TooltipManager.instance) {\n\t\t\tTooltipManager.instance = new TooltipManager()\n\t\t}\n\t\treturn TooltipManager.instance\n\t}\n\n\tshowTooltip(\n\t\ttooltipId: string,\n\t\tcontent: string | React.ReactNode,\n\t\ttargetElement: HTMLElement,\n\t\tside: 'top' | 'right' | 'bottom' | 'left',\n\t\tsideOffset: number,\n\t\tshowOnMobile: boolean,\n\t\tdelayDuration: number\n\t) {\n\t\t// Clear any existing destroy timeout\n\t\tif (this.destroyTimeoutId) {\n\t\t\tclearTimeout(this.destroyTimeoutId)\n\t\t\tthis.destroyTimeoutId = null\n\t\t}\n\n\t\t// Update current tooltip\n\t\tthis.currentTooltip.set({\n\t\t\tid: tooltipId,\n\t\t\tcontent,\n\t\t\tside,\n\t\t\tsideOffset,\n\t\t\tshowOnMobile,\n\t\t\ttargetElement,\n\t\t\tdelayDuration,\n\t\t})\n\t}\n\n\tupdateCurrentTooltip(tooltipId: string, update: (tooltip: CurrentTooltip) => CurrentTooltip) {\n\t\tthis.currentTooltip.update((tooltip) => {\n\t\t\tif (tooltip?.id === tooltipId) {\n\t\t\t\treturn update(tooltip)\n\t\t\t}\n\t\t\treturn tooltip\n\t\t})\n\t}\n\n\thideTooltip(editor: Editor | null, tooltipId: string, instant: boolean = false) {\n\t\tconst hide = () => {\n\t\t\t// Only hide if this is the current tooltip\n\t\t\tif (this.currentTooltip.get()?.id === tooltipId) {\n\t\t\t\tthis.currentTooltip.set(null)\n\t\t\t\tthis.destroyTimeoutId = null\n\t\t\t}\n\t\t}\n\n\t\tif (editor && !instant) {\n\t\t\t// Start destroy timeout (1 second)\n\t\t\tthis.destroyTimeoutId = editor.timers.setTimeout(hide, 300)\n\t\t} else {\n\t\t\thide()\n\t\t}\n\t}\n\n\thideAllTooltips() {\n\t\tthis.currentTooltip.set(null)\n\t\tthis.destroyTimeoutId = null\n\t}\n\n\tgetCurrentTooltipData() {\n\t\tconst currentTooltip = this.currentTooltip.get()\n\t\tif (!currentTooltip) return null\n\t\tif (!this.supportsHover() && !currentTooltip.showOnMobile) return null\n\t\treturn currentTooltip\n\t}\n\n\tprivate supportsHoverAtom: Atom<boolean> | null = null\n\tsupportsHover() {\n\t\tif (!this.supportsHoverAtom) {\n\t\t\tconst mediaQuery = window.matchMedia('(hover: hover)')\n\t\t\tconst supportsHover = atom('has hover', mediaQuery.matches)\n\t\t\tthis.supportsHoverAtom = supportsHover\n\t\t\tmediaQuery.addEventListener('change', (e) => {\n\t\t\t\tsupportsHover.set(e.matches)\n\t\t\t})\n\t\t}\n\t\treturn this.supportsHoverAtom.get()\n\t}\n}\n\nexport const tooltipManager = TooltipManager.getInstance()\n\n// Context for the tooltip singleton\nconst TooltipSingletonContext = createContext<boolean>(false)\n\n/** @public */\nexport interface TldrawUiTooltipProviderProps {\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderProps) {\n\treturn (\n\t\t<_Tooltip.Provider skipDelayDuration={700}>\n\t\t\t<TooltipSingletonContext.Provider value={true}>\n\t\t\t\t{children}\n\t\t\t\t<TooltipSingleton />\n\t\t\t</TooltipSingletonContext.Provider>\n\t\t</_Tooltip.Provider>\n\t)\n}\n\n// The singleton tooltip component that renders once\nfunction TooltipSingleton() {\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst triggerRef = useRef<HTMLDivElement>(null)\n\tconst isFirstShowRef = useRef(true)\n\tconst editor = useMaybeEditor()\n\n\tconst currentTooltip = useValue(\n\t\t'current tooltip',\n\t\t() => tooltipManager.getCurrentTooltipData(),\n\t\t[]\n\t)\n\n\tconst cameraState = useValue('camera state', () => editor?.getCameraState(), [editor])\n\n\t// Hide tooltip when camera is moving (panning/zooming)\n\tuseEffect(() => {\n\t\tif (cameraState === 'moving' && isOpen && currentTooltip) {\n\t\t\ttooltipManager.hideTooltip(editor, currentTooltip.id, true)\n\t\t}\n\t}, [cameraState, isOpen, currentTooltip, editor])\n\n\tuseEffect(() => {\n\t\tfunction handleKeyDown(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape' && currentTooltip && isOpen) {\n\t\t\t\ttooltipManager.hideTooltip(editor, currentTooltip.id)\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('keydown', handleKeyDown, { capture: true })\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', handleKeyDown, { capture: true })\n\t\t}\n\t}, [editor, currentTooltip, isOpen])\n\n\t// Update open state and trigger position\n\tuseEffect(() => {\n\t\tlet timer: ReturnType<typeof setTimeout> | null = null\n\t\tif (currentTooltip && triggerRef.current) {\n\t\t\t// Position the invisible trigger element over the active element\n\t\t\tconst activeRect = currentTooltip.targetElement.getBoundingClientRect()\n\t\t\tconst trigger = triggerRef.current\n\n\t\t\ttrigger.style.position = 'fixed'\n\t\t\ttrigger.style.left = `${activeRect.left}px`\n\t\t\ttrigger.style.top = `${activeRect.top}px`\n\t\t\ttrigger.style.width = `${activeRect.width}px`\n\t\t\ttrigger.style.height = `${activeRect.height}px`\n\t\t\ttrigger.style.pointerEvents = 'none'\n\t\t\ttrigger.style.zIndex = '9999'\n\n\t\t\t// Handle delay for first show\n\t\t\tif (isFirstShowRef.current) {\n\t\t\t\t// eslint-disable-next-line no-restricted-globals\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tsetIsOpen(true)\n\t\t\t\t\tisFirstShowRef.current = false\n\t\t\t\t}, currentTooltip.delayDuration)\n\t\t\t} else {\n\t\t\t\t// Subsequent tooltips show immediately\n\t\t\t\tsetIsOpen(true)\n\t\t\t}\n\t\t} else {\n\t\t\t// Hide tooltip immediately\n\t\t\tsetIsOpen(false)\n\t\t\t// Reset first show state after tooltip is hidden\n\t\t\tisFirstShowRef.current = true\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (timer !== null) {\n\t\t\t\tclearTimeout(timer)\n\t\t\t}\n\t\t}\n\t}, [currentTooltip])\n\n\tif (!currentTooltip) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<_Tooltip.Root open={isOpen} delayDuration={0}>\n\t\t\t<_Tooltip.Trigger asChild>\n\t\t\t\t<div ref={triggerRef} />\n\t\t\t</_Tooltip.Trigger>\n\t\t\t<_Tooltip.Content\n\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\tside={currentTooltip.side}\n\t\t\t\tsideOffset={currentTooltip.sideOffset}\n\t\t\t\tavoidCollisions\n\t\t\t\tcollisionPadding={8}\n\t\t\t\tdir=\"ltr\"\n\t\t\t>\n\t\t\t\t{currentTooltip.content}\n\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t</_Tooltip.Content>\n\t\t</_Tooltip.Root>\n\t)\n}\n\n/** @public @react */\nexport const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tcontent,\n\t\t\tside,\n\t\t\tsideOffset = 5,\n\t\t\tdisabled = false,\n\t\t\tshowOnMobile = false,\n\t\t\tdelayDuration,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst editor = useMaybeEditor()\n\t\tconst tooltipId = useRef<string>(uniqueId())\n\t\tconst hasProvider = useContext(TooltipSingletonContext)\n\t\tconst showUiLabels = useValue('showUiLabels', () => editor?.user.getShowUiLabels(), [editor])\n\n\t\tconst orientationCtx = useTldrawUiOrientation()\n\t\tconst sideToUse = side ?? orientationCtx.tooltipSide\n\n\t\tuseEffect(() => {\n\t\t\tconst currentTooltipId = tooltipId.current\n\t\t\treturn () => {\n\t\t\t\tif (hasProvider) {\n\t\t\t\t\ttooltipManager.hideTooltip(editor, currentTooltipId, true)\n\t\t\t\t}\n\t\t\t}\n\t\t}, [editor, hasProvider])\n\n\t\tuseLayoutEffect(() => {\n\t\t\tif (hasProvider && tooltipManager.getCurrentTooltipData()?.id === tooltipId.current) {\n\t\t\t\ttooltipManager.updateCurrentTooltip(tooltipId.current, (tooltip) => ({\n\t\t\t\t\t...tooltip,\n\t\t\t\t\tcontent,\n\t\t\t\t\tside: sideToUse,\n\t\t\t\t\tsideOffset,\n\t\t\t\t\tshowOnMobile,\n\t\t\t\t}))\n\t\t\t}\n\t\t}, [content, sideToUse, sideOffset, showOnMobile, hasProvider])\n\n\t\t// Don't show tooltip if disabled, no content, or UI labels are disabled\n\t\tif (disabled || !content) {\n\t\t\treturn <>{children}</>\n\t\t}\n\n\t\tlet delayDurationToUse\n\t\tif (showUiLabels) {\n\t\t\tdelayDurationToUse = 0\n\t\t} else {\n\t\t\tdelayDurationToUse =\n\t\t\t\tdelayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS)\n\t\t}\n\n\t\t// Fallback to old behavior if no provider\n\t\tif (!hasProvider || showUiLabels) {\n\t\t\treturn (\n\t\t\t\t<_Tooltip.Root delayDuration={delayDurationToUse} disableHoverableContent={!showUiLabels}>\n\t\t\t\t\t<_Tooltip.Trigger asChild ref={ref}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</_Tooltip.Trigger>\n\t\t\t\t\t<_Tooltip.Content\n\t\t\t\t\t\tclassName=\"tlui-tooltip\"\n\t\t\t\t\t\tside={sideToUse}\n\t\t\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<_Tooltip.Arrow className=\"tlui-tooltip__arrow\" />\n\t\t\t\t\t</_Tooltip.Content>\n\t\t\t\t</_Tooltip.Root>\n\t\t\t)\n\t\t}\n\n\t\tconst child = React.Children.only(children)\n\t\tassert(React.isValidElement(child), 'TldrawUiTooltip children must be a single element')\n\n\t\tconst handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\tchild.props.onMouseEnter?.(event)\n\t\t\ttooltipManager.showTooltip(\n\t\t\t\ttooltipId.current,\n\t\t\t\tcontent,\n\t\t\t\tevent.currentTarget as HTMLElement,\n\t\t\t\tsideToUse,\n\t\t\t\tsideOffset,\n\t\t\t\tshowOnMobile,\n\t\t\t\tdelayDurationToUse\n\t\t\t)\n\t\t}\n\n\t\tconst handleMouseLeave = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\tchild.props.onMouseLeave?.(event)\n\t\t\ttooltipManager.hideTooltip(editor, tooltipId.current)\n\t\t}\n\n\t\tconst handleFocus = (event: React.FocusEvent<HTMLElement>) => {\n\t\t\tchild.props.onFocus?.(event)\n\t\t\ttooltipManager.showTooltip(\n\t\t\t\ttooltipId.current,\n\t\t\t\tcontent,\n\t\t\t\tevent.currentTarget as HTMLElement,\n\t\t\t\tsideToUse,\n\t\t\t\tsideOffset,\n\t\t\t\tshowOnMobile,\n\t\t\t\tdelayDurationToUse\n\t\t\t)\n\t\t}\n\n\t\tconst handleBlur = (event: React.FocusEvent<HTMLElement>) => {\n\t\t\tchild.props.onBlur?.(event)\n\t\t\ttooltipManager.hideTooltip(editor, tooltipId.current)\n\t\t}\n\n\t\tconst childrenWithHandlers = React.cloneElement(children as React.ReactElement, {\n\t\t\tonMouseEnter: handleMouseEnter,\n\t\t\tonMouseLeave: handleMouseLeave,\n\t\t\tonFocus: handleFocus,\n\t\t\tonBlur: handleBlur,\n\t\t})\n\n\t\treturn childrenWithHandlers\n\t}\n)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,46 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import classNames from "classnames";
3
+ import { Slot } from "radix-ui";
4
+ import { createContext, forwardRef, useContext } from "react";
5
+ const TldrawUiOrientationContext = createContext({
6
+ orientation: "horizontal",
7
+ tooltipSide: "bottom"
8
+ });
9
+ function TldrawUiOrientationProvider({
10
+ children,
11
+ orientation,
12
+ tooltipSide
13
+ }) {
14
+ const prevContext = useTldrawUiOrientation();
15
+ const tooltipSideToUse = tooltipSide ?? (orientation === prevContext.orientation ? prevContext.tooltipSide : orientation === "horizontal" ? "bottom" : "right");
16
+ return /* @__PURE__ */ jsx(TldrawUiOrientationContext.Provider, { value: { orientation, tooltipSide: tooltipSideToUse }, children });
17
+ }
18
+ function useTldrawUiOrientation() {
19
+ return useContext(TldrawUiOrientationContext);
20
+ }
21
+ const TldrawUiRow = forwardRef(
22
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
23
+ const Component = asChild ? Slot.Root : "div";
24
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "horizontal", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-row", className), ...props }) });
25
+ }
26
+ );
27
+ const TldrawUiColumn = forwardRef(
28
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
29
+ const Component = asChild ? Slot.Root : "div";
30
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "vertical", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-column", className), ...props }) });
31
+ }
32
+ );
33
+ const TldrawUiGrid = forwardRef(
34
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
35
+ const Component = asChild ? Slot.Root : "div";
36
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "horizontal", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-grid", className), ...props }) });
37
+ }
38
+ );
39
+ export {
40
+ TldrawUiColumn,
41
+ TldrawUiGrid,
42
+ TldrawUiOrientationProvider,
43
+ TldrawUiRow,
44
+ useTldrawUiOrientation
45
+ };
46
+ //# sourceMappingURL=layout.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/lib/ui/components/primitives/layout.tsx"],
4
+ "sourcesContent": ["import classNames from 'classnames'\nimport { Slot } from 'radix-ui'\nimport { HTMLAttributes, ReactNode, createContext, forwardRef, useContext } from 'react'\n\n/** @public */\nexport interface TldrawUiOrientationContext {\n\torientation: 'horizontal' | 'vertical'\n\ttooltipSide: 'top' | 'right' | 'bottom' | 'left'\n}\n\nconst TldrawUiOrientationContext = createContext<TldrawUiOrientationContext>({\n\torientation: 'horizontal',\n\ttooltipSide: 'bottom',\n})\n\n/** @public */\nexport interface TldrawUiOrientationProviderProps {\n\tchildren: ReactNode\n\torientation: 'horizontal' | 'vertical'\n\ttooltipSide?: 'top' | 'right' | 'bottom' | 'left'\n}\n/** @public @react */\nexport function TldrawUiOrientationProvider({\n\tchildren,\n\torientation,\n\ttooltipSide,\n}: TldrawUiOrientationProviderProps) {\n\tconst prevContext = useTldrawUiOrientation()\n\t// generally, we want tooltip side to cascade down through the layout - apart from when the\n\t// orientation changes. If the tooltip side is \"bottom\", and then I include some vertical layout\n\t// elements, keeping the tooltip side as bottom will cause the tooltip to overlap elements\n\t// stacked on top of each other. In the absence of a tooltip side, we pick a default side based\n\t// on the orientation whenever the orientation changes.\n\tconst tooltipSideToUse =\n\t\ttooltipSide ??\n\t\t(orientation === prevContext.orientation\n\t\t\t? prevContext.tooltipSide\n\t\t\t: orientation === 'horizontal'\n\t\t\t\t? 'bottom'\n\t\t\t\t: 'right')\n\n\treturn (\n\t\t<TldrawUiOrientationContext.Provider value={{ orientation, tooltipSide: tooltipSideToUse }}>\n\t\t\t{children}\n\t\t</TldrawUiOrientationContext.Provider>\n\t)\n}\n\n/** @public */\nexport function useTldrawUiOrientation() {\n\treturn useContext(TldrawUiOrientationContext)\n}\n\n/** @public */\nexport interface TLUiLayoutProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode\n\ttooltipSide?: 'top' | 'right' | 'bottom' | 'left'\n\tasChild?: boolean\n}\n\n/**\n * A row, usually of UI controls like buttons, select dropdown, checkboxes, etc.\n *\n * @public @react\n */\nexport const TldrawUiRow = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"horizontal\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-row', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n\n/**\n * A column, usually of UI controls like buttons, select dropdown, checkboxes, etc.\n *\n * @public @react\n */\nexport const TldrawUiColumn = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"vertical\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-column', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n\n/**\n * A tight grid 4 elements wide, usually of UI controls like buttons, select dropdown, checkboxes,\n * etc.\n *\n * @public @react */\nexport const TldrawUiGrid = forwardRef<HTMLDivElement, TLUiLayoutProps>(\n\t({ asChild, className, tooltipSide, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn (\n\t\t\t<TldrawUiOrientationProvider orientation=\"horizontal\" tooltipSide={tooltipSide}>\n\t\t\t\t<Component ref={ref} className={classNames('tlui-grid', className)} {...props} />\n\t\t\t</TldrawUiOrientationProvider>\n\t\t)\n\t}\n)\n"],
5
+ "mappings": "AA0CE;AA1CF,OAAO,gBAAgB;AACvB,SAAS,YAAY;AACrB,SAAoC,eAAe,YAAY,kBAAkB;AAQjF,MAAM,6BAA6B,cAA0C;AAAA,EAC5E,aAAa;AAAA,EACb,aAAa;AACd,CAAC;AASM,SAAS,4BAA4B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACD,GAAqC;AACpC,QAAM,cAAc,uBAAuB;AAM3C,QAAM,mBACL,gBACC,gBAAgB,YAAY,cAC1B,YAAY,cACZ,gBAAgB,eACf,WACA;AAEL,SACC,oBAAC,2BAA2B,UAA3B,EAAoC,OAAO,EAAE,aAAa,aAAa,iBAAiB,GACvF,UACF;AAEF;AAGO,SAAS,yBAAyB;AACxC,SAAO,WAAW,0BAA0B;AAC7C;AAcO,MAAM,cAAc;AAAA,EAC1B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,cAAa,aACrD,8BAAC,aAAU,KAAU,WAAW,WAAW,YAAY,SAAS,GAAI,GAAG,OAAO,GAC/E;AAAA,EAEF;AACD;AAOO,MAAM,iBAAiB;AAAA,EAC7B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,YAAW,aACnD,8BAAC,aAAU,KAAU,WAAW,WAAW,eAAe,SAAS,GAAI,GAAG,OAAO,GAClF;AAAA,EAEF;AACD;AAOO,MAAM,eAAe;AAAA,EAC3B,CAAC,EAAE,SAAS,WAAW,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WACC,oBAAC,+BAA4B,aAAY,cAAa,aACrD,8BAAC,aAAU,KAAU,WAAW,WAAW,aAAa,SAAS,GAAI,GAAG,OAAO,GAChF;AAAA,EAEF;AACD;",
6
+ "names": []
7
+ }
@@ -11,6 +11,7 @@ function TldrawUiMenuCheckboxItem({
11
11
  id,
12
12
  kbd,
13
13
  label,
14
+ lang,
14
15
  readonlyOk,
15
16
  onSelect,
16
17
  toggle = false,
@@ -29,6 +30,7 @@ function TldrawUiMenuCheckboxItem({
29
30
  _DropdownMenu.CheckboxItem,
30
31
  {
31
32
  dir: "ltr",
33
+ lang,
32
34
  className: "tlui-button tlui-button__menu tlui-button__checkbox",
33
35
  title: labelStr,
34
36
  onSelect: (e) => {
@@ -58,6 +60,7 @@ function TldrawUiMenuCheckboxItem({
58
60
  {
59
61
  className: "tlui-button tlui-button__menu tlui-button__checkbox",
60
62
  dir: "ltr",
63
+ lang,
61
64
  title: labelStr,
62
65
  onSelect: (e) => {
63
66
  onSelect(sourceId);