@tldraw/editor 4.6.0-next.0eb36d65eec3 → 4.6.0-next.1a05e8ec7833

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 (300) hide show
  1. package/dist-cjs/index.d.ts +816 -112
  2. package/dist-cjs/index.js +22 -6
  3. package/dist-cjs/index.js.map +3 -3
  4. package/dist-cjs/lib/TldrawEditor.js +59 -14
  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/{createTLUser.js → createTLCurrentUser.js} +9 -9
  19. package/dist-cjs/lib/config/createTLCurrentUser.js.map +7 -0
  20. package/dist-cjs/lib/config/createTLStore.js +30 -0
  21. package/dist-cjs/lib/config/createTLStore.js.map +2 -2
  22. package/dist-cjs/lib/config/defaultAssets.js +36 -0
  23. package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
  24. package/dist-cjs/lib/editor/Editor.js +389 -13
  25. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  26. package/dist-cjs/lib/editor/assets/AssetUtil.js +67 -0
  27. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
  28. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  29. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  30. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -0
  31. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
  32. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -0
  33. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
  34. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
  35. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
  36. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
  37. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  38. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
  39. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
  40. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +12 -0
  41. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  42. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js +80 -0
  43. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js.map +7 -0
  44. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +466 -0
  45. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +7 -0
  46. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js +17 -0
  47. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js.map +7 -0
  48. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
  49. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
  50. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +1 -0
  51. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
  52. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
  53. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
  54. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
  55. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  56. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
  57. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
  58. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
  59. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
  60. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +107 -0
  61. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +7 -0
  62. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +586 -0
  63. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
  64. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
  65. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  66. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +8 -4
  67. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  68. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +76 -0
  69. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  70. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +32 -2
  71. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  72. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
  73. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  74. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
  75. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  76. package/dist-cjs/lib/editor/tools/StateNode.js +15 -17
  77. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  78. package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
  79. package/dist-cjs/lib/editor/types/clipboard-types.js.map +1 -1
  80. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  81. package/dist-cjs/lib/exports/ExportDelay.js +1 -0
  82. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  83. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
  84. package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
  85. package/dist-cjs/lib/exports/getSvgJsx.js +14 -8
  86. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  87. package/dist-cjs/lib/globals/environment.js +18 -1
  88. package/dist-cjs/lib/globals/environment.js.map +2 -2
  89. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  90. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  91. package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
  92. package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
  93. package/dist-cjs/lib/hooks/useCursor.js +3 -7
  94. package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
  95. package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
  96. package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
  97. package/dist-cjs/lib/hooks/useGestureEvents.js +171 -127
  98. package/dist-cjs/lib/hooks/useGestureEvents.js.map +3 -3
  99. package/dist-cjs/lib/options.js +2 -0
  100. package/dist-cjs/lib/options.js.map +2 -2
  101. package/dist-cjs/lib/primitives/Vec.js +3 -0
  102. package/dist-cjs/lib/primitives/Vec.js.map +1 -1
  103. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
  104. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
  105. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
  106. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
  107. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
  108. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
  109. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
  110. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
  111. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  112. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  113. package/dist-cjs/lib/utils/reparenting.js +2 -1
  114. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  115. package/dist-cjs/lib/utils/richText.js.map +2 -2
  116. package/dist-cjs/lib/utils/runtime.js +2 -1
  117. package/dist-cjs/lib/utils/runtime.js.map +2 -2
  118. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +2 -0
  119. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +1 -1
  120. package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
  121. package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
  122. package/dist-cjs/version.js +3 -3
  123. package/dist-cjs/version.js.map +1 -1
  124. package/dist-esm/index.d.mts +816 -112
  125. package/dist-esm/index.mjs +27 -9
  126. package/dist-esm/index.mjs.map +2 -2
  127. package/dist-esm/lib/TldrawEditor.mjs +62 -14
  128. package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
  129. package/dist-esm/lib/components/LiveCollaborators.mjs +1 -0
  130. package/dist-esm/lib/components/LiveCollaborators.mjs.map +2 -2
  131. package/dist-esm/lib/components/MenuClickCapture.mjs +100 -39
  132. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  133. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +10 -3
  134. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +3 -3
  135. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -2
  136. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  137. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -1
  138. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  139. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +1 -0
  140. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +2 -2
  141. package/dist-esm/lib/config/{createTLUser.mjs → createTLCurrentUser.mjs} +6 -6
  142. package/dist-esm/lib/config/createTLCurrentUser.mjs.map +7 -0
  143. package/dist-esm/lib/config/createTLStore.mjs +36 -1
  144. package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
  145. package/dist-esm/lib/config/defaultAssets.mjs +16 -0
  146. package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
  147. package/dist-esm/lib/editor/Editor.mjs +391 -13
  148. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  149. package/dist-esm/lib/editor/assets/AssetUtil.mjs +47 -0
  150. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
  151. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  152. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  153. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -0
  154. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
  155. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -0
  156. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
  157. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
  158. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  159. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  160. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  161. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  162. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  163. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +12 -0
  164. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  165. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
  166. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
  167. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
  168. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
  169. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
  170. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
  171. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
  172. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
  173. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +1 -0
  174. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +1 -1
  175. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +1 -0
  176. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +1 -1
  177. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +2 -1
  178. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  179. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +1 -0
  180. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +1 -1
  181. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +1 -0
  182. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +1 -1
  183. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +89 -0
  184. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
  185. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +568 -0
  186. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
  187. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -0
  188. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  189. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +8 -4
  190. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  191. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +56 -0
  192. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  193. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +32 -2
  194. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  195. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
  196. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  197. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
  198. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  199. package/dist-esm/lib/editor/tools/StateNode.mjs +15 -17
  200. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  201. package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
  202. package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
  203. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  204. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
  205. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
  206. package/dist-esm/lib/exports/getSvgJsx.mjs +14 -11
  207. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  208. package/dist-esm/lib/globals/environment.mjs +18 -1
  209. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  210. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  211. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  212. package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
  213. package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
  214. package/dist-esm/lib/hooks/useCursor.mjs +3 -7
  215. package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
  216. package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
  217. package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
  218. package/dist-esm/lib/hooks/useGestureEvents.mjs +171 -127
  219. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +3 -3
  220. package/dist-esm/lib/options.mjs +2 -0
  221. package/dist-esm/lib/options.mjs.map +2 -2
  222. package/dist-esm/lib/primitives/Vec.mjs +3 -0
  223. package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
  224. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
  225. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
  226. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
  227. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
  228. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
  229. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
  230. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
  231. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
  232. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  233. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  234. package/dist-esm/lib/utils/reparenting.mjs +2 -1
  235. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  236. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  237. package/dist-esm/lib/utils/runtime.mjs +2 -1
  238. package/dist-esm/lib/utils/runtime.mjs.map +2 -2
  239. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +2 -0
  240. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +1 -1
  241. package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
  242. package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
  243. package/dist-esm/version.mjs +3 -3
  244. package/dist-esm/version.mjs.map +1 -1
  245. package/editor.css +13 -37
  246. package/package.json +8 -9
  247. package/src/index.ts +30 -7
  248. package/src/lib/TldrawEditor.tsx +98 -19
  249. package/src/lib/components/LiveCollaborators.tsx +8 -2
  250. package/src/lib/components/MenuClickCapture.tsx +129 -49
  251. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +14 -3
  252. package/src/lib/components/default-components/DefaultCanvas.tsx +6 -2
  253. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +2 -2
  254. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +2 -0
  255. package/src/lib/config/{createTLUser.ts → createTLCurrentUser.ts} +6 -6
  256. package/src/lib/config/createTLStore.ts +57 -2
  257. package/src/lib/config/defaultAssets.ts +19 -0
  258. package/src/lib/editor/Editor.ts +526 -42
  259. package/src/lib/editor/assets/AssetUtil.ts +85 -0
  260. package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
  261. package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
  262. package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
  263. package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
  264. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
  265. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
  266. package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
  267. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  268. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  269. package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
  270. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +605 -0
  271. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +25 -31
  272. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +7 -5
  273. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +121 -0
  274. package/src/lib/editor/shapes/ShapeUtil.ts +50 -3
  275. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
  276. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
  277. package/src/lib/editor/tools/StateNode.ts +16 -18
  278. package/src/lib/editor/types/SvgExportContext.tsx +5 -0
  279. package/src/lib/editor/types/clipboard-types.ts +2 -1
  280. package/src/lib/editor/types/external-content.ts +1 -0
  281. package/src/lib/exports/getSvgJsx.tsx +23 -16
  282. package/src/lib/globals/environment.ts +18 -0
  283. package/src/lib/hooks/useCanvasEvents.ts +40 -3
  284. package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
  285. package/src/lib/hooks/useCursor.ts +3 -7
  286. package/src/lib/hooks/useDarkMode.ts +4 -4
  287. package/src/lib/hooks/useGestureEvents.ts +240 -168
  288. package/src/lib/options.ts +14 -0
  289. package/src/lib/primitives/Box.test.ts +30 -0
  290. package/src/lib/primitives/geometry/Geometry2d.test.ts +21 -0
  291. package/src/lib/utils/reparenting.ts +6 -2
  292. package/src/lib/utils/richText.ts +1 -1
  293. package/src/lib/utils/runtime.ts +3 -1
  294. package/src/lib/utils/sync/hardReset.ts +0 -8
  295. package/src/version.ts +3 -3
  296. package/dist-cjs/lib/config/createTLUser.js.map +0 -7
  297. package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
  298. package/dist-esm/lib/config/createTLUser.mjs.map +0 -7
  299. package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
  300. package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
@@ -1,11 +1,6 @@
1
1
  import { useAtom, useValue } from '@tldraw/state-react'
2
- import {
3
- TLFrameShape,
4
- TLShape,
5
- TLShapeId,
6
- getColorValue,
7
- getDefaultColorTheme,
8
- } from '@tldraw/tlschema'
2
+ import { TLFrameShape, TLShape, TLShapeId } from '@tldraw/tlschema'
3
+ import { TLFontFace } from '@tldraw/tlschema'
9
4
  import { hasOwnProperty, promiseWithResolve, uniqueId } from '@tldraw/utils'
10
5
  import {
11
6
  ComponentType,
@@ -21,7 +16,7 @@ import { flushSync } from 'react-dom'
21
16
  import { ErrorBoundary } from '../components/ErrorBoundary'
22
17
  import { InnerShape, InnerShapeBackground } from '../components/Shape'
23
18
  import type { Editor, TLRenderingShape } from '../editor/Editor'
24
- import { TLFontFace } from '../editor/managers/FontManager/FontManager'
19
+ import { getColorValue } from '../editor/managers/ThemeManager/defaultThemes'
25
20
  import { ShapeUtil } from '../editor/shapes/ShapeUtil'
26
21
  import { TLImageExportOptions } from '../editor/types/misc-types'
27
22
  import {
@@ -54,7 +49,9 @@ export function getSvgJsx(editor: Editor, ids: TLShapeId[], opts: TLImageExportO
54
49
  const renderPadding =
55
50
  typeof opts.padding === 'number' ? opts.padding : editor.options.defaultSvgPadding
56
51
 
57
- const isDarkMode = opts.darkMode ?? editor.user.getIsDarkMode()
52
+ const colorMode: 'light' | 'dark' =
53
+ opts.darkMode !== undefined ? (opts.darkMode ? 'dark' : 'light') : editor.getColorMode()
54
+ const isDarkMode = colorMode === 'dark'
58
55
 
59
56
  // ---Figure out which shapes we need to include
60
57
  const shapeIdsToInclude = editor.getShapeAndDescendantIds(ids)
@@ -63,8 +60,9 @@ export function getSvgJsx(editor: Editor, ids: TLShapeId[], opts: TLImageExportO
63
60
  .filter(({ id }) => shapeIdsToInclude.has(id))
64
61
 
65
62
  // --- Common bounding box of all shapes
63
+ const singleFrameShape = ids.length === 1 ? editor.getShape(ids[0]) : null
66
64
  const singleFrameShapeId =
67
- ids.length === 1 && editor.isShapeOfType(editor.getShape(ids[0])!, 'frame') ? ids[0] : null
65
+ singleFrameShape && editor.isShapeFrameLike(singleFrameShape) ? ids[0] : null
68
66
 
69
67
  let bbox: null | Box = null
70
68
  let paddingWasApplied = false
@@ -116,6 +114,7 @@ export function getSvgJsx(editor: Editor, ids: TLShapeId[], opts: TLImageExportO
116
114
  background={background}
117
115
  singleFrameShapeId={singleFrameShapeId}
118
116
  isDarkMode={isDarkMode}
117
+ colorMode={colorMode}
119
118
  renderingShapes={renderingShapes}
120
119
  onMount={initialEffectPromise.resolve}
121
120
  waitUntil={exportDelay.waitUntil}
@@ -206,6 +205,7 @@ function SvgExport({
206
205
  background,
207
206
  singleFrameShapeId,
208
207
  isDarkMode,
208
+ colorMode,
209
209
  renderingShapes,
210
210
  onMount,
211
211
  waitUntil,
@@ -218,12 +218,13 @@ function SvgExport({
218
218
  background: boolean
219
219
  singleFrameShapeId: TLShapeId | null
220
220
  isDarkMode: boolean
221
+ colorMode: 'light' | 'dark'
221
222
  renderingShapes: TLRenderingShape[]
222
223
  onMount(): void
223
224
  waitUntil(promise: Promise<void>): void
224
225
  }) {
225
226
  const masksId = useUniqueSafeId()
226
- const theme = getDefaultColorTheme({ isDarkMode })
227
+ const theme = editor.getCurrentTheme()
227
228
 
228
229
  const stateAtom = useAtom<{
229
230
  defsById: Record<
@@ -257,6 +258,7 @@ function SvgExport({
257
258
  const exportContext = useMemo(
258
259
  (): SvgExportContext => ({
259
260
  isDarkMode,
261
+ colorMode,
260
262
  waitUntil,
261
263
  addExportDef,
262
264
  scale,
@@ -272,7 +274,7 @@ function SvgExport({
272
274
  })
273
275
  },
274
276
  }),
275
- [isDarkMode, waitUntil, addExportDef, scale, pixelRatio, editor]
277
+ [isDarkMode, colorMode, waitUntil, addExportDef, scale, pixelRatio, editor]
276
278
  )
277
279
 
278
280
  const didRenderRef = useRef(false)
@@ -443,17 +445,22 @@ function SvgExport({
443
445
  onMount()
444
446
  }, [onMount, shapeElements])
445
447
 
446
- let backgroundColor = background ? theme.background : 'transparent'
448
+ const colors = theme.colors[colorMode]
449
+ let backgroundColor = background ? colors.background : 'transparent'
447
450
 
448
451
  if (singleFrameShapeId && background) {
449
452
  const frameShapeUtil = editor.getShapeUtil('frame') as any as
450
453
  | undefined
451
- | { options: { showColors: boolean } }
454
+ | {
455
+ options: {
456
+ showColors: boolean
457
+ }
458
+ }
452
459
  if (frameShapeUtil?.options.showColors) {
453
460
  const shape = editor.getShape(singleFrameShapeId)! as TLFrameShape
454
- backgroundColor = getColorValue(theme, shape.props.color, 'frameFill')
461
+ backgroundColor = getColorValue(colors, shape.props.color, 'frameFill')
455
462
  } else {
456
- backgroundColor = theme.solid
463
+ backgroundColor = colors.solid
457
464
  }
458
465
  }
459
466
 
@@ -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
  }