tldraw 3.16.0-internal.a478398270c6 → 3.16.0-next.15f085081fd5

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 (534) hide show
  1. package/dist-cjs/index.d.ts +316 -23
  2. package/dist-cjs/index.js +34 -2
  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/TldrawImage.js +5 -2
  7. package/dist-cjs/lib/TldrawImage.js.map +3 -3
  8. package/dist-cjs/lib/canvas/TldrawCropHandles.js +1 -1
  9. package/dist-cjs/lib/canvas/TldrawCropHandles.js.map +2 -2
  10. package/dist-cjs/lib/canvas/TldrawHandles.js +1 -1
  11. package/dist-cjs/lib/canvas/TldrawHandles.js.map +2 -2
  12. package/dist-cjs/lib/canvas/TldrawOverlays.js +1 -1
  13. package/dist-cjs/lib/canvas/TldrawOverlays.js.map +2 -2
  14. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  15. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  16. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +279 -271
  17. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  18. package/dist-cjs/lib/defaultExternalContentHandlers.js +6 -4
  19. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  20. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +27 -44
  21. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +16 -4
  23. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  24. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  25. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  26. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  27. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  28. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +3 -0
  29. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  30. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -6
  31. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  33. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  34. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +20 -17
  35. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  37. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  38. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  39. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  40. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  41. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  42. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -4
  43. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  44. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  45. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  46. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +20 -5
  47. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  48. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +6 -5
  49. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  50. package/dist-cjs/lib/shapes/shared/PathBuilder.js +21 -3
  51. package/dist-cjs/lib/shapes/shared/PathBuilder.js.map +2 -2
  52. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -0
  53. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  54. package/dist-cjs/lib/shapes/shared/RichTextLabel.js +5 -2
  55. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  56. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  57. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  58. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js +4 -3
  59. package/dist-cjs/lib/shapes/shared/SvgTextLabel.js.map +2 -2
  60. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  61. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  62. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  63. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +7 -13
  64. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  65. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  66. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  67. package/dist-cjs/lib/styles.js.map +2 -2
  68. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  69. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  70. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  71. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  72. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +7 -1
  73. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
  74. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +43 -22
  75. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  76. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -15
  77. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  78. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +5 -0
  79. package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
  80. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +8 -0
  81. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  82. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +8 -0
  83. package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +2 -2
  84. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +8 -0
  85. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  86. package/dist-cjs/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.js.map +2 -2
  87. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  88. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  89. package/dist-cjs/lib/ui/components/A11y.js +14 -12
  90. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  91. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  92. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  93. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  94. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  95. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  96. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  97. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  98. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  99. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +57 -7
  100. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
  101. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -2
  102. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  104. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  106. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  107. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +4 -5
  108. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  109. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  110. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  111. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  112. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  113. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  114. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  115. package/dist-cjs/lib/ui/components/Spinner.js +2 -25
  116. package/dist-cjs/lib/ui/components/Spinner.js.map +2 -2
  117. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  118. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  119. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -139
  120. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  122. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  123. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  124. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  125. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js +21 -7
  126. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbar.js.map +3 -3
  127. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  128. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  129. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  130. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  131. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  132. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  133. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  134. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  135. package/dist-cjs/lib/ui/components/menu-items.js +22 -0
  136. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  137. package/dist-cjs/lib/ui/components/primitives/Button/TldrawUiButtonIcon.js.map +2 -2
  138. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +7 -16
  139. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  140. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  141. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  142. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js +1 -1
  143. package/dist-cjs/lib/ui/components/primitives/TldrawUiDialog.js.map +2 -2
  144. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js +35 -1
  145. package/dist-cjs/lib/ui/components/primitives/TldrawUiIcon.js.map +2 -2
  146. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  147. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  148. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +6 -2
  149. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  150. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +31 -7
  151. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  152. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +262 -0
  153. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  154. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  155. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  156. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.js.map +2 -2
  157. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  158. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  159. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  160. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -22
  161. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  162. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  163. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  164. package/dist-cjs/lib/ui/context/actions.js +72 -9
  165. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  166. package/dist-cjs/lib/ui/context/components.js +2 -0
  167. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  168. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  169. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  170. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +2 -2
  171. package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
  172. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  173. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  174. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  175. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +12 -0
  176. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  177. package/dist-cjs/lib/ui/kbd-utils.js +11 -4
  178. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  179. package/dist-cjs/lib/ui/version.js +3 -3
  180. package/dist-cjs/lib/ui/version.js.map +1 -1
  181. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +1 -1
  182. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  183. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +3 -2
  184. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  185. package/dist-esm/index.d.mts +316 -23
  186. package/dist-esm/index.mjs +57 -5
  187. package/dist-esm/index.mjs.map +2 -2
  188. package/dist-esm/lib/Tldraw.mjs +14 -4
  189. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  190. package/dist-esm/lib/TldrawImage.mjs +5 -2
  191. package/dist-esm/lib/TldrawImage.mjs.map +2 -2
  192. package/dist-esm/lib/canvas/TldrawCropHandles.mjs +1 -1
  193. package/dist-esm/lib/canvas/TldrawCropHandles.mjs.map +2 -2
  194. package/dist-esm/lib/canvas/TldrawHandles.mjs +1 -1
  195. package/dist-esm/lib/canvas/TldrawHandles.mjs.map +2 -2
  196. package/dist-esm/lib/canvas/TldrawOverlays.mjs +1 -1
  197. package/dist-esm/lib/canvas/TldrawOverlays.mjs.map +2 -2
  198. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  199. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  200. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +279 -271
  201. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  202. package/dist-esm/lib/defaultExternalContentHandlers.mjs +6 -4
  203. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  204. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +30 -44
  205. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  206. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +19 -5
  207. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  208. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  209. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  210. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  211. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  212. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +3 -0
  213. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  214. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -6
  215. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  216. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  217. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  218. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +21 -17
  219. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  220. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  221. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  222. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  223. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  224. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  225. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  226. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -4
  227. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  228. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  229. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  230. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +21 -5
  231. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  232. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +7 -5
  233. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  234. package/dist-esm/lib/shapes/shared/PathBuilder.mjs +22 -3
  235. package/dist-esm/lib/shapes/shared/PathBuilder.mjs.map +2 -2
  236. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -0
  237. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  238. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs +5 -2
  239. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  240. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  241. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  242. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs +4 -3
  243. package/dist-esm/lib/shapes/shared/SvgTextLabel.mjs.map +2 -2
  244. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  245. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  246. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  247. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +8 -13
  248. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  249. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  250. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  251. package/dist-esm/lib/styles.mjs.map +2 -2
  252. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  253. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  254. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  255. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  256. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +7 -1
  257. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
  258. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +43 -22
  259. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  260. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -15
  261. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  262. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +5 -0
  263. package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
  264. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +8 -0
  265. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  266. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +8 -0
  267. package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +2 -2
  268. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +8 -0
  269. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  270. package/dist-esm/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.mjs.map +2 -2
  271. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  272. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  273. package/dist-esm/lib/ui/components/A11y.mjs +14 -12
  274. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  275. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  276. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  277. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  278. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  279. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  280. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  281. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  282. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  283. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +57 -7
  284. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
  285. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -3
  286. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  287. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  288. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  289. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  290. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  291. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +4 -5
  292. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  293. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  294. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  295. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  296. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  297. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  298. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  299. package/dist-esm/lib/ui/components/Spinner.mjs +3 -26
  300. package/dist-esm/lib/ui/components/Spinner.mjs.map +2 -2
  301. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  302. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  303. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -139
  304. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  305. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  306. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  307. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  308. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  309. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs +23 -9
  310. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbar.mjs.map +3 -3
  311. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  312. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  313. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  314. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  315. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  316. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  317. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  318. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  319. package/dist-esm/lib/ui/components/menu-items.mjs +22 -0
  320. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  321. package/dist-esm/lib/ui/components/primitives/Button/TldrawUiButtonIcon.mjs.map +2 -2
  322. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +8 -6
  323. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  324. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  325. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  326. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs +1 -1
  327. package/dist-esm/lib/ui/components/primitives/TldrawUiDialog.mjs.map +2 -2
  328. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs +36 -2
  329. package/dist-esm/lib/ui/components/primitives/TldrawUiIcon.mjs.map +2 -2
  330. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  331. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  332. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +6 -2
  333. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  334. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +31 -7
  335. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  336. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +239 -0
  337. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  338. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  339. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  340. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.mjs.map +2 -2
  341. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  342. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  343. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  344. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -24
  345. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  346. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  347. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  348. package/dist-esm/lib/ui/context/actions.mjs +72 -9
  349. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  350. package/dist-esm/lib/ui/context/components.mjs +2 -0
  351. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  352. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  353. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  354. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +2 -2
  355. package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
  356. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  357. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  358. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +12 -0
  359. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  360. package/dist-esm/lib/ui/kbd-utils.mjs +11 -4
  361. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  362. package/dist-esm/lib/ui/version.mjs +3 -3
  363. package/dist-esm/lib/ui/version.mjs.map +1 -1
  364. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +1 -1
  365. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  366. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +3 -2
  367. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  368. package/package.json +12 -34
  369. package/src/index.ts +42 -3
  370. package/src/lib/Tldraw.tsx +15 -2
  371. package/src/lib/TldrawImage.tsx +6 -2
  372. package/src/lib/canvas/TldrawCropHandles.tsx +3 -1
  373. package/src/lib/canvas/TldrawHandles.tsx +5 -1
  374. package/src/lib/canvas/TldrawOverlays.tsx +1 -1
  375. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  376. package/src/lib/canvas/TldrawSelectionForeground.tsx +5 -1
  377. package/src/lib/defaultExternalContentHandlers.ts +14 -5
  378. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  379. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  380. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +12 -11
  381. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +30 -46
  382. package/src/lib/shapes/arrow/arrowLabel.ts +23 -3
  383. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  384. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  385. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +3 -0
  386. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  387. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -7
  388. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  389. package/src/lib/shapes/frame/FrameShapeUtil.tsx +30 -21
  390. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  391. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  392. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  393. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -4
  394. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  395. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  396. package/src/lib/shapes/line/LineShapeUtil.tsx +25 -6
  397. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  398. package/src/lib/shapes/note/NoteShapeUtil.tsx +10 -4
  399. package/src/lib/shapes/shared/PathBuilder.test.tsx +1 -1
  400. package/src/lib/shapes/shared/PathBuilder.tsx +35 -1
  401. package/src/lib/shapes/shared/PlainTextLabel.tsx +1 -0
  402. package/src/lib/shapes/shared/RichTextLabel.tsx +4 -0
  403. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  404. package/src/lib/shapes/shared/SvgTextLabel.tsx +4 -2
  405. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  406. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  407. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  408. package/src/lib/shapes/text/TextShapeUtil.tsx +8 -14
  409. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  410. package/src/lib/styles.tsx +3 -1
  411. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  412. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  413. package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +8 -1
  414. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +54 -30
  415. package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -24
  416. package/src/lib/tools/SelectTool/childStates/PointingShape.ts +7 -0
  417. package/src/lib/tools/SelectTool/childStates/Resizing.ts +12 -1
  418. package/src/lib/tools/SelectTool/childStates/Rotating.ts +11 -0
  419. package/src/lib/tools/SelectTool/childStates/Translating.ts +11 -1
  420. package/src/lib/tools/selection-logic/getHitShapeOnCanvasPointerDown.ts +1 -0
  421. package/src/lib/ui/TldrawUi.tsx +33 -12
  422. package/src/lib/ui/components/A11y.tsx +15 -13
  423. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  424. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  425. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  426. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  427. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +46 -6
  428. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -2
  429. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  430. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  431. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +4 -5
  432. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  433. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  434. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  435. package/src/lib/ui/components/Spinner.tsx +2 -24
  436. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  437. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -106
  438. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  439. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  440. package/src/lib/ui/components/Toolbar/DefaultImageToolbar.tsx +25 -9
  441. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  442. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  443. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  444. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +17 -12
  445. package/src/lib/ui/components/menu-items.tsx +25 -0
  446. package/src/lib/ui/components/primitives/Button/TldrawUiButtonIcon.tsx +2 -2
  447. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -35
  448. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  449. package/src/lib/ui/components/primitives/TldrawUiDialog.tsx +1 -1
  450. package/src/lib/ui/components/primitives/TldrawUiIcon.tsx +41 -3
  451. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  452. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +6 -1
  453. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +56 -12
  454. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +325 -0
  455. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  456. package/src/lib/ui/components/primitives/menus/TldrawUiMenuCheckboxItem.tsx +2 -2
  457. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  458. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  459. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +224 -23
  460. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  461. package/src/lib/ui/context/actions.tsx +74 -10
  462. package/src/lib/ui/context/components.tsx +3 -0
  463. package/src/lib/ui/context/events.tsx +6 -2
  464. package/src/lib/ui/hooks/menu-hooks.ts +1 -0
  465. package/src/lib/ui/hooks/useKeyboardShortcuts.ts +3 -2
  466. package/src/lib/ui/hooks/useTools.tsx +142 -11
  467. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +12 -0
  468. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +12 -0
  469. package/src/lib/ui/kbd-utils.ts +12 -4
  470. package/src/lib/ui/version.ts +3 -3
  471. package/src/lib/ui.css +417 -314
  472. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +21 -7
  473. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +1 -1
  474. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +28 -7
  475. package/src/lib/utils/tldr/buildFromV1Document.ts +2 -1
  476. package/src/test/A11y.test.tsx +3 -2
  477. package/src/test/ClickManager.test.ts +7 -6
  478. package/src/test/Editor.test.tsx +21 -20
  479. package/src/test/EraserTool.test.ts +184 -13
  480. package/src/test/HandTool.test.ts +10 -9
  481. package/src/test/HighlightShape.test.ts +2 -1
  482. package/src/test/SelectTool.test.ts +40 -13
  483. package/src/test/TLUserPreferences.test.ts +4 -3
  484. package/src/test/TestEditor.ts +13 -15
  485. package/src/test/TldrawEditor.test.tsx +11 -10
  486. package/src/test/ZoomTool.test.ts +7 -6
  487. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  488. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  489. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  490. package/src/test/arrows-megabus.test.tsx +17 -10
  491. package/src/test/bindings.test.tsx +24 -37
  492. package/src/test/bookmark-shapes.test.ts +1 -8
  493. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  494. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  495. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  496. package/src/test/commands/alignShapes.test.tsx +25 -24
  497. package/src/test/commands/animationSpeed.test.ts +2 -1
  498. package/src/test/commands/centerOnPoint.test.ts +3 -2
  499. package/src/test/commands/clipboard.test.ts +3 -2
  500. package/src/test/commands/createShapes.test.ts +2 -1
  501. package/src/test/commands/deletePage.test.ts +84 -1
  502. package/src/test/commands/deleteShapes.test.ts +2 -1
  503. package/src/test/commands/distributeShapes.test.tsx +11 -10
  504. package/src/test/commands/getSvgString.test.ts +2 -1
  505. package/src/test/commands/packShapes.test.ts +5 -4
  506. package/src/test/commands/resizeShape.test.ts +2 -1
  507. package/src/test/commands/rotateShapes.test.ts +7 -6
  508. package/src/test/commands/setCamera.test.ts +4 -3
  509. package/src/test/commands/setCurrentPage.test.ts +3 -2
  510. package/src/test/commands/stackShapes.test.ts +11 -10
  511. package/src/test/commands/stretch.test.tsx +13 -12
  512. package/src/test/createDeepLink.test.tsx +2 -1
  513. package/src/test/cropping.test.ts +3 -2
  514. package/src/test/drawing.test.ts +2 -1
  515. package/src/test/flipShapes.test.ts +4 -3
  516. package/src/test/frames.test.ts +25 -24
  517. package/src/test/getCulledShapes.test.tsx +3 -2
  518. package/src/test/groups.test.tsx +2 -2
  519. package/src/test/handleDeepLink.test.tsx +2 -1
  520. package/src/test/inner-outer-margin.test.ts +315 -0
  521. package/src/test/maxShapes.test.ts +3 -2
  522. package/src/test/modifiers.test.ts +5 -4
  523. package/src/test/navigation.test.ts +264 -9
  524. package/src/test/panning.test.ts +2 -1
  525. package/src/test/perf/perf.test.ts +2 -1
  526. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  527. package/src/test/resizing.test.ts +39 -38
  528. package/src/test/select.test.tsx +4 -3
  529. package/src/test/selection-omnibus.test.ts +11 -10
  530. package/src/test/shapeutils.test.ts +398 -48
  531. package/src/test/translating.test.ts +10 -9
  532. package/tldraw.css +737 -627
  533. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  534. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
@@ -23,5 +23,9 @@ export function TldrawHandles({ children }: TLHandlesProps) {
23
23
 
24
24
  if (!shouldDisplayHandles) return null
25
25
 
26
- return <svg className="tl-user-handles tl-overlays__item">{children}</svg>
26
+ return (
27
+ <svg className="tl-user-handles tl-overlays__item" aria-hidden="true">
28
+ {children}
29
+ </svg>
30
+ )
27
31
  }
@@ -60,7 +60,7 @@ export function TldrawArrowHints() {
60
60
  {ShapeIndicator && <ShapeIndicator shapeId={targetInfo.target.id} />}
61
61
 
62
62
  {showEdgeHints && (
63
- <svg className="tl-overlays__item">
63
+ <svg className="tl-overlays__item" aria-hidden="true">
64
64
  <circle
65
65
  cx={anchorInPageSpace.x}
66
66
  cy={anchorInPageSpace.y}
@@ -31,7 +31,7 @@ export function TldrawScribble({ scribble, zoom, color, opacity, className }: TL
31
31
  <path
32
32
  className="tl-scribble"
33
33
  d={d}
34
- fill={color ?? `var(--color-${scribble.color})`}
34
+ fill={color ?? `var(--tl-color-${scribble.color})`}
35
35
  opacity={opacity ?? scribble.opacity}
36
36
  />
37
37
  </svg>
@@ -192,7 +192,11 @@ export const TldrawSelectionForeground = track(function TldrawSelectionForegroun
192
192
  textHandleHeight * zoom >= 4
193
193
 
194
194
  return (
195
- <svg className="tl-overlays__item tl-selection__fg" data-testid="selection-foreground">
195
+ <svg
196
+ className="tl-overlays__item tl-selection__fg"
197
+ data-testid="selection-foreground"
198
+ aria-hidden="true"
199
+ >
196
200
  <g ref={rSvg}>
197
201
  {shouldDisplayBox && (
198
202
  <rect
@@ -144,7 +144,7 @@ export async function defaultHandleExternalFileAsset(
144
144
  { file, assetId }: TLFileExternalAsset,
145
145
  options: TLDefaultExternalContentHandlerOpts
146
146
  ) {
147
- const isSuccess = runFileChecks(file, options)
147
+ const isSuccess = notifyIfFileNotAllowed(file, options)
148
148
  if (!isSuccess) assert(false, 'File checks failed')
149
149
 
150
150
  const assetInfo = await getAssetInfo(file, options, assetId)
@@ -161,7 +161,7 @@ export async function defaultHandleExternalFileReplaceContent(
161
161
  { file, shapeId, isImage }: TLFileReplaceExternalContent,
162
162
  options: TLDefaultExternalContentHandlerOpts
163
163
  ) {
164
- const isSuccess = runFileChecks(file, options)
164
+ const isSuccess = notifyIfFileNotAllowed(file, options)
165
165
  if (!isSuccess) assert(false, 'File checks failed')
166
166
 
167
167
  const shape = editor.getShape(shapeId)
@@ -399,7 +399,7 @@ export async function defaultHandleExternalFileContent(
399
399
  file: File
400
400
  }[] = []
401
401
  for (const file of files) {
402
- const isSuccess = runFileChecks(file, options)
402
+ const isSuccess = notifyIfFileNotAllowed(file, options)
403
403
  if (!isSuccess) continue
404
404
 
405
405
  const assetInfo = await getAssetInfo(file, options)
@@ -873,7 +873,15 @@ export function createEmptyBookmarkShape(
873
873
  return editor.getShape(partial.id) as TLBookmarkShape
874
874
  }
875
875
 
876
- function runFileChecks(file: File, options: TLDefaultExternalContentHandlerOpts) {
876
+ /**
877
+ * Checks if a file is allowed to be uploaded. If it is not, it will show a toast explaining why to the user.
878
+ *
879
+ * @param file - The file to check
880
+ * @param options - The options for the external content handler
881
+ * @returns True if the file is allowed, false otherwise
882
+ * @public
883
+ */
884
+ export function notifyIfFileNotAllowed(file: File, options: TLDefaultExternalContentHandlerOpts) {
877
885
  const {
878
886
  acceptedImageMimeTypes = DEFAULT_SUPPORTED_IMAGE_TYPES,
879
887
  acceptedVideoMimeTypes = DEFAULT_SUPPORT_VIDEO_TYPES,
@@ -915,7 +923,8 @@ function runFileChecks(file: File, options: TLDefaultExternalContentHandlerOpts)
915
923
  return true
916
924
  }
917
925
 
918
- async function getAssetInfo(
926
+ /** @public */
927
+ export async function getAssetInfo(
919
928
  file: File,
920
929
  options: TLDefaultExternalContentHandlerOpts,
921
930
  assetId?: TLAssetId
@@ -1,4 +1,5 @@
1
1
  import { TLArrowShape, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from '../../../test/TestEditor'
3
4
  import { ArrowShapeUtil } from './ArrowShapeUtil'
4
5
  import { updateArrowTargetState } from './arrowTargetState'
@@ -12,7 +13,7 @@ const ids = {
12
13
  arrow1: createShapeId('arrow1'),
13
14
  }
14
15
 
15
- jest.useFakeTimers()
16
+ vi.useFakeTimers()
16
17
 
17
18
  window.requestAnimationFrame = function requestAnimationFrame(cb) {
18
19
  return setTimeout(cb, 1000 / 60)
@@ -1,4 +1,5 @@
1
1
  import { IndexKey, TLArrowShape, TLShapeId, Vec, createShapeId } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from '../../../test/TestEditor'
3
4
  import { getArrowTargetState } from './arrowTargetState'
4
5
  import { getArrowBindings } from './shared'
@@ -13,7 +14,7 @@ global.cancelAnimationFrame = function cancelAnimationFrame(id) {
13
14
  clearTimeout(id)
14
15
  }
15
16
 
16
- jest.useFakeTimers()
17
+ vi.useFakeTimers()
17
18
 
18
19
  const ids = {
19
20
  box1: createShapeId('box1'),
@@ -242,7 +243,7 @@ describe('When pointing an end shape', () => {
242
243
  },
243
244
  })
244
245
 
245
- jest.advanceTimersByTime(1000)
246
+ vi.advanceTimersByTime(1000)
246
247
 
247
248
  arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
248
249
 
@@ -306,7 +307,7 @@ describe('When pointing an end shape', () => {
306
307
  })
307
308
 
308
309
  // Give time for the velocity to die down
309
- jest.advanceTimersByTime(1000)
310
+ vi.advanceTimersByTime(1000)
310
311
 
311
312
  arrow = editor.getCurrentPageShapes()[editor.getCurrentPageShapes().length - 1]
312
313
 
@@ -1,4 +1,5 @@
1
- import { HALF_PI, TLArrowShape, TLShapeId, createShapeId } from '@tldraw/editor'
1
+ import { HALF_PI, TLArrowShape, TLShapeId, createShapeId, toRichText } from '@tldraw/editor'
2
+ import { vi } from 'vitest'
2
3
  import { TestEditor } from '../../../test/TestEditor'
3
4
  import { createOrUpdateArrowBinding, getArrowBindings } from './shared'
4
5
 
@@ -12,7 +13,7 @@ const ids = {
12
13
  arrow1: createShapeId('arrow1'),
13
14
  }
14
15
 
15
- jest.useFakeTimers()
16
+ vi.useFakeTimers()
16
17
 
17
18
  window.requestAnimationFrame = function requestAnimationFrame(cb) {
18
19
  return setTimeout(cb, 1000 / 60)
@@ -217,7 +218,7 @@ describe('Other cases when arrow are moved', () => {
217
218
  // When box one is not selected, unbinds box1 and keeps binding to box2
218
219
  editor.select(ids.arrow1, ids.box2, ids.box3)
219
220
  editor.alignShapes(editor.getSelectedShapeIds(), 'right')
220
- jest.advanceTimersByTime(1000)
221
+ vi.advanceTimersByTime(1000)
221
222
 
222
223
  expect(bindings()).toMatchObject({
223
224
  start: { toId: ids.box1, props: { isPrecise: false } },
@@ -227,7 +228,7 @@ describe('Other cases when arrow are moved', () => {
227
228
  // maintains bindings if they would still be over the same shape (but makes them precise), but unbinds others
228
229
  editor.select(ids.arrow1, ids.box3)
229
230
  editor.alignShapes(editor.getSelectedShapeIds(), 'top')
230
- jest.advanceTimersByTime(1000)
231
+ vi.advanceTimersByTime(1000)
231
232
 
232
233
  expect(bindings()).toMatchObject({
233
234
  start: { toId: ids.box1, props: { isPrecise: true } },
@@ -244,7 +245,7 @@ describe('Other cases when arrow are moved', () => {
244
245
  // When box one is not selected, unbinds box1 and keeps binding to box2
245
246
  editor.select(ids.arrow1, ids.box2, ids.box3)
246
247
  editor.distributeShapes(editor.getSelectedShapeIds(), 'horizontal')
247
- jest.advanceTimersByTime(1000)
248
+ vi.advanceTimersByTime(1000)
248
249
 
249
250
  expect(bindings()).toMatchObject({
250
251
  start: { toId: ids.box1, props: { isPrecise: false } },
@@ -254,7 +255,7 @@ describe('Other cases when arrow are moved', () => {
254
255
  // unbinds when only the arrow is selected (not its bound shapes) if the arrow itself has moved
255
256
  editor.select(ids.arrow1, ids.box3, ids.box4)
256
257
  editor.distributeShapes(editor.getSelectedShapeIds(), 'vertical')
257
- jest.advanceTimersByTime(1000)
258
+ vi.advanceTimersByTime(1000)
258
259
 
259
260
  // The arrow didn't actually move
260
261
  expect(bindings()).toMatchObject({
@@ -265,7 +266,7 @@ describe('Other cases when arrow are moved', () => {
265
266
  // The arrow will not move because it is still bound to another shape
266
267
  editor.updateShapes([{ id: ids.box4, type: 'geo', y: -600 }])
267
268
  editor.distributeShapes(editor.getSelectedShapeIds(), 'vertical')
268
- jest.advanceTimersByTime(1000)
269
+ vi.advanceTimersByTime(1000)
269
270
 
270
271
  expect(bindings()).toMatchObject({
271
272
  start: undefined,
@@ -333,7 +334,7 @@ describe('Arrow labels', () => {
333
334
  editor.setCurrentTool('arrow').pointerDown(10, 10).pointerMove(100, 100).pointerUp()
334
335
  const arrowId = editor.getOnlySelectedShape()!.id
335
336
  editor.updateShapes<TLArrowShape>([
336
- { id: arrowId, type: 'arrow', props: { text: 'Test Label' } },
337
+ { id: arrowId, type: 'arrow', props: { richText: toRichText('Test Label') } },
337
338
  ])
338
339
  })
339
340
 
@@ -341,7 +342,7 @@ describe('Arrow labels', () => {
341
342
  const arrowId = editor.getOnlySelectedShape()!.id
342
343
  expect(arrow(arrowId)).toMatchObject({
343
344
  props: {
344
- text: 'Test Label',
345
+ richText: toRichText('Test Label'),
345
346
  },
346
347
  })
347
348
  })
@@ -349,11 +350,11 @@ describe('Arrow labels', () => {
349
350
  it('should update the label of an arrow', () => {
350
351
  const arrowId = editor.getOnlySelectedShape()!.id
351
352
  editor.updateShapes<TLArrowShape>([
352
- { id: arrowId, type: 'arrow', props: { text: 'New Label' } },
353
+ { id: arrowId, type: 'arrow', props: { richText: toRichText('New Label') } },
353
354
  ])
354
355
  expect(arrow(arrowId)).toMatchObject({
355
356
  props: {
356
- text: 'New Label',
357
+ richText: toRichText('New Label'),
357
358
  },
358
359
  })
359
360
  })
@@ -31,13 +31,16 @@ import {
31
31
  clamp,
32
32
  debugFlags,
33
33
  exhaustiveSwitchError,
34
+ getColorValue,
34
35
  getDefaultColorTheme,
36
+ getFontsFromRichText,
35
37
  invLerp,
36
38
  lerp,
37
39
  mapObjectMapValues,
38
40
  maybeSnapToGrid,
39
41
  structuredClone,
40
42
  toDomPrecision,
43
+ toRichText,
41
44
  track,
42
45
  useEditor,
43
46
  useIsEditing,
@@ -46,12 +49,11 @@ import {
46
49
  } from '@tldraw/editor'
47
50
  import React, { useMemo } from 'react'
48
51
  import { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'
52
+ import { isEmptyRichText, renderPlaintextFromRichText } from '../../utils/text/richText'
49
53
  import { PathBuilder } from '../shared/PathBuilder'
50
- import { PlainTextLabel } from '../shared/PlainTextLabel'
54
+ import { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'
51
55
  import { ShapeFill } from '../shared/ShapeFill'
52
- import { SvgTextLabel } from '../shared/SvgTextLabel'
53
56
  import { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'
54
- import { DefaultFontFaces } from '../shared/defaultFonts'
55
57
  import { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'
56
58
  import { useDefaultColorTheme } from '../shared/useDefaultColorTheme'
57
59
  import { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'
@@ -130,10 +132,6 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
130
132
  override canSnap() {
131
133
  return false
132
134
  }
133
- override canTabTo(shape: TLArrowShape) {
134
- const bindings = getArrowBindings(this.editor, shape)
135
- return !!(bindings.start || bindings.end || shape.props.text)
136
- }
137
135
  override hideResizeHandles() {
138
136
  return true
139
137
  }
@@ -160,8 +158,13 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
160
158
  }
161
159
 
162
160
  override getFontFaces(shape: TLArrowShape) {
163
- if (!shape.props.text) return EMPTY_ARRAY
164
- return [DefaultFontFaces[`tldraw_${shape.props.font}`].normal.normal]
161
+ if (isEmptyRichText(shape.props.richText)) return EMPTY_ARRAY
162
+
163
+ return getFontsFromRichText(this.editor, shape.props.richText, {
164
+ family: `tldraw_${shape.props.font}`,
165
+ weight: 'normal',
166
+ style: 'normal',
167
+ })
165
168
  }
166
169
 
167
170
  override getDefaultProps(): TLArrowShape['props'] {
@@ -178,7 +181,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
178
181
  end: { x: 2, y: 0 },
179
182
  arrowheadStart: 'none',
180
183
  arrowheadEnd: 'arrow',
181
- text: '',
184
+ richText: toRichText(''),
182
185
  labelPosition: 0.5,
183
186
  font: 'draw',
184
187
  scale: 1,
@@ -208,7 +211,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
208
211
  : new Polyline2d({ points: info.route.points })
209
212
 
210
213
  let labelGeom
211
- if (isEditing || shape.props.text.trim()) {
214
+ if (isEditing || !isEmptyRichText(shape.props.richText)) {
212
215
  const labelPosition = getArrowLabelPosition(this.editor, shape)
213
216
  if (debugFlags.debugGeometry.get()) {
214
217
  debugGeom.push(...labelPosition.debugGeom)
@@ -280,7 +283,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
280
283
  }
281
284
 
282
285
  override getText(shape: TLArrowShape) {
283
- return shape.props.text
286
+ return renderPlaintextFromRichText(this.editor, shape.props.richText)
284
287
  }
285
288
 
286
289
  override onHandleDrag(shape: TLArrowShape, info: TLHandleDragInfo<TLArrowShape>) {
@@ -761,7 +764,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
761
764
  const labelPosition = getArrowLabelPosition(this.editor, shape)
762
765
  const isSelected = shape.id === this.editor.getOnlySelectedShapeId()
763
766
  const isEditing = this.editor.getEditingShapeId() === shape.id
764
- const showArrowLabel = isEditing || shape.props.text
767
+ const showArrowLabel = isEditing || !isEmptyRichText(shape.props.richText)
765
768
 
766
769
  return (
767
770
  <>
@@ -775,17 +778,16 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
775
778
  )}
776
779
  </SVGContainer>
777
780
  {showArrowLabel && (
778
- <PlainTextLabel
781
+ <RichTextLabel
779
782
  shapeId={shape.id}
780
- classNamePrefix="tl-arrow"
781
783
  type="arrow"
782
784
  font={shape.props.font}
783
785
  fontSize={getArrowLabelFontSize(shape)}
784
786
  lineHeight={TEXT_PROPS.lineHeight}
785
787
  align="middle"
786
788
  verticalAlign="middle"
787
- text={shape.props.text}
788
- labelColor={theme[shape.props.labelColor].solid}
789
+ labelColor={getColorValue(theme, shape.props.labelColor, 'solid')}
790
+ richText={shape.props.richText}
789
791
  textWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}
790
792
  isSelected={isSelected}
791
793
  padding={0}
@@ -810,9 +812,9 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
810
812
  const { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, info?.bindings)
811
813
  const geometry = this.editor.getShapeGeometry<Group2d>(shape)
812
814
  const bounds = geometry.bounds
815
+ const isEmpty = isEmptyRichText(shape.props.richText)
813
816
 
814
- const labelGeometry =
815
- isEditing || shape.props.text.trim() ? (geometry.children[1] as Rectangle2d) : null
817
+ const labelGeometry = isEditing || !isEmpty ? (geometry.children[1] as Rectangle2d) : null
816
818
 
817
819
  if (Vec.Equals(start, end)) return null
818
820
 
@@ -851,7 +853,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
851
853
  <defs>
852
854
  <ArrowClipPath
853
855
  radius={3.5 * shape.props.scale}
854
- hasText={shape.props.text.trim().length > 0}
856
+ hasText={!isEmpty}
855
857
  bounds={bounds}
856
858
  labelBounds={labelBounds}
857
859
  as={clipStartArrowhead && as ? as : ''}
@@ -909,7 +911,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
909
911
  }
910
912
 
911
913
  override onEditStart(shape: TLArrowShape) {
912
- if (shape.props.text.trim() === '') {
914
+ if (isEmptyRichText(shape.props.richText)) {
913
915
  // editing text for the first time, so set the position to the default:
914
916
  const labelPosition = getArrowLabelDefaultPosition(this.editor, shape)
915
917
  this.editor.updateShape<TLArrowShape>({
@@ -920,26 +922,6 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
920
922
  }
921
923
  }
922
924
 
923
- override onEditEnd(shape: TLArrowShape) {
924
- const {
925
- id,
926
- type,
927
- props: { text },
928
- } = shape
929
-
930
- if (text.trimEnd() !== shape.props.text) {
931
- this.editor.updateShapes<TLArrowShape>([
932
- {
933
- id,
934
- type,
935
- props: {
936
- text: text.trimEnd(),
937
- },
938
- },
939
- ])
940
- }
941
- }
942
-
943
925
  override toSvg(shape: TLArrowShape, ctx: SvgExportContext) {
944
926
  ctx.addExportDef(getFillDefForExport(shape.props.fill))
945
927
  const theme = getDefaultColorTheme(ctx)
@@ -948,17 +930,18 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
948
930
  return (
949
931
  <g transform={`scale(${scaleFactor})`}>
950
932
  <ArrowSvg shape={shape} shouldDisplayHandles={false} />
951
- <SvgTextLabel
933
+ <RichTextSVG
952
934
  fontSize={getArrowLabelFontSize(shape)}
953
935
  font={shape.props.font}
954
936
  align="middle"
955
937
  verticalAlign="middle"
956
- text={shape.props.text}
957
- labelColor={theme[shape.props.labelColor].solid}
938
+ labelColor={getColorValue(theme, shape.props.labelColor, 'solid')}
939
+ richText={shape.props.richText}
958
940
  bounds={getArrowLabelPosition(this.editor, shape)
959
941
  .box.clone()
960
942
  .expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}
961
943
  padding={0}
944
+ showTextOutline={true}
962
945
  />
963
946
  </g>
964
947
  )
@@ -1034,6 +1017,7 @@ const ArrowSvg = track(function ArrowSvg({
1034
1017
  if (!geometry) return null
1035
1018
  const bounds = Box.ZeroFix(geometry.bounds)
1036
1019
  const bindings = getArrowBindings(editor, shape)
1020
+ const isEmpty = isEmptyRichText(shape.props.richText)
1037
1021
 
1038
1022
  if (!info?.isValid) return null
1039
1023
 
@@ -1084,7 +1068,7 @@ const ArrowSvg = track(function ArrowSvg({
1084
1068
  <clipPath id={clipPathId}>
1085
1069
  <ArrowClipPath
1086
1070
  radius={3.5 * shape.props.scale}
1087
- hasText={isEditing || shape.props.text.trim().length > 0}
1071
+ hasText={isEditing || !isEmpty}
1088
1072
  bounds={bounds}
1089
1073
  labelBounds={labelPosition.box}
1090
1074
  as={clipStartArrowhead && as ? as : ''}
@@ -1094,7 +1078,7 @@ const ArrowSvg = track(function ArrowSvg({
1094
1078
  </defs>
1095
1079
  <g
1096
1080
  fill="none"
1097
- stroke={theme[shape.props.color].solid}
1081
+ stroke={getColorValue(theme, shape.props.color, 'solid')}
1098
1082
  strokeWidth={strokeWidth}
1099
1083
  strokeLinejoin="round"
1100
1084
  strokeLinecap="round"
@@ -9,13 +9,17 @@ import {
9
9
  Polygon2d,
10
10
  Polyline2d,
11
11
  TLArrowShape,
12
+ TLShape,
12
13
  Vec,
13
14
  VecLike,
14
15
  clamp,
15
16
  createComputedCache,
16
17
  exhaustiveSwitchError,
17
18
  getChangedKeys,
19
+ pointInPolygon,
20
+ toRichText,
18
21
  } from '@tldraw/editor'
22
+ import { isEmptyRichText, renderHtmlFromRichTextForMeasurement } from '../../utils/text/richText'
19
23
  import {
20
24
  ARROW_LABEL_FONT_SIZES,
21
25
  ARROW_LABEL_PADDING,
@@ -59,14 +63,18 @@ const labelSizeCache = createComputedCache(
59
63
 
60
64
  const bodyGeom = getArrowBodyGeometry(editor, shape)
61
65
  // We use 'i' as a default label to measure against as a minimum width.
62
- const text = shape.props.text || 'i'
66
+ const isEmpty = isEmptyRichText(shape.props.richText)
67
+ const html = renderHtmlFromRichTextForMeasurement(
68
+ editor,
69
+ isEmpty ? toRichText('i') : shape.props.richText
70
+ )
63
71
 
64
72
  const bodyBounds = bodyGeom.bounds
65
73
 
66
74
  const fontSize = getArrowLabelFontSize(shape)
67
75
 
68
76
  // First we measure the text with no constraints
69
- const { w, h } = editor.textMeasure.measureText(text, {
77
+ const { w, h } = editor.textMeasure.measureHtml(html, {
70
78
  ...TEXT_PROPS,
71
79
  fontFamily: FONT_FAMILIES[shape.props.font],
72
80
  fontSize,
@@ -96,7 +104,7 @@ const labelSizeCache = createComputedCache(
96
104
  }
97
105
 
98
106
  if (shouldSquish) {
99
- const { w: squishedWidth, h: squishedHeight } = editor.textMeasure.measureText(text, {
107
+ const { w: squishedWidth, h: squishedHeight } = editor.textMeasure.measureHtml(html, {
100
108
  ...TEXT_PROPS,
101
109
  fontFamily: FONT_FAMILIES[shape.props.font],
102
110
  fontSize,
@@ -292,3 +300,15 @@ export function getArrowLabelDefaultPosition(editor: Editor, shape: TLArrowShape
292
300
  exhaustiveSwitchError(info, 'type')
293
301
  }
294
302
  }
303
+
304
+ /** @internal */
305
+ export function isOverArrowLabel(editor: Editor, shape: TLShape) {
306
+ if (!editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) return false
307
+
308
+ const pointInShapeSpace = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)
309
+ // How should we handle multiple labels? Do shapes ever have multiple labels?
310
+ const labelGeometry = editor.getShapeGeometry<Group2d>(shape).children[1]
311
+ // Knowing what we know about arrows... if the shape has no text in its label,
312
+ // then the label geometry should not be there.
313
+ return labelGeometry && pointInPolygon(pointInShapeSpace, labelGeometry.vertices)
314
+ }
@@ -94,7 +94,7 @@ export function updateArrowTargetState({
94
94
  const target = editor.getShapeAtPoint(pointInPageSpace, {
95
95
  hitInside: true,
96
96
  hitFrameInside: true,
97
- margin: arrowKind === 'elbow' ? 8 : 0,
97
+ margin: arrowKind === 'elbow' ? 8 : [8, 0],
98
98
  filter: (targetShape) => {
99
99
  return (
100
100
  !targetShape.isLocked &&
@@ -187,6 +187,7 @@ export function updateArrowTargetState({
187
187
  }
188
188
 
189
189
  const shouldSnapCenter = !isExact && precise && targetGeometryInTargetSpace.isClosed
190
+ // const shouldSnapEdges = !isExact && (precise || !targetGeometryInTargetSpace.isClosed)
190
191
  const shouldSnapEdges =
191
192
  !isExact && ((precise && arrowKind === 'elbow') || !targetGeometryInTargetSpace.isClosed)
192
193
  const shouldSnapEdgePoints =
@@ -98,7 +98,7 @@ export function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {
98
98
  y={fullBox.minY - 3}
99
99
  fontSize={10}
100
100
  fill="black"
101
- stroke="var(--color-background)"
101
+ stroke="var(--tl-color-background)"
102
102
  strokeWidth={2}
103
103
  paintOrder="stroke"
104
104
  >
@@ -109,7 +109,7 @@ export function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {
109
109
  y={info.A.expanded.y}
110
110
  fontSize={10}
111
111
  fill="black"
112
- stroke="var(--color-background)"
112
+ stroke="var(--tl-color-background)"
113
113
  strokeWidth={2}
114
114
  paintOrder="stroke"
115
115
  >
@@ -121,7 +121,7 @@ export function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {
121
121
  y={info.B.expanded.y}
122
122
  fontSize={10}
123
123
  fill="black"
124
- stroke="var(--color-background)"
124
+ stroke="var(--tl-color-background)"
125
125
  strokeWidth={2}
126
126
  paintOrder="stroke"
127
127
  >
@@ -118,6 +118,7 @@ export class Pointing extends StateNode {
118
118
  const change = util.onHandleDrag?.(shape, {
119
119
  handle: { ...startHandle, x: 0, y: 0 },
120
120
  isPrecise: true,
121
+ isCreatingShape: true,
121
122
  initial: initial,
122
123
  })
123
124
 
@@ -145,6 +146,7 @@ export class Pointing extends StateNode {
145
146
  const change = util.onHandleDrag?.(shape, {
146
147
  handle: { ...startHandle, x: 0, y: 0 },
147
148
  isPrecise: this.isPrecise,
149
+ isCreatingShape: true,
148
150
  initial: initial,
149
151
  })
150
152
 
@@ -162,6 +164,7 @@ export class Pointing extends StateNode {
162
164
  const change = util.onHandleDrag?.(this.editor.getShape(shape)!, {
163
165
  handle: { ...endHandle, x: point.x, y: point.y },
164
166
  isPrecise: false,
167
+ isCreatingShape: true,
165
168
  initial: initial,
166
169
  })
167
170
 
@@ -1,5 +1,4 @@
1
1
  import { TestEditor } from '../../../test/TestEditor'
2
- import { DrawShapeTool } from './DrawShapeTool'
3
2
 
4
3
  let editor: TestEditor
5
4
 
@@ -10,10 +9,6 @@ afterEach(() => {
10
9
  editor?.dispose()
11
10
  })
12
11
 
13
- describe(DrawShapeTool, () => {
14
- return
15
- })
16
-
17
12
  describe('When in the idle state', () => {
18
13
  it('Returns to select on cancel', () => {
19
14
  editor.setCurrentTool('draw')
@@ -14,6 +14,7 @@ import {
14
14
  VecLike,
15
15
  drawShapeMigrations,
16
16
  drawShapeProps,
17
+ getColorValue,
17
18
  last,
18
19
  lerp,
19
20
  rng,
@@ -51,10 +52,6 @@ export class DrawShapeUtil extends ShapeUtil<TLDrawShape> {
51
52
  maxPointsPerShape: 600,
52
53
  }
53
54
 
54
- override canTabTo() {
55
- return false
56
- }
57
-
58
55
  override hideResizeHandles(shape: TLDrawShape) {
59
56
  return getIsDot(shape)
60
57
  }
@@ -293,7 +290,7 @@ function DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverrid
293
290
  <path
294
291
  d={svgInk(allPointsFromSegments, options)}
295
292
  strokeLinecap="round"
296
- fill={theme[shape.props.color].solid}
293
+ fill={getColorValue(theme, shape.props.color, 'solid')}
297
294
  />
298
295
  </>
299
296
  )
@@ -317,8 +314,8 @@ function DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverrid
317
314
  <path
318
315
  d={solidStrokePath}
319
316
  strokeLinecap="round"
320
- fill={isDot ? theme[shape.props.color].solid : 'none'}
321
- stroke={theme[shape.props.color].solid}
317
+ fill={isDot ? getColorValue(theme, shape.props.color, 'solid') : 'none'}
318
+ stroke={getColorValue(theme, shape.props.color, 'solid')}
322
319
  strokeWidth={sw}
323
320
  strokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}
324
321
  strokeDashoffset="0"
@@ -144,7 +144,7 @@ export class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {
144
144
  border: 0,
145
145
  boxShadow: getRotatedBoxShadow(pageRotation),
146
146
  borderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,
147
- background: embedInfo?.definition.backgroundColor ?? 'var(--color-background)',
147
+ background: embedInfo?.definition.backgroundColor ?? 'var(--tl-color-background)',
148
148
  width: w,
149
149
  height: h,
150
150
  }}