tldraw 3.16.0-canary.2b8b5023f0a5 → 3.16.0-canary.2b8e5b0ef726

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 (431) hide show
  1. package/dist-cjs/index.d.ts +274 -110
  2. package/dist-cjs/index.js +36 -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/arrowLabel.js +6 -0
  11. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
  12. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  13. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  14. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +4 -4
  15. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  17. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  18. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -5
  19. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  21. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  22. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +2 -2
  23. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  24. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -0
  25. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  27. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +2 -1
  29. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
  31. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  32. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  33. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  34. package/dist-cjs/lib/shapes/shared/ShapeFill.js +1 -1
  35. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  36. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  37. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -4
  38. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  39. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  40. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  41. package/dist-cjs/lib/shapes/text/PlainTextArea.js +2 -2
  42. package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
  43. package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
  44. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  45. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  46. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  47. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  48. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  49. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  50. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  51. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  52. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  53. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  54. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  55. package/dist-cjs/lib/ui/components/A11y.js +1 -1
  56. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  57. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +10 -2
  58. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  59. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  60. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  61. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  62. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  63. package/dist-cjs/lib/ui/components/LanguageMenu.js +1 -0
  64. package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
  65. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js +1 -0
  66. package/dist-cjs/lib/ui/components/Minimap/DefaultMinimap.js.map +2 -2
  67. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  68. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  69. package/dist-cjs/lib/ui/components/MobileStylePanel.js +4 -2
  70. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  71. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +1 -1
  72. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  73. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
  74. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  75. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
  76. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  77. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +147 -0
  78. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  79. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  80. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  81. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +23 -22
  82. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  83. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +24 -21
  84. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  85. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  86. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  87. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +4 -2
  88. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  89. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  90. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -22
  92. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  93. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  94. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +5 -4
  96. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  97. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +188 -78
  98. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  99. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +11 -2
  100. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
  102. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +18 -5
  104. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +18 -3
  106. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +186 -165
  108. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/primitives/layout.js +30 -5
  110. package/dist-cjs/lib/ui/components/primitives/layout.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js +3 -0
  112. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  114. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  115. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  116. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +8 -24
  117. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  118. package/dist-cjs/lib/ui/context/actions.js +29 -10
  119. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  120. package/dist-cjs/lib/ui/context/components.js +2 -0
  121. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  122. package/dist-cjs/lib/ui/context/events.js.map +1 -1
  123. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  124. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  125. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  126. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  127. package/dist-cjs/lib/ui/hooks/useTools.js +22 -4
  128. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  129. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  130. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +6 -2
  131. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  132. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  133. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  134. package/dist-cjs/lib/ui/version.js +3 -3
  135. package/dist-cjs/lib/ui/version.js.map +1 -1
  136. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  137. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  138. package/dist-cjs/lib/utils/export/export.js +0 -20
  139. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  140. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  141. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  142. package/dist-esm/index.d.mts +274 -110
  143. package/dist-esm/index.mjs +68 -30
  144. package/dist-esm/index.mjs.map +2 -2
  145. package/dist-esm/lib/Tldraw.mjs +14 -4
  146. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  147. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  148. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  149. package/dist-esm/lib/defaultExternalContentHandlers.mjs +15 -4
  150. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  151. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  152. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  153. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  154. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  155. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +5 -5
  156. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  157. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  158. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  159. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +12 -5
  160. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  161. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  162. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  163. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +3 -3
  164. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  165. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +1 -0
  166. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  167. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  168. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  169. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +2 -1
  170. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  171. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
  172. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  173. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  174. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  175. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +1 -1
  176. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  177. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  178. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +4 -5
  179. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  180. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  181. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  182. package/dist-esm/lib/shapes/text/PlainTextArea.mjs +3 -3
  183. package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
  184. package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
  185. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  186. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  187. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  188. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  189. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  190. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  191. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  192. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  193. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  194. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  195. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  196. package/dist-esm/lib/ui/components/A11y.mjs +2 -2
  197. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  198. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +10 -2
  199. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  200. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  201. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  202. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  203. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  204. package/dist-esm/lib/ui/components/LanguageMenu.mjs +1 -0
  205. package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
  206. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs +1 -0
  207. package/dist-esm/lib/ui/components/Minimap/DefaultMinimap.mjs.map +2 -2
  208. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  209. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  210. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +4 -2
  211. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  212. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -2
  213. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  214. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
  215. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  216. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
  217. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  218. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +135 -0
  219. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  220. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  221. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  222. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +20 -19
  223. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  224. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +21 -18
  225. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  226. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  227. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  228. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +4 -2
  229. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  230. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  231. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  232. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -22
  233. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  234. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  235. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  236. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +5 -4
  237. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  238. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -80
  239. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  240. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +12 -3
  241. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  242. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +3 -3
  243. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  244. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +18 -5
  245. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  246. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +19 -4
  247. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  248. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +196 -167
  249. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  250. package/dist-esm/lib/ui/components/primitives/layout.mjs +31 -6
  251. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +2 -2
  252. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs +3 -0
  253. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  254. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  255. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  256. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  257. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +8 -24
  258. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  259. package/dist-esm/lib/ui/context/actions.mjs +29 -10
  260. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  261. package/dist-esm/lib/ui/context/components.mjs +2 -0
  262. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  263. package/dist-esm/lib/ui/context/events.mjs.map +1 -1
  264. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  265. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  266. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  267. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  268. package/dist-esm/lib/ui/hooks/useTools.mjs +23 -4
  269. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  270. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +6 -2
  271. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  272. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  273. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  274. package/dist-esm/lib/ui/version.mjs +3 -3
  275. package/dist-esm/lib/ui/version.mjs.map +1 -1
  276. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  277. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  278. package/dist-esm/lib/utils/export/export.mjs +0 -20
  279. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  280. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  281. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  282. package/package.json +11 -34
  283. package/src/index.ts +49 -22
  284. package/src/lib/Tldraw.tsx +15 -2
  285. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  286. package/src/lib/defaultExternalContentHandlers.ts +26 -4
  287. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  288. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +6 -5
  289. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +48 -6
  290. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  291. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  292. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +5 -5
  293. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  294. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  295. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -4
  296. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  297. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +3 -3
  298. package/src/lib/shapes/geo/GeoShapeUtil.tsx +1 -0
  299. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  300. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  301. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  302. package/src/lib/shapes/note/NoteShapeUtil.tsx +1 -0
  303. package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
  304. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  305. package/src/lib/shapes/shared/ShapeFill.tsx +1 -1
  306. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  307. package/src/lib/shapes/shared/useEditablePlainText.ts +5 -9
  308. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  309. package/src/lib/shapes/text/PlainTextArea.tsx +3 -3
  310. package/src/lib/shapes/text/RichTextArea.tsx +3 -4
  311. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  312. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  313. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  314. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  315. package/src/lib/ui/TldrawUi.tsx +33 -12
  316. package/src/lib/ui/assetUrls.ts +13 -10
  317. package/src/lib/ui/components/A11y.tsx +2 -2
  318. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +13 -2
  319. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  320. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  321. package/src/lib/ui/components/LanguageMenu.tsx +1 -0
  322. package/src/lib/ui/components/Minimap/DefaultMinimap.tsx +1 -0
  323. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  324. package/src/lib/ui/components/MobileStylePanel.tsx +4 -3
  325. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +2 -2
  326. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
  327. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -381
  328. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +70 -50
  329. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  330. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +28 -19
  331. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  332. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  333. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +5 -3
  334. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  335. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -24
  336. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  337. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +6 -5
  338. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +208 -56
  339. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +8 -3
  340. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +3 -3
  341. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +52 -32
  342. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +27 -6
  343. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +231 -185
  344. package/src/lib/ui/components/primitives/layout.tsx +79 -5
  345. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +4 -0
  346. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  347. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  348. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +11 -24
  349. package/src/lib/ui/context/actions.tsx +36 -10
  350. package/src/lib/ui/context/components.tsx +3 -0
  351. package/src/lib/ui/context/events.tsx +1 -1
  352. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  353. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  354. package/src/lib/ui/hooks/useTools.tsx +26 -4
  355. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +4 -0
  356. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +6 -2
  357. package/src/lib/ui/kbd-utils.ts +10 -3
  358. package/src/lib/ui/version.ts +3 -3
  359. package/src/lib/ui.css +375 -245
  360. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  361. package/src/lib/utils/export/copyAs.ts +1 -24
  362. package/src/lib/utils/export/export.ts +0 -36
  363. package/src/lib/utils/export/exportAs.ts +1 -32
  364. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  365. package/src/test/A11y.test.tsx +3 -2
  366. package/src/test/ClickManager.test.ts +7 -6
  367. package/src/test/Editor.test.tsx +20 -19
  368. package/src/test/EraserTool.test.ts +184 -13
  369. package/src/test/HandTool.test.ts +10 -9
  370. package/src/test/HighlightShape.test.ts +2 -1
  371. package/src/test/SelectTool.test.ts +3 -2
  372. package/src/test/TLUserPreferences.test.ts +4 -3
  373. package/src/test/TestEditor.ts +13 -15
  374. package/src/test/TldrawEditor.test.tsx +11 -10
  375. package/src/test/ZoomTool.test.ts +7 -6
  376. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  377. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  378. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  379. package/src/test/arrows-megabus.test.tsx +5 -4
  380. package/src/test/bindings.test.tsx +24 -37
  381. package/src/test/bookmark-shapes.test.ts +1 -8
  382. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  383. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  384. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  385. package/src/test/commands/alignShapes.test.tsx +25 -24
  386. package/src/test/commands/animationSpeed.test.ts +2 -1
  387. package/src/test/commands/centerOnPoint.test.ts +3 -2
  388. package/src/test/commands/clipboard.test.ts +3 -2
  389. package/src/test/commands/createShapes.test.ts +2 -1
  390. package/src/test/commands/deleteShapes.test.ts +2 -1
  391. package/src/test/commands/distributeShapes.test.tsx +11 -10
  392. package/src/test/commands/getSvgString.test.ts +2 -1
  393. package/src/test/commands/packShapes.test.ts +5 -4
  394. package/src/test/commands/resizeShape.test.ts +2 -1
  395. package/src/test/commands/rotateShapes.test.ts +7 -6
  396. package/src/test/commands/setCamera.test.ts +4 -3
  397. package/src/test/commands/setCurrentPage.test.ts +3 -2
  398. package/src/test/commands/stackShapes.test.ts +11 -10
  399. package/src/test/commands/stretch.test.tsx +13 -12
  400. package/src/test/createDeepLink.test.tsx +2 -1
  401. package/src/test/cropping.test.ts +3 -2
  402. package/src/test/custom-clipping.test.ts +436 -0
  403. package/src/test/drawing.test.ts +2 -1
  404. package/src/test/flipShapes.test.ts +4 -3
  405. package/src/test/frames.test.ts +25 -24
  406. package/src/test/getCulledShapes.test.tsx +74 -4
  407. package/src/test/groups.test.tsx +1 -1
  408. package/src/test/handleDeepLink.test.tsx +2 -1
  409. package/src/test/maxShapes.test.ts +3 -2
  410. package/src/test/modifiers.test.ts +5 -4
  411. package/src/test/navigation.test.ts +12 -11
  412. package/src/test/panning.test.ts +2 -1
  413. package/src/test/perf/perf.test.ts +2 -1
  414. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  415. package/src/test/resizing.test.ts +39 -38
  416. package/src/test/select.test.tsx +4 -3
  417. package/src/test/selection-omnibus.test.ts +11 -10
  418. package/src/test/shapeutils.test.ts +4 -3
  419. package/src/test/translating.test.ts +9 -8
  420. package/tldraw.css +683 -537
  421. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  422. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  423. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  424. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +0 -131
  425. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  426. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  427. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  428. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  429. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  430. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  431. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
@@ -1,78 +1,84 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { assert, 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, instant = false) {
40
+ updateCurrentTooltip(tooltipId, update) {
41
+ this.currentTooltip.update((tooltip) => {
42
+ if (tooltip?.id === tooltipId) {
43
+ return update(tooltip);
44
+ }
45
+ return tooltip;
46
+ });
47
+ }
48
+ hideTooltip(editor, tooltipId, instant = false) {
46
49
  const hide = () => {
47
- if (this.currentTooltipId === tooltipId) {
48
- this.currentTooltipId = null;
49
- this.currentContent = "";
50
- this.activeElement = null;
50
+ if (this.currentTooltip.get()?.id === tooltipId) {
51
+ this.currentTooltip.set(null);
51
52
  this.destroyTimeoutId = null;
52
- this.notify();
53
53
  }
54
54
  };
55
- if (instant) {
55
+ if (editor && !instant) {
56
+ this.destroyTimeoutId = editor.timers.setTimeout(hide, 300);
57
+ } else {
56
58
  hide();
57
- } else if (this.editor) {
58
- this.destroyTimeoutId = this.editor.timers.setTimeout(hide, 300);
59
59
  }
60
60
  }
61
61
  hideAllTooltips() {
62
- this.currentTooltipId = null;
63
- this.currentContent = "";
64
- this.activeElement = null;
62
+ this.currentTooltip.set(null);
65
63
  this.destroyTimeoutId = null;
66
- this.notify();
67
64
  }
68
65
  getCurrentTooltipData() {
69
- return {
70
- id: this.currentTooltipId,
71
- content: this.currentContent,
72
- side: this.currentSide,
73
- sideOffset: this.currentSideOffset,
74
- element: this.activeElement
75
- };
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();
76
82
  }
77
83
  }
78
84
  const tooltipManager = TooltipManager.getInstance();
@@ -84,45 +90,37 @@ function TldrawUiTooltipProvider({ children }) {
84
90
  ] }) });
85
91
  }
86
92
  function TooltipSingleton() {
87
- const editor = useMaybeEditor();
88
- const [, forceUpdate] = useState({});
89
93
  const [isOpen, setIsOpen] = useState(false);
90
94
  const triggerRef = useRef(null);
91
- const previousPositionRef = useRef(null);
92
- const prefersReducedMotion = usePrefersReducedMotion();
93
- const [shouldAnimate, setShouldAnimate] = useState(false);
94
95
  const isFirstShowRef = useRef(true);
95
- const showTimeoutRef = useRef(null);
96
- useEffect(() => {
97
- tooltipManager.setEditor(editor);
98
- }, [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]);
99
103
  useEffect(() => {
100
- const unsubscribe = tooltipManager.subscribe(() => {
101
- forceUpdate({});
102
- });
103
- return unsubscribe;
104
- }, []);
105
- const tooltipData = tooltipManager.getCurrentTooltipData();
104
+ if (cameraState === "moving" && isOpen && currentTooltip) {
105
+ tooltipManager.hideTooltip(editor, currentTooltip.id, true);
106
+ }
107
+ }, [cameraState, isOpen, currentTooltip, editor]);
106
108
  useEffect(() => {
107
- const shouldBeOpen = Boolean(tooltipData.id && tooltipData.element);
108
- if (showTimeoutRef.current) {
109
- clearTimeout(showTimeoutRef.current);
110
- showTimeoutRef.current = null;
109
+ function handleKeyDown(event) {
110
+ if (event.key === "Escape" && currentTooltip) {
111
+ tooltipManager.hideTooltip(editor, currentTooltip.id);
112
+ }
111
113
  }
112
- if (shouldBeOpen && tooltipData.element && triggerRef.current) {
113
- const activeRect = tooltipData.element.getBoundingClientRect();
114
+ document.addEventListener("keydown", handleKeyDown);
115
+ return () => {
116
+ document.removeEventListener("keydown", handleKeyDown);
117
+ };
118
+ }, [editor, currentTooltip]);
119
+ useEffect(() => {
120
+ let timer = null;
121
+ if (currentTooltip && triggerRef.current) {
122
+ const activeRect = currentTooltip.targetElement.getBoundingClientRect();
114
123
  const trigger = triggerRef.current;
115
- const newPosition = {
116
- x: activeRect.left + activeRect.width / 2,
117
- y: activeRect.top + activeRect.height / 2
118
- };
119
- let shouldAnimateCheck = false;
120
- if (previousPositionRef.current) {
121
- const isNearPrevious = Vec.DistMin(previousPositionRef.current, newPosition, 200);
122
- shouldAnimateCheck = !prefersReducedMotion && isNearPrevious && Math.abs(newPosition.y - previousPositionRef.current.y) < 50;
123
- }
124
- setShouldAnimate(isFirstShowRef.current ? false : shouldAnimateCheck);
125
- previousPositionRef.current = newPosition;
126
124
  trigger.style.position = "fixed";
127
125
  trigger.style.left = `${activeRect.left}px`;
128
126
  trigger.style.top = `${activeRect.top}px`;
@@ -130,22 +128,25 @@ function TooltipSingleton() {
130
128
  trigger.style.height = `${activeRect.height}px`;
131
129
  trigger.style.pointerEvents = "none";
132
130
  trigger.style.zIndex = "9999";
133
- if (isFirstShowRef.current && editor) {
134
- showTimeoutRef.current = editor.timers.setTimeout(() => {
131
+ if (isFirstShowRef.current) {
132
+ timer = setTimeout(() => {
135
133
  setIsOpen(true);
136
134
  isFirstShowRef.current = false;
137
- }, editor.options.tooltipDelayMs);
135
+ }, currentTooltip.delayDuration);
138
136
  } else {
139
137
  setIsOpen(true);
140
138
  }
141
- } else if (!shouldBeOpen) {
139
+ } else {
142
140
  setIsOpen(false);
143
- previousPositionRef.current = null;
144
- setShouldAnimate(false);
145
141
  isFirstShowRef.current = true;
146
142
  }
147
- }, [tooltipData.id, tooltipData.element, editor, prefersReducedMotion]);
148
- if (!tooltipData.id) {
143
+ return () => {
144
+ if (timer !== null) {
145
+ clearTimeout(timer);
146
+ }
147
+ };
148
+ }, [currentTooltip]);
149
+ if (!currentTooltip) {
149
150
  return null;
150
151
  }
151
152
  return /* @__PURE__ */ jsxs(_Tooltip.Root, { open: isOpen, delayDuration: 0, children: [
@@ -154,98 +155,126 @@ function TooltipSingleton() {
154
155
  _Tooltip.Content,
155
156
  {
156
157
  className: "tlui-tooltip",
157
- "data-should-animate": shouldAnimate,
158
- side: tooltipData.side,
159
- sideOffset: tooltipData.sideOffset,
158
+ side: currentTooltip.side,
159
+ sideOffset: currentTooltip.sideOffset,
160
160
  avoidCollisions: true,
161
161
  collisionPadding: 8,
162
162
  dir: "ltr",
163
163
  children: [
164
- tooltipData.content,
164
+ currentTooltip.content,
165
165
  /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
166
166
  ]
167
167
  }
168
168
  )
169
169
  ] });
170
170
  }
171
- function TldrawUiTooltip({
172
- children,
173
- content,
174
- side = "bottom",
175
- sideOffset = 5,
176
- disabled = false
177
- }) {
178
- const editor = useMaybeEditor();
179
- const tooltipId = useRef(uniqueId());
180
- const hasProvider = useContext(TooltipSingletonContext);
181
- if (disabled || !content) {
182
- return /* @__PURE__ */ jsx(Fragment, { children });
183
- }
184
- if (!hasProvider) {
185
- return /* @__PURE__ */ jsxs(
186
- _Tooltip.Root,
187
- {
188
- delayDuration: editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS,
189
- disableHoverableContent: true,
190
- children: [
191
- /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, children }),
192
- /* @__PURE__ */ jsxs(
193
- _Tooltip.Content,
194
- {
195
- className: "tlui-tooltip",
196
- side,
197
- sideOffset,
198
- avoidCollisions: true,
199
- collisionPadding: 8,
200
- dir: "ltr",
201
- children: [
202
- content,
203
- /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
204
- ]
205
- }
206
- )
207
- ]
171
+ const TldrawUiTooltip = forwardRef(
172
+ ({
173
+ children,
174
+ content,
175
+ side,
176
+ sideOffset = 5,
177
+ disabled = false,
178
+ showOnMobile = false,
179
+ delayDuration
180
+ }, ref) => {
181
+ const editor = useMaybeEditor();
182
+ const tooltipId = useRef(uniqueId());
183
+ const hasProvider = useContext(TooltipSingletonContext);
184
+ const showUiLabels = useValue("showUiLabels", () => editor?.user.getShowUiLabels(), [editor]);
185
+ const orientationCtx = useTldrawUiOrientation();
186
+ const sideToUse = side ?? orientationCtx.tooltipSide;
187
+ useEffect(() => {
188
+ const currentTooltipId = tooltipId.current;
189
+ return () => {
190
+ if (hasProvider) {
191
+ tooltipManager.hideTooltip(editor, currentTooltipId, true);
192
+ }
193
+ };
194
+ }, [editor, hasProvider]);
195
+ useLayoutEffect(() => {
196
+ if (hasProvider && tooltipManager.getCurrentTooltipData()?.id === tooltipId.current) {
197
+ tooltipManager.updateCurrentTooltip(tooltipId.current, (tooltip) => ({
198
+ ...tooltip,
199
+ content,
200
+ side: sideToUse,
201
+ sideOffset,
202
+ showOnMobile
203
+ }));
208
204
  }
209
- );
205
+ }, [content, sideToUse, sideOffset, showOnMobile, hasProvider]);
206
+ if (disabled || !content) {
207
+ return /* @__PURE__ */ jsx(Fragment, { children });
208
+ }
209
+ let delayDurationToUse;
210
+ if (showUiLabels) {
211
+ delayDurationToUse = 0;
212
+ } else {
213
+ delayDurationToUse = delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS);
214
+ }
215
+ if (!hasProvider) {
216
+ return /* @__PURE__ */ jsxs(_Tooltip.Root, { delayDuration: delayDurationToUse, disableHoverableContent: true, children: [
217
+ /* @__PURE__ */ jsx(_Tooltip.Trigger, { asChild: true, ref, children }),
218
+ /* @__PURE__ */ jsxs(
219
+ _Tooltip.Content,
220
+ {
221
+ className: "tlui-tooltip",
222
+ side: sideToUse,
223
+ sideOffset,
224
+ avoidCollisions: true,
225
+ collisionPadding: 8,
226
+ dir: "ltr",
227
+ children: [
228
+ content,
229
+ /* @__PURE__ */ jsx(_Tooltip.Arrow, { className: "tlui-tooltip__arrow" })
230
+ ]
231
+ }
232
+ )
233
+ ] });
234
+ }
235
+ const child = React.Children.only(children);
236
+ assert(React.isValidElement(child), "TldrawUiTooltip children must be a single element");
237
+ const handleMouseEnter = (event) => {
238
+ child.props.onMouseEnter?.(event);
239
+ tooltipManager.showTooltip(
240
+ tooltipId.current,
241
+ content,
242
+ event.currentTarget,
243
+ sideToUse,
244
+ sideOffset,
245
+ showOnMobile,
246
+ delayDurationToUse
247
+ );
248
+ };
249
+ const handleMouseLeave = (event) => {
250
+ child.props.onMouseLeave?.(event);
251
+ tooltipManager.hideTooltip(editor, tooltipId.current);
252
+ };
253
+ const handleFocus = (event) => {
254
+ child.props.onFocus?.(event);
255
+ tooltipManager.showTooltip(
256
+ tooltipId.current,
257
+ content,
258
+ event.currentTarget,
259
+ sideToUse,
260
+ sideOffset,
261
+ showOnMobile,
262
+ delayDurationToUse
263
+ );
264
+ };
265
+ const handleBlur = (event) => {
266
+ child.props.onBlur?.(event);
267
+ tooltipManager.hideTooltip(editor, tooltipId.current);
268
+ };
269
+ const childrenWithHandlers = React.cloneElement(children, {
270
+ onMouseEnter: handleMouseEnter,
271
+ onMouseLeave: handleMouseLeave,
272
+ onFocus: handleFocus,
273
+ onBlur: handleBlur
274
+ });
275
+ return childrenWithHandlers;
210
276
  }
211
- const child = React.Children.only(children);
212
- assert(React.isValidElement(child), "TldrawUiTooltip children must be a single element");
213
- const handleMouseEnter = (event) => {
214
- child.props.onMouseEnter?.(event);
215
- tooltipManager.showTooltip(
216
- tooltipId.current,
217
- content,
218
- event.currentTarget,
219
- side,
220
- sideOffset
221
- );
222
- };
223
- const handleMouseLeave = (event) => {
224
- child.props.onMouseLeave?.(event);
225
- tooltipManager.hideTooltip(tooltipId.current);
226
- };
227
- const handleFocus = (event) => {
228
- child.props.onFocus?.(event);
229
- tooltipManager.showTooltip(
230
- tooltipId.current,
231
- content,
232
- event.currentTarget,
233
- side,
234
- sideOffset
235
- );
236
- };
237
- const handleBlur = (event) => {
238
- child.props.onBlur?.(event);
239
- tooltipManager.hideTooltip(tooltipId.current);
240
- };
241
- const childrenWithHandlers = React.cloneElement(children, {
242
- onMouseEnter: handleMouseEnter,
243
- onMouseLeave: handleMouseLeave,
244
- onFocus: handleFocus,
245
- onBlur: handleBlur
246
- });
247
- return childrenWithHandlers;
248
- }
277
+ );
249
278
  export {
250
279
  TldrawUiTooltip,
251
280
  TldrawUiTooltipProvider,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/ui/components/primitives/TldrawUiTooltip.tsx"],
4
- "sourcesContent": ["import { assert, 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, instant: boolean = false) {\n\t\tconst hide = () => {\n\t\t\t// Only hide if this is the current tooltip\n\t\t\tif (this.currentTooltipId === tooltipId) {\n\t\t\t\tthis.currentTooltipId = null\n\t\t\t\tthis.currentContent = ''\n\t\t\t\tthis.activeElement = null\n\t\t\t\tthis.destroyTimeoutId = null\n\t\t\t\tthis.notify()\n\t\t\t}\n\t\t}\n\n\t\tif (instant) {\n\t\t\thide()\n\t\t} else if (this.editor) {\n\t\t\t// Start destroy timeout (1 second)\n\t\t\tthis.destroyTimeoutId = this.editor.timers.setTimeout(hide, 300)\n\t\t}\n\t}\n\n\thideAllTooltips() {\n\t\tthis.currentTooltipId = null\n\t\tthis.currentContent = ''\n\t\tthis.activeElement = null\n\t\tthis.destroyTimeoutId = null\n\t\tthis.notify()\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\nexport const tooltipManager = TooltipManager.getInstance()\n\n// Context for the tooltip singleton\nconst TooltipSingletonContext = createContext<boolean>(false)\n\n/** @public */\nexport interface TldrawUiTooltipProviderProps {\n\tchildren: React.ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiTooltipProvider({ children }: TldrawUiTooltipProviderProps) {\n\treturn (\n\t\t<_Tooltip.Provider skipDelayDuration={700}>\n\t\t\t<TooltipSingletonContext.Provider value={true}>\n\t\t\t\t{children}\n\t\t\t\t<TooltipSingleton />\n\t\t\t</TooltipSingletonContext.Provider>\n\t\t</_Tooltip.Provider>\n\t)\n}\n\n// The singleton tooltip component that renders once\nfunction TooltipSingleton() {\n\tconst editor = useMaybeEditor()\n\tconst [, 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 child = React.Children.only(children)\n\tassert(React.isValidElement(child), 'TldrawUiTooltip children must be a single element')\n\n\tconst handleMouseEnter = (event: React.MouseEvent<HTMLElement>) => {\n\t\tchild.props.onMouseEnter?.(event)\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 = (event: React.MouseEvent<HTMLElement>) => {\n\t\tchild.props.onMouseLeave?.(event)\n\t\ttooltipManager.hideTooltip(tooltipId.current)\n\t}\n\n\tconst handleFocus = (event: React.FocusEvent<HTMLElement>) => {\n\t\tchild.props.onFocus?.(event)\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 = (event: React.FocusEvent<HTMLElement>) => {\n\t\tchild.props.onBlur?.(event)\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) {\n\t\t\t\ttooltipManager.hideTooltip(editor, currentTooltip.id)\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('keydown', handleKeyDown)\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', handleKeyDown)\n\t\t}\n\t}, [editor, currentTooltip])\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) {\n\t\t\treturn (\n\t\t\t\t<_Tooltip.Root delayDuration={delayDurationToUse} disableHoverableContent>\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": "AA+IG,SAyJO,UAvJN,KAFD;AA/IH,SAAS,QAAc,MAAc,UAAU,gBAAgB,gBAAgB;AAC/E,SAAS,WAAW,gBAAgB;AACpC,OAAO;AAAA,EACN;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,8BAA8B;AAEvC,MAAM,2BAA2B;AAwBjC,MAAM,eAAe;AAAA,EACpB,OAAe,WAAkC;AAAA,EACzC,iBAAiB,KAA4B,mBAAmB,IAAI;AAAA,EACpE,mBAAkC;AAAA,EAE1C,OAAO,cAA8B;AACpC,QAAI,CAAC,eAAe,UAAU;AAC7B,qBAAe,WAAW,IAAI,eAAe;AAAA,IAC9C;AACA,WAAO,eAAe;AAAA,EACvB;AAAA,EAEA,YACC,WACA,SACA,eACA,MACA,YACA,cACA,eACC;AAED,QAAI,KAAK,kBAAkB;AAC1B,mBAAa,KAAK,gBAAgB;AAClC,WAAK,mBAAmB;AAAA,IACzB;AAGA,SAAK,eAAe,IAAI;AAAA,MACvB,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,qBAAqB,WAAmB,QAAqD;AAC5F,SAAK,eAAe,OAAO,CAAC,YAAY;AACvC,UAAI,SAAS,OAAO,WAAW;AAC9B,eAAO,OAAO,OAAO;AAAA,MACtB;AACA,aAAO;AAAA,IACR,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,QAAuB,WAAmB,UAAmB,OAAO;AAC/E,UAAM,OAAO,MAAM;AAElB,UAAI,KAAK,eAAe,IAAI,GAAG,OAAO,WAAW;AAChD,aAAK,eAAe,IAAI,IAAI;AAC5B,aAAK,mBAAmB;AAAA,MACzB;AAAA,IACD;AAEA,QAAI,UAAU,CAAC,SAAS;AAEvB,WAAK,mBAAmB,OAAO,OAAO,WAAW,MAAM,GAAG;AAAA,IAC3D,OAAO;AACN,WAAK;AAAA,IACN;AAAA,EACD;AAAA,EAEA,kBAAkB;AACjB,SAAK,eAAe,IAAI,IAAI;AAC5B,SAAK,mBAAmB;AAAA,EACzB;AAAA,EAEA,wBAAwB;AACvB,UAAM,iBAAiB,KAAK,eAAe,IAAI;AAC/C,QAAI,CAAC,eAAgB,QAAO;AAC5B,QAAI,CAAC,KAAK,cAAc,KAAK,CAAC,eAAe,aAAc,QAAO;AAClE,WAAO;AAAA,EACR;AAAA,EAEQ,oBAA0C;AAAA,EAClD,gBAAgB;AACf,QAAI,CAAC,KAAK,mBAAmB;AAC5B,YAAM,aAAa,OAAO,WAAW,gBAAgB;AACrD,YAAM,gBAAgB,KAAK,aAAa,WAAW,OAAO;AAC1D,WAAK,oBAAoB;AACzB,iBAAW,iBAAiB,UAAU,CAAC,MAAM;AAC5C,sBAAc,IAAI,EAAE,OAAO;AAAA,MAC5B,CAAC;AAAA,IACF;AACA,WAAO,KAAK,kBAAkB,IAAI;AAAA,EACnC;AACD;AAEO,MAAM,iBAAiB,eAAe,YAAY;AAGzD,MAAM,0BAA0B,cAAuB,KAAK;AAQrD,SAAS,wBAAwB,EAAE,SAAS,GAAiC;AACnF,SACC,oBAAC,SAAS,UAAT,EAAkB,mBAAmB,KACrC,+BAAC,wBAAwB,UAAxB,EAAiC,OAAO,MACvC;AAAA;AAAA,IACD,oBAAC,oBAAiB;AAAA,KACnB,GACD;AAEF;AAGA,SAAS,mBAAmB;AAC3B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,iBAAiB,OAAO,IAAI;AAClC,QAAM,SAAS,eAAe;AAE9B,QAAM,iBAAiB;AAAA,IACtB;AAAA,IACA,MAAM,eAAe,sBAAsB;AAAA,IAC3C,CAAC;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,gBAAgB,MAAM,QAAQ,eAAe,GAAG,CAAC,MAAM,CAAC;AAGrF,YAAU,MAAM;AACf,QAAI,gBAAgB,YAAY,UAAU,gBAAgB;AACzD,qBAAe,YAAY,QAAQ,eAAe,IAAI,IAAI;AAAA,IAC3D;AAAA,EACD,GAAG,CAAC,aAAa,QAAQ,gBAAgB,MAAM,CAAC;AAEhD,YAAU,MAAM;AACf,aAAS,cAAc,OAAsB;AAC5C,UAAI,MAAM,QAAQ,YAAY,gBAAgB;AAC7C,uBAAe,YAAY,QAAQ,eAAe,EAAE;AAAA,MACrD;AAAA,IACD;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM;AACZ,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACtD;AAAA,EACD,GAAG,CAAC,QAAQ,cAAc,CAAC;AAG3B,YAAU,MAAM;AACf,QAAI,QAA8C;AAClD,QAAI,kBAAkB,WAAW,SAAS;AAEzC,YAAM,aAAa,eAAe,cAAc,sBAAsB;AACtE,YAAM,UAAU,WAAW;AAE3B,cAAQ,MAAM,WAAW;AACzB,cAAQ,MAAM,OAAO,GAAG,WAAW,IAAI;AACvC,cAAQ,MAAM,MAAM,GAAG,WAAW,GAAG;AACrC,cAAQ,MAAM,QAAQ,GAAG,WAAW,KAAK;AACzC,cAAQ,MAAM,SAAS,GAAG,WAAW,MAAM;AAC3C,cAAQ,MAAM,gBAAgB;AAC9B,cAAQ,MAAM,SAAS;AAGvB,UAAI,eAAe,SAAS;AAE3B,gBAAQ,WAAW,MAAM;AACxB,oBAAU,IAAI;AACd,yBAAe,UAAU;AAAA,QAC1B,GAAG,eAAe,aAAa;AAAA,MAChC,OAAO;AAEN,kBAAU,IAAI;AAAA,MACf;AAAA,IACD,OAAO;AAEN,gBAAU,KAAK;AAEf,qBAAe,UAAU;AAAA,IAC1B;AAEA,WAAO,MAAM;AACZ,UAAI,UAAU,MAAM;AACnB,qBAAa,KAAK;AAAA,MACnB;AAAA,IACD;AAAA,EACD,GAAG,CAAC,cAAc,CAAC;AAEnB,MAAI,CAAC,gBAAgB;AACpB,WAAO;AAAA,EACR;AAEA,SACC,qBAAC,SAAS,MAAT,EAAc,MAAM,QAAQ,eAAe,GAC3C;AAAA,wBAAC,SAAS,SAAT,EAAiB,SAAO,MACxB,8BAAC,SAAI,KAAK,YAAY,GACvB;AAAA,IACA;AAAA,MAAC,SAAS;AAAA,MAAT;AAAA,QACA,WAAU;AAAA,QACV,MAAM,eAAe;AAAA,QACrB,YAAY,eAAe;AAAA,QAC3B,iBAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,KAAI;AAAA,QAEH;AAAA,yBAAe;AAAA,UAChB,oBAAC,SAAS,OAAT,EAAe,WAAU,uBAAsB;AAAA;AAAA;AAAA,IACjD;AAAA,KACD;AAEF;AAGO,MAAM,kBAAkB;AAAA,EAC9B,CACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf;AAAA,EACD,GACA,QACI;AACJ,UAAM,SAAS,eAAe;AAC9B,UAAM,YAAY,OAAe,SAAS,CAAC;AAC3C,UAAM,cAAc,WAAW,uBAAuB;AACtD,UAAM,eAAe,SAAS,gBAAgB,MAAM,QAAQ,KAAK,gBAAgB,GAAG,CAAC,MAAM,CAAC;AAE5F,UAAM,iBAAiB,uBAAuB;AAC9C,UAAM,YAAY,QAAQ,eAAe;AAEzC,cAAU,MAAM;AACf,YAAM,mBAAmB,UAAU;AACnC,aAAO,MAAM;AACZ,YAAI,aAAa;AAChB,yBAAe,YAAY,QAAQ,kBAAkB,IAAI;AAAA,QAC1D;AAAA,MACD;AAAA,IACD,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,oBAAgB,MAAM;AACrB,UAAI,eAAe,eAAe,sBAAsB,GAAG,OAAO,UAAU,SAAS;AACpF,uBAAe,qBAAqB,UAAU,SAAS,CAAC,aAAa;AAAA,UACpE,GAAG;AAAA,UACH;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACD,EAAE;AAAA,MACH;AAAA,IACD,GAAG,CAAC,SAAS,WAAW,YAAY,cAAc,WAAW,CAAC;AAG9D,QAAI,YAAY,CAAC,SAAS;AACzB,aAAO,gCAAG,UAAS;AAAA,IACpB;AAEA,QAAI;AACJ,QAAI,cAAc;AACjB,2BAAqB;AAAA,IACtB,OAAO;AACN,2BACC,kBAAkB,QAAQ,QAAQ,kBAAkB;AAAA,IACtD;AAGA,QAAI,CAAC,aAAa;AACjB,aACC,qBAAC,SAAS,MAAT,EAAc,eAAe,oBAAoB,yBAAuB,MACxE;AAAA,4BAAC,SAAS,SAAT,EAAiB,SAAO,MAAC,KACxB,UACF;AAAA,QACA;AAAA,UAAC,SAAS;AAAA,UAAT;AAAA,YACA,WAAU;AAAA,YACV,MAAM;AAAA,YACN;AAAA,YACA,iBAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,KAAI;AAAA,YAEH;AAAA;AAAA,cACD,oBAAC,SAAS,OAAT,EAAe,WAAU,uBAAsB;AAAA;AAAA;AAAA,QACjD;AAAA,SACD;AAAA,IAEF;AAEA,UAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ;AAC1C,WAAO,MAAM,eAAe,KAAK,GAAG,mDAAmD;AAEvF,UAAM,mBAAmB,CAAC,UAAyC;AAClE,YAAM,MAAM,eAAe,KAAK;AAChC,qBAAe;AAAA,QACd,UAAU;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAEA,UAAM,mBAAmB,CAAC,UAAyC;AAClE,YAAM,MAAM,eAAe,KAAK;AAChC,qBAAe,YAAY,QAAQ,UAAU,OAAO;AAAA,IACrD;AAEA,UAAM,cAAc,CAAC,UAAyC;AAC7D,YAAM,MAAM,UAAU,KAAK;AAC3B,qBAAe;AAAA,QACd,UAAU;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAEA,UAAM,aAAa,CAAC,UAAyC;AAC5D,YAAM,MAAM,SAAS,KAAK;AAC1B,qBAAe,YAAY,QAAQ,UAAU,OAAO;AAAA,IACrD;AAEA,UAAM,uBAAuB,MAAM,aAAa,UAAgC;AAAA,MAC/E,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,IACT,CAAC;AAED,WAAO;AAAA,EACR;AACD;",
6
6
  "names": []
7
7
  }
@@ -1,21 +1,46 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import classNames from "classnames";
3
3
  import { Slot } from "radix-ui";
4
- import { forwardRef } from "react";
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
+ }
5
21
  const TldrawUiRow = forwardRef(
6
- ({ asChild, className, ...props }, ref) => {
22
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
7
23
  const Component = asChild ? Slot.Root : "div";
8
- return /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-row", className), ...props });
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 }) });
9
31
  }
10
32
  );
11
33
  const TldrawUiGrid = forwardRef(
12
- ({ asChild, className, ...props }, ref) => {
34
+ ({ asChild, className, tooltipSide, ...props }, ref) => {
13
35
  const Component = asChild ? Slot.Root : "div";
14
- return /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-grid", className), ...props });
36
+ return /* @__PURE__ */ jsx(TldrawUiOrientationProvider, { orientation: "horizontal", tooltipSide, children: /* @__PURE__ */ jsx(Component, { ref, className: classNames("tlui-grid", className), ...props }) });
15
37
  }
16
38
  );
17
39
  export {
40
+ TldrawUiColumn,
18
41
  TldrawUiGrid,
19
- TldrawUiRow
42
+ TldrawUiOrientationProvider,
43
+ TldrawUiRow,
44
+ useTldrawUiOrientation
20
45
  };
21
46
  //# sourceMappingURL=layout.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/ui/components/primitives/layout.tsx"],
4
- "sourcesContent": ["import classNames from 'classnames'\nimport { Slot } from 'radix-ui'\nimport { HTMLAttributes, ReactNode, forwardRef } from 'react'\n\n/** @public */\nexport interface TLUiLayoutProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode\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, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn <Component ref={ref} className={classNames('tlui-row', className)} {...props} />\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, ...props }, ref) => {\n\t\tconst Component = asChild ? Slot.Root : 'div'\n\t\treturn <Component ref={ref} className={classNames('tlui-grid', className)} {...props} />\n\t}\n)\n"],
5
- "mappings": "AAkBS;AAlBT,OAAO,gBAAgB;AACvB,SAAS,YAAY;AACrB,SAAoC,kBAAkB;AAa/C,MAAM,cAAc;AAAA,EAC1B,CAAC,EAAE,SAAS,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC1C,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WAAO,oBAAC,aAAU,KAAU,WAAW,WAAW,YAAY,SAAS,GAAI,GAAG,OAAO;AAAA,EACtF;AACD;AAOO,MAAM,eAAe;AAAA,EAC3B,CAAC,EAAE,SAAS,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC1C,UAAM,YAAY,UAAU,KAAK,OAAO;AACxC,WAAO,oBAAC,aAAU,KAAU,WAAW,WAAW,aAAa,SAAS,GAAI,GAAG,OAAO;AAAA,EACvF;AACD;",
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
6
  "names": []
7
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);