@tldraw/editor 4.6.0-next.fecc64eee134 → 5.0.1

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 (324) hide show
  1. package/dist-cjs/index.d.ts +493 -170
  2. package/dist-cjs/index.js +14 -23
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +3 -0
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/components/MenuClickCapture.js +93 -47
  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 +46 -248
  11. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +3 -3
  12. package/dist-cjs/lib/editor/Editor.js +142 -33
  13. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  14. package/dist-cjs/lib/editor/assets/AssetUtil.js +1 -0
  15. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +1 -1
  16. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  17. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  18. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -0
  19. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
  20. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +98 -0
  21. package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +7 -0
  22. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -0
  23. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
  24. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
  25. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
  26. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
  27. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +1 -1
  28. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
  29. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
  30. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +12 -0
  31. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  32. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
  33. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
  34. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +1 -0
  35. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
  36. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
  37. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
  38. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
  39. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  40. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
  41. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
  42. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
  43. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
  44. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +1 -0
  45. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +1 -1
  46. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +14 -0
  47. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +2 -2
  48. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
  49. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  50. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +2 -0
  51. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +1 -1
  52. package/dist-cjs/lib/editor/overlays/OverlayManager.js +154 -0
  53. package/dist-cjs/lib/editor/overlays/OverlayManager.js.map +7 -0
  54. package/dist-cjs/lib/editor/overlays/OverlayUtil.js +92 -0
  55. package/dist-cjs/lib/editor/overlays/OverlayUtil.js.map +7 -0
  56. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js +161 -0
  57. package/dist-cjs/lib/editor/overlays/ShapeIndicatorOverlayUtil.js.map +7 -0
  58. package/dist-cjs/lib/editor/overlays/getOverlayDisplayValues.js +39 -0
  59. package/dist-cjs/lib/editor/overlays/getOverlayDisplayValues.js.map +7 -0
  60. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +79 -0
  61. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  62. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +36 -23
  63. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  64. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +32 -2
  65. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  66. package/dist-cjs/lib/editor/tools/StateNode.js +1 -0
  67. package/dist-cjs/lib/editor/tools/StateNode.js.map +1 -1
  68. package/dist-cjs/lib/editor/types/event-types.js.map +2 -2
  69. package/dist-cjs/lib/exports/ExportDelay.js +1 -0
  70. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  71. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
  72. package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
  73. package/dist-cjs/lib/exports/fetchCache.js +1 -1
  74. package/dist-cjs/lib/exports/fetchCache.js.map +2 -2
  75. package/dist-cjs/lib/exports/getSvgJsx.js +2 -1
  76. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  77. package/dist-cjs/lib/hooks/EditorComponentsContext.js.map +2 -2
  78. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  79. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  80. package/dist-cjs/lib/hooks/useEditorComponents.js +0 -28
  81. package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
  82. package/dist-cjs/lib/hooks/usePeerIds.js +1 -36
  83. package/dist-cjs/lib/hooks/usePeerIds.js.map +2 -2
  84. package/dist-cjs/lib/hooks/useShapeCulling.js +2 -1
  85. package/dist-cjs/lib/hooks/useShapeCulling.js.map +2 -2
  86. package/dist-cjs/lib/options.js +1 -0
  87. package/dist-cjs/lib/options.js.map +2 -2
  88. package/dist-cjs/lib/primitives/Vec.js +3 -0
  89. package/dist-cjs/lib/primitives/Vec.js.map +1 -1
  90. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
  91. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
  92. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
  93. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
  94. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
  95. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
  96. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
  97. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
  98. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  99. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  100. package/dist-cjs/lib/utils/reparenting.js +20 -7
  101. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  102. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +5 -0
  103. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +2 -2
  104. package/dist-cjs/version.js +4 -4
  105. package/dist-cjs/version.js.map +1 -1
  106. package/dist-esm/index.d.mts +493 -170
  107. package/dist-esm/index.mjs +21 -41
  108. package/dist-esm/index.mjs.map +2 -2
  109. package/dist-esm/lib/TldrawEditor.mjs +3 -0
  110. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  111. package/dist-esm/lib/components/MenuClickCapture.mjs +94 -48
  112. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  113. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs +160 -0
  114. package/dist-esm/lib/components/default-components/CanvasOverlays.mjs.map +7 -0
  115. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +47 -249
  116. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +3 -3
  117. package/dist-esm/lib/editor/Editor.mjs +143 -35
  118. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  119. package/dist-esm/lib/editor/assets/AssetUtil.mjs +1 -0
  120. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +1 -1
  121. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  122. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  123. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -0
  124. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
  125. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +83 -0
  126. package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +7 -0
  127. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -0
  128. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
  129. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
  130. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  131. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  132. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +1 -1
  133. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  134. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  135. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +12 -0
  136. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  137. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs +1 -0
  138. package/dist-esm/lib/editor/managers/ScribbleManager/ScribbleManager.mjs.map +1 -1
  139. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +1 -0
  140. package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +1 -1
  141. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs +1 -0
  142. package/dist-esm/lib/editor/managers/SnapManager/HandleSnaps.mjs.map +1 -1
  143. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +2 -1
  144. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  145. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs +1 -0
  146. package/dist-esm/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.mjs.map +1 -1
  147. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs +1 -0
  148. package/dist-esm/lib/editor/managers/TextManager/TextManager.mjs.map +1 -1
  149. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +1 -0
  150. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +1 -1
  151. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +14 -0
  152. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +2 -2
  153. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -0
  154. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  155. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +2 -0
  156. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +1 -1
  157. package/dist-esm/lib/editor/overlays/OverlayManager.mjs +136 -0
  158. package/dist-esm/lib/editor/overlays/OverlayManager.mjs.map +7 -0
  159. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs +72 -0
  160. package/dist-esm/lib/editor/overlays/OverlayUtil.mjs.map +7 -0
  161. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs +141 -0
  162. package/dist-esm/lib/editor/overlays/ShapeIndicatorOverlayUtil.mjs.map +7 -0
  163. package/dist-esm/lib/editor/overlays/getOverlayDisplayValues.mjs +19 -0
  164. package/dist-esm/lib/editor/overlays/getOverlayDisplayValues.mjs.map +7 -0
  165. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +59 -0
  166. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  167. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +36 -23
  168. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  169. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +32 -2
  170. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  171. package/dist-esm/lib/editor/tools/StateNode.mjs +1 -0
  172. package/dist-esm/lib/editor/tools/StateNode.mjs.map +1 -1
  173. package/dist-esm/lib/editor/types/event-types.mjs.map +2 -2
  174. package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
  175. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  176. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
  177. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
  178. package/dist-esm/lib/exports/fetchCache.mjs +2 -2
  179. package/dist-esm/lib/exports/fetchCache.mjs.map +2 -2
  180. package/dist-esm/lib/exports/getSvgJsx.mjs +2 -1
  181. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  182. package/dist-esm/lib/hooks/EditorComponentsContext.mjs.map +2 -2
  183. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  184. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  185. package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -28
  186. package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
  187. package/dist-esm/lib/hooks/usePeerIds.mjs +2 -40
  188. package/dist-esm/lib/hooks/usePeerIds.mjs.map +2 -2
  189. package/dist-esm/lib/hooks/useShapeCulling.mjs +2 -1
  190. package/dist-esm/lib/hooks/useShapeCulling.mjs.map +2 -2
  191. package/dist-esm/lib/options.mjs +1 -0
  192. package/dist-esm/lib/options.mjs.map +2 -2
  193. package/dist-esm/lib/primitives/Vec.mjs +3 -0
  194. package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
  195. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
  196. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
  197. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
  198. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
  199. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
  200. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
  201. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
  202. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
  203. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  204. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  205. package/dist-esm/lib/utils/reparenting.mjs +20 -7
  206. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  207. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +5 -0
  208. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
  209. package/dist-esm/version.mjs +4 -4
  210. package/dist-esm/version.mjs.map +1 -1
  211. package/editor.css +4 -243
  212. package/package.json +7 -7
  213. package/src/index.ts +18 -39
  214. package/src/lib/TldrawEditor.tsx +9 -0
  215. package/src/lib/components/MenuClickCapture.tsx +124 -64
  216. package/src/lib/components/default-components/CanvasOverlays.tsx +208 -0
  217. package/src/lib/components/default-components/DefaultCanvas.tsx +51 -322
  218. package/src/lib/editor/Editor.test.ts +3 -1
  219. package/src/lib/editor/Editor.ts +167 -38
  220. package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +98 -0
  221. package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
  222. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  223. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  224. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +14 -0
  225. package/src/lib/editor/overlays/OverlayManager.ts +183 -0
  226. package/src/lib/editor/overlays/OverlayUtil.ts +143 -0
  227. package/src/lib/editor/overlays/ShapeIndicatorOverlayUtil.ts +216 -0
  228. package/src/lib/editor/overlays/getOverlayDisplayValues.ts +51 -0
  229. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +128 -0
  230. package/src/lib/editor/shapes/ShapeUtil.ts +45 -26
  231. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +40 -3
  232. package/src/lib/editor/types/event-types.ts +2 -0
  233. package/src/lib/exports/fetchCache.ts +2 -4
  234. package/src/lib/exports/getSvgJsx.test.ts +3 -1
  235. package/src/lib/exports/getSvgJsx.tsx +2 -1
  236. package/src/lib/hooks/EditorComponentsContext.tsx +0 -27
  237. package/src/lib/hooks/useCanvasEvents.ts +45 -3
  238. package/src/lib/hooks/useEditorComponents.tsx +0 -28
  239. package/src/lib/hooks/usePeerIds.ts +6 -55
  240. package/src/lib/hooks/useShapeCulling.tsx +3 -1
  241. package/src/lib/options.ts +7 -0
  242. package/src/lib/utils/reparenting.ts +22 -9
  243. package/src/lib/utils/sync/TLLocalSyncClient.ts +3 -0
  244. package/src/version.ts +4 -4
  245. package/dist-cjs/lib/components/GeometryDebuggingView.js +0 -115
  246. package/dist-cjs/lib/components/GeometryDebuggingView.js.map +0 -7
  247. package/dist-cjs/lib/components/LiveCollaborators.js +0 -151
  248. package/dist-cjs/lib/components/LiveCollaborators.js.map +0 -7
  249. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +0 -227
  250. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +0 -7
  251. package/dist-cjs/lib/components/default-components/DefaultBrush.js +0 -38
  252. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +0 -7
  253. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +0 -71
  254. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +0 -7
  255. package/dist-cjs/lib/components/default-components/DefaultCursor.js +0 -59
  256. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +0 -7
  257. package/dist-cjs/lib/components/default-components/DefaultHandle.js +0 -56
  258. package/dist-cjs/lib/components/default-components/DefaultHandle.js.map +0 -7
  259. package/dist-cjs/lib/components/default-components/DefaultHandles.js +0 -28
  260. package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +0 -7
  261. package/dist-cjs/lib/components/default-components/DefaultScribble.js +0 -51
  262. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +0 -7
  263. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js +0 -69
  264. package/dist-cjs/lib/components/default-components/DefaultSelectionForeground.js.map +0 -7
  265. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +0 -107
  266. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +0 -7
  267. package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js +0 -28
  268. package/dist-cjs/lib/components/default-components/DefaultShapeIndicatorErrorFallback.js.map +0 -7
  269. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +0 -101
  270. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +0 -7
  271. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +0 -170
  272. package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +0 -7
  273. package/dist-cjs/lib/hooks/useHandleEvents.js +0 -100
  274. package/dist-cjs/lib/hooks/useHandleEvents.js.map +0 -7
  275. package/dist-cjs/lib/hooks/useSelectionEvents.js +0 -98
  276. package/dist-cjs/lib/hooks/useSelectionEvents.js.map +0 -7
  277. package/dist-esm/lib/components/GeometryDebuggingView.mjs +0 -95
  278. package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +0 -7
  279. package/dist-esm/lib/components/LiveCollaborators.mjs +0 -134
  280. package/dist-esm/lib/components/LiveCollaborators.mjs.map +0 -7
  281. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +0 -207
  282. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +0 -7
  283. package/dist-esm/lib/components/default-components/DefaultBrush.mjs +0 -18
  284. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +0 -7
  285. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +0 -41
  286. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +0 -7
  287. package/dist-esm/lib/components/default-components/DefaultCursor.mjs +0 -29
  288. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +0 -7
  289. package/dist-esm/lib/components/default-components/DefaultHandle.mjs +0 -26
  290. package/dist-esm/lib/components/default-components/DefaultHandle.mjs.map +0 -7
  291. package/dist-esm/lib/components/default-components/DefaultHandles.mjs +0 -8
  292. package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +0 -7
  293. package/dist-esm/lib/components/default-components/DefaultScribble.mjs +0 -21
  294. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +0 -7
  295. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs +0 -39
  296. package/dist-esm/lib/components/default-components/DefaultSelectionForeground.mjs.map +0 -7
  297. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +0 -77
  298. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +0 -7
  299. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs +0 -8
  300. package/dist-esm/lib/components/default-components/DefaultShapeIndicatorErrorFallback.mjs.map +0 -7
  301. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +0 -81
  302. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +0 -7
  303. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +0 -142
  304. package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +0 -7
  305. package/dist-esm/lib/hooks/useHandleEvents.mjs +0 -70
  306. package/dist-esm/lib/hooks/useHandleEvents.mjs.map +0 -7
  307. package/dist-esm/lib/hooks/useSelectionEvents.mjs +0 -78
  308. package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +0 -7
  309. package/src/lib/components/GeometryDebuggingView.tsx +0 -108
  310. package/src/lib/components/LiveCollaborators.tsx +0 -174
  311. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +0 -289
  312. package/src/lib/components/default-components/DefaultBrush.tsx +0 -35
  313. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +0 -52
  314. package/src/lib/components/default-components/DefaultCursor.tsx +0 -59
  315. package/src/lib/components/default-components/DefaultHandle.tsx +0 -42
  316. package/src/lib/components/default-components/DefaultHandles.tsx +0 -15
  317. package/src/lib/components/default-components/DefaultScribble.tsx +0 -31
  318. package/src/lib/components/default-components/DefaultSelectionForeground.tsx +0 -50
  319. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +0 -104
  320. package/src/lib/components/default-components/DefaultShapeIndicatorErrorFallback.tsx +0 -9
  321. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +0 -116
  322. package/src/lib/components/default-components/DefaultSnapIndictor.tsx +0 -174
  323. package/src/lib/hooks/useHandleEvents.ts +0 -88
  324. package/src/lib/hooks/useSelectionEvents.ts +0 -97
@@ -1,108 +0,0 @@
1
- import { track } from '@tldraw/state-react'
2
- import { modulate } from '@tldraw/utils'
3
- import { useEditor } from '../hooks/useEditor'
4
- import { Geometry2d } from '../primitives/geometry/Geometry2d'
5
- import { Group2d } from '../primitives/geometry/Group2d'
6
-
7
- export const GeometryDebuggingView = track(function GeometryDebuggingView({
8
- showStroke = true,
9
- showVertices = true,
10
- showClosestPointOnOutline = true,
11
- }: {
12
- showStroke?: boolean
13
- showVertices?: boolean
14
- showClosestPointOnOutline?: boolean
15
- }) {
16
- const editor = useEditor()
17
-
18
- const zoomLevel = editor.getZoomLevel()
19
- const renderingShapes = editor.getRenderingShapes()
20
- const currentPagePoint = editor.inputs.getCurrentPagePoint()
21
-
22
- return (
23
- <svg
24
- style={{
25
- position: 'absolute',
26
- pointerEvents: 'none',
27
- zIndex: 999999999,
28
- top: 0,
29
- left: 0,
30
- overflow: 'visible',
31
- }}
32
- >
33
- {renderingShapes.map((result) => {
34
- const shape = editor.getShape(result.id)!
35
-
36
- if (shape.type === 'group') return null
37
-
38
- const geometry = editor.getShapeGeometry(shape)
39
- const pageTransform = editor.getShapePageTransform(shape)!
40
-
41
- const pointInShapeSpace = editor.getPointInShapeSpace(shape, currentPagePoint)
42
- const nearestPointOnShape = geometry.nearestPoint(pointInShapeSpace)
43
- const distanceToPoint = geometry.distanceToPoint(pointInShapeSpace, true)
44
- const dist = Math.abs(distanceToPoint) * zoomLevel
45
- const hitInside = distanceToPoint < 0
46
-
47
- const { vertices } = geometry
48
-
49
- return (
50
- <g
51
- key={result.id + '_outline'}
52
- transform={pageTransform.toCssString()}
53
- strokeLinecap="round"
54
- strokeLinejoin="round"
55
- >
56
- {showStroke && (
57
- <g
58
- stroke={geometry.debugColor ?? 'red'}
59
- opacity="1"
60
- strokeWidth={2 / zoomLevel}
61
- fill="none"
62
- >
63
- <GeometryStroke geometry={geometry} />
64
- </g>
65
- )}
66
- {showVertices &&
67
- vertices.map((v, i) => (
68
- <circle
69
- key={`v${i}`}
70
- cx={v.x}
71
- cy={v.y}
72
- r={2 / zoomLevel}
73
- fill={`hsl(${modulate(i, [0, vertices.length - 1], [120, 200])}, 100%, 50%)`}
74
- stroke="black"
75
- strokeWidth={1 / zoomLevel}
76
- />
77
- ))}
78
- {showClosestPointOnOutline && dist < 150 && (
79
- <line
80
- x1={nearestPointOnShape.x}
81
- y1={nearestPointOnShape.y}
82
- x2={pointInShapeSpace.x}
83
- y2={pointInShapeSpace.y}
84
- opacity={1 - dist / 150}
85
- stroke={hitInside ? 'goldenrod' : 'dodgerblue'}
86
- strokeWidth={2 / zoomLevel}
87
- />
88
- )}
89
- </g>
90
- )
91
- })}
92
- </svg>
93
- )
94
- })
95
-
96
- function GeometryStroke({ geometry }: { geometry: Geometry2d }) {
97
- if (geometry instanceof Group2d) {
98
- return (
99
- <g stroke={geometry.debugColor}>
100
- {[...geometry.children, ...geometry.ignoredChildren].map((child, i) => (
101
- <GeometryStroke geometry={child} key={i} />
102
- ))}
103
- </g>
104
- )
105
- }
106
-
107
- return <path d={geometry.toSimpleSvgPath()} stroke={geometry.debugColor} />
108
- }
@@ -1,174 +0,0 @@
1
- import { track } from '@tldraw/state-react'
2
- import { TLInstancePresence } from '@tldraw/tlschema'
3
- import { useEffect, useRef, useState } from 'react'
4
- import { Editor } from '../editor/Editor'
5
- import { useEditorComponents } from '../hooks/EditorComponentsContext'
6
- import { useEditor } from '../hooks/useEditor'
7
- import { usePeerIds } from '../hooks/usePeerIds'
8
- import { usePresence } from '../hooks/usePresence'
9
- import {
10
- CollaboratorState,
11
- getCollaboratorStateFromElapsedTime,
12
- shouldShowCollaborator,
13
- } from '../utils/collaboratorState'
14
-
15
- export const LiveCollaborators = track(function Collaborators() {
16
- const peerIds = usePeerIds()
17
- return peerIds.map((id) => <CollaboratorGuard key={id} collaboratorId={id} />)
18
- })
19
-
20
- const CollaboratorGuard = track(function CollaboratorGuard({
21
- collaboratorId,
22
- }: {
23
- collaboratorId: string
24
- }) {
25
- const editor = useEditor()
26
- const presence = usePresence(collaboratorId)
27
- const collaboratorState = useCollaboratorState(editor, presence)
28
-
29
- if (!(presence && presence.currentPageId === editor.getCurrentPageId())) {
30
- // No need to render if we don't have a presence or if they're on a different page
31
- return null
32
- }
33
-
34
- if (!shouldShowCollaborator(editor, presence, collaboratorState)) {
35
- return null
36
- }
37
-
38
- return <Collaborator latestPresence={presence} />
39
- })
40
-
41
- const Collaborator = track(function Collaborator({
42
- latestPresence,
43
- }: {
44
- latestPresence: TLInstancePresence
45
- }) {
46
- const editor = useEditor()
47
-
48
- const {
49
- CollaboratorBrush,
50
- CollaboratorScribble,
51
- CollaboratorCursor,
52
- CollaboratorHint,
53
- CollaboratorShapeIndicator,
54
- } = useEditorComponents()
55
-
56
- const zoomLevel = editor.getZoomLevel()
57
- const viewportPageBounds = editor.getViewportPageBounds()
58
- const { userId, chatMessage, brush, scribbles, selectedShapeIds, userName, cursor, color } =
59
- latestPresence
60
-
61
- if (!cursor) return null
62
-
63
- // Add a little padding to the top-left of the viewport
64
- // so that the cursor doesn't get cut off
65
- const isCursorInViewport = !(
66
- cursor.x < viewportPageBounds.minX - 12 / zoomLevel ||
67
- cursor.y < viewportPageBounds.minY - 16 / zoomLevel ||
68
- cursor.x > viewportPageBounds.maxX - 12 / zoomLevel ||
69
- cursor.y > viewportPageBounds.maxY - 16 / zoomLevel
70
- )
71
-
72
- return (
73
- <>
74
- {brush && CollaboratorBrush ? (
75
- <CollaboratorBrush
76
- className="tl-collaborator__brush"
77
- key={userId + '_brush'}
78
- userId={userId}
79
- brush={brush}
80
- color={color}
81
- opacity={0.1}
82
- />
83
- ) : null}
84
- {isCursorInViewport && CollaboratorCursor ? (
85
- <CollaboratorCursor
86
- className="tl-collaborator__cursor"
87
- key={userId + '_cursor'}
88
- userId={userId}
89
- point={cursor}
90
- color={color}
91
- zoom={zoomLevel}
92
- name={userName !== 'New User' ? userName : null}
93
- chatMessage={chatMessage ?? ''}
94
- />
95
- ) : CollaboratorHint ? (
96
- <CollaboratorHint
97
- className="tl-collaborator__cursor-hint"
98
- key={userId + '_cursor_hint'}
99
- userId={userId}
100
- point={cursor}
101
- color={color}
102
- zoom={zoomLevel}
103
- viewport={viewportPageBounds}
104
- />
105
- ) : null}
106
- {CollaboratorScribble && scribbles.length ? (
107
- <>
108
- {scribbles.map((scribble) => (
109
- <CollaboratorScribble
110
- key={userId + '_scribble_' + scribble.id}
111
- className="tl-collaborator__scribble"
112
- userId={userId}
113
- scribble={scribble}
114
- color={color}
115
- zoom={zoomLevel}
116
- opacity={scribble.color === 'laser' ? 0.5 : 0.1}
117
- />
118
- ))}
119
- </>
120
- ) : null}
121
- {CollaboratorShapeIndicator &&
122
- selectedShapeIds
123
- .filter((id) => {
124
- // Skip hidden shapes
125
- if (editor.isShapeHidden(id)) return false
126
- // Only render SVG indicators for shapes that use legacy indicators
127
- // Canvas-based indicators are handled by CanvasShapeIndicators
128
- const shape = editor.getShape(id)
129
- if (!shape) return false
130
- const util = editor.getShapeUtil(shape)
131
- return util.useLegacyIndicator()
132
- })
133
- .map((shapeId) => (
134
- <CollaboratorShapeIndicator
135
- className="tl-collaborator__shape-indicator"
136
- key={userId + '_' + shapeId}
137
- userId={userId}
138
- shapeId={shapeId}
139
- color={color}
140
- opacity={0.5}
141
- />
142
- ))}
143
- </>
144
- )
145
- })
146
-
147
- function useCollaboratorState(
148
- editor: Editor,
149
- latestPresence: TLInstancePresence | null
150
- ): CollaboratorState {
151
- const rLastActivityTimestamp = useRef(latestPresence?.lastActivityTimestamp ?? -1)
152
-
153
- const [state, setState] = useState<CollaboratorState>(() =>
154
- getCollaboratorStateFromElapsedTime(editor, Date.now() - rLastActivityTimestamp.current)
155
- )
156
-
157
- useEffect(() => {
158
- const interval = editor.timers.setInterval(() => {
159
- setState(
160
- getCollaboratorStateFromElapsedTime(editor, Date.now() - rLastActivityTimestamp.current)
161
- )
162
- }, editor.options.collaboratorCheckIntervalMs)
163
-
164
- return () => clearInterval(interval)
165
- }, [editor])
166
-
167
- if (latestPresence) {
168
- // We can do this on every render, it's free and cheaper than an effect
169
- // remember, there can be lots and lots of cursors moving around all the time
170
- rLastActivityTimestamp.current = latestPresence.lastActivityTimestamp ?? Infinity
171
- }
172
-
173
- return state
174
- }
@@ -1,289 +0,0 @@
1
- import { useComputed, useQuickReactor } from '@tldraw/state-react'
2
- import { createComputedCache } from '@tldraw/store'
3
- import { TLShape, TLShapeId } from '@tldraw/tlschema'
4
- import { dedupe } from '@tldraw/utils'
5
- import { memo, useEffect, useRef } from 'react'
6
- import { Editor } from '../../editor/Editor'
7
- import { TLIndicatorPath } from '../../editor/shapes/ShapeUtil'
8
- import { getComputedStyle } from '../../exports/domUtils'
9
- import { useColorMode } from '../../hooks/useColorMode'
10
- import { useEditor } from '../../hooks/useEditor'
11
- import { useActivePeerIds$ } from '../../hooks/usePeerIds'
12
-
13
- interface CollaboratorIndicatorData {
14
- color: string
15
- shapeIds: TLShapeId[]
16
- }
17
-
18
- interface RenderData {
19
- idsToDisplay: Set<TLShapeId>
20
- renderingShapeIds: Set<TLShapeId>
21
- hintingShapeIds: TLShapeId[]
22
- collaboratorIndicators: CollaboratorIndicatorData[]
23
- }
24
-
25
- function setsEqual<T>(a: Set<T>, b: Set<T>): boolean {
26
- if (a.size !== b.size) return false
27
- for (const item of a) {
28
- if (!b.has(item)) return false
29
- }
30
- return true
31
- }
32
-
33
- function arraysEqual<T>(a: readonly T[], b: readonly T[]): boolean {
34
- if (a.length !== b.length) return false
35
- for (let i = 0; i < a.length; i++) {
36
- if (a[i] !== b[i]) return false
37
- }
38
- return true
39
- }
40
-
41
- function collaboratorIndicatorsEqual(
42
- a: CollaboratorIndicatorData[],
43
- b: CollaboratorIndicatorData[]
44
- ): boolean {
45
- if (a.length !== b.length) return false
46
- for (let i = 0; i < a.length; i++) {
47
- if (a[i].color !== b[i].color) return false
48
- if (!arraysEqual(a[i].shapeIds, b[i].shapeIds)) return false
49
- }
50
- return true
51
- }
52
-
53
- function renderDataEqual(a: RenderData, b: RenderData): boolean {
54
- return (
55
- setsEqual(a.idsToDisplay, b.idsToDisplay) &&
56
- setsEqual(a.renderingShapeIds, b.renderingShapeIds) &&
57
- arraysEqual(a.hintingShapeIds, b.hintingShapeIds) &&
58
- collaboratorIndicatorsEqual(a.collaboratorIndicators, b.collaboratorIndicators)
59
- )
60
- }
61
-
62
- const indicatorPathCache = createComputedCache(
63
- 'indicatorPath',
64
- (editor: Editor, shape: TLShape) => {
65
- const util = editor.getShapeUtil(shape)
66
- return util.getIndicatorPath(shape)
67
- }
68
- )
69
-
70
- const getIndicatorPath = (editor: Editor, shape: TLShape) => {
71
- return indicatorPathCache.get(editor, shape.id)
72
- }
73
-
74
- function renderShapeIndicator(
75
- ctx: CanvasRenderingContext2D,
76
- editor: Editor,
77
- shapeId: TLShapeId,
78
- renderingShapeIds: Set<TLShapeId>
79
- ): boolean {
80
- if (!renderingShapeIds.has(shapeId)) return false
81
-
82
- const shape = editor.getShape(shapeId)
83
- if (!shape || shape.isLocked) return false
84
-
85
- const pageTransform = editor.getShapePageTransform(shape)
86
- if (!pageTransform) return false
87
-
88
- const indicatorPath = getIndicatorPath(editor, shape)
89
- if (!indicatorPath) return false
90
-
91
- ctx.save()
92
- ctx.transform(
93
- pageTransform.a,
94
- pageTransform.b,
95
- pageTransform.c,
96
- pageTransform.d,
97
- pageTransform.e,
98
- pageTransform.f
99
- )
100
- renderIndicatorPath(ctx, indicatorPath)
101
- ctx.restore()
102
-
103
- return true
104
- }
105
-
106
- function renderIndicatorPath(ctx: CanvasRenderingContext2D, indicatorPath: TLIndicatorPath) {
107
- if (indicatorPath instanceof Path2D) {
108
- ctx.stroke(indicatorPath)
109
- } else {
110
- const { path, clipPath, additionalPaths } = indicatorPath
111
-
112
- if (clipPath) {
113
- ctx.save()
114
- ctx.clip(clipPath, 'evenodd')
115
- ctx.stroke(path)
116
- ctx.restore()
117
- } else {
118
- ctx.stroke(path)
119
- }
120
-
121
- if (additionalPaths) {
122
- for (const additionalPath of additionalPaths) {
123
- ctx.stroke(additionalPath)
124
- }
125
- }
126
- }
127
- }
128
-
129
- /** @internal @react */
130
- export const CanvasShapeIndicators = memo(function CanvasShapeIndicators() {
131
- const editor = useEditor()
132
- const canvasRef = useRef<HTMLCanvasElement>(null)
133
-
134
- // Cache the selected color to avoid getComputedStyle on every render
135
- const rSelectedColor = useRef<string | null>(null)
136
- const colorMode = useColorMode()
137
-
138
- useEffect(() => {
139
- const timer = editor.timers.setTimeout(() => {
140
- rSelectedColor.current = null
141
- }, 0)
142
- return () => clearTimeout(timer)
143
- }, [colorMode, editor])
144
-
145
- // Get active peer IDs (already handles time-based state transitions)
146
- const activePeerIds$ = useActivePeerIds$()
147
-
148
- const $renderData = useComputed(
149
- 'indicator render data',
150
- () => {
151
- const renderingShapeIds = new Set(editor.getRenderingShapes().map((s) => s.id))
152
-
153
- // Compute ids to display for selected/hovered shapes
154
- const idsToDisplay = new Set<TLShapeId>()
155
- const instanceState = editor.getInstanceState()
156
- const isChangingStyle = instanceState.isChangingStyle
157
- const isIdleOrEditing = editor.isInAny('select.idle', 'select.editing_shape')
158
- const isInSelectState = editor.isInAny(
159
- 'select.brushing',
160
- 'select.scribble_brushing',
161
- 'select.pointing_shape',
162
- 'select.pointing_selection',
163
- 'select.pointing_handle'
164
- )
165
-
166
- if (!isChangingStyle && (isIdleOrEditing || isInSelectState)) {
167
- for (const id of editor.getSelectedShapeIds()) {
168
- idsToDisplay.add(id)
169
- }
170
- if (isIdleOrEditing && instanceState.isHoveringCanvas && !instanceState.isCoarsePointer) {
171
- const hovered = editor.getHoveredShapeId()
172
- if (hovered) idsToDisplay.add(hovered)
173
- }
174
- }
175
-
176
- // Compute hinting shape ids
177
- const hintingShapeIds = dedupe(editor.getHintingShapeIds())
178
-
179
- // Compute collaborator indicators
180
- const collaboratorIndicators: CollaboratorIndicatorData[] = []
181
- const currentPageId = editor.getCurrentPageId()
182
- const activePeerIds = activePeerIds$.get()
183
-
184
- const collaborators = editor.getCollaborators()
185
- for (const peerId of activePeerIds.values()) {
186
- // Skip collaborators on different pages
187
- const presence = collaborators.find((c) => c.userId === peerId)
188
- if (!presence || presence.currentPageId !== currentPageId) continue
189
-
190
- // Filter to shapes that are visible and on the current rendering set
191
- const visibleShapeIds = presence.selectedShapeIds.filter(
192
- (id) => renderingShapeIds.has(id) && !editor.isShapeHidden(id)
193
- )
194
-
195
- if (visibleShapeIds.length > 0) {
196
- collaboratorIndicators.push({
197
- color: presence.color,
198
- shapeIds: visibleShapeIds,
199
- })
200
- }
201
- }
202
-
203
- return {
204
- idsToDisplay,
205
- renderingShapeIds,
206
- hintingShapeIds,
207
- collaboratorIndicators,
208
- }
209
- },
210
- { isEqual: renderDataEqual },
211
- [editor, activePeerIds$]
212
- )
213
-
214
- useQuickReactor(
215
- 'canvas indicators render',
216
- () => {
217
- const canvas = canvasRef.current
218
- if (!canvas) return
219
-
220
- const ctx = canvas.getContext('2d')
221
- if (!ctx) return
222
-
223
- const { idsToDisplay, renderingShapeIds, hintingShapeIds, collaboratorIndicators } =
224
- $renderData.get()
225
-
226
- const { w, h } = editor.getViewportScreenBounds()
227
- const dpr = editor.getInstanceState().devicePixelRatio
228
- const { x: cx, y: cy, z: zoom } = editor.getCamera()
229
-
230
- const canvasWidth = Math.ceil(w * dpr)
231
- const canvasHeight = Math.ceil(h * dpr)
232
-
233
- if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) {
234
- canvas.width = canvasWidth
235
- canvas.height = canvasHeight
236
- canvas.style.width = `${w}px`
237
- canvas.style.height = `${h}px`
238
- }
239
-
240
- ctx.resetTransform()
241
- ctx.clearRect(0, 0, canvas.width, canvas.height)
242
-
243
- ctx.scale(dpr, dpr)
244
- ctx.scale(zoom, zoom)
245
- ctx.translate(cx, cy)
246
-
247
- ctx.lineCap = 'round'
248
- ctx.lineJoin = 'round'
249
-
250
- // Draw collaborator indicators first (underneath local indicators)
251
- // Use 0.5 opacity to match the original SVG-based collaborator indicators
252
- ctx.lineWidth = 1.5 / zoom
253
- for (const collaborator of collaboratorIndicators) {
254
- ctx.strokeStyle = collaborator.color
255
- ctx.globalAlpha = 0.7
256
- for (const shapeId of collaborator.shapeIds) {
257
- renderShapeIndicator(ctx, editor, shapeId, renderingShapeIds)
258
- }
259
- }
260
-
261
- // Reset alpha for local indicators
262
- ctx.globalAlpha = 1.0
263
-
264
- // Use cached color, only call getComputedStyle when cache is empty
265
- if (!rSelectedColor.current) {
266
- rSelectedColor.current = getComputedStyle(canvas).getPropertyValue('--tl-color-selected')
267
- }
268
-
269
- ctx.strokeStyle = rSelectedColor.current
270
-
271
- // Draw selected/hovered indicators (1.5px stroke)
272
- ctx.lineWidth = 1.5 / zoom
273
- for (const shapeId of idsToDisplay) {
274
- renderShapeIndicator(ctx, editor, shapeId, renderingShapeIds)
275
- }
276
-
277
- // Draw hinted indicators with a thicker stroke (2.5px)
278
- if (hintingShapeIds.length > 0) {
279
- ctx.lineWidth = 2.5 / zoom
280
- for (const shapeId of hintingShapeIds) {
281
- renderShapeIndicator(ctx, editor, shapeId, renderingShapeIds)
282
- }
283
- }
284
- },
285
- [editor, $renderData]
286
- )
287
-
288
- return <canvas ref={canvasRef} className="tl-canvas-indicators" />
289
- })
@@ -1,35 +0,0 @@
1
- import { BoxModel } from '@tldraw/tlschema'
2
- import { useRef } from 'react'
3
- import { useTransform } from '../../hooks/useTransform'
4
- import { toDomPrecision } from '../../primitives/utils'
5
-
6
- /** @public */
7
- export interface TLBrushProps {
8
- userId?: string
9
- brush: BoxModel
10
- color?: string
11
- opacity?: number
12
- className?: string
13
- }
14
-
15
- /** @public @react */
16
- export const DefaultBrush = ({ brush, color, opacity, className }: TLBrushProps) => {
17
- const rSvg = useRef<SVGSVGElement>(null)
18
- useTransform(rSvg, brush.x, brush.y)
19
-
20
- const w = toDomPrecision(Math.max(1, brush.w))
21
- const h = toDomPrecision(Math.max(1, brush.h))
22
-
23
- return (
24
- <svg className="tl-overlays__item" ref={rSvg} aria-hidden="true">
25
- {color ? (
26
- <g className="tl-brush" opacity={opacity}>
27
- <rect width={w} height={h} fill={color} opacity={0.75} />
28
- <rect width={w} height={h} fill="none" stroke={color} opacity={0.1} />
29
- </g>
30
- ) : (
31
- <rect className={`tl-brush tl-brush__default ${className}`} width={w} height={h} />
32
- )}
33
- </svg>
34
- )
35
- }
@@ -1,52 +0,0 @@
1
- import { VecModel } from '@tldraw/tlschema'
2
- import classNames from 'classnames'
3
- import { useRef } from 'react'
4
- import { useSharedSafeId } from '../../hooks/useSafeId'
5
- import { useTransform } from '../../hooks/useTransform'
6
- import { Box } from '../../primitives/Box'
7
- import { clamp } from '../../primitives/utils'
8
- import { Vec } from '../../primitives/Vec'
9
-
10
- /** @public */
11
- export interface TLCollaboratorHintProps {
12
- userId: string
13
- className?: string
14
- point: VecModel
15
- viewport: Box
16
- zoom: number
17
- opacity?: number
18
- color: string
19
- }
20
-
21
- /** @public @react */
22
- export function DefaultCollaboratorHint({
23
- className,
24
- zoom,
25
- point,
26
- color,
27
- viewport,
28
- opacity = 1,
29
- }: TLCollaboratorHintProps) {
30
- const rSvg = useRef<SVGSVGElement>(null)
31
-
32
- useTransform(
33
- rSvg,
34
- clamp(point.x, viewport.minX + 5 / zoom, viewport.maxX - 5 / zoom),
35
- clamp(point.y, viewport.minY + 5 / zoom, viewport.maxY - 5 / zoom),
36
- 1 / zoom,
37
- Vec.Angle(viewport.center, point)
38
- )
39
- const cursorHintId = useSharedSafeId('cursor_hint')
40
-
41
- return (
42
- <svg ref={rSvg} className={classNames('tl-overlays__item', className)} aria-hidden="true">
43
- <use
44
- href={`#${cursorHintId}`}
45
- color={color}
46
- strokeWidth={3}
47
- stroke="var(--tl-color-background)"
48
- />
49
- <use href={`#${cursorHintId}`} color={color} opacity={opacity} />
50
- </svg>
51
- )
52
- }