@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
@@ -0,0 +1,85 @@
1
+ import { LegacyMigrations, MigrationSequence } from '@tldraw/store'
2
+ import {
3
+ RecordProps,
4
+ TLAsset,
5
+ TLAssetId,
6
+ TLPropsMigrations,
7
+ TLUnknownAsset,
8
+ } from '@tldraw/tlschema'
9
+ import type { Editor } from '../Editor'
10
+
11
+ /** @public */
12
+ export interface TLAssetUtilConstructor<
13
+ T extends TLAsset = TLAsset,
14
+ U extends AssetUtil<T> = AssetUtil<T>,
15
+ > {
16
+ new (editor: Editor): U
17
+ type: T['type']
18
+ props?: RecordProps<T>
19
+ migrations?: LegacyMigrations | TLPropsMigrations | MigrationSequence
20
+ }
21
+
22
+ /**
23
+ * Abstract base class for defining asset-type-specific behavior.
24
+ *
25
+ * Each asset type (image, video, bookmark, etc.) has a corresponding AssetUtil that handles
26
+ * type-specific operations like determining supported MIME types and creating assets from files.
27
+ *
28
+ * @public
29
+ */
30
+ export abstract class AssetUtil<Asset extends TLAsset = TLAsset> {
31
+ /** Configure this asset util's {@link AssetUtil.options | `options`}. */
32
+ static configure<T extends TLAssetUtilConstructor<any, any>>(
33
+ this: T,
34
+ options: T extends new (...args: any[]) => { options: infer Options } ? Partial<Options> : never
35
+ ): T {
36
+ // @ts-expect-error -- typescript has no idea what's going on here but it's fine
37
+ return class extends this {
38
+ // @ts-expect-error
39
+ options = { ...this.options, ...options }
40
+ }
41
+ }
42
+
43
+ constructor(public editor: Editor) {}
44
+
45
+ /**
46
+ * Options for this asset util. Override this to provide customization options for your asset.
47
+ * Use {@link AssetUtil.configure} to customize existing asset utils.
48
+ */
49
+ options = {}
50
+
51
+ static props?: RecordProps<TLUnknownAsset>
52
+ static migrations?: LegacyMigrations | TLPropsMigrations | MigrationSequence
53
+
54
+ /**
55
+ * The type of the asset util, which should match the asset's type.
56
+ */
57
+ static type: string
58
+
59
+ /**
60
+ * Get the default props for an asset of this type.
61
+ */
62
+ abstract getDefaultProps(): Asset['props']
63
+
64
+ /**
65
+ * Get the MIME types that this asset type supports.
66
+ * Return an empty array if this asset type doesn't support files (e.g. bookmarks).
67
+ */
68
+ getSupportedMimeTypes(): readonly string[] {
69
+ return []
70
+ }
71
+
72
+ /**
73
+ * Check whether this asset type accepts a given MIME type.
74
+ */
75
+ acceptsMimeType(mimeType: string): boolean {
76
+ return this.getSupportedMimeTypes().includes(mimeType)
77
+ }
78
+
79
+ /**
80
+ * Create an asset from a file. Return null if this asset type can't handle the file.
81
+ */
82
+ async getAssetFromFile(_file: File, _assetId: TLAssetId): Promise<Asset | null> {
83
+ return null
84
+ }
85
+ }
@@ -87,7 +87,7 @@ export class ClickManager {
87
87
  *
88
88
  * @public
89
89
  */
90
- // eslint-disable-next-line no-restricted-syntax
90
+ // eslint-disable-next-line tldraw/no-setter-getter
91
91
  get clickState() {
92
92
  return this._clickState
93
93
  }
@@ -0,0 +1,98 @@
1
+ import { EMPTY_ARRAY, atom, computed } from '@tldraw/state'
2
+ import { TLInstancePresence } from '@tldraw/tlschema'
3
+ import { maxBy } from '@tldraw/utils'
4
+ import {
5
+ getCollaboratorStateFromElapsedTime,
6
+ shouldShowCollaborator,
7
+ } from '../../../utils/collaboratorState'
8
+ import type { Editor } from '../../Editor'
9
+
10
+ /**
11
+ * Tracks remote peers and exposes the collaborator-related queries used by the
12
+ * editor and its overlays. Encapsulates the visibility clock that periodically
13
+ * re-evaluates which collaborators should be visible based on activity.
14
+ *
15
+ * Accessed via {@link Editor.collaborators}.
16
+ *
17
+ * @public
18
+ */
19
+ export class CollaboratorsManager {
20
+ constructor(private readonly editor: Editor) {
21
+ // Editor disposes `editor.timers` on its own teardown, so the interval is
22
+ // automatically cleared when the editor is disposed.
23
+ editor.timers.setInterval(() => {
24
+ this._visibilityClock.set(Date.now())
25
+ }, editor.options.collaboratorCheckIntervalMs)
26
+ }
27
+
28
+ /**
29
+ * Drives reactive re-evaluation of {@link CollaboratorsManager.getVisibleCollaborators}.
30
+ * Ticked on a fixed interval so callers don't need to manage their own activity timers.
31
+ */
32
+ private readonly _visibilityClock = atom('collaboratorVisibilityClock', Date.now())
33
+
34
+ @computed
35
+ private _getCollaboratorsQuery() {
36
+ return this.editor.store.query.records('instance_presence', () => ({
37
+ userId: { neq: this.editor.user.getId() },
38
+ }))
39
+ }
40
+
41
+ /**
42
+ * Returns a list of presence records for all peer collaborators.
43
+ * This will return the latest presence record for each connected user.
44
+ */
45
+ @computed
46
+ getCollaborators(): TLInstancePresence[] {
47
+ const allPresenceRecords = this._getCollaboratorsQuery().get()
48
+ if (!allPresenceRecords.length) return EMPTY_ARRAY
49
+ const userIds = [...new Set(allPresenceRecords.map((c) => c.userId))].sort()
50
+ return userIds.map((id) => {
51
+ const latestPresence = maxBy(
52
+ allPresenceRecords.filter((c) => c.userId === id),
53
+ (p) => p.lastActivityTimestamp ?? 0
54
+ )
55
+ return latestPresence!
56
+ })
57
+ }
58
+
59
+ /**
60
+ * Returns a list of presence records for all peer collaborators on the current page.
61
+ * This will return the latest presence record for each connected user.
62
+ */
63
+ @computed
64
+ getCollaboratorsOnCurrentPage(): TLInstancePresence[] {
65
+ const currentPageId = this.editor.getCurrentPageId()
66
+ return this.getCollaborators().filter((c) => c.currentPageId === currentPageId)
67
+ }
68
+
69
+ /**
70
+ * Returns a list of presence records for peer collaborators who should currently be
71
+ * shown in the UI. Filters {@link CollaboratorsManager.getCollaborators} by activity
72
+ * state (active / idle / inactive) and visibility rules such as following and
73
+ * highlighted users. Re-evaluates on the visibility clock, so callers don't need to
74
+ * drive their own activity timer.
75
+ */
76
+ @computed
77
+ getVisibleCollaborators(): TLInstancePresence[] {
78
+ this._visibilityClock.get()
79
+ const now = Date.now()
80
+ return this.getCollaborators().filter((presence) => {
81
+ // Treat a missing `lastActivityTimestamp` as "active right now" (elapsed = 0)
82
+ // so newly-joined peers aren't immediately classified as idle/inactive.
83
+ const elapsed = Math.max(0, now - (presence.lastActivityTimestamp ?? now))
84
+ const state = getCollaboratorStateFromElapsedTime(this.editor, elapsed)
85
+ return shouldShowCollaborator(this.editor, presence, state)
86
+ })
87
+ }
88
+
89
+ /**
90
+ * Returns a list of presence records for peer collaborators who should currently be
91
+ * shown in the UI, filtered to those on the current page.
92
+ */
93
+ @computed
94
+ getVisibleCollaboratorsOnCurrentPage(): TLInstancePresence[] {
95
+ const currentPageId = this.editor.getCurrentPageId()
96
+ return this.getVisibleCollaborators().filter((c) => c.currentPageId === currentPageId)
97
+ }
98
+ }
@@ -1,5 +1,5 @@
1
- import { Vec } from '../../../primitives/Vec'
2
1
  import { EASINGS } from '../../../primitives/easings'
2
+ import { Vec } from '../../../primitives/Vec'
3
3
  import type { Editor } from '../../Editor'
4
4
 
5
5
  /** @public */
@@ -1,8 +1,15 @@
1
- import { TLParentId, TLShape, TLShapeId, createShapeId, toRichText } from '@tldraw/tlschema'
1
+ import {
2
+ TLFontFace,
3
+ TLParentId,
4
+ TLShape,
5
+ TLShapeId,
6
+ createShapeId,
7
+ toRichText,
8
+ } from '@tldraw/tlschema'
2
9
  import { IndexKey } from '@tldraw/utils'
3
10
  import { Mock, Mocked, vi } from 'vitest'
4
11
  import { Editor } from '../../Editor'
5
- import { FontManager, TLFontFace } from './FontManager'
12
+ import { FontManager } from './FontManager'
6
13
 
7
14
  // Mock the Editor class
8
15
  vi.mock('../../Editor')
@@ -1,6 +1,6 @@
1
1
  import { computed, EMPTY_ARRAY, transact } from '@tldraw/state'
2
2
  import { AtomMap } from '@tldraw/store'
3
- import { TLShape, TLShapeId } from '@tldraw/tlschema'
3
+ import { TLFontFace, TLShape, TLShapeId } from '@tldraw/tlschema'
4
4
  import {
5
5
  areArraysShallowEqual,
6
6
  compact,
@@ -10,72 +10,6 @@ import {
10
10
  } from '@tldraw/utils'
11
11
  import type { Editor } from '../../Editor'
12
12
 
13
- /**
14
- * Represents the `src` property of a {@link TLFontFace}.
15
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src | `src`} for details of the properties here.
16
- * @public
17
- */
18
- export interface TLFontFaceSource {
19
- /**
20
- * A URL from which to load the font. If the value here is a key in
21
- * {@link tldraw#TLEditorAssetUrls.fonts}, the value from there will be used instead.
22
- */
23
- url: string
24
- format?: string
25
- tech?: string
26
- }
27
-
28
- /**
29
- * A font face that can be used in the editor. The properties of this are largely the same as the
30
- * ones in the
31
- * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face | css `@font-face` rule}.
32
- * @public
33
- */
34
- export interface TLFontFace {
35
- /**
36
- * How this font can be referred to in CSS.
37
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-family | `font-family`}.
38
- */
39
- readonly family: string
40
- /**
41
- * The source of the font. This
42
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src | `src`}.
43
- */
44
- readonly src: TLFontFaceSource
45
- /**
46
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/ascent-override | `ascent-override`}.
47
- */
48
- readonly ascentOverride?: string
49
- /**
50
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/descent-override | `descent-override`}.
51
- */
52
- readonly descentOverride?: string
53
- /**
54
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-stretch | `font-stretch`}.
55
- */
56
- readonly stretch?: string
57
- /**
58
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-style | `font-style`}.
59
- */
60
- readonly style?: string
61
- /**
62
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-weight | `font-weight`}.
63
- */
64
- readonly weight?: string
65
- /**
66
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-feature-settings | `font-feature-settings`}.
67
- */
68
- readonly featureSettings?: string
69
- /**
70
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/line-gap-override | `line-gap-override`}.
71
- */
72
- readonly lineGapOverride?: string
73
- /**
74
- * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/unicode-range | `unicode-range`}.
75
- */
76
- readonly unicodeRange?: string
77
- }
78
-
79
13
  interface FontState {
80
14
  readonly state: 'loading' | 'ready' | 'error'
81
15
  readonly instance: FontFace
@@ -21,7 +21,7 @@ export class InputsManager {
21
21
  /**
22
22
  * @deprecated Use `getOriginPagePoint()` instead.
23
23
  */
24
- // eslint-disable-next-line no-restricted-syntax
24
+ // eslint-disable-next-line tldraw/no-setter-getter
25
25
  get originPagePoint() {
26
26
  return this.getOriginPagePoint()
27
27
  }
@@ -36,7 +36,7 @@ export class InputsManager {
36
36
  /**
37
37
  * @deprecated Use `getOriginScreenPoint()` instead.
38
38
  */
39
- // eslint-disable-next-line no-restricted-syntax
39
+ // eslint-disable-next-line tldraw/no-setter-getter
40
40
  get originScreenPoint() {
41
41
  return this.getOriginScreenPoint()
42
42
  }
@@ -51,7 +51,7 @@ export class InputsManager {
51
51
  /**
52
52
  * @deprecated Use `getPreviousPagePoint()` instead.
53
53
  */
54
- // eslint-disable-next-line no-restricted-syntax
54
+ // eslint-disable-next-line tldraw/no-setter-getter
55
55
  get previousPagePoint() {
56
56
  return this.getPreviousPagePoint()
57
57
  }
@@ -66,7 +66,7 @@ export class InputsManager {
66
66
  /**
67
67
  * @deprecated Use `getPreviousScreenPoint()` instead.
68
68
  */
69
- // eslint-disable-next-line no-restricted-syntax
69
+ // eslint-disable-next-line tldraw/no-setter-getter
70
70
  get previousScreenPoint() {
71
71
  return this.getPreviousScreenPoint()
72
72
  }
@@ -81,7 +81,7 @@ export class InputsManager {
81
81
  /**
82
82
  * @deprecated Use `getCurrentPagePoint()` instead.
83
83
  */
84
- // eslint-disable-next-line no-restricted-syntax
84
+ // eslint-disable-next-line tldraw/no-setter-getter
85
85
  get currentPagePoint() {
86
86
  return this.getCurrentPagePoint()
87
87
  }
@@ -96,7 +96,7 @@ export class InputsManager {
96
96
  /**
97
97
  * @deprecated Use `getCurrentScreenPoint()` instead.
98
98
  */
99
- // eslint-disable-next-line no-restricted-syntax
99
+ // eslint-disable-next-line tldraw/no-setter-getter
100
100
  get currentScreenPoint() {
101
101
  return this.getCurrentScreenPoint()
102
102
  }
@@ -111,7 +111,7 @@ export class InputsManager {
111
111
  /**
112
112
  * @deprecated Use `getPointerVelocity()` instead.
113
113
  */
114
- // eslint-disable-next-line no-restricted-syntax
114
+ // eslint-disable-next-line tldraw/no-setter-getter
115
115
  get pointerVelocity() {
116
116
  return this.getPointerVelocity()
117
117
  }
@@ -147,11 +147,11 @@ export class InputsManager {
147
147
  /**
148
148
  * @deprecated Use `getIsPen()` instead.
149
149
  */
150
- // eslint-disable-next-line no-restricted-syntax
150
+ // eslint-disable-next-line tldraw/no-setter-getter
151
151
  get isPen() {
152
152
  return this.getIsPen()
153
153
  }
154
- // eslint-disable-next-line no-restricted-syntax
154
+ // eslint-disable-next-line tldraw/no-setter-getter
155
155
  set isPen(isPen: boolean) {
156
156
  this.setIsPen(isPen)
157
157
  }
@@ -172,11 +172,11 @@ export class InputsManager {
172
172
  /**
173
173
  * @deprecated Use `getShiftKey()` instead.
174
174
  */
175
- // eslint-disable-next-line no-restricted-syntax
175
+ // eslint-disable-next-line tldraw/no-setter-getter
176
176
  get shiftKey() {
177
177
  return this.getShiftKey()
178
178
  }
179
- // eslint-disable-next-line no-restricted-syntax
179
+ // eslint-disable-next-line tldraw/no-setter-getter
180
180
  set shiftKey(shiftKey: boolean) {
181
181
  this.setShiftKey(shiftKey)
182
182
  }
@@ -198,11 +198,11 @@ export class InputsManager {
198
198
  /**
199
199
  * @deprecated Use `getMetaKey()` instead.
200
200
  */
201
- // eslint-disable-next-line no-restricted-syntax
201
+ // eslint-disable-next-line tldraw/no-setter-getter
202
202
  get metaKey() {
203
203
  return this.getMetaKey()
204
204
  }
205
- // eslint-disable-next-line no-restricted-syntax
205
+ // eslint-disable-next-line tldraw/no-setter-getter
206
206
  set metaKey(metaKey: boolean) {
207
207
  this.setMetaKey(metaKey)
208
208
  }
@@ -224,11 +224,11 @@ export class InputsManager {
224
224
  /**
225
225
  * @deprecated Use `getCtrlKey()` instead.
226
226
  */
227
- // eslint-disable-next-line no-restricted-syntax
227
+ // eslint-disable-next-line tldraw/no-setter-getter
228
228
  get ctrlKey() {
229
229
  return this.getCtrlKey()
230
230
  }
231
- // eslint-disable-next-line no-restricted-syntax
231
+ // eslint-disable-next-line tldraw/no-setter-getter
232
232
  set ctrlKey(ctrlKey: boolean) {
233
233
  this.setCtrlKey(ctrlKey)
234
234
  }
@@ -250,11 +250,11 @@ export class InputsManager {
250
250
  /**
251
251
  * @deprecated Use `getAltKey()` instead.
252
252
  */
253
- // eslint-disable-next-line no-restricted-syntax
253
+ // eslint-disable-next-line tldraw/no-setter-getter
254
254
  get altKey() {
255
255
  return this.getAltKey()
256
256
  }
257
- // eslint-disable-next-line no-restricted-syntax
257
+ // eslint-disable-next-line tldraw/no-setter-getter
258
258
  set altKey(altKey: boolean) {
259
259
  this.setAltKey(altKey)
260
260
  }
@@ -275,7 +275,7 @@ export class InputsManager {
275
275
  /**
276
276
  * @deprecated Use `getAccelKey()` instead.
277
277
  */
278
- // eslint-disable-next-line no-restricted-syntax
278
+ // eslint-disable-next-line tldraw/no-setter-getter
279
279
  get accelKey() {
280
280
  return this.getAccelKey()
281
281
  }
@@ -290,11 +290,11 @@ export class InputsManager {
290
290
  /**
291
291
  * Soon to be deprecated, use `getIsDragging()` instead.
292
292
  */
293
- // eslint-disable-next-line no-restricted-syntax
293
+ // eslint-disable-next-line tldraw/no-setter-getter
294
294
  get isDragging() {
295
295
  return this.getIsDragging()
296
296
  }
297
- // eslint-disable-next-line no-restricted-syntax
297
+ // eslint-disable-next-line tldraw/no-setter-getter
298
298
  set isDragging(isDragging: boolean) {
299
299
  this.setIsDragging(isDragging)
300
300
  }
@@ -315,11 +315,11 @@ export class InputsManager {
315
315
  /**
316
316
  * @deprecated Use `getIsPointing()` instead.
317
317
  */
318
- // eslint-disable-next-line no-restricted-syntax
318
+ // eslint-disable-next-line tldraw/no-setter-getter
319
319
  get isPointing() {
320
320
  return this.getIsPointing()
321
321
  }
322
- // eslint-disable-next-line no-restricted-syntax
322
+ // eslint-disable-next-line tldraw/no-setter-getter
323
323
  set isPointing(isPointing: boolean) {
324
324
  this.setIsPointing(isPointing)
325
325
  }
@@ -331,6 +331,18 @@ export class InputsManager {
331
331
  this._isPointing.set(isPointing)
332
332
  }
333
333
 
334
+ private _isRightPointing = atom<boolean>('isRightPointing', false)
335
+ /**
336
+ * Whether the user is right-click pointing (before drag threshold).
337
+ */
338
+ getIsRightPointing() {
339
+ return this._isRightPointing.get()
340
+ }
341
+ /** @internal */
342
+ setIsRightPointing(isRightPointing: boolean) {
343
+ this._isRightPointing.set(isRightPointing)
344
+ }
345
+
334
346
  private _isPinching = atom<boolean>('isPinching', false)
335
347
  /**
336
348
  * Whether the user is pinching.
@@ -341,11 +353,11 @@ export class InputsManager {
341
353
  /**
342
354
  * @deprecated Use `getIsPinching()` instead.
343
355
  */
344
- // eslint-disable-next-line no-restricted-syntax
356
+ // eslint-disable-next-line tldraw/no-setter-getter
345
357
  get isPinching() {
346
358
  return this.getIsPinching()
347
359
  }
348
- // eslint-disable-next-line no-restricted-syntax
360
+ // eslint-disable-next-line tldraw/no-setter-getter
349
361
  set isPinching(isPinching: boolean) {
350
362
  this.setIsPinching(isPinching)
351
363
  }
@@ -367,11 +379,11 @@ export class InputsManager {
367
379
  /**
368
380
  * @deprecated Use `getIsEditing()` instead.
369
381
  */
370
- // eslint-disable-next-line no-restricted-syntax
382
+ // eslint-disable-next-line tldraw/no-setter-getter
371
383
  get isEditing() {
372
384
  return this.getIsEditing()
373
385
  }
374
- // eslint-disable-next-line no-restricted-syntax
386
+ // eslint-disable-next-line tldraw/no-setter-getter
375
387
  set isEditing(isEditing: boolean) {
376
388
  this.setIsEditing(isEditing)
377
389
  }
@@ -392,11 +404,11 @@ export class InputsManager {
392
404
  /**
393
405
  * @deprecated Use `getIsPanning()` instead.
394
406
  */
395
- // eslint-disable-next-line no-restricted-syntax
407
+ // eslint-disable-next-line tldraw/no-setter-getter
396
408
  get isPanning() {
397
409
  return this.getIsPanning()
398
410
  }
399
- // eslint-disable-next-line no-restricted-syntax
411
+ // eslint-disable-next-line tldraw/no-setter-getter
400
412
  set isPanning(isPanning: boolean) {
401
413
  this.setIsPanning(isPanning)
402
414
  }
@@ -418,11 +430,11 @@ export class InputsManager {
418
430
  /**
419
431
  * @deprecated Use `getIsSpacebarPanning()` instead.
420
432
  */
421
- // eslint-disable-next-line no-restricted-syntax
433
+ // eslint-disable-next-line tldraw/no-setter-getter
422
434
  get isSpacebarPanning() {
423
435
  return this.getIsSpacebarPanning()
424
436
  }
425
- // eslint-disable-next-line no-restricted-syntax
437
+ // eslint-disable-next-line tldraw/no-setter-getter
426
438
  set isSpacebarPanning(isSpacebarPanning: boolean) {
427
439
  this.setIsSpacebarPanning(isSpacebarPanning)
428
440
  }
@@ -0,0 +1,82 @@
1
+ import type { PerformanceManager } from './PerformanceManager'
2
+
3
+ /** Wrap performance.mark with try/catch — `detail` option may throw in Safari/Firefox. */
4
+ function safeMark(name: string, detail?: Record<string, unknown>) {
5
+ try {
6
+ performance.mark(name, detail ? { detail } : undefined)
7
+ } catch {
8
+ performance.mark(name)
9
+ }
10
+ }
11
+
12
+ /**
13
+ * Optional adapter that pipes PerformanceManager events into browser
14
+ * `performance.mark()` / `performance.measure()` for DevTools integration.
15
+ *
16
+ * Tree-shakeable — only included if imported.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const adapter = new PerformanceApiAdapter(editor.performance)
21
+ * // ... later
22
+ * adapter.dispose()
23
+ * ```
24
+ *
25
+ * @public
26
+ */
27
+ export class PerformanceApiAdapter {
28
+ private cleanups: (() => void)[] = []
29
+
30
+ constructor(perfManager: PerformanceManager) {
31
+ this.cleanups.push(
32
+ perfManager.on('interaction-start', (event) => {
33
+ safeMark(`tldraw:interaction:${event.name}:start`, { path: event.path })
34
+ })
35
+ )
36
+
37
+ this.cleanups.push(
38
+ perfManager.on('interaction-end', (event) => {
39
+ const startMark = `tldraw:interaction:${event.name}:start`
40
+ const endMark = `tldraw:interaction:${event.name}:end`
41
+ safeMark(endMark, {
42
+ path: event.path,
43
+ fps: event.fps,
44
+ frameCount: event.frameCount,
45
+ shapeCount: event.shapeCount,
46
+ })
47
+ try {
48
+ performance.measure(`tldraw:interaction:${event.name}`, startMark, endMark)
49
+ } catch {
50
+ // start mark may not exist if adapter attached mid-interaction
51
+ }
52
+ })
53
+ )
54
+
55
+ this.cleanups.push(
56
+ perfManager.on('camera-start', (event) => {
57
+ safeMark(`tldraw:camera:${event.type}:start`)
58
+ })
59
+ )
60
+
61
+ this.cleanups.push(
62
+ perfManager.on('camera-end', (event) => {
63
+ const startMark = `tldraw:camera:${event.type}:start`
64
+ const endMark = `tldraw:camera:${event.type}:end`
65
+ safeMark(endMark, { fps: event.fps, shapeCount: event.shapeCount })
66
+ try {
67
+ performance.measure(`tldraw:camera:${event.type}`, startMark, endMark)
68
+ } catch {
69
+ // start mark may not exist
70
+ }
71
+ })
72
+ )
73
+ }
74
+
75
+ /** Remove all listeners and stop piping events. @public */
76
+ dispose() {
77
+ for (const cleanup of this.cleanups) {
78
+ cleanup()
79
+ }
80
+ this.cleanups.length = 0
81
+ }
82
+ }