@tldraw/editor 4.6.0-next.30b99cd52fc8 → 4.6.0-next.35cf541abcf9

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 (284) hide show
  1. package/dist-cjs/index.d.ts +758 -96
  2. package/dist-cjs/index.js +18 -3
  3. package/dist-cjs/index.js.map +3 -3
  4. package/dist-cjs/lib/TldrawEditor.js +55 -12
  5. package/dist-cjs/lib/TldrawEditor.js.map +3 -3
  6. package/dist-cjs/lib/components/LiveCollaborators.js +1 -0
  7. package/dist-cjs/lib/components/LiveCollaborators.js.map +2 -2
  8. package/dist-cjs/lib/components/MenuClickCapture.js +99 -38
  9. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  10. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +10 -3
  11. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +3 -3
  12. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +5 -2
  13. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +1 -1
  15. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  16. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +1 -0
  17. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +2 -2
  18. package/dist-cjs/lib/config/createTLStore.js +7 -0
  19. package/dist-cjs/lib/config/createTLStore.js.map +2 -2
  20. package/dist-cjs/lib/config/defaultAssets.js +36 -0
  21. package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
  22. package/dist-cjs/lib/editor/Editor.js +279 -10
  23. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  24. package/dist-cjs/lib/editor/assets/AssetUtil.js +67 -0
  25. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
  26. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  27. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  28. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -0
  29. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
  30. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -0
  31. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
  32. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
  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 +12 -0
  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/editor/managers/PerformanceManager/perf-types.js +17 -0
  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 +1 -0
  49. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
  50. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
  51. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
  52. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
  53. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  54. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
  55. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
  56. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
  57. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
  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 +586 -0
  61. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
  62. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
  63. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  64. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +8 -4
  65. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  66. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +76 -0
  67. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  68. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +22 -2
  69. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  70. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
  71. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  72. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
  73. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  74. package/dist-cjs/lib/editor/tools/StateNode.js +15 -17
  75. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  76. package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
  77. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  78. package/dist-cjs/lib/exports/ExportDelay.js +1 -0
  79. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  80. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
  81. package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
  82. package/dist-cjs/lib/exports/getSvgJsx.js +14 -8
  83. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  84. package/dist-cjs/lib/globals/environment.js +18 -1
  85. package/dist-cjs/lib/globals/environment.js.map +2 -2
  86. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  87. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  88. package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
  89. package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
  90. package/dist-cjs/lib/hooks/useCursor.js +3 -7
  91. package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
  92. package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
  93. package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
  94. package/dist-cjs/lib/options.js +2 -0
  95. package/dist-cjs/lib/options.js.map +2 -2
  96. package/dist-cjs/lib/primitives/Vec.js +3 -0
  97. package/dist-cjs/lib/primitives/Vec.js.map +1 -1
  98. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
  99. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
  100. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
  101. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
  102. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
  103. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
  104. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
  105. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
  106. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  107. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  108. package/dist-cjs/lib/utils/reparenting.js +2 -1
  109. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  110. package/dist-cjs/lib/utils/richText.js.map +2 -2
  111. package/dist-cjs/lib/utils/runtime.js +2 -1
  112. package/dist-cjs/lib/utils/runtime.js.map +2 -2
  113. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +2 -0
  114. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +1 -1
  115. package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
  116. package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
  117. package/dist-cjs/version.js +3 -3
  118. package/dist-cjs/version.js.map +1 -1
  119. package/dist-esm/index.d.mts +758 -96
  120. package/dist-esm/index.mjs +19 -6
  121. package/dist-esm/index.mjs.map +2 -2
  122. package/dist-esm/lib/TldrawEditor.mjs +58 -12
  123. package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
  124. package/dist-esm/lib/components/LiveCollaborators.mjs +1 -0
  125. package/dist-esm/lib/components/LiveCollaborators.mjs.map +2 -2
  126. package/dist-esm/lib/components/MenuClickCapture.mjs +100 -39
  127. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  128. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +10 -3
  129. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +3 -3
  130. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -2
  131. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  132. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -1
  133. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  134. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +1 -0
  135. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +2 -2
  136. package/dist-esm/lib/config/createTLStore.mjs +10 -1
  137. package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
  138. package/dist-esm/lib/config/defaultAssets.mjs +16 -0
  139. package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
  140. package/dist-esm/lib/editor/Editor.mjs +279 -10
  141. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  142. package/dist-esm/lib/editor/assets/AssetUtil.mjs +47 -0
  143. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
  144. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  145. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  146. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -0
  147. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
  148. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -0
  149. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
  150. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
  151. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  152. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  153. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  154. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  155. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  156. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +12 -0
  157. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  158. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
  159. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
  160. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
  161. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
  162. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
  163. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
  164. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
  165. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
  166. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +1 -0
  167. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +1 -1
  168. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +1 -0
  169. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +1 -1
  170. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +2 -1
  171. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  172. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +1 -0
  173. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +1 -1
  174. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +1 -0
  175. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +1 -1
  176. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +89 -0
  177. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
  178. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +568 -0
  179. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
  180. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -0
  181. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  182. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +8 -4
  183. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  184. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +56 -0
  185. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  186. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +22 -2
  187. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  188. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
  189. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  190. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
  191. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  192. package/dist-esm/lib/editor/tools/StateNode.mjs +15 -17
  193. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  194. package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
  195. package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
  196. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  197. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
  198. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
  199. package/dist-esm/lib/exports/getSvgJsx.mjs +14 -11
  200. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  201. package/dist-esm/lib/globals/environment.mjs +18 -1
  202. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  203. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  204. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  205. package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
  206. package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
  207. package/dist-esm/lib/hooks/useCursor.mjs +3 -7
  208. package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
  209. package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
  210. package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
  211. package/dist-esm/lib/options.mjs +2 -0
  212. package/dist-esm/lib/options.mjs.map +2 -2
  213. package/dist-esm/lib/primitives/Vec.mjs +3 -0
  214. package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
  215. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
  216. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
  217. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
  218. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
  219. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
  220. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
  221. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
  222. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
  223. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  224. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  225. package/dist-esm/lib/utils/reparenting.mjs +2 -1
  226. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  227. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  228. package/dist-esm/lib/utils/runtime.mjs +2 -1
  229. package/dist-esm/lib/utils/runtime.mjs.map +2 -2
  230. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +2 -0
  231. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +1 -1
  232. package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
  233. package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
  234. package/dist-esm/version.mjs +3 -3
  235. package/dist-esm/version.mjs.map +1 -1
  236. package/editor.css +0 -37
  237. package/package.json +7 -7
  238. package/src/index.ts +24 -6
  239. package/src/lib/TldrawEditor.tsx +90 -13
  240. package/src/lib/components/LiveCollaborators.tsx +8 -2
  241. package/src/lib/components/MenuClickCapture.tsx +129 -49
  242. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +14 -3
  243. package/src/lib/components/default-components/DefaultCanvas.tsx +6 -2
  244. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +2 -2
  245. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +2 -0
  246. package/src/lib/config/createTLStore.ts +22 -1
  247. package/src/lib/config/defaultAssets.ts +19 -0
  248. package/src/lib/editor/Editor.ts +387 -40
  249. package/src/lib/editor/assets/AssetUtil.ts +85 -0
  250. package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
  251. package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
  252. package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
  253. package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
  254. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
  255. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
  256. package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
  257. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  258. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  259. package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
  260. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +605 -0
  261. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +23 -29
  262. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +5 -3
  263. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +121 -0
  264. package/src/lib/editor/shapes/ShapeUtil.ts +39 -3
  265. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
  266. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
  267. package/src/lib/editor/tools/StateNode.ts +16 -18
  268. package/src/lib/editor/types/SvgExportContext.tsx +5 -0
  269. package/src/lib/editor/types/external-content.ts +1 -0
  270. package/src/lib/exports/getSvgJsx.tsx +23 -16
  271. package/src/lib/globals/environment.ts +18 -0
  272. package/src/lib/hooks/useCanvasEvents.ts +40 -3
  273. package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
  274. package/src/lib/hooks/useCursor.ts +3 -7
  275. package/src/lib/hooks/useDarkMode.ts +4 -4
  276. package/src/lib/options.ts +14 -0
  277. package/src/lib/utils/reparenting.ts +6 -2
  278. package/src/lib/utils/richText.ts +1 -1
  279. package/src/lib/utils/runtime.ts +3 -1
  280. package/src/lib/utils/sync/hardReset.ts +0 -8
  281. package/src/version.ts +3 -3
  282. package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
  283. package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
  284. package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
@@ -46,8 +46,26 @@ const tlenvReactive = atom('tlenvReactive', {
46
46
  // on touch-screen laptops, which will become "coarse" if the user touches the screen.
47
47
  // See https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/pointer#coarse
48
48
  isCoarsePointer: false,
49
+ // Whether the user's display supports P3 color space. This is dynamic because a window can
50
+ // move between displays with different color gamut support.
51
+ supportsP3ColorSpace: false,
49
52
  })
50
53
 
54
+ if (typeof window !== 'undefined') {
55
+ const canRenderP3 = typeof CSS !== 'undefined' && CSS.supports('color', 'color(display-p3 1 1 1)')
56
+ if (canRenderP3) {
57
+ const p3mql = window.matchMedia('(color-gamut: p3)')
58
+ const updateSupportsP3 = () => {
59
+ const supportsP3 = p3mql.matches
60
+ if (supportsP3 !== tlenvReactive.__unsafe__getWithoutCapture().supportsP3ColorSpace) {
61
+ tlenvReactive.update((prev) => ({ ...prev, supportsP3ColorSpace: supportsP3 }))
62
+ }
63
+ }
64
+ updateSupportsP3()
65
+ p3mql.addEventListener('change', updateSupportsP3)
66
+ }
67
+ }
68
+
51
69
  if (typeof window !== 'undefined' && !isForcedFinePointer) {
52
70
  const mql = getGlobalWindow().matchMedia && getGlobalWindow().matchMedia('(any-pointer: coarse)')
53
71
 
@@ -1,6 +1,5 @@
1
1
  import { useValue } from '@tldraw/state-react'
2
2
  import React, { useEffect, useMemo } from 'react'
3
- import { RIGHT_MOUSE_BUTTON } from '../constants'
4
3
  import { tlenv } from '../globals/environment'
5
4
  import {
6
5
  elementShouldCaptureKeys,
@@ -21,7 +20,9 @@ export function useCanvasEvents() {
21
20
  function onPointerDown(e: React.PointerEvent) {
22
21
  if (editor.wasEventAlreadyHandled(e)) return
23
22
 
24
- if (e.button === RIGHT_MOUSE_BUTTON) {
23
+ // With right-click panning disabled, fire right_click on press and let the
24
+ // native contextmenu through so the menu opens at the pointer-down location.
25
+ if (e.button === 2 && !editor.options.rightClickPanning) {
25
26
  editor.dispatch({
26
27
  type: 'pointer',
27
28
  target: 'canvas',
@@ -31,7 +32,7 @@ export function useCanvasEvents() {
31
32
  return
32
33
  }
33
34
 
34
- if (e.button !== 0 && e.button !== 1 && e.button !== 5) return
35
+ if (e.button !== 0 && e.button !== 1 && e.button !== 2 && e.button !== 5) return
35
36
 
36
37
  setPointerCapture(e.currentTarget, e)
37
38
 
@@ -47,6 +48,11 @@ export function useCanvasEvents() {
47
48
  if (editor.wasEventAlreadyHandled(e)) return
48
49
  if (e.button !== 0 && e.button !== 1 && e.button !== 2 && e.button !== 5) return
49
50
 
51
+ const rightClickPanning = editor.options.rightClickPanning
52
+ // Check before dispatch (which resets isPanning)
53
+ const wasRightClickPanning =
54
+ rightClickPanning && e.button === 2 && editor.inputs.getIsPanning()
55
+
50
56
  releasePointerCapture(e.currentTarget, e)
51
57
 
52
58
  editor.dispatch({
@@ -55,6 +61,21 @@ export function useCanvasEvents() {
55
61
  name: 'pointer_up',
56
62
  ...getPointerInfo(editor, e),
57
63
  })
64
+
65
+ // Static right-click: fire contextmenu at the pointer-up location
66
+ if (rightClickPanning && e.button === 2 && !wasRightClickPanning) {
67
+ const contextMenuEvent = new PointerEvent('contextmenu', {
68
+ bubbles: true,
69
+ clientX: e.clientX,
70
+ clientY: e.clientY,
71
+ button: 2,
72
+ buttons: 0,
73
+ pointerId: e.pointerId,
74
+ pointerType: e.pointerType,
75
+ isPrimary: e.isPrimary,
76
+ })
77
+ e.currentTarget.dispatchEvent(contextMenuEvent)
78
+ }
58
79
  }
59
80
 
60
81
  function onPointerEnter(e: React.PointerEvent) {
@@ -143,6 +164,21 @@ export function useCanvasEvents() {
143
164
  e.stopPropagation()
144
165
  }
145
166
 
167
+ function onContextMenu(e: React.MouseEvent) {
168
+ // With right-click panning disabled, let the native contextmenu through so the
169
+ // menu opens on press.
170
+ if (!editor.options.rightClickPanning) return
171
+ // Synthetic events — our own dispatch from onPointerUp, or tests using
172
+ // fireEvent.contextMenu — pass through so Radix can open the menu. The real
173
+ // browser contextmenu is always suppressed: right-click behavior has
174
+ // already been decided by our pointer handling (either we dispatched a
175
+ // synthetic to open the menu at the release position, or we panned and
176
+ // don't want a menu at all).
177
+ if (e.nativeEvent.isTrusted) {
178
+ preventDefault(e)
179
+ }
180
+ }
181
+
146
182
  return {
147
183
  onPointerDown,
148
184
  onPointerUp,
@@ -153,6 +189,7 @@ export function useCanvasEvents() {
153
189
  onTouchStart,
154
190
  onTouchEnd,
155
191
  onClick,
192
+ onContextMenu,
156
193
  }
157
194
  },
158
195
  [editor]
@@ -3,11 +3,15 @@ import { useSvgExportContext } from '../editor/types/SvgExportContext'
3
3
  import { useEditor } from './useEditor'
4
4
 
5
5
  /** @public */
6
- export function useIsDarkMode() {
6
+ export function useColorMode(): 'light' | 'dark' {
7
7
  const editor = useEditor()
8
8
  const exportContext = useSvgExportContext()
9
- return useValue('isDarkMode', () => exportContext?.isDarkMode ?? editor.user.getIsDarkMode(), [
10
- exportContext,
11
- editor,
12
- ])
9
+ return useValue(
10
+ 'colorMode',
11
+ () => {
12
+ if (exportContext) return exportContext.colorMode
13
+ return editor.getColorMode()
14
+ },
15
+ [exportContext, editor]
16
+ )
13
17
  }
@@ -3,7 +3,6 @@ import { TLCursorType } from '@tldraw/tlschema'
3
3
  import { PI, radiansToDegrees } from '../primitives/utils'
4
4
  import { useContainer } from './useContainer'
5
5
  import { useEditor } from './useEditor'
6
- import { useIsDarkMode } from './useIsDarkMode'
7
6
 
8
7
  const CORNER_SVG = `<path d='m19.7432 17.0869-4.072 4.068 2.829 2.828-8.473-.013-.013-8.47 2.841 2.842 4.075-4.068 1.414-1.415-2.844-2.842h8.486v8.484l-2.83-2.827z' fill='%23fff'/><path d='m18.6826 16.7334-4.427 4.424 1.828 1.828-5.056-.016-.014-5.054 1.842 1.841 4.428-4.422 2.474-2.475-1.844-1.843h5.073v5.071l-1.83-1.828z' fill='%23000'/>`
9
8
  const EDGE_SVG = `<path d='m9 17.9907v.005l5.997 5.996.001-3.999h1.999 2.02v4l5.98-6.001-5.98-5.999.001 4.019-2.021.002h-2l.001-4.022zm1.411.003 3.587-3.588-.001 2.587h3.5 2.521v-2.585l3.565 3.586-3.564 3.585-.001-2.585h-2.521l-3.499-.001-.001 2.586z' fill='%23fff'/><path d='m17.4971 18.9932h2.521v2.586l3.565-3.586-3.565-3.585v2.605h-2.521-3.5v-2.607l-3.586 3.587 3.586 3.586v-2.587z' fill='%23000'/>`
@@ -67,7 +66,6 @@ export function getCursor(cursor: TLCursorType, rotation = 0, color = 'black') {
67
66
  export function useCursor() {
68
67
  const editor = useEditor()
69
68
  const container = useContainer()
70
- const isDarkMode = useIsDarkMode()
71
69
 
72
70
  useQuickReactor(
73
71
  'useCursor',
@@ -79,11 +77,9 @@ export function useCursor() {
79
77
  return
80
78
  }
81
79
 
82
- container.style.setProperty(
83
- '--tl-cursor',
84
- getCursor(type, rotation, isDarkMode ? 'white' : 'black')
85
- )
80
+ const { cursor } = editor.getCurrentTheme().colors[editor.getColorMode()]
81
+ container.style.setProperty('--tl-cursor', getCursor(type, rotation, cursor))
86
82
  },
87
- [editor, container, isDarkMode]
83
+ [editor, container]
88
84
  )
89
85
  }
@@ -1,18 +1,18 @@
1
1
  import { useValue } from '@tldraw/state-react'
2
2
  import React from 'react'
3
3
  import { debugFlags } from '../utils/debug-flags'
4
+ import { useColorMode } from './useColorMode'
4
5
  import { useContainer } from './useContainer'
5
6
  import { useEditor } from './useEditor'
6
- import { useIsDarkMode } from './useIsDarkMode'
7
7
 
8
8
  export function useDarkMode() {
9
9
  const editor = useEditor()
10
10
  const container = useContainer()
11
- const isDarkMode = useIsDarkMode()
11
+ const colorMode = useColorMode()
12
12
  const forceSrgb = useValue(debugFlags.forceSrgb)
13
13
 
14
14
  React.useEffect(() => {
15
- if (isDarkMode) {
15
+ if (colorMode === 'dark') {
16
16
  container.setAttribute('data-color-mode', 'dark')
17
17
  container.classList.remove('tl-theme__light')
18
18
  container.classList.add('tl-theme__dark')
@@ -26,5 +26,5 @@ export function useDarkMode() {
26
26
  } else {
27
27
  container.classList.remove('tl-theme__force-sRGB')
28
28
  }
29
- }, [editor, container, forceSrgb, isDarkMode])
29
+ }, [editor, container, forceSrgb, colorMode])
30
30
  }
@@ -154,6 +154,12 @@ export interface TldrawOptions {
154
154
  * When false, the spacebar will not pan the camera.
155
155
  */
156
156
  readonly spacebarPanning: boolean
157
+ /**
158
+ * Whether to allow right-click + drag to pan the camera. When true, right-click + drag pans the
159
+ * camera and a static right-click opens the context menu at the release position. When false,
160
+ * right-click opens the context menu on press (no drag-to-pan).
161
+ */
162
+ readonly rightClickPanning: boolean
157
163
  /**
158
164
  * The default padding (in pixels) used when zooming to fit content in the viewport.
159
165
  * This affects methods like `zoomToFit()`, `zoomToSelection()`, and `zoomToBounds()`.
@@ -196,6 +202,12 @@ export interface TldrawOptions {
196
202
  * viewport's page dimensions regardless of overview zoom changes.
197
203
  */
198
204
  readonly quickZoomPreservesScreenBounds: boolean
205
+ /**
206
+ * Whether to use 2D canvas rendering for shape indicators. When true (default),
207
+ * shapes that support it will render indicators on a 2D canvas for better
208
+ * performance. When false, all indicators use legacy SVG rendering.
209
+ */
210
+ readonly useCanvasIndicators: boolean
199
211
  /**
200
212
  * Called before content is written to the clipboard during a copy or cut operation.
201
213
  * Receives the serialized content (shapes, bindings, assets) and can filter or transform
@@ -326,11 +338,13 @@ export const defaultTldrawOptions = {
326
338
  debouncedZoom: true,
327
339
  debouncedZoomThreshold: 500,
328
340
  spacebarPanning: true,
341
+ rightClickPanning: true,
329
342
  zoomToFitPadding: 128,
330
343
  snapThreshold: 8,
331
344
  camera: DEFAULT_CAMERA_OPTIONS,
332
345
  text: {},
333
346
  deepLinks: undefined,
347
+ useCanvasIndicators: true,
334
348
  quickZoomPreservesScreenBounds: true,
335
349
  onBeforeCopyToClipboard: undefined,
336
350
  onBeforePasteFromClipboard: undefined,
@@ -103,9 +103,13 @@ export function kickoutOccludedShapes(
103
103
  if (oldParentIndex > -1) {
104
104
  // If the old parent is a direct child of the new parent, then we'll add them above the old parent but below the next sibling.
105
105
  const siblingsIndexAbove = oldParentSiblingIds[oldParentIndex + 1]
106
- const indexKeyAbove = siblingsIndexAbove
106
+ const siblingAboveIndex = siblingsIndexAbove
107
107
  ? editor.getShape(siblingsIndexAbove)!.index
108
- : getIndexAbove(prevParent.index)
108
+ : undefined
109
+ const indexKeyAbove =
110
+ siblingAboveIndex && siblingAboveIndex > prevParent.index
111
+ ? siblingAboveIndex
112
+ : getIndexAbove(prevParent.index)
109
113
  insertIndexKey = getIndexBetween(prevParent.index, indexKeyAbove)
110
114
  } else {
111
115
  // If the old parent is not a direct child of the new parent, then we'll add them to the "top" of the new parent's children.
@@ -2,9 +2,9 @@ import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'
2
2
  import { Node, Schema } from '@tiptap/pm/model'
3
3
  import { EditorProviderProps } from '@tiptap/react'
4
4
  import { TLRichText } from '@tldraw/tlschema'
5
+ import { TLFontFace } from '@tldraw/tlschema'
5
6
  import { assert, WeakCache } from '@tldraw/utils'
6
7
  import type { Editor } from '../editor/Editor'
7
- import { TLFontFace } from '../editor/managers/FontManager/FontManager'
8
8
 
9
9
  /**
10
10
  * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.
@@ -1,3 +1,5 @@
1
+ import { hardReset } from './sync/hardReset'
2
+
1
3
  /** @public */
2
4
  export const runtime: {
3
5
  openWindow(url: string, target: string, allowReferrer?: boolean): void
@@ -11,7 +13,7 @@ export const runtime: {
11
13
  window.location.reload()
12
14
  },
13
15
  async hardReset() {
14
- return await (window as any).__tldraw__hardReset?.()
16
+ return await hardReset({ shouldReload: true })
15
17
  },
16
18
  }
17
19
 
@@ -19,11 +19,3 @@ export async function hardReset({ shouldReload = true } = {}) {
19
19
  window.location.reload()
20
20
  }
21
21
  }
22
-
23
- if (typeof window !== 'undefined') {
24
- if (process.env.NODE_ENV === 'development') {
25
- ;(window as any).hardReset = hardReset
26
- }
27
- // window.__tldraw__hardReset is used to inject the logic into the tldraw library
28
- ;(window as any).__tldraw__hardReset = hardReset
29
- }
package/src/version.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '4.6.0-next.30b99cd52fc8'
4
+ export const version = '4.6.0-next.35cf541abcf9'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2026-04-03T13:03:17.058Z',
8
- patch: '2026-04-03T13:03:17.058Z',
7
+ minor: '2026-04-22T15:37:39.418Z',
8
+ patch: '2026-04-22T15:37:39.418Z',
9
9
  }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/useIsDarkMode.ts"],
4
- "sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { useSvgExportContext } from '../editor/types/SvgExportContext'\nimport { useEditor } from './useEditor'\n\n/** @public */\nexport function useIsDarkMode() {\n\tconst editor = useEditor()\n\tconst exportContext = useSvgExportContext()\n\treturn useValue('isDarkMode', () => exportContext?.isDarkMode ?? editor.user.getIsDarkMode(), [\n\t\texportContext,\n\t\teditor,\n\t])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAyB;AACzB,8BAAoC;AACpC,uBAA0B;AAGnB,SAAS,gBAAgB;AAC/B,QAAM,aAAS,4BAAU;AACzB,QAAM,oBAAgB,6CAAoB;AAC1C,aAAO,6BAAS,cAAc,MAAM,eAAe,cAAc,OAAO,KAAK,cAAc,GAAG;AAAA,IAC7F;AAAA,IACA;AAAA,EACD,CAAC;AACF;",
6
- "names": []
7
- }
@@ -1,15 +0,0 @@
1
- import { useValue } from "@tldraw/state-react";
2
- import { useSvgExportContext } from "../editor/types/SvgExportContext.mjs";
3
- import { useEditor } from "./useEditor.mjs";
4
- function useIsDarkMode() {
5
- const editor = useEditor();
6
- const exportContext = useSvgExportContext();
7
- return useValue("isDarkMode", () => exportContext?.isDarkMode ?? editor.user.getIsDarkMode(), [
8
- exportContext,
9
- editor
10
- ]);
11
- }
12
- export {
13
- useIsDarkMode
14
- };
15
- //# sourceMappingURL=useIsDarkMode.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/useIsDarkMode.ts"],
4
- "sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { useSvgExportContext } from '../editor/types/SvgExportContext'\nimport { useEditor } from './useEditor'\n\n/** @public */\nexport function useIsDarkMode() {\n\tconst editor = useEditor()\n\tconst exportContext = useSvgExportContext()\n\treturn useValue('isDarkMode', () => exportContext?.isDarkMode ?? editor.user.getIsDarkMode(), [\n\t\texportContext,\n\t\teditor,\n\t])\n}\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAGnB,SAAS,gBAAgB;AAC/B,QAAM,SAAS,UAAU;AACzB,QAAM,gBAAgB,oBAAoB;AAC1C,SAAO,SAAS,cAAc,MAAM,eAAe,cAAc,OAAO,KAAK,cAAc,GAAG;AAAA,IAC7F;AAAA,IACA;AAAA,EACD,CAAC;AACF;",
6
- "names": []
7
- }