tldraw 3.16.0-canary.ed8bd30c0f28 → 3.16.0-canary.f293c3bb58f5

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 (363) hide show
  1. package/dist-cjs/index.d.ts +203 -6
  2. package/dist-cjs/index.js +18 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  9. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  11. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  12. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  13. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  14. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  15. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  16. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
  17. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  18. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  19. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  20. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  21. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  23. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  24. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  25. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
  27. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
  28. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  29. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  31. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  33. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  34. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  35. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  36. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  37. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  38. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  39. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  40. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  41. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  42. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  43. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  44. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  45. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  46. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  47. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  48. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  49. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  50. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  51. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  52. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  53. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  54. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  55. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  56. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +1 -1
  57. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  58. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  59. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  61. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  63. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  65. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  66. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  67. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  69. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  70. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  71. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  72. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  73. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  74. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
  75. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  77. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  79. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  80. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  81. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  83. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  84. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  85. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  86. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  87. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  88. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  89. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  90. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +5 -16
  91. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  92. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  93. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  95. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  96. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +30 -7
  97. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  98. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +262 -0
  99. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  100. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  101. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  102. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  103. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  104. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  105. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  106. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  107. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  108. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  109. package/dist-cjs/lib/ui/context/actions.js +31 -2
  110. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  111. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  112. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  113. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  114. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  115. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +3 -0
  116. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  117. package/dist-cjs/lib/ui/version.js +3 -3
  118. package/dist-cjs/lib/ui/version.js.map +1 -1
  119. package/dist-esm/index.d.mts +203 -6
  120. package/dist-esm/index.mjs +29 -1
  121. package/dist-esm/index.mjs.map +2 -2
  122. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  123. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  124. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  125. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  126. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  127. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  128. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  129. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  130. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  131. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  132. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  133. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  134. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  135. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  136. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  137. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  138. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  139. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  140. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  141. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  142. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  143. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  144. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  145. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  146. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  147. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  148. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  149. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  150. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  151. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  152. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  153. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  154. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  155. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  156. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  157. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  158. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  159. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  160. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  161. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  162. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  163. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  164. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  165. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  166. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  167. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  168. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  169. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  170. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  171. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  172. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  173. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  174. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +1 -1
  175. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  176. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  177. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  178. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  179. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  180. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  181. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  182. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  183. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  184. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  185. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  186. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  187. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  188. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  189. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  190. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  191. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  192. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
  193. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  194. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  195. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  196. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  197. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  198. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  199. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  200. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  201. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  202. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  203. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  204. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  205. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  206. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  207. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  208. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +6 -6
  209. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  210. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  211. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  212. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  213. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  214. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +30 -7
  215. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  216. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +239 -0
  217. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  218. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  219. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  220. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  221. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  222. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  223. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  224. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  225. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  226. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  227. package/dist-esm/lib/ui/context/actions.mjs +31 -2
  228. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  229. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  230. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  231. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  232. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +3 -0
  233. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  234. package/dist-esm/lib/ui/version.mjs +3 -3
  235. package/dist-esm/lib/ui/version.mjs.map +1 -1
  236. package/package.json +11 -34
  237. package/src/index.ts +23 -0
  238. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  239. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  240. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  241. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  242. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  243. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  244. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  245. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  246. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  247. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  248. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  249. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  250. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  251. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  252. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  253. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  254. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  255. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  256. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  257. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  258. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  259. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  260. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  261. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  262. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  263. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  264. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  265. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  266. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  267. package/src/lib/ui/TldrawUi.tsx +17 -2
  268. package/src/lib/ui/assetUrls.ts +13 -10
  269. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  270. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  271. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  272. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +1 -1
  273. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  274. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  275. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  276. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  277. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  278. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  279. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  280. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  281. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
  282. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  283. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  284. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  285. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  286. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  287. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +14 -11
  288. package/src/lib/ui/components/menu-items.tsx +8 -0
  289. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +40 -37
  290. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  291. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  292. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +51 -12
  293. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +325 -0
  294. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  295. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  296. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  297. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  298. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  299. package/src/lib/ui/context/actions.tsx +31 -2
  300. package/src/lib/ui/context/events.tsx +2 -0
  301. package/src/lib/ui/hooks/useTools.tsx +140 -10
  302. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +3 -0
  303. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +3 -0
  304. package/src/lib/ui/version.ts +3 -3
  305. package/src/lib/ui.css +409 -292
  306. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  307. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  308. package/src/test/A11y.test.tsx +3 -2
  309. package/src/test/ClickManager.test.ts +7 -6
  310. package/src/test/Editor.test.tsx +20 -19
  311. package/src/test/EraserTool.test.ts +184 -13
  312. package/src/test/HandTool.test.ts +10 -9
  313. package/src/test/HighlightShape.test.ts +2 -1
  314. package/src/test/SelectTool.test.ts +3 -2
  315. package/src/test/TLUserPreferences.test.ts +4 -3
  316. package/src/test/TestEditor.ts +13 -15
  317. package/src/test/TldrawEditor.test.tsx +11 -10
  318. package/src/test/ZoomTool.test.ts +7 -6
  319. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  320. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  321. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  322. package/src/test/arrows-megabus.test.tsx +17 -10
  323. package/src/test/bindings.test.tsx +24 -37
  324. package/src/test/bookmark-shapes.test.ts +1 -8
  325. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  326. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  327. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  328. package/src/test/commands/alignShapes.test.tsx +25 -24
  329. package/src/test/commands/animationSpeed.test.ts +2 -1
  330. package/src/test/commands/centerOnPoint.test.ts +3 -2
  331. package/src/test/commands/clipboard.test.ts +3 -2
  332. package/src/test/commands/createShapes.test.ts +2 -1
  333. package/src/test/commands/deleteShapes.test.ts +2 -1
  334. package/src/test/commands/distributeShapes.test.tsx +11 -10
  335. package/src/test/commands/getSvgString.test.ts +2 -1
  336. package/src/test/commands/packShapes.test.ts +5 -4
  337. package/src/test/commands/resizeShape.test.ts +2 -1
  338. package/src/test/commands/rotateShapes.test.ts +7 -6
  339. package/src/test/commands/setCamera.test.ts +4 -3
  340. package/src/test/commands/setCurrentPage.test.ts +3 -2
  341. package/src/test/commands/stackShapes.test.ts +11 -10
  342. package/src/test/commands/stretch.test.tsx +13 -12
  343. package/src/test/createDeepLink.test.tsx +2 -1
  344. package/src/test/cropping.test.ts +3 -2
  345. package/src/test/drawing.test.ts +2 -1
  346. package/src/test/flipShapes.test.ts +4 -3
  347. package/src/test/frames.test.ts +25 -24
  348. package/src/test/getCulledShapes.test.tsx +3 -2
  349. package/src/test/groups.test.tsx +1 -1
  350. package/src/test/handleDeepLink.test.tsx +2 -1
  351. package/src/test/inner-outer-margin.test.ts +315 -0
  352. package/src/test/maxShapes.test.ts +3 -2
  353. package/src/test/modifiers.test.ts +5 -4
  354. package/src/test/navigation.test.ts +12 -11
  355. package/src/test/panning.test.ts +2 -1
  356. package/src/test/perf/perf.test.ts +2 -1
  357. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  358. package/src/test/resizing.test.ts +39 -38
  359. package/src/test/select.test.tsx +4 -3
  360. package/src/test/selection-omnibus.test.ts +11 -10
  361. package/src/test/shapeutils.test.ts +4 -3
  362. package/src/test/translating.test.ts +9 -8
  363. package/tldraw.css +702 -580
package/src/index.ts CHANGED
@@ -22,8 +22,19 @@ export {
22
22
  } from './lib/shapes/shared/PathBuilder'
23
23
  export { usePrefersReducedMotion } from './lib/shapes/shared/usePrefersReducedMotion'
24
24
  export { DefaultA11yAnnouncer, useSelectedShapesAnnouncer } from './lib/ui/components/A11y'
25
+ export { AccessibilityMenu } from './lib/ui/components/AccessibilityMenu'
25
26
  export { ColorSchemeMenu } from './lib/ui/components/ColorSchemeMenu'
26
27
  export { DefaultDialogs } from './lib/ui/components/Dialogs'
28
+ export {
29
+ TldrawUiColumn,
30
+ TldrawUiGrid,
31
+ TldrawUiOrientationProvider,
32
+ TldrawUiRow,
33
+ useTldrawUiOrientation,
34
+ type TldrawUiOrientationContext,
35
+ type TldrawUiOrientationProviderProps,
36
+ type TLUiLayoutProps,
37
+ } from './lib/ui/components/primitives/layout'
27
38
  export {
28
39
  TldrawUiMenuActionCheckboxItem,
29
40
  type TLUiMenuActionCheckboxItemProps,
@@ -155,6 +166,9 @@ export {
155
166
  type TLDefaultFont,
156
167
  type TLDefaultFonts,
157
168
  } from './lib/shapes/shared/defaultFonts'
169
+ export { getStrokePoints } from './lib/shapes/shared/freehand/getStrokePoints'
170
+ export { getSvgPathFromStrokePoints } from './lib/shapes/shared/freehand/svg'
171
+ export { type StrokeOptions, type StrokePoint } from './lib/shapes/shared/freehand/types'
158
172
  export {
159
173
  PlainTextLabel,
160
174
  TextLabel,
@@ -294,6 +308,7 @@ export {
294
308
  ToggleSnapModeItem,
295
309
  ToggleToolLockItem,
296
310
  ToggleTransparentBgMenuItem,
311
+ ToggleUiLabelsItem,
297
312
  ToggleWrapModeItem,
298
313
  UngroupMenuItem,
299
314
  UnlockAllMenuItem,
@@ -412,6 +427,12 @@ export {
412
427
  type TLUiToolbarToggleGroupProps,
413
428
  type TLUiToolbarToggleItemProps,
414
429
  } from './lib/ui/components/primitives/TldrawUiToolbar'
430
+ export {
431
+ TldrawUiTooltip,
432
+ TldrawUiTooltipProvider,
433
+ type TldrawUiTooltipProps,
434
+ type TldrawUiTooltipProviderProps,
435
+ } from './lib/ui/components/primitives/TldrawUiTooltip'
415
436
  export {
416
437
  DefaultQuickActions,
417
438
  type TLUiQuickActionsProps,
@@ -590,7 +611,9 @@ export { useMenuIsOpen } from './lib/ui/hooks/useMenuIsOpen'
590
611
  export { useReadonly } from './lib/ui/hooks/useReadonly'
591
612
  export { useRelevantStyles } from './lib/ui/hooks/useRelevantStyles'
592
613
  export {
614
+ onDragFromToolbarToCreateShape,
593
615
  useTools,
616
+ type OnDragFromToolbarToCreateShapesOpts,
594
617
  type TLUiToolItem,
595
618
  type TLUiToolsContextType,
596
619
  type TLUiToolsProviderProps,
@@ -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>
@@ -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
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,
@@ -31,6 +31,7 @@ import {
31
31
  clamp,
32
32
  debugFlags,
33
33
  exhaustiveSwitchError,
34
+ getColorValue,
34
35
  getDefaultColorTheme,
35
36
  getFontsFromRichText,
36
37
  invLerp,
@@ -785,8 +786,8 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
785
786
  lineHeight={TEXT_PROPS.lineHeight}
786
787
  align="middle"
787
788
  verticalAlign="middle"
789
+ labelColor={getColorValue(theme, shape.props.labelColor, 'solid')}
788
790
  richText={shape.props.richText}
789
- labelColor={theme[shape.props.labelColor].solid}
790
791
  textWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}
791
792
  isSelected={isSelected}
792
793
  padding={0}
@@ -934,8 +935,8 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
934
935
  font={shape.props.font}
935
936
  align="middle"
936
937
  verticalAlign="middle"
938
+ labelColor={getColorValue(theme, shape.props.labelColor, 'solid')}
937
939
  richText={shape.props.richText}
938
- labelColor={theme[shape.props.labelColor].solid}
939
940
  bounds={getArrowLabelPosition(this.editor, shape)
940
941
  .box.clone()
941
942
  .expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}
@@ -1077,7 +1078,7 @@ const ArrowSvg = track(function ArrowSvg({
1077
1078
  </defs>
1078
1079
  <g
1079
1080
  fill="none"
1080
- stroke={theme[shape.props.color].solid}
1081
+ stroke={getColorValue(theme, shape.props.color, 'solid')}
1081
1082
  strokeWidth={strokeWidth}
1082
1083
  strokeLinejoin="round"
1083
1084
  strokeLinecap="round"
@@ -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
  >
@@ -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,
@@ -289,7 +290,7 @@ function DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverrid
289
290
  <path
290
291
  d={svgInk(allPointsFromSegments, options)}
291
292
  strokeLinecap="round"
292
- fill={theme[shape.props.color].solid}
293
+ fill={getColorValue(theme, shape.props.color, 'solid')}
293
294
  />
294
295
  </>
295
296
  )
@@ -313,8 +314,8 @@ function DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverrid
313
314
  <path
314
315
  d={solidStrokePath}
315
316
  strokeLinecap="round"
316
- fill={isDot ? theme[shape.props.color].solid : 'none'}
317
- stroke={theme[shape.props.color].solid}
317
+ fill={isDot ? getColorValue(theme, shape.props.color, 'solid') : 'none'}
318
+ stroke={getColorValue(theme, shape.props.color, 'solid')}
318
319
  strokeWidth={sw}
319
320
  strokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}
320
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
  }}
@@ -19,6 +19,7 @@ import {
19
19
  compact,
20
20
  frameShapeMigrations,
21
21
  frameShapeProps,
22
+ getColorValue,
22
23
  getDefaultColorTheme,
23
24
  lerp,
24
25
  resizeBox,
@@ -220,13 +221,16 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
220
221
  )
221
222
 
222
223
  const showFrameColors = this.options.showColors
223
-
224
- const color = theme[shape.props.color]
225
- const frameFill = showFrameColors ? color.frame.fill : theme.black.frame.fill
226
- const frameStroke = showFrameColors ? color.frame.stroke : theme.black.frame.stroke
227
- const frameHeadingStroke = showFrameColors ? color.frame.headingStroke : theme.background
228
- const frameHeadingFill = showFrameColors ? color.frame.headingFill : theme.background
229
- const frameHeadingText = showFrameColors ? color.frame.text : theme.text
224
+ const colorToUse = showFrameColors ? shape.props.color : 'black'
225
+ const frameFill = getColorValue(theme, colorToUse, 'frameFill')
226
+ const frameStroke = getColorValue(theme, colorToUse, 'frameStroke')
227
+ const frameHeadingStroke = showFrameColors
228
+ ? getColorValue(theme, colorToUse, 'frameHeadingStroke')
229
+ : theme.background
230
+ const frameHeadingFill = showFrameColors
231
+ ? getColorValue(theme, colorToUse, 'frameHeadingFill')
232
+ : theme.background
233
+ const frameHeadingText = getColorValue(theme, colorToUse, 'frameText')
230
234
 
231
235
  return (
232
236
  <>
@@ -277,13 +281,16 @@ export class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {
277
281
  const text = createTextJsxFromSpans(this.editor, spans, opts)
278
282
 
279
283
  const showFrameColors = this.options.showColors
280
-
281
- const color = theme[shape.props.color]
282
- const frameFill = showFrameColors ? color.frame.fill : theme.black.frame.fill
283
- const frameStroke = showFrameColors ? color.frame.stroke : theme.black.frame.stroke
284
- const frameHeadingStroke = showFrameColors ? color.frame.headingStroke : theme.background
285
- const frameHeadingFill = showFrameColors ? color.frame.headingFill : theme.background
286
- const frameHeadingText = showFrameColors ? color.frame.text : theme.text
284
+ const colorToUse = showFrameColors ? shape.props.color : 'black'
285
+ const frameFill = getColorValue(theme, colorToUse, 'frameFill')
286
+ const frameStroke = getColorValue(theme, colorToUse, 'frameStroke')
287
+ const frameHeadingStroke = showFrameColors
288
+ ? getColorValue(theme, colorToUse, 'frameHeadingStroke')
289
+ : theme.background
290
+ const frameHeadingFill = showFrameColors
291
+ ? getColorValue(theme, colorToUse, 'frameHeadingFill')
292
+ : theme.background
293
+ const frameHeadingText = getColorValue(theme, colorToUse, 'frameText')
287
294
 
288
295
  return (
289
296
  <>
@@ -64,7 +64,7 @@ export const FrameHeading = memo(function FrameHeading({
64
64
  overflow: isEditing ? 'visible' : 'hidden',
65
65
  maxWidth: `calc(var(--tl-zoom) * ${
66
66
  side === 0 || side === 2 ? Math.ceil(width) : Math.ceil(height)
67
- }px + ${showColors ? '0px' : 'var(--frame-offset-width)'})`,
67
+ }px + ${showColors ? '0px' : 'var(--tl-frame-offset-width)'})`,
68
68
  bottom: '100%',
69
69
  transform: `${translation} scale(var(--tl-scale)) translateX(${offsetX}px)`,
70
70
  }}
@@ -18,6 +18,7 @@ import {
18
18
  exhaustiveSwitchError,
19
19
  geoShapeMigrations,
20
20
  geoShapeProps,
21
+ getColorValue,
21
22
  getDefaultColorTheme,
22
23
  getFontsFromRichText,
23
24
  isEqual,
@@ -220,7 +221,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
220
221
  verticalAlign={verticalAlign}
221
222
  richText={richText}
222
223
  isSelected={isOnlySelected}
223
- labelColor={theme[props.labelColor].solid}
224
+ labelColor={getColorValue(theme, props.labelColor, 'solid')}
224
225
  wrap
225
226
  />
226
227
  </HTMLContainer>
@@ -278,7 +279,7 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
278
279
  align={props.align}
279
280
  verticalAlign={props.verticalAlign}
280
281
  richText={props.richText}
281
- labelColor={theme[props.labelColor].solid}
282
+ labelColor={getColorValue(theme, props.labelColor, 'solid')}
282
283
  bounds={bounds}
283
284
  padding={LABEL_PADDING}
284
285
  />
@@ -1,4 +1,4 @@
1
- import { TLGeoShape } from '@tldraw/editor'
1
+ import { getColorValue, TLGeoShape } from '@tldraw/editor'
2
2
  import { ShapeFill } from '../../shared/ShapeFill'
3
3
  import { STROKE_SIZES } from '../../shared/default-shape-constants'
4
4
  import { useDefaultColorTheme } from '../../shared/useDefaultColorTheme'
@@ -33,7 +33,7 @@ export function GeoShapeBody({
33
33
  strokeWidth,
34
34
  forceSolid,
35
35
  randomSeed: shape.id,
36
- props: { fill: 'none', stroke: theme[color].solid },
36
+ props: { fill: 'none', stroke: getColorValue(theme, color, 'solid') },
37
37
  })}
38
38
  </>
39
39
  )
@@ -10,6 +10,7 @@ import {
10
10
  TLHighlightShapeProps,
11
11
  TLResizeInfo,
12
12
  VecLike,
13
+ getColorValue,
13
14
  highlightShapeMigrations,
14
15
  highlightShapeProps,
15
16
  last,
@@ -289,7 +290,12 @@ function HighlightRenderer({
289
290
  : getShapeDot(shape.props.segments[0].points[0])
290
291
 
291
292
  const colorSpace = useColorSpace()
292
- const color = theme[shape.props.color].highlight[colorSpace]
293
+
294
+ const color = getColorValue(
295
+ theme,
296
+ shape.props.color,
297
+ colorSpace === 'p3' ? 'highlightP3' : 'highlightSrgb'
298
+ )
293
299
 
294
300
  return (
295
301
  <path
@@ -314,9 +314,9 @@ const ImageShape = memo(function ImageShape({ shape }: { shape: TLImageShape })
314
314
  overflow: 'hidden',
315
315
  width: shape.props.w,
316
316
  height: shape.props.h,
317
- color: 'var(--color-text-3)',
318
- backgroundColor: 'var(--color-low)',
319
- border: '1px solid var(--color-low-border)',
317
+ color: 'var(--tl-color-text-3)',
318
+ backgroundColor: 'var(--tl-color-low)',
319
+ border: '1px solid var(--tl-color-low-border)',
320
320
  }}
321
321
  >
322
322
  <div
@@ -7,6 +7,7 @@ import {
7
7
  sortByIndex,
8
8
  structuredClone,
9
9
  } from '@tldraw/editor'
10
+ import { vi } from 'vitest'
10
11
  import { TestEditor } from '../../../test/TestEditor'
11
12
  import { TL } from '../../../test/test-jsx'
12
13
 
@@ -16,7 +17,7 @@ mockUniqueId(() => 'id' + nextId++)
16
17
  let editor: TestEditor
17
18
  const id = createShapeId('line1')
18
19
 
19
- jest.useFakeTimers()
20
+ vi.useFakeTimers()
20
21
 
21
22
  beforeEach(() => {
22
23
  editor = new TestEditor()
@@ -338,12 +339,12 @@ describe('Misc', () => {
338
339
 
339
340
  expect(editor.getShapePageBounds(box)!.maxX).not.toEqual(editor.getShapePageBounds(line)!.maxX)
340
341
  editor.alignShapes(editor.getSelectedShapeIds(), 'right')
341
- jest.advanceTimersByTime(1000)
342
+ vi.advanceTimersByTime(1000)
342
343
  expect(editor.getShapePageBounds(box)!.maxX).toEqual(editor.getShapePageBounds(line)!.maxX)
343
344
 
344
345
  expect(editor.getShapePageBounds(box)!.maxY).not.toEqual(editor.getShapePageBounds(line)!.maxY)
345
346
  editor.alignShapes(editor.getSelectedShapeIds(), 'bottom')
346
- jest.advanceTimersByTime(1000)
347
+ vi.advanceTimersByTime(1000)
347
348
  expect(editor.getShapePageBounds(box)!.maxY).toEqual(editor.getShapePageBounds(line)!.maxY)
348
349
  })
349
350
 
@@ -12,6 +12,7 @@ import {
12
12
  WeakCache,
13
13
  ZERO_INDEX_KEY,
14
14
  assert,
15
+ getColorValue,
15
16
  getIndexAbove,
16
17
  getIndexBetween,
17
18
  getIndices,
@@ -346,6 +347,10 @@ function LineShapeSvg({
346
347
  strokeWidth,
347
348
  forceSolid,
348
349
  randomSeed: shape.id,
349
- props: { transform: `scale(${scale})`, stroke: theme[color].solid, fill: 'none' },
350
+ props: {
351
+ transform: `scale(${scale})`,
352
+ stroke: getColorValue(theme, color, 'solid'),
353
+ fill: 'none',
354
+ },
350
355
  })
351
356
  }
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`Misc resizes: line shape after resize 1`] = `
3
+ exports[`Misc > resizes > line shape after resize 1`] = `
4
4
  {
5
5
  "id": "shape:line1",
6
6
  "index": "a1",
@@ -17,6 +17,7 @@ import {
17
17
  Vec,
18
18
  WeakCache,
19
19
  exhaustiveSwitchError,
20
+ getColorValue,
20
21
  getDefaultColorTheme,
21
22
  getFontsFromRichText,
22
23
  isEqual,
@@ -288,7 +289,7 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
288
289
  style={{
289
290
  width: nw,
290
291
  height: nh,
291
- backgroundColor: theme[color].note.fill,
292
+ backgroundColor: getColorValue(theme, color, 'noteFill'),
292
293
  borderBottom: hideShadows
293
294
  ? isDarkMode
294
295
  ? `${2 * scale}px solid rgb(20, 20, 20)`
@@ -308,7 +309,11 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
308
309
  verticalAlign={verticalAlign}
309
310
  richText={richText}
310
311
  isSelected={isSelected}
311
- labelColor={labelColor === 'black' ? theme[color].note.text : theme[labelColor].fill}
312
+ labelColor={
313
+ labelColor === 'black'
314
+ ? getColorValue(theme, color, 'noteText')
315
+ : getColorValue(theme, labelColor, 'fill')
316
+ }
312
317
  wrap
313
318
  padding={LABEL_PADDING * scale}
314
319
  hasCustomTabBehavior
@@ -343,7 +348,7 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
343
348
  align={shape.props.align}
344
349
  verticalAlign={shape.props.verticalAlign}
345
350
  richText={shape.props.richText}
346
- labelColor={theme[shape.props.color].note.text}
351
+ labelColor={getColorValue(theme, shape.props.color, 'noteText')}
347
352
  bounds={bounds}
348
353
  padding={LABEL_PADDING}
349
354
  showTextOutline={false}
@@ -357,7 +362,7 @@ export class NoteShapeUtil extends ShapeUtil<TLNoteShape> {
357
362
  rx={1}
358
363
  width={NOTE_SIZE}
359
364
  height={bounds.h}
360
- fill={theme[shape.props.color].note.fill}
365
+ fill={getColorValue(theme, shape.props.color, 'noteFill')}
361
366
  />
362
367
  {textLabel}
363
368
  </>
@@ -1,4 +1,5 @@
1
1
  import {
2
+ getColorValue,
2
3
  TLDefaultColorStyle,
3
4
  TLDefaultColorTheme,
4
5
  TLDefaultFillStyle,
@@ -29,13 +30,13 @@ export const ShapeFill = React.memo(function ShapeFill({
29
30
  return null
30
31
  }
31
32
  case 'solid': {
32
- return <path fill={theme[color].semi} d={d} />
33
+ return <path fill={getColorValue(theme, color, 'semi')} d={d} />
33
34
  }
34
35
  case 'semi': {
35
36
  return <path fill={theme.solid} d={d} />
36
37
  }
37
38
  case 'fill': {
38
- return <path fill={theme[color].fill} d={d} />
39
+ return <path fill={getColorValue(theme, color, 'fill')} d={d} />
39
40
  }
40
41
  case 'pattern': {
41
42
  return <PatternFill theme={theme} color={color} fill={fill} d={d} scale={scale} />
@@ -53,13 +54,13 @@ export function PatternFill({ d, color, theme }: ShapeFillProps) {
53
54
 
54
55
  return (
55
56
  <>
56
- <path fill={theme[color].pattern} d={d} />
57
+ <path fill={getColorValue(theme, color, 'pattern')} d={d} />
57
58
  <path
58
59
  fill={
59
60
  svgExport
60
61
  ? `url(#${getHashPatternZoomName(1, theme.id)})`
61
62
  : teenyTiny
62
- ? theme[color].semi
63
+ ? getColorValue(theme, color, 'semi')
63
64
  : `url(#${getHashPatternZoomName(zoomLevel, theme.id)})`
64
65
  }
65
66
  d={d}
@@ -6,6 +6,8 @@ import { StrokePoint } from './types'
6
6
  *
7
7
  * @param points - The stroke points returned from perfect-freehand
8
8
  * @param closed - Whether the shape is closed
9
+ *
10
+ * @public
9
11
  */
10
12
  export function getSvgPathFromStrokePoints(points: StrokePoint[], closed = false): string {
11
13
  const len = points.length
@@ -1,10 +1,20 @@
1
+ import { useMaybeEditor, useValue } from '@tldraw/editor'
1
2
  import { useEffect, useState } from 'react'
2
3
 
3
4
  /** @public */
4
5
  export function usePrefersReducedMotion() {
6
+ const editor = useMaybeEditor()
7
+ const animationSpeed = useValue('animationSpeed', () => editor?.user.getAnimationSpeed(), [
8
+ editor,
9
+ ])
5
10
  const [prefersReducedMotion, setPrefersReducedMotion] = useState(false)
6
11
 
7
12
  useEffect(() => {
13
+ if (animationSpeed !== undefined) {
14
+ setPrefersReducedMotion(animationSpeed === 0 ? true : false)
15
+ return
16
+ }
17
+
8
18
  if (typeof window === 'undefined' || !('matchMedia' in window)) return
9
19
  const mql = window.matchMedia('(prefers-reduced-motion: reduce)')
10
20
  const handler = () => {
@@ -13,7 +23,7 @@ export function usePrefersReducedMotion() {
13
23
  handler()
14
24
  mql.addEventListener('change', handler)
15
25
  return () => mql.removeEventListener('change', handler)
16
- }, [])
26
+ }, [animationSpeed])
17
27
 
18
28
  return prefersReducedMotion
19
29
  }