@tldraw/editor 4.6.0-next.5a871ec02ff3 → 4.6.0-next.6594d48ace27

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 (448) hide show
  1. package/dist-cjs/index.d.ts +1316 -285
  2. package/dist-cjs/index.js +31 -26
  3. package/dist-cjs/index.js.map +3 -3
  4. package/dist-cjs/lib/TldrawEditor.js +62 -14
  5. package/dist-cjs/lib/TldrawEditor.js.map +3 -3
  6. package/dist-cjs/lib/components/MenuClickCapture.js +99 -38
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/CanvasOverlays.js +180 -0
  9. package/dist-cjs/lib/components/default-components/CanvasOverlays.js.map +7 -0
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +33 -236
  11. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +3 -3
  12. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  13. package/dist-cjs/lib/config/{createTLUser.js → createTLCurrentUser.js} +9 -9
  14. package/dist-cjs/lib/config/createTLCurrentUser.js.map +7 -0
  15. package/dist-cjs/lib/config/createTLStore.js +31 -1
  16. package/dist-cjs/lib/config/createTLStore.js.map +2 -2
  17. package/dist-cjs/lib/{components/default-components/DefaultShapeIndicatorErrorFallback.js → config/defaultAssets.js} +17 -9
  18. package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
  19. package/dist-cjs/lib/config/defaultShapes.js.map +2 -2
  20. package/dist-cjs/lib/editor/Editor.js +921 -386
  21. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  22. package/dist-cjs/lib/editor/assets/AssetUtil.js +67 -0
  23. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
  24. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  25. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  26. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +26 -64
  27. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
  28. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +98 -0
  29. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +7 -0
  30. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +2 -1
  31. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  32. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +15 -53
  33. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
  34. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
  35. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  36. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
  37. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
  38. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +83 -112
  39. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  40. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js +80 -0
  41. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js.map +7 -0
  42. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +466 -0
  43. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +7 -0
  44. package/dist-cjs/lib/{components/default-components/DefaultHandles.js → editor/managers/PerformanceManager/perf-types.js} +3 -14
  45. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js.map +7 -0
  46. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
  47. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
  48. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +22 -56
  49. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +2 -2
  50. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +12 -52
  51. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +2 -2
  52. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +21 -57
  53. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  54. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +5 -4
  55. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +2 -2
  56. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +103 -30
  57. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +2 -2
  58. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +107 -0
  59. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +7 -0
  60. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +600 -0
  61. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
  62. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +17 -55
  63. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  64. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +65 -72
  65. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  66. package/dist-cjs/lib/editor/overlays/OverlayManager.js +154 -0
  67. package/dist-cjs/lib/editor/overlays/OverlayManager.js.map +7 -0
  68. package/dist-cjs/lib/editor/overlays/OverlayUtil.js +92 -0
  69. package/dist-cjs/lib/editor/overlays/OverlayUtil.js.map +7 -0
  70. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +161 -0
  71. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
  72. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +76 -0
  73. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  74. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +35 -20
  75. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  76. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +33 -3
  77. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  78. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
  79. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  80. package/dist-cjs/lib/editor/tools/StateNode.js +15 -17
  81. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  82. package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
  83. package/dist-cjs/lib/editor/types/clipboard-types.js.map +1 -1
  84. package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
  85. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  86. package/dist-cjs/lib/exports/ExportDelay.js +13 -53
  87. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  88. package/dist-cjs/lib/exports/FontEmbedder.js +14 -57
  89. package/dist-cjs/lib/exports/FontEmbedder.js.map +1 -1
  90. package/dist-cjs/lib/exports/StyleEmbedder.js +2 -1
  91. package/dist-cjs/lib/exports/StyleEmbedder.js.map +2 -2
  92. package/dist-cjs/lib/exports/fetchCache.js +1 -1
  93. package/dist-cjs/lib/exports/fetchCache.js.map +2 -2
  94. package/dist-cjs/lib/exports/getSvgJsx.js +14 -8
  95. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  96. package/dist-cjs/lib/globals/environment.js +18 -1
  97. package/dist-cjs/lib/globals/environment.js.map +2 -2
  98. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  99. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  100. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  101. package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
  102. package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
  103. package/dist-cjs/lib/hooks/useCursor.js +3 -7
  104. package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
  105. package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
  106. package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
  107. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -28
  108. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  109. package/dist-cjs/lib/hooks/useGestureEvents.js +171 -127
  110. package/dist-cjs/lib/hooks/useGestureEvents.js.map +3 -3
  111. package/dist-cjs/lib/hooks/useLocalStore.js.map +2 -2
  112. package/dist-cjs/lib/hooks/usePeerIds.js +1 -36
  113. package/dist-cjs/lib/hooks/usePeerIds.js.map +2 -2
  114. package/dist-cjs/lib/hooks/useShapeCulling.js +2 -1
  115. package/dist-cjs/lib/hooks/useShapeCulling.js.map +2 -2
  116. package/dist-cjs/lib/options.js +4 -0
  117. package/dist-cjs/lib/options.js.map +2 -2
  118. package/dist-cjs/lib/primitives/Box.js +26 -26
  119. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  120. package/dist-cjs/lib/primitives/Vec.js +4 -1
  121. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  122. package/dist-cjs/lib/primitives/geometry/Arc2d.js +2 -2
  123. package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
  124. package/dist-cjs/lib/primitives/geometry/Circle2d.js +3 -2
  125. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
  126. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +1 -1
  127. package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +1 -1
  128. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +4 -3
  129. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
  130. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +12 -9
  131. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  132. package/dist-cjs/lib/primitives/geometry/Polyline2d.js +2 -2
  133. package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
  134. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +2 -1
  135. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
  136. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  137. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  138. package/dist-cjs/lib/utils/SharedStylesMap.js +1 -1
  139. package/dist-cjs/lib/utils/SharedStylesMap.js.map +1 -1
  140. package/dist-cjs/lib/utils/getSvgPathFromPoints.js.map +2 -2
  141. package/dist-cjs/lib/utils/reparenting.js +2 -1
  142. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  143. package/dist-cjs/lib/utils/richText.js.map +2 -2
  144. package/dist-cjs/lib/utils/runtime.js +2 -1
  145. package/dist-cjs/lib/utils/runtime.js.map +2 -2
  146. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +8 -2
  147. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  148. package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
  149. package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
  150. package/dist-cjs/version.js +3 -3
  151. package/dist-cjs/version.js.map +1 -1
  152. package/dist-esm/index.d.mts +1316 -285
  153. package/dist-esm/index.mjs +44 -48
  154. package/dist-esm/index.mjs.map +2 -2
  155. package/dist-esm/lib/TldrawEditor.mjs +65 -14
  156. package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
  157. package/dist-esm/lib/components/MenuClickCapture.mjs +100 -39
  158. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  159. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs +160 -0
  160. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs.map +7 -0
  161. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +34 -237
  162. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +3 -3
  163. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  164. package/dist-esm/lib/config/{createTLUser.mjs → createTLCurrentUser.mjs} +6 -6
  165. package/dist-esm/lib/config/createTLCurrentUser.mjs.map +7 -0
  166. package/dist-esm/lib/config/createTLStore.mjs +37 -2
  167. package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
  168. package/dist-esm/lib/config/defaultAssets.mjs +16 -0
  169. package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
  170. package/dist-esm/lib/config/defaultShapes.mjs.map +2 -2
  171. package/dist-esm/lib/editor/Editor.mjs +924 -389
  172. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  173. package/dist-esm/lib/editor/assets/AssetUtil.mjs +47 -0
  174. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
  175. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  176. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  177. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +26 -64
  178. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
  179. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +83 -0
  180. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +7 -0
  181. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +2 -1
  182. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  183. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +15 -53
  184. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  185. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  186. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  187. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  188. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  189. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +83 -112
  190. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  191. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
  192. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
  193. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
  194. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
  195. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
  196. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
  197. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
  198. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
  199. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +22 -56
  200. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +2 -2
  201. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +12 -52
  202. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +2 -2
  203. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +21 -57
  204. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  205. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +5 -4
  206. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +2 -2
  207. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +103 -30
  208. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +2 -2
  209. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +89 -0
  210. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
  211. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +582 -0
  212. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
  213. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +17 -55
  214. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  215. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +65 -72
  216. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  217. package/dist-esm/lib/editor/overlays/OverlayManager.mjs +136 -0
  218. package/dist-esm/lib/editor/overlays/OverlayManager.mjs.map +7 -0
  219. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs +72 -0
  220. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs.map +7 -0
  221. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +141 -0
  222. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
  223. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +56 -0
  224. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  225. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +35 -20
  226. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  227. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +33 -3
  228. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  229. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
  230. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  231. package/dist-esm/lib/editor/tools/StateNode.mjs +15 -17
  232. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  233. package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
  234. package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
  235. package/dist-esm/lib/exports/ExportDelay.mjs +13 -53
  236. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  237. package/dist-esm/lib/exports/FontEmbedder.mjs +14 -57
  238. package/dist-esm/lib/exports/FontEmbedder.mjs.map +1 -1
  239. package/dist-esm/lib/exports/StyleEmbedder.mjs +2 -1
  240. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +2 -2
  241. package/dist-esm/lib/exports/fetchCache.mjs +2 -2
  242. package/dist-esm/lib/exports/fetchCache.mjs.map +2 -2
  243. package/dist-esm/lib/exports/getSvgJsx.mjs +14 -11
  244. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  245. package/dist-esm/lib/globals/environment.mjs +18 -1
  246. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  247. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  248. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  249. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  250. package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
  251. package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
  252. package/dist-esm/lib/hooks/useCursor.mjs +3 -7
  253. package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
  254. package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
  255. package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
  256. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -28
  257. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  258. package/dist-esm/lib/hooks/useGestureEvents.mjs +171 -127
  259. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +3 -3
  260. package/dist-esm/lib/hooks/useLocalStore.mjs.map +2 -2
  261. package/dist-esm/lib/hooks/usePeerIds.mjs +2 -40
  262. package/dist-esm/lib/hooks/usePeerIds.mjs.map +2 -2
  263. package/dist-esm/lib/hooks/useShapeCulling.mjs +2 -1
  264. package/dist-esm/lib/hooks/useShapeCulling.mjs.map +2 -2
  265. package/dist-esm/lib/options.mjs +4 -0
  266. package/dist-esm/lib/options.mjs.map +2 -2
  267. package/dist-esm/lib/primitives/Box.mjs +26 -26
  268. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  269. package/dist-esm/lib/primitives/Vec.mjs +4 -1
  270. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  271. package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
  272. package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
  273. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +3 -2
  274. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
  275. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +1 -1
  276. package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +1 -1
  277. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +4 -3
  278. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
  279. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +12 -9
  280. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  281. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +2 -2
  282. package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
  283. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +2 -1
  284. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
  285. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  286. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  287. package/dist-esm/lib/utils/SharedStylesMap.mjs +1 -1
  288. package/dist-esm/lib/utils/SharedStylesMap.mjs.map +1 -1
  289. package/dist-esm/lib/utils/getSvgPathFromPoints.mjs.map +2 -2
  290. package/dist-esm/lib/utils/reparenting.mjs +2 -1
  291. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  292. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  293. package/dist-esm/lib/utils/runtime.mjs +2 -1
  294. package/dist-esm/lib/utils/runtime.mjs.map +2 -2
  295. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +8 -2
  296. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  297. package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
  298. package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
  299. package/dist-esm/version.mjs +3 -3
  300. package/dist-esm/version.mjs.map +1 -1
  301. package/editor.css +16 -256
  302. package/package.json +7 -8
  303. package/src/index.ts +58 -52
  304. package/src/lib/TldrawEditor.tsx +108 -20
  305. package/src/lib/components/MenuClickCapture.tsx +129 -49
  306. package/src/lib/components/default-components/CanvasOverlays.tsx +208 -0
  307. package/src/lib/components/default-components/DefaultCanvas.tsx +38 -310
  308. package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -0
  309. package/src/lib/config/TLEditorSnapshot.test.ts +1 -1
  310. package/src/lib/config/{createTLUser.ts → createTLCurrentUser.ts} +9 -9
  311. package/src/lib/config/createTLStore.ts +58 -3
  312. package/src/lib/config/defaultAssets.ts +19 -0
  313. package/src/lib/config/defaultShapes.ts +1 -1
  314. package/src/lib/editor/Editor.test.ts +3 -1
  315. package/src/lib/editor/Editor.ts +610 -69
  316. package/src/lib/editor/assets/AssetUtil.ts +85 -0
  317. package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
  318. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +98 -0
  319. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +1 -1
  320. package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
  321. package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
  322. package/src/lib/editor/managers/InputsManager/InputsManager.ts +42 -30
  323. package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
  324. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
  325. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
  326. package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
  327. package/src/lib/editor/managers/SnapManager/BoundsSnaps.ts +1 -1
  328. package/src/lib/editor/managers/SnapManager/HandleSnaps.ts +1 -1
  329. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  330. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  331. package/src/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.ts +5 -5
  332. package/src/lib/editor/managers/TextManager/TextManager.test.ts +18 -4
  333. package/src/lib/editor/managers/TextManager/TextManager.ts +140 -34
  334. package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
  335. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +619 -0
  336. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +25 -31
  337. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +7 -5
  338. package/src/lib/editor/overlays/OverlayManager.ts +183 -0
  339. package/src/lib/editor/overlays/OverlayUtil.ts +143 -0
  340. package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +216 -0
  341. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +123 -0
  342. package/src/lib/editor/shapes/ShapeUtil.ts +67 -30
  343. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +41 -4
  344. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
  345. package/src/lib/editor/tools/StateNode.ts +16 -18
  346. package/src/lib/editor/types/SvgExportContext.tsx +5 -0
  347. package/src/lib/editor/types/clipboard-types.ts +2 -1
  348. package/src/lib/editor/types/event-types.ts +2 -0
  349. package/src/lib/editor/types/external-content.ts +1 -0
  350. package/src/lib/exports/StyleEmbedder.ts +1 -1
  351. package/src/lib/exports/fetchCache.ts +2 -4
  352. package/src/lib/exports/getSvgJsx.test.ts +3 -1
  353. package/src/lib/exports/getSvgJsx.tsx +24 -17
  354. package/src/lib/globals/environment.ts +18 -0
  355. package/src/lib/hooks/EditorComponentsContext.tsx +0 -27
  356. package/src/lib/hooks/useCanvasEvents.ts +40 -3
  357. package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
  358. package/src/lib/hooks/useCursor.ts +3 -7
  359. package/src/lib/hooks/useDarkMode.ts +4 -4
  360. package/src/lib/hooks/useEditorComponents.tsx +1 -29
  361. package/src/lib/hooks/useGestureEvents.ts +240 -168
  362. package/src/lib/hooks/useLocalStore.ts +1 -1
  363. package/src/lib/hooks/usePeerIds.ts +6 -55
  364. package/src/lib/hooks/useShapeCulling.tsx +3 -1
  365. package/src/lib/options.ts +115 -0
  366. package/src/lib/primitives/Box.test.ts +30 -0
  367. package/src/lib/primitives/Box.ts +26 -26
  368. package/src/lib/primitives/Vec.ts +1 -1
  369. package/src/lib/primitives/geometry/Arc2d.ts +2 -2
  370. package/src/lib/primitives/geometry/Circle2d.ts +2 -2
  371. package/src/lib/primitives/geometry/CubicSpline2d.ts +1 -1
  372. package/src/lib/primitives/geometry/Ellipse2d.ts +3 -3
  373. package/src/lib/primitives/geometry/Geometry2d.test.ts +21 -0
  374. package/src/lib/primitives/geometry/Geometry2d.ts +10 -9
  375. package/src/lib/primitives/geometry/Polyline2d.ts +2 -2
  376. package/src/lib/primitives/geometry/Stadium2d.ts +1 -1
  377. package/src/lib/utils/SharedStylesMap.ts +1 -1
  378. package/src/lib/utils/getSvgPathFromPoints.ts +1 -1
  379. package/src/lib/utils/reparenting.ts +6 -2
  380. package/src/lib/utils/richText.ts +1 -1
  381. package/src/lib/utils/runtime.ts +3 -1
  382. package/src/lib/utils/sync/TLLocalSyncClient.test.ts +1 -1
  383. package/src/lib/utils/sync/TLLocalSyncClient.ts +5 -1
  384. package/src/lib/utils/sync/hardReset.ts +0 -8
  385. package/src/version.ts +3 -3
  386. package/dist-cjs/lib/components/LiveCollaborators.js +0 -151
  387. package/dist-cjs/lib/components/LiveCollaborators.js.map +0 -7
  388. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +0 -227
  389. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +0 -7
  390. package/dist-cjs/lib/components/default-components/DefaultBrush.js +0 -38
  391. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +0 -7
  392. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +0 -71
  393. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +0 -7
  394. package/dist-cjs/lib/components/default-components/DefaultHandle.js +0 -56
  395. package/dist-cjs/lib/components/default-components/DefaultHandle.js.map +0 -7
  396. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +0 -7
  397. package/dist-cjs/lib/components/default-components/DefaultScribble.js +0 -51
  398. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +0 -7
  399. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js +0 -69
  400. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js.map +0 -7
  401. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +0 -107
  402. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +0 -7
  403. package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js.map +0 -7
  404. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +0 -101
  405. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +0 -7
  406. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +0 -170
  407. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +0 -7
  408. package/dist-cjs/lib/config/createTLUser.js.map +0 -7
  409. package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
  410. package/dist-esm/lib/components/LiveCollaborators.mjs +0 -134
  411. package/dist-esm/lib/components/LiveCollaborators.mjs.map +0 -7
  412. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +0 -207
  413. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +0 -7
  414. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +0 -18
  415. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +0 -7
  416. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +0 -41
  417. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +0 -7
  418. package/dist-esm/lib/components/default-components/DefaultHandle.mjs +0 -26
  419. package/dist-esm/lib/components/default-components/DefaultHandle.mjs.map +0 -7
  420. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +0 -8
  421. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +0 -7
  422. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +0 -21
  423. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +0 -7
  424. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs +0 -39
  425. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs.map +0 -7
  426. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +0 -77
  427. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +0 -7
  428. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs +0 -8
  429. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs.map +0 -7
  430. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +0 -81
  431. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +0 -7
  432. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +0 -142
  433. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +0 -7
  434. package/dist-esm/lib/config/createTLUser.mjs.map +0 -7
  435. package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
  436. package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
  437. package/src/lib/components/LiveCollaborators.tsx +0 -174
  438. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +0 -289
  439. package/src/lib/components/default-components/DefaultBrush.tsx +0 -35
  440. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +0 -52
  441. package/src/lib/components/default-components/DefaultHandle.tsx +0 -42
  442. package/src/lib/components/default-components/DefaultHandles.tsx +0 -15
  443. package/src/lib/components/default-components/DefaultScribble.tsx +0 -31
  444. package/src/lib/components/default-components/DefaultSelectionForeground.tsx +0 -50
  445. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +0 -104
  446. package/src/lib/components/default-components/DefaultShapeIndicatorErrorFallback.tsx +0 -9
  447. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +0 -116
  448. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +0 -174
@@ -1,5 +1,14 @@
1
1
  import { MigrationSequence, Store } from '@tldraw/store'
2
- import { TLShape, TLStore, TLStoreSnapshot } from '@tldraw/tlschema'
2
+ import {
3
+ TLShape,
4
+ TLStore,
5
+ TLStoreSnapshot,
6
+ TLTheme,
7
+ TLThemeId,
8
+ TLThemes,
9
+ registerColorsFromThemes,
10
+ registerFontsFromThemes,
11
+ } from '@tldraw/tlschema'
3
12
  import { annotateError, Required } from '@tldraw/utils'
4
13
  import classNames from 'classnames'
5
14
  import React, {
@@ -16,16 +25,19 @@ import React, {
16
25
  import { version } from '../version'
17
26
  import { DefaultErrorFallback } from './components/default-components/DefaultErrorFallback'
18
27
  import { OptionalErrorBoundary } from './components/ErrorBoundary'
28
+ import { createTLCurrentUser, TLCurrentUser } from './config/createTLCurrentUser'
19
29
  import { TLStoreBaseOptions } from './config/createTLStore'
20
- import { createTLUser, TLUser } from './config/createTLUser'
30
+ import { TLAnyAssetUtilConstructor } from './config/defaultAssets'
21
31
  import { TLAnyBindingUtilConstructor } from './config/defaultBindings'
22
32
  import { TLAnyShapeUtilConstructor } from './config/defaultShapes'
23
33
  import { TLEditorSnapshot } from './config/TLEditorSnapshot'
24
34
  import { Editor } from './editor/Editor'
35
+ import { resolveThemes } from './editor/managers/ThemeManager/ThemeManager'
36
+ import { TLAnyOverlayUtilConstructor } from './editor/overlays/OverlayUtil'
25
37
  import { TLStateNodeConstructor } from './editor/tools/StateNode'
26
38
  import { TLCameraOptions } from './editor/types/misc-types'
27
- import type { TLEditorComponents } from './hooks/EditorComponentsContext'
28
39
  import { useEditorComponents } from './hooks/EditorComponentsContext'
40
+ import type { TLEditorComponents } from './hooks/EditorComponentsContext'
29
41
  import { ContainerProvider, useContainer } from './hooks/useContainer'
30
42
  import { useCursor } from './hooks/useCursor'
31
43
  import { useDarkMode } from './hooks/useDarkMode'
@@ -121,6 +133,16 @@ export interface TldrawEditorBaseProps {
121
133
  */
122
134
  bindingUtils?: readonly TLAnyBindingUtilConstructor[]
123
135
 
136
+ /**
137
+ * An array of asset utils to use in the editor.
138
+ */
139
+ assetUtils?: readonly TLAnyAssetUtilConstructor[]
140
+
141
+ /**
142
+ * An array of overlay utils to use in the editor for canvas overlay UI elements.
143
+ */
144
+ overlayUtils?: readonly TLAnyOverlayUtilConstructor[]
145
+
124
146
  /**
125
147
  * An array of tools to add to the editor's state chart.
126
148
  */
@@ -154,12 +176,26 @@ export interface TldrawEditorBaseProps {
154
176
  /**
155
177
  * The user interacting with the editor.
156
178
  */
157
- user?: TLUser
179
+ user?: TLCurrentUser
180
+
181
+ /**
182
+ * The editor's color scheme. Defaults to `'light'`.
183
+ *
184
+ * - `'light'` - Always use light mode.
185
+ * - `'dark'` - Always use dark mode.
186
+ * - `'system'` - Follow the OS color scheme preference.
187
+ */
188
+ colorScheme?: 'light' | 'dark' | 'system'
189
+
190
+ /**
191
+ * Named themes for the editor.
192
+ */
193
+ themes?: Partial<TLThemes>
158
194
 
159
195
  /**
160
- * Whether to infer dark mode from the user's OS. Defaults to false.
196
+ * The id of the initially active theme. Defaults to `'default'`.
161
197
  */
162
- inferDarkMode?: boolean
198
+ initialTheme?: TLThemeId
163
199
 
164
200
  /**
165
201
  * Camera options for the editor.
@@ -242,6 +278,7 @@ declare global {
242
278
 
243
279
  const EMPTY_SHAPE_UTILS_ARRAY = [] as const
244
280
  const EMPTY_BINDING_UTILS_ARRAY = [] as const
281
+ const EMPTY_ASSET_UTILS_ARRAY = [] as const
245
282
  const EMPTY_TOOLS_ARRAY = [] as const
246
283
  /** @internal */
247
284
  export const TL_CONTAINER_CLASS = 'tl-container'
@@ -259,8 +296,15 @@ export const TldrawEditor = memo(function TldrawEditor({
259
296
  deepLinks: _deepLinks,
260
297
  ...rest
261
298
  }: TldrawEditorProps) {
299
+ // Register custom colors and fonts before effects run. For external stores,
300
+ // users should also pass themes to createTLStore so they are
301
+ // registered before data is loaded into the store.
302
+ const resolvedThemes = resolveThemes(rest.themes)
303
+ registerColorsFromThemes(resolvedThemes)
304
+ registerFontsFromThemes(resolvedThemes)
305
+
262
306
  const [container, setContainer] = useState<HTMLElement | null>(null)
263
- const user = useMemo(() => _user ?? createTLUser(), [_user])
307
+ const user = useMemo(() => _user ?? createTLCurrentUser(), [_user])
264
308
 
265
309
  const ErrorFallback =
266
310
  components?.ErrorFallback === undefined ? DefaultErrorFallback : components?.ErrorFallback
@@ -285,6 +329,7 @@ export const TldrawEditor = memo(function TldrawEditor({
285
329
  ...rest,
286
330
  shapeUtils: rest.shapeUtils ?? EMPTY_SHAPE_UTILS_ARRAY,
287
331
  bindingUtils: rest.bindingUtils ?? EMPTY_BINDING_UTILS_ARRAY,
332
+ assetUtils: rest.assetUtils ?? EMPTY_ASSET_UTILS_ARRAY,
288
333
  tools: rest.tools ?? EMPTY_TOOLS_ARRAY,
289
334
  components,
290
335
  options: useShallowObjectIdentity(mergedOptions),
@@ -331,8 +376,8 @@ export const TldrawEditor = memo(function TldrawEditor({
331
376
 
332
377
  function TldrawEditorWithOwnStore(
333
378
  props: Required<
334
- TldrawEditorProps & { store: undefined; user: TLUser },
335
- 'shapeUtils' | 'bindingUtils' | 'tools'
379
+ TldrawEditorProps & { store: undefined; user: TLCurrentUser },
380
+ 'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
336
381
  >
337
382
  ) {
338
383
  const {
@@ -341,23 +386,29 @@ function TldrawEditorWithOwnStore(
341
386
  initialData,
342
387
  shapeUtils,
343
388
  bindingUtils,
389
+ assetUtils,
344
390
  persistenceKey,
345
391
  sessionId,
346
392
  user,
347
393
  assets,
394
+ users,
348
395
  migrations,
396
+ themes,
349
397
  } = props
350
398
 
351
399
  const syncedStore = useLocalStore({
352
400
  shapeUtils,
353
401
  bindingUtils,
402
+ assetUtils,
354
403
  initialData,
355
404
  persistenceKey,
356
405
  sessionId,
357
406
  defaultName,
358
407
  snapshot,
359
408
  assets,
409
+ users,
360
410
  migrations,
411
+ themes,
361
412
  })
362
413
 
363
414
  return <TldrawEditorWithLoadingStore {...props} store={syncedStore} user={user} />
@@ -368,8 +419,8 @@ const TldrawEditorWithLoadingStore = memo(function TldrawEditorBeforeLoading({
368
419
  user,
369
420
  ...rest
370
421
  }: Required<
371
- TldrawEditorProps & { store: TLStoreWithStatus; user: TLUser },
372
- 'shapeUtils' | 'bindingUtils' | 'tools'
422
+ TldrawEditorProps & { store: TLStoreWithStatus; user: TLCurrentUser },
423
+ 'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
373
424
  >) {
374
425
  const container = useContainer()
375
426
 
@@ -415,22 +466,26 @@ function TldrawEditorWithReadyStore({
415
466
  tools,
416
467
  shapeUtils,
417
468
  bindingUtils,
469
+ assetUtils,
470
+ overlayUtils,
418
471
  user,
419
472
  initialState,
420
473
  autoFocus = true,
421
- inferDarkMode,
422
474
  // eslint-disable-next-line @typescript-eslint/no-deprecated
423
475
  cameraOptions,
424
476
  options,
425
477
  licenseKey,
426
478
  getShapeVisibility,
479
+ colorScheme,
427
480
  assetUrls,
481
+ themes,
482
+ initialTheme,
428
483
  }: Required<
429
484
  TldrawEditorProps & {
430
485
  store: TLStore
431
- user: TLUser
486
+ user: TLCurrentUser
432
487
  },
433
- 'shapeUtils' | 'bindingUtils' | 'tools'
488
+ 'shapeUtils' | 'bindingUtils' | 'assetUtils' | 'tools'
434
489
  >) {
435
490
  const { ErrorFallback } = useEditorComponents()
436
491
  const container = useContainer()
@@ -446,44 +501,59 @@ function TldrawEditorWithReadyStore({
446
501
  const editorOptionsRef = useRef({
447
502
  // for these, it's because they're only used when the editor first mounts:
448
503
  autoFocus: autoFocus && !noAutoFocus(),
449
- inferDarkMode,
450
504
  initialState,
505
+ colorScheme,
451
506
 
452
507
  // for these, it's because we keep them up to date in a separate effect:
453
508
  cameraOptions,
454
509
  deepLinks,
510
+ themes,
511
+ initialTheme,
455
512
  })
456
513
 
457
514
  useLayoutEffect(() => {
458
515
  editorOptionsRef.current = {
459
516
  autoFocus: autoFocus && !noAutoFocus(),
460
- inferDarkMode,
461
517
  initialState,
518
+ colorScheme,
462
519
  cameraOptions,
463
520
  deepLinks,
521
+ themes,
522
+ initialTheme,
464
523
  }
465
- }, [autoFocus, inferDarkMode, initialState, cameraOptions, deepLinks])
524
+ }, [autoFocus, initialState, colorScheme, cameraOptions, deepLinks, themes, initialTheme])
466
525
 
467
526
  useLayoutEffect(
468
527
  () => {
469
- const { autoFocus, inferDarkMode, initialState, cameraOptions, deepLinks } =
470
- editorOptionsRef.current
528
+ const {
529
+ autoFocus,
530
+ initialState,
531
+ colorScheme: initColorScheme,
532
+ cameraOptions,
533
+ deepLinks,
534
+ themes,
535
+ initialTheme,
536
+ } = editorOptionsRef.current
471
537
  const editor = new Editor({
472
538
  store,
473
539
  shapeUtils,
474
540
  bindingUtils,
541
+ assetUtils,
542
+ overlayUtils,
475
543
  tools,
476
544
  getContainer: () => container,
477
545
  user,
478
546
  initialState,
479
547
  // we should check for some kind of query parameter that turns off autofocus
480
548
  autoFocus,
481
- inferDarkMode,
482
549
  cameraOptions,
483
550
  options,
484
551
  licenseKey,
485
552
  getShapeVisibility,
553
+ colorScheme: initColorScheme,
486
554
  fontAssetUrls: assetUrls?.fonts,
555
+ themes: themes,
556
+ initialTheme: initialTheme,
487
557
  })
488
558
 
489
559
  editor.updateViewportScreenBounds(canvasRef.current ?? container)
@@ -508,9 +578,12 @@ function TldrawEditorWithReadyStore({
508
578
  },
509
579
  // if any of these change, we need to recreate the editor.
510
580
  [
581
+ assetUtils,
511
582
  bindingUtils,
583
+ colorScheme,
512
584
  container,
513
585
  options,
586
+ overlayUtils,
514
587
  shapeUtils,
515
588
  store,
516
589
  tools,
@@ -537,6 +610,21 @@ function TldrawEditorWithReadyStore({
537
610
  }
538
611
  }, [editor, cameraOptions, options?.camera])
539
612
 
613
+ // keep the editor up to date with the latest theme definitions
614
+ useLayoutEffect(() => {
615
+ if (editor && themes) {
616
+ for (const def of Object.values(themes) as TLTheme[]) {
617
+ editor.updateTheme(def)
618
+ }
619
+ }
620
+ }, [editor, themes])
621
+
622
+ useLayoutEffect(() => {
623
+ if (editor && initialTheme) {
624
+ editor.setCurrentTheme(initialTheme)
625
+ }
626
+ }, [editor, initialTheme])
627
+
540
628
  const crashingError = useSyncExternalStore(
541
629
  useCallback(
542
630
  (onStoreChange) => {
@@ -1,8 +1,10 @@
1
1
  import { useValue } from '@tldraw/state-react'
2
- import { PointerEvent, useCallback, useRef, useState } from 'react'
2
+ import { type PointerEvent, useCallback, useEffect, useRef, useState } from 'react'
3
+ import { flushSync } from 'react-dom'
3
4
  import { useCanvasEvents } from '../hooks/useCanvasEvents'
4
5
  import { useEditor } from '../hooks/useEditor'
5
6
  import { Vec } from '../primitives/Vec'
7
+ import { releasePointerCapture, setPointerCapture } from '../utils/dom'
6
8
  import { getPointerInfo } from '../utils/getPointerInfo'
7
9
 
8
10
  /**
@@ -13,99 +15,173 @@ import { getPointerInfo } from '../utils/getPointerInfo'
13
15
  export function MenuClickCapture() {
14
16
  const editor = useEditor()
15
17
 
16
- // Whether any menus are open
17
18
  const isMenuOpen = useValue('is menu open', () => editor.menus.hasAnyOpenMenus(), [editor])
18
19
 
19
- // Whether we're pointing or not—keep this component visible if we're pointing
20
+ // Keep this component mounted while the pointer is down so pointerup/move still
21
+ // land here after a synchronous clearOpenMenus() flips isMenuOpen to false.
20
22
  const [isPointing, setIsPointing] = useState(false)
21
-
22
23
  const showElement = isMenuOpen || isPointing
23
24
 
24
- // Get the same events that we use on the canvas
25
25
  const canvasEvents = useCanvasEvents()
26
26
 
27
- // Keep track of the pointer state
28
27
  const rPointerState = useRef({
29
28
  isDown: false,
30
29
  isDragging: false,
30
+ button: 0,
31
31
  start: new Vec(),
32
32
  })
33
33
 
34
+ // Swallow the native contextmenu that follows a right-click pointerdown. Without
35
+ // this, Radix's trigger catches the native event and opens a menu at the pointer-
36
+ // DOWN position — then our own synthetic contextmenu (fired on pointerup) opens it
37
+ // again at the release position, producing a visible flash.
38
+ const rCancelContextMenuSwallow = useRef<null | (() => void)>(null)
39
+ useEffect(
40
+ () => () => {
41
+ rCancelContextMenuSwallow.current?.()
42
+ rCancelContextMenuSwallow.current = null
43
+ },
44
+ []
45
+ )
46
+ const swallowNextNativeContextMenu = useCallback(() => {
47
+ rCancelContextMenuSwallow.current?.()
48
+ const doc = editor.getContainerDocument()
49
+ const onContextMenu = (event: MouseEvent) => {
50
+ // Skip our own synthetic contextmenu — only swallow the real browser one
51
+ if (!event.isTrusted) return
52
+ rCancelContextMenuSwallow.current?.()
53
+ rCancelContextMenuSwallow.current = null
54
+ event.preventDefault()
55
+ event.stopImmediatePropagation()
56
+ }
57
+ const cancel = () => doc.removeEventListener('contextmenu', onContextMenu, true)
58
+ rCancelContextMenuSwallow.current = cancel
59
+ doc.addEventListener('contextmenu', onContextMenu, true)
60
+ // Drop the listener on the next tick if it never fires (e.g. pointer moved off-screen)
61
+ doc.defaultView?.setTimeout(() => {
62
+ if (rCancelContextMenuSwallow.current === cancel) {
63
+ cancel()
64
+ rCancelContextMenuSwallow.current = null
65
+ }
66
+ }, 0)
67
+ }, [editor])
68
+
34
69
  const handlePointerDown = useCallback(
35
70
  (e: PointerEvent) => {
36
- if (e.button === 0) {
37
- setIsPointing(true)
38
- rPointerState.current = {
39
- isDown: true,
40
- isDragging: false,
41
- start: new Vec(e.clientX, e.clientY),
71
+ if (e.button !== 0 && e.button !== 2) return
72
+
73
+ flushSync(() => setIsPointing(true))
74
+ setPointerCapture(e.currentTarget, e)
75
+ rPointerState.current = {
76
+ isDown: true,
77
+ isDragging: false,
78
+ button: e.button,
79
+ start: new Vec(e.clientX, e.clientY),
80
+ }
81
+
82
+ if (e.button === 2) {
83
+ if (!editor.options.rightClickPanning) {
84
+ // Right-click panning off: close the open menu and swallow the native
85
+ // contextmenu that would otherwise briefly open a new one (causing a flash).
86
+ swallowNextNativeContextMenu()
87
+ editor.menus.clearOpenMenus()
88
+ return
42
89
  }
43
- rDidAPointerDownAndDragWhileMenuWasOpen.current = false
90
+ // Forward right-click pointerdown through the canvas's own handler so
91
+ // pointer capture is also set on the canvas (load-bearing: without this
92
+ // the context menu briefly flashes closed during consecutive right-clicks).
93
+ // We don't clearOpenMenus() — Radix's DismissableLayer closes the menu
94
+ // via outside-click detection, keeping its internal state in sync.
95
+ const canvas =
96
+ editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas') ?? e.currentTarget
97
+ canvasEvents.onPointerDown?.({ ...e, currentTarget: canvas })
98
+ swallowNextNativeContextMenu()
99
+ return
44
100
  }
101
+
45
102
  editor.menus.clearOpenMenus()
46
103
  },
47
- [editor]
104
+ [canvasEvents, editor, swallowNextNativeContextMenu]
48
105
  )
49
106
 
50
- const rDidAPointerDownAndDragWhileMenuWasOpen = useRef(false)
51
-
52
107
  const handlePointerMove = useCallback(
53
108
  (e: PointerEvent) => {
54
- // Do nothing unless we're pointing
55
- if (!rPointerState.current.isDown) return
56
-
57
- // call the onPointerDown with the original pointer position
58
- const { x, y } = rPointerState.current.start
109
+ const state = rPointerState.current
110
+ if (!state.isDown) return
59
111
 
60
- if (!rDidAPointerDownAndDragWhileMenuWasOpen.current) {
112
+ // Left-click: wait for the drag threshold before forwarding anything, then
113
+ // replay pointerdown at the original start so the editor records the
114
+ // correct drag origin. Right-click forwards moves immediately (pointerdown
115
+ // was already dispatched in handlePointerDown).
116
+ if (state.button !== 2 && !state.isDragging) {
61
117
  if (
62
- // We're pointing, but are we dragging?
63
- Vec.Dist2(rPointerState.current.start, new Vec(e.clientX, e.clientY)) >
118
+ Vec.Dist2(state.start, new Vec(e.clientX, e.clientY)) <=
64
119
  editor.options.dragDistanceSquared
65
120
  ) {
66
- rDidAPointerDownAndDragWhileMenuWasOpen.current = true
67
- // Wehaddaeventitsadrag
68
- rPointerState.current = {
69
- ...rPointerState.current,
70
- isDown: true,
71
- isDragging: true,
72
- }
73
- canvasEvents.onPointerDown?.({
74
- ...e,
75
- clientX: x,
76
- clientY: y,
77
- button: 0,
78
- })
121
+ return
79
122
  }
80
- }
81
-
82
- if (rDidAPointerDownAndDragWhileMenuWasOpen.current) {
123
+ state.isDragging = true
83
124
  editor.dispatch({
84
125
  type: 'pointer',
85
126
  target: 'canvas',
86
- name: 'pointer_move',
87
- ...getPointerInfo(editor, e),
127
+ name: 'pointer_down',
128
+ ...getPointerInfo(editor, { ...e, clientX: state.start.x, clientY: state.start.y }),
88
129
  })
89
130
  }
131
+
132
+ editor.dispatch({
133
+ type: 'pointer',
134
+ target: 'canvas',
135
+ name: 'pointer_move',
136
+ ...getPointerInfo(editor, e),
137
+ })
90
138
  },
91
- [canvasEvents, editor]
139
+ [editor]
92
140
  )
93
141
 
94
142
  const handlePointerUp = useCallback(
95
143
  (e: PointerEvent) => {
96
- // Run the pointer up
97
- canvasEvents.onPointerUp?.(e)
98
- // Then turn off pointing
144
+ const isStaticRightClick = e.button === 2 && !rPointerState.current.isDragging
145
+
146
+ editor.dispatch({
147
+ type: 'pointer',
148
+ target: 'canvas',
149
+ name: 'pointer_up',
150
+ ...getPointerInfo(editor, e),
151
+ })
152
+
153
+ if (isStaticRightClick && editor.options.rightClickPanning) {
154
+ // Dispatch contextmenu on the canvas's parent (Radix's trigger) so the
155
+ // menu opens at the release position. Bypassing the canvas avoids its
156
+ // own onContextMenu handler, which preventDefaults non-synthesized events.
157
+ const canvas = editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas')
158
+ const trigger = canvas?.parentElement ?? e.currentTarget
159
+ editor.timers.requestAnimationFrame(() => {
160
+ trigger.dispatchEvent(
161
+ new PointerEvent('contextmenu', {
162
+ bubbles: true,
163
+ clientX: e.clientX,
164
+ clientY: e.clientY,
165
+ button: 2,
166
+ buttons: 0,
167
+ pointerId: e.pointerId,
168
+ pointerType: e.pointerType,
169
+ isPrimary: e.isPrimary,
170
+ })
171
+ )
172
+ })
173
+ }
174
+
175
+ releasePointerCapture(e.currentTarget, e)
99
176
  setIsPointing(false)
100
- // Reset the pointer state
101
177
  rPointerState.current = {
102
178
  isDown: false,
103
179
  isDragging: false,
180
+ button: 0,
104
181
  start: new Vec(e.clientX, e.clientY),
105
182
  }
106
- rDidAPointerDownAndDragWhileMenuWasOpen.current = false
107
183
  },
108
- [canvasEvents]
184
+ [editor]
109
185
  )
110
186
 
111
187
  return (
@@ -117,6 +193,10 @@ export function MenuClickCapture() {
117
193
  onPointerDown={handlePointerDown}
118
194
  onPointerMove={handlePointerMove}
119
195
  onPointerUp={handlePointerUp}
196
+ onContextMenu={(e) => {
197
+ e.preventDefault()
198
+ e.stopPropagation()
199
+ }}
120
200
  />
121
201
  )
122
202
  )