@tldraw/editor 4.6.0-canary.ab4e1d4fd85b → 4.6.0-canary.abd30e51f1f3

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 (222) hide show
  1. package/dist-cjs/index.d.ts +387 -3
  2. package/dist-cjs/index.js +7 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/components/LiveCollaborators.js +1 -0
  5. package/dist-cjs/lib/components/LiveCollaborators.js.map +2 -2
  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/CanvasShapeIndicators.js +7 -0
  9. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +3 -3
  10. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +5 -2
  11. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +1 -1
  13. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js +1 -0
  15. package/dist-cjs/lib/components/default-components/DefaultShapeIndicators.js.map +2 -2
  16. package/dist-cjs/lib/editor/Editor.js +79 -5
  17. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  18. package/dist-cjs/lib/editor/assets/AssetUtil.js +1 -0
  19. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +1 -1
  20. package/dist-cjs/lib/editor/bindings/BindingUtil.js +1 -0
  21. package/dist-cjs/lib/editor/bindings/BindingUtil.js.map +1 -1
  22. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -0
  23. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +1 -1
  24. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +1 -0
  25. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +1 -1
  26. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js +1 -0
  27. package/dist-cjs/lib/editor/managers/FocusManager/FocusManager.js.map +1 -1
  28. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -0
  29. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +1 -1
  30. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js +2 -0
  31. package/dist-cjs/lib/editor/managers/HistoryManager/HistoryManager.js.map +1 -1
  32. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +12 -0
  33. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
  34. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js +80 -0
  35. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js.map +7 -0
  36. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +466 -0
  37. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +7 -0
  38. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js +17 -0
  39. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js.map +7 -0
  40. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js +1 -0
  41. package/dist-cjs/lib/editor/managers/ScribbleManager/ScribbleManager.js.map +1 -1
  42. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +1 -0
  43. package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +1 -1
  44. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js +1 -0
  45. package/dist-cjs/lib/editor/managers/SnapManager/HandleSnaps.js.map +1 -1
  46. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +2 -1
  47. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  48. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js +1 -0
  49. package/dist-cjs/lib/editor/managers/SpatialIndexManager/SpatialIndexManager.js.map +1 -1
  50. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js +1 -0
  51. package/dist-cjs/lib/editor/managers/TextManager/TextManager.js.map +1 -1
  52. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +1 -0
  53. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +1 -1
  54. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -0
  55. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +1 -1
  56. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +2 -0
  57. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +1 -1
  58. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +76 -0
  59. package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +7 -0
  60. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +13 -2
  61. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  62. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
  63. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  64. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
  65. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  66. package/dist-cjs/lib/editor/tools/StateNode.js +15 -17
  67. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  68. package/dist-cjs/lib/exports/ExportDelay.js +1 -0
  69. package/dist-cjs/lib/exports/ExportDelay.js.map +1 -1
  70. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -0
  71. package/dist-cjs/lib/exports/StyleEmbedder.js.map +1 -1
  72. package/dist-cjs/lib/exports/getSvgJsx.js +2 -1
  73. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  74. package/dist-cjs/lib/hooks/useCanvasEvents.js +25 -4
  75. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  76. package/dist-cjs/lib/options.js +2 -0
  77. package/dist-cjs/lib/options.js.map +2 -2
  78. package/dist-cjs/lib/primitives/Vec.js +3 -0
  79. package/dist-cjs/lib/primitives/Vec.js.map +1 -1
  80. package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -0
  81. package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +1 -1
  82. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -0
  83. package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +1 -1
  84. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +2 -0
  85. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +1 -1
  86. package/dist-cjs/lib/primitives/geometry/Stadium2d.js +1 -0
  87. package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +1 -1
  88. package/dist-cjs/lib/utils/EditorAtom.js +2 -0
  89. package/dist-cjs/lib/utils/EditorAtom.js.map +1 -1
  90. package/dist-cjs/lib/utils/runtime.js +2 -1
  91. package/dist-cjs/lib/utils/runtime.js.map +2 -2
  92. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +2 -0
  93. package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js.map +1 -1
  94. package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
  95. package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
  96. package/dist-cjs/version.js +3 -3
  97. package/dist-cjs/version.js.map +1 -1
  98. package/dist-esm/index.d.mts +387 -3
  99. package/dist-esm/index.mjs +7 -1
  100. package/dist-esm/index.mjs.map +2 -2
  101. package/dist-esm/lib/components/LiveCollaborators.mjs +1 -0
  102. package/dist-esm/lib/components/LiveCollaborators.mjs.map +2 -2
  103. package/dist-esm/lib/components/MenuClickCapture.mjs +100 -39
  104. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  105. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +7 -0
  106. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +3 -3
  107. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -2
  108. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  109. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -1
  110. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  111. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs +1 -0
  112. package/dist-esm/lib/components/default-components/DefaultShapeIndicators.mjs.map +2 -2
  113. package/dist-esm/lib/editor/Editor.mjs +80 -6
  114. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  115. package/dist-esm/lib/editor/assets/AssetUtil.mjs +1 -0
  116. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +1 -1
  117. package/dist-esm/lib/editor/bindings/BindingUtil.mjs +1 -0
  118. package/dist-esm/lib/editor/bindings/BindingUtil.mjs.map +1 -1
  119. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -0
  120. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +1 -1
  121. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +1 -0
  122. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +1 -1
  123. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs +1 -0
  124. package/dist-esm/lib/editor/managers/FocusManager/FocusManager.mjs.map +1 -1
  125. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -0
  126. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +1 -1
  127. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs +2 -0
  128. package/dist-esm/lib/editor/managers/HistoryManager/HistoryManager.mjs.map +1 -1
  129. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +12 -0
  130. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
  131. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
  132. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
  133. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
  134. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
  135. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
  136. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
  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/TickManager/TickManager.mjs +1 -0
  152. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +1 -1
  153. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +2 -0
  154. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +1 -1
  155. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +56 -0
  156. package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +7 -0
  157. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +13 -2
  158. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  159. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
  160. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  161. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
  162. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  163. package/dist-esm/lib/editor/tools/StateNode.mjs +15 -17
  164. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  165. package/dist-esm/lib/exports/ExportDelay.mjs +1 -0
  166. package/dist-esm/lib/exports/ExportDelay.mjs.map +1 -1
  167. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -0
  168. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +1 -1
  169. package/dist-esm/lib/exports/getSvgJsx.mjs +2 -1
  170. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  171. package/dist-esm/lib/hooks/useCanvasEvents.mjs +25 -4
  172. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  173. package/dist-esm/lib/options.mjs +2 -0
  174. package/dist-esm/lib/options.mjs.map +2 -2
  175. package/dist-esm/lib/primitives/Vec.mjs +3 -0
  176. package/dist-esm/lib/primitives/Vec.mjs.map +1 -1
  177. package/dist-esm/lib/primitives/geometry/Circle2d.mjs +1 -0
  178. package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +1 -1
  179. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +1 -0
  180. package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +1 -1
  181. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +2 -0
  182. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +1 -1
  183. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +1 -0
  184. package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +1 -1
  185. package/dist-esm/lib/utils/EditorAtom.mjs +2 -0
  186. package/dist-esm/lib/utils/EditorAtom.mjs.map +1 -1
  187. package/dist-esm/lib/utils/runtime.mjs +2 -1
  188. package/dist-esm/lib/utils/runtime.mjs.map +2 -2
  189. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +2 -0
  190. package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +1 -1
  191. package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
  192. package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
  193. package/dist-esm/version.mjs +3 -3
  194. package/dist-esm/version.mjs.map +1 -1
  195. package/editor.css +0 -4
  196. package/package.json +7 -7
  197. package/src/index.ts +16 -0
  198. package/src/lib/components/LiveCollaborators.tsx +8 -2
  199. package/src/lib/components/MenuClickCapture.tsx +129 -49
  200. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +11 -0
  201. package/src/lib/components/default-components/DefaultCanvas.tsx +6 -2
  202. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +2 -2
  203. package/src/lib/components/default-components/DefaultShapeIndicators.tsx +2 -0
  204. package/src/lib/editor/Editor.ts +103 -14
  205. package/src/lib/editor/managers/InputsManager/InputsManager.ts +12 -0
  206. package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
  207. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
  208. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
  209. package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
  210. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +13 -2
  211. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  212. package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +121 -0
  213. package/src/lib/editor/shapes/ShapeUtil.ts +13 -2
  214. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
  215. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
  216. package/src/lib/editor/tools/StateNode.ts +16 -18
  217. package/src/lib/exports/getSvgJsx.tsx +2 -1
  218. package/src/lib/hooks/useCanvasEvents.ts +40 -3
  219. package/src/lib/options.ts +14 -0
  220. package/src/lib/utils/runtime.ts +3 -1
  221. package/src/lib/utils/sync/hardReset.ts +0 -8
  222. package/src/version.ts +3 -3
@@ -220,6 +220,54 @@ export declare abstract class BaseBoxShapeUtil<Shape extends TLBaseBoxShape> ext
220
220
  getInterpolatedProps(startShape: Shape, endShape: Shape, t: number): Shape['props'];
221
221
  }
222
222
 
223
+ /**
224
+ * A base class for frame-like shapes — containers that clip their children,
225
+ * require full-brush selection, block erasure from inside, and support
226
+ * drag-and-drop reparenting.
227
+ *
228
+ * Extending this class is the easiest way to create a custom frame-like shape.
229
+ * It provides sensible defaults for all frame-like behaviors:
230
+ *
231
+ * - `isFrameLike()` returns `true`
232
+ * - `providesBackgroundForChildren()` returns `true`
233
+ * - `canReceiveNewChildrenOfType()` returns `true` unless the container is locked
234
+ * - `getClipPath()` returns the shape geometry's vertices
235
+ * - `onDragShapesIn()` reparents shapes into the frame (with index restoration)
236
+ * - `onDragShapesOut()` reparents shapes back to the page
237
+ *
238
+ * All methods can be overridden for custom behavior.
239
+ *
240
+ * @example
241
+ * ```ts
242
+ * class MyContainerUtil extends BaseFrameLikeShapeUtil<MyContainerShape> {
243
+ * static override type = 'my-container' as const
244
+ * static override props = myContainerShapeProps
245
+ *
246
+ * override getDefaultProps() {
247
+ * return { w: 300, h: 200 }
248
+ * }
249
+ *
250
+ * override component(shape: MyContainerShape) {
251
+ * return <SVGContainer>...</SVGContainer>
252
+ * }
253
+ *
254
+ * override indicator(shape: MyContainerShape) {
255
+ * return <rect width={shape.props.w} height={shape.props.h} />
256
+ * }
257
+ * }
258
+ * ```
259
+ *
260
+ * @public
261
+ */
262
+ export declare abstract class BaseFrameLikeShapeUtil<Shape extends TLBaseBoxShape> extends BaseBoxShapeUtil<Shape> {
263
+ isFrameLike(_shape: Shape): boolean;
264
+ providesBackgroundForChildren(): boolean;
265
+ canReceiveNewChildrenOfType(shape: Shape, _type: TLShape['type']): boolean;
266
+ getClipPath(shape: Shape): undefined | Vec[];
267
+ onDragShapesIn(shape: Shape, draggingShapes: TLShape[], { initialParentIds, initialIndices }: TLDragShapesInInfo): void;
268
+ onDragShapesOut(shape: Shape, draggingShapes: TLShape[], info: TLDragShapesOutInfo): void;
269
+ }
270
+
223
271
  /** @public */
224
272
  export declare interface BatchMeasurementRequest {
225
273
  html: string;
@@ -996,6 +1044,7 @@ export declare const defaultTldrawOptions: {
996
1044
  readonly onBeforePasteFromClipboard: undefined;
997
1045
  readonly onClipboardPasteRaw: undefined;
998
1046
  readonly quickZoomPreservesScreenBounds: true;
1047
+ readonly rightClickPanning: true;
999
1048
  readonly snapThreshold: 8;
1000
1049
  readonly spacebarPanning: true;
1001
1050
  readonly temporaryAssetPreviewLifetimeMs: 180000;
@@ -1004,6 +1053,7 @@ export declare const defaultTldrawOptions: {
1004
1053
  readonly tooltipDelayMs: 700;
1005
1054
  readonly uiCoarseDragDistanceSquared: 625;
1006
1055
  readonly uiDragDistanceSquared: 16;
1056
+ readonly useCanvasIndicators: true;
1007
1057
  readonly zoomToFitPadding: 128;
1008
1058
  };
1009
1059
 
@@ -1166,6 +1216,12 @@ export declare class Editor extends EventEmitter<TLEventMap> {
1166
1216
  * @public
1167
1217
  */
1168
1218
  readonly snaps: SnapManager;
1219
+ /**
1220
+ * A manager for performance measurement hooks.
1221
+ *
1222
+ * @public
1223
+ */
1224
+ readonly performance: PerformanceManager;
1169
1225
  /* Excluded from this release type: _spatialIndex */
1170
1226
  /**
1171
1227
  * A manager for the any asynchronous events and making sure they're
@@ -3116,6 +3172,20 @@ export declare class Editor extends EventEmitter<TLEventMap> {
3116
3172
  type: T['type'];
3117
3173
  }>;
3118
3174
  isShapeOfType<T extends TLShape = TLShape>(shapeId: TLShapeId, type: T['type']): boolean;
3175
+ /**
3176
+ * Get whether a shape behaves like a frame — a container that has child
3177
+ * shapes, requires full-brush selection, blocks erasure from inside, etc.
3178
+ *
3179
+ * @example
3180
+ * ```ts
3181
+ * const isFrameLike = editor.isShapeFrameLike(someShape)
3182
+ * ```
3183
+ *
3184
+ * @param shape - The shape (or shape id) to test.
3185
+ *
3186
+ * @public
3187
+ */
3188
+ isShapeFrameLike(shape: TLShape | TLShapeId): boolean;
3119
3189
  /**
3120
3190
  * Get a shape by its id.
3121
3191
  *
@@ -4775,7 +4845,7 @@ export declare class GroupShapeUtil extends ShapeUtil<TLGroupShape> {
4775
4845
  static type: "group";
4776
4846
  static props: RecordProps<TLGroupShape>;
4777
4847
  static migrations: TLPropsMigrations;
4778
- hideSelectionBoundsFg(): boolean;
4848
+ hideSelectionBoundsFg(shape: TLGroupShape): boolean;
4779
4849
  canBind(): boolean;
4780
4850
  canResize(): boolean;
4781
4851
  canResizeChildren(): boolean;
@@ -5061,6 +5131,12 @@ export declare class InputsManager {
5061
5131
  get isPointing(): boolean;
5062
5132
  set isPointing(isPointing: boolean);
5063
5133
  /* Excluded from this release type: setIsPointing */
5134
+ private _isRightPointing;
5135
+ /**
5136
+ * Whether the user is right-click pointing (before drag threshold).
5137
+ */
5138
+ getIsRightPointing(): boolean;
5139
+ /* Excluded from this release type: setIsRightPointing */
5064
5140
  private _isPinching;
5065
5141
  /**
5066
5142
  * Whether the user is pinching.
@@ -5417,6 +5493,94 @@ export declare function parseDeepLinkString(deepLinkString: string): TLDeepLink;
5417
5493
  /** @public */
5418
5494
  export declare type PerfectDashTerminal = 'none' | 'outset' | 'skip';
5419
5495
 
5496
+ /**
5497
+ * Optional adapter that pipes PerformanceManager events into browser
5498
+ * `performance.mark()` / `performance.measure()` for DevTools integration.
5499
+ *
5500
+ * Tree-shakeable — only included if imported.
5501
+ *
5502
+ * @example
5503
+ * ```ts
5504
+ * const adapter = new PerformanceApiAdapter(editor.performance)
5505
+ * // ... later
5506
+ * adapter.dispose()
5507
+ * ```
5508
+ *
5509
+ * @public
5510
+ */
5511
+ export declare class PerformanceApiAdapter {
5512
+ private cleanups;
5513
+ constructor(perfManager: PerformanceManager);
5514
+ /** Remove all listeners and stop piping events. @public */
5515
+ dispose(): void;
5516
+ }
5517
+
5518
+ /**
5519
+ * Manages performance event subscriptions for the editor. Available as `editor.performance`.
5520
+ *
5521
+ * Listeners are lazy — internal editor hooks (frame, shape events) are only attached while
5522
+ * at least one subscriber exists, so there is zero overhead when unused.
5523
+ *
5524
+ * @example
5525
+ * ```ts
5526
+ * const unsub = editor.performance.on('interaction-end', (event) => {
5527
+ * console.log(`${event.name}: ${event.fps.toFixed(1)} fps, p95=${event.p95FrameTime.toFixed(1)}ms`)
5528
+ * })
5529
+ * ```
5530
+ *
5531
+ * @public
5532
+ */
5533
+ export declare class PerformanceManager {
5534
+ /* Excluded from this release type: emitter */
5535
+ private editor;
5536
+ private activeInteraction;
5537
+ private activeCamera;
5538
+ private frameCleanup;
5539
+ private shapeCreatedCleanup;
5540
+ private shapeEditedCleanup;
5541
+ private shapeDeletedCleanup;
5542
+ private loafObserver;
5543
+ constructor(editor: Editor);
5544
+ /**
5545
+ * Subscribe to a performance event. Returns an unsubscribe function.
5546
+ *
5547
+ * @example
5548
+ * ```ts
5549
+ * const unsub = editor.performance.on('interaction-end', (event) => {
5550
+ * sendToAnalytics({ name: event.name, fps: event.fps, p95: event.p95FrameTime })
5551
+ * })
5552
+ * // later: unsub()
5553
+ * ```
5554
+ *
5555
+ * @public
5556
+ */
5557
+ on<K extends keyof TLPerfEventMap>(event: K, fn: (...args: TLPerfEventMap[K]) => void): () => void;
5558
+ /**
5559
+ * Subscribe to a performance event once. The listener is removed after the first invocation.
5560
+ * Returns an unsubscribe function for early removal.
5561
+ *
5562
+ * @public
5563
+ */
5564
+ once<K extends keyof TLPerfEventMap>(event: K, fn: (...args: TLPerfEventMap[K]) => void): () => void;
5565
+ /* Excluded from this release type: dispose */
5566
+ /* Excluded from this release type: _notifyInteractionStart */
5567
+ /* Excluded from this release type: _notifyInteractionEnd */
5568
+ /* Excluded from this release type: _notifyCameraOperation */
5569
+ /* Excluded from this release type: _notifyUndoRedo */
5570
+ private _startCameraSession;
5571
+ private _endCameraSession;
5572
+ private _onFrame;
5573
+ private _onShapesCreated;
5574
+ private _onShapesEdited;
5575
+ private _onShapesDeleted;
5576
+ private _startLoafObserver;
5577
+ private _stopLoafObserver;
5578
+ private _needsFrameListener;
5579
+ private _needsLoafObserver;
5580
+ private _maybeAttachLazyListeners;
5581
+ private _maybeDetachLazyListeners;
5582
+ }
5583
+
5420
5584
  /**
5421
5585
  * Find the approximate perimeter of an ellipse.
5422
5586
  *
@@ -6008,7 +6172,7 @@ export declare abstract class ShapeUtil<Shape extends TLShape = TLShape> {
6008
6172
  *
6009
6173
  * @public
6010
6174
  */
6011
- canBind(_opts: TLShapeUtilCanBindOpts): boolean;
6175
+ canBind(opts: TLShapeUtilCanBindOpts): boolean;
6012
6176
  /**
6013
6177
  * Whether the shape can be double clicked to edit.
6014
6178
  *
@@ -6142,6 +6306,14 @@ export declare abstract class ShapeUtil<Shape extends TLShape = TLShape> {
6142
6306
  * @public
6143
6307
  */
6144
6308
  isAspectRatioLocked(shape: Shape): boolean;
6309
+ /**
6310
+ * Whether the shape behaves like a frame — a container that has child shapes,
6311
+ * requires full-brush selection, blocks erasure from inside, etc.
6312
+ *
6313
+ * @param shape - The shape.
6314
+ * @public
6315
+ */
6316
+ isFrameLike(_shape: Shape): boolean;
6145
6317
  /**
6146
6318
  * By default, the bounds of an image export are the bounds of all the shapes it contains, plus
6147
6319
  * some padding. If an export includes a shape where `isExportBoundsContainer` is true, then the
@@ -6189,7 +6361,7 @@ export declare abstract class ShapeUtil<Shape extends TLShape = TLShape> {
6189
6361
  * @param type - The shape type.
6190
6362
  * @public
6191
6363
  */
6192
- canReceiveNewChildrenOfType(shape: Shape, _type: TLShape['type']): boolean;
6364
+ canReceiveNewChildrenOfType(shape: Shape, type: TLShape['type']): boolean;
6193
6365
  /**
6194
6366
  * Get the shape as an SVG object.
6195
6367
  *
@@ -6632,6 +6804,8 @@ export declare abstract class StateNode implements Partial<TLEventHandlers> {
6632
6804
  static children?: () => TLStateNodeConstructor[];
6633
6805
  static isLockable: boolean;
6634
6806
  static useCoalescedEvents: boolean;
6807
+ /** Set to `true` in subclasses to emit interaction-start/end performance events when this state is entered/exited. */
6808
+ static trackPerformance: boolean;
6635
6809
  id: string;
6636
6810
  type: 'branch' | 'leaf' | 'root';
6637
6811
  shapeType?: string;
@@ -7005,6 +7179,29 @@ export declare interface TLCameraConstraints {
7005
7179
  };
7006
7180
  }
7007
7181
 
7182
+ /**
7183
+ * Emitted when a camera operation ends (after a 50ms debounce), with aggregated frame time stats.
7184
+ * @public
7185
+ */
7186
+ export declare interface TLCameraEndPerfEvent extends TLPerfFrameTimeStats {
7187
+ /** Whether this was a pan or zoom operation. */
7188
+ type: 'panning' | 'zooming';
7189
+ /** Total shapes on the current page. */
7190
+ shapeCount: number;
7191
+ /** Number of shapes visible (not culled) in the viewport. */
7192
+ visibleShapeCount: number;
7193
+ /** Number of shapes culled (off-screen) from rendering. */
7194
+ culledShapeCount: number;
7195
+ /** Viewport width in screen pixels. */
7196
+ viewportWidth: number;
7197
+ /** Viewport height in screen pixels. */
7198
+ viewportHeight: number;
7199
+ /** Camera zoom level (`camera.z`) at session end. */
7200
+ zoomLevel: number;
7201
+ /** `performance.now()` when the camera session ended. */
7202
+ timestamp: number;
7203
+ }
7204
+
7008
7205
  /** @public */
7009
7206
  export declare interface TLCameraMoveOptions {
7010
7207
  /** Whether to move the camera immediately, rather than on the next tick. */
@@ -7043,6 +7240,17 @@ export declare interface TLCameraOptions {
7043
7240
  constraints?: TLCameraConstraints;
7044
7241
  }
7045
7242
 
7243
+ /**
7244
+ * Emitted when a camera operation (pan or zoom) begins.
7245
+ * @public
7246
+ */
7247
+ export declare interface TLCameraStartPerfEvent {
7248
+ /** Whether this is a pan or zoom operation. */
7249
+ type: 'panning' | 'zooming';
7250
+ /** `performance.now()` when the camera session started. */
7251
+ timestamp: number;
7252
+ }
7253
+
7046
7254
  /** @public */
7047
7255
  export declare type TLCancelEvent = (info: TLCancelEventInfo) => void;
7048
7256
 
@@ -7530,6 +7738,12 @@ export declare interface TldrawOptions {
7530
7738
  * When false, the spacebar will not pan the camera.
7531
7739
  */
7532
7740
  readonly spacebarPanning: boolean;
7741
+ /**
7742
+ * Whether to allow right-click + drag to pan the camera. When true, right-click + drag pans the
7743
+ * camera and a static right-click opens the context menu at the release position. When false,
7744
+ * right-click opens the context menu on press (no drag-to-pan).
7745
+ */
7746
+ readonly rightClickPanning: boolean;
7533
7747
  /**
7534
7748
  * The default padding (in pixels) used when zooming to fit content in the viewport.
7535
7749
  * This affects methods like `zoomToFit()`, `zoomToSelection()`, and `zoomToBounds()`.
@@ -7572,6 +7786,12 @@ export declare interface TldrawOptions {
7572
7786
  * viewport's page dimensions regardless of overview zoom changes.
7573
7787
  */
7574
7788
  readonly quickZoomPreservesScreenBounds: boolean;
7789
+ /**
7790
+ * Whether to use 2D canvas rendering for shape indicators. When true (default),
7791
+ * shapes that support it will render indicators on a 2D canvas for better
7792
+ * performance. When false, all indicators use legacy SVG rendering.
7793
+ */
7794
+ readonly useCanvasIndicators: boolean;
7575
7795
  /**
7576
7796
  * Called before content is written to the clipboard during a copy or cut operation.
7577
7797
  * Receives the serialized content (shapes, bindings, assets) and can filter or transform
@@ -7981,6 +8201,21 @@ export declare interface TLFilesExternalContent extends TLBaseExternalContent {
7981
8201
  ignoreParent?: boolean;
7982
8202
  }
7983
8203
 
8204
+ /**
8205
+ * Emitted every animation frame when at least one `'frame'` listener is registered.
8206
+ * @public
8207
+ */
8208
+ export declare interface TLFramePerfEvent {
8209
+ /** Time since the last frame in ms. */
8210
+ elapsed: number;
8211
+ /** Total shapes on the current page. */
8212
+ shapeCount: number;
8213
+ /** Number of shapes culled (off-screen) from rendering. */
8214
+ culledShapeCount: number;
8215
+ /** Number of shapes visible (not culled) in the viewport. */
8216
+ visibleShapeCount: number;
8217
+ }
8218
+
7984
8219
  /** Additional options for the {@link ShapeUtil.getGeometry} method.
7985
8220
  *
7986
8221
  * @public
@@ -8123,6 +8358,38 @@ export declare type TLIndicatorPath = {
8123
8358
  path: Path2D;
8124
8359
  } | Path2D;
8125
8360
 
8361
+ /**
8362
+ * Emitted when an interaction state is exited, with aggregated frame time stats.
8363
+ * @public
8364
+ */
8365
+ export declare interface TLInteractionEndPerfEvent extends TLPerfFrameTimeStats {
8366
+ /** The state node id (e.g. `'translating'`). */
8367
+ name: string;
8368
+ /** Full tool path (e.g. `'select.translating'`). */
8369
+ path: string;
8370
+ /** Total shapes on the current page. */
8371
+ shapeCount: number;
8372
+ /** Breakdown of selected shape types at interaction start (e.g. `{ geo: 2, draw: 1 }`). */
8373
+ selectedShapeTypes: Record<string, number>;
8374
+ /** Camera zoom level (`camera.z`) at interaction end. */
8375
+ zoomLevel: number;
8376
+ /** `performance.now()` when the interaction ended. */
8377
+ timestamp: number;
8378
+ }
8379
+
8380
+ /**
8381
+ * Emitted when an interaction state (e.g. translating, resizing) is entered.
8382
+ * @public
8383
+ */
8384
+ export declare interface TLInteractionStartPerfEvent {
8385
+ /** The state node id (e.g. `'translating'`). */
8386
+ name: string;
8387
+ /** Full tool path (e.g. `'select.translating'`). */
8388
+ path: string;
8389
+ /** `performance.now()` when the interaction started. */
8390
+ timestamp: number;
8391
+ }
8392
+
8126
8393
  /** @public */
8127
8394
  export declare type TLInterruptEvent = (info: TLInterruptEventInfo) => void;
8128
8395
 
@@ -8370,6 +8637,94 @@ export declare const tlmenus: {
8370
8637
  */
8371
8638
  export declare type TLOnMountHandler = (editor: Editor) => (() => undefined | void) | undefined | void;
8372
8639
 
8640
+ /**
8641
+ * Map of all performance event names to their payload types.
8642
+ * Used with {@link PerformanceManager.on} and {@link PerformanceManager.once}.
8643
+ * @public
8644
+ */
8645
+ export declare interface TLPerfEventMap {
8646
+ /** An interaction state was entered. */
8647
+ 'interaction-start': [TLInteractionStartPerfEvent];
8648
+ /** An interaction state was exited, with aggregated frame time stats. */
8649
+ 'interaction-end': [TLInteractionEndPerfEvent];
8650
+ /** A camera operation (pan/zoom) began. */
8651
+ 'camera-start': [TLCameraStartPerfEvent];
8652
+ /** A camera operation ended (after debounce), with aggregated frame time stats. */
8653
+ 'camera-end': [TLCameraEndPerfEvent];
8654
+ /** Shapes were created. */
8655
+ 'shapes-created': [TLShapeOperationPerfEvent];
8656
+ /** Shapes were updated. */
8657
+ 'shapes-updated': [TLShapeOperationPerfEvent];
8658
+ /** Shapes were deleted. */
8659
+ 'shapes-deleted': [TLShapeOperationPerfEvent];
8660
+ /** An animation frame was rendered. Only fires when listeners are registered. */
8661
+ frame: [TLFramePerfEvent];
8662
+ /** An undo operation was performed. */
8663
+ undo: [TLUndoRedoPerfEvent];
8664
+ /** A redo operation was performed. */
8665
+ redo: [TLUndoRedoPerfEvent];
8666
+ }
8667
+
8668
+ /**
8669
+ * Common frame time statistics shared by interaction and camera end events.
8670
+ * @public
8671
+ */
8672
+ export declare interface TLPerfFrameTimeStats {
8673
+ /** Total duration of the session in ms. */
8674
+ duration: number;
8675
+ /** Average frames per second during the session. */
8676
+ fps: number;
8677
+ /** Total number of frames recorded. */
8678
+ frameCount: number;
8679
+ /** Mean frame duration in ms. */
8680
+ avgFrameTime: number;
8681
+ /** Median (p50) frame duration in ms. */
8682
+ medianFrameTime: number;
8683
+ /** 95th percentile frame duration in ms. */
8684
+ p95FrameTime: number;
8685
+ /** 99th percentile frame duration in ms. */
8686
+ p99FrameTime: number;
8687
+ /** Shortest frame duration in ms. */
8688
+ minFrameTime: number;
8689
+ /** Longest frame duration in ms. */
8690
+ maxFrameTime: number;
8691
+ /** Raw frame durations for local analysis. Exclude when sending to analytics. */
8692
+ frameTimes: number[];
8693
+ /**
8694
+ * Long animation frames observed during this period (Chromium 123+).
8695
+ * Only present when the browser supports the Long Animation Frames API and
8696
+ * at least one long frame was observed.
8697
+ * Exclude when sending to analytics — entries are large and contain script URLs.
8698
+ */
8699
+ longAnimationFrames?: TLPerfLongAnimationFrame[];
8700
+ }
8701
+
8702
+ /**
8703
+ * A long animation frame observed by the browser during an interaction.
8704
+ * Available only in browsers that support the Long Animation Frames API (Chromium 123+).
8705
+ * @public
8706
+ */
8707
+ export declare interface TLPerfLongAnimationFrame {
8708
+ /** Frame start time (relative to timeOrigin). */
8709
+ startTime: number;
8710
+ /** Total frame duration in ms. */
8711
+ duration: number;
8712
+ /** Time the main thread was blocked in ms. */
8713
+ blockingDuration: number;
8714
+ /** Scripts that contributed to the long frame. */
8715
+ scripts: TLPerfLongAnimationFrameScript[];
8716
+ }
8717
+
8718
+ /** A script attribution entry from a long animation frame. @public */
8719
+ export declare interface TLPerfLongAnimationFrameScript {
8720
+ /** The script source URL (may be empty for inline scripts). */
8721
+ sourceURL: string;
8722
+ /** The function name or invoker description. */
8723
+ invoker: string;
8724
+ /** Time spent in this script in ms. */
8725
+ duration: number;
8726
+ }
8727
+
8373
8728
  /** @public */
8374
8729
  export declare type TLPinchEvent = (info: TLPinchEventInfo) => void;
8375
8730
 
@@ -8557,6 +8912,21 @@ export declare interface TLShapeIndicatorsProps {
8557
8912
  showAll?: boolean;
8558
8913
  }
8559
8914
 
8915
+ /**
8916
+ * Emitted when shapes are created, updated, or deleted.
8917
+ * @public
8918
+ */
8919
+ export declare interface TLShapeOperationPerfEvent {
8920
+ /** The operation type. */
8921
+ operation: 'create' | 'delete' | 'update';
8922
+ /** Number of shapes affected. */
8923
+ count: number;
8924
+ /** Breakdown by shape type (e.g. `{ geo: 2, draw: 1 }`). */
8925
+ shapeTypes: Record<string, number>;
8926
+ /** `performance.now()` when the operation occurred. */
8927
+ timestamp: number;
8928
+ }
8929
+
8560
8930
  /**
8561
8931
  * Options passed to {@link ShapeUtil.canBeLaidOut}.
8562
8932
  *
@@ -8642,6 +9012,7 @@ export declare interface TLStateNodeConstructor {
8642
9012
  children?(): TLStateNodeConstructor[];
8643
9013
  isLockable: boolean;
8644
9014
  useCoalescedEvents: boolean;
9015
+ trackPerformance: boolean;
8645
9016
  }
8646
9017
 
8647
9018
  /** @public */
@@ -8819,6 +9190,19 @@ export declare interface TLTldrawExternalContentSource {
8819
9190
  data: TLContent;
8820
9191
  }
8821
9192
 
9193
+ /**
9194
+ * Emitted after an undo or redo operation.
9195
+ * @public
9196
+ */
9197
+ export declare interface TLUndoRedoPerfEvent {
9198
+ /** Whether this was an undo or redo. */
9199
+ type: 'redo' | 'undo';
9200
+ /** Number of undo steps remaining. */
9201
+ undoDepth: number;
9202
+ /** Number of redo steps remaining. */
9203
+ redoDepth: number;
9204
+ }
9205
+
8822
9206
  /** @public */
8823
9207
  export declare interface TLUpdatePointerOptions {
8824
9208
  /** Whether to update the pointer immediately, rather than on the next tick. */
package/dist-cjs/index.js CHANGED
@@ -23,6 +23,7 @@ __export(index_exports, {
23
23
  AssetUtil: () => import_AssetUtil.AssetUtil,
24
24
  BaseBoxShapeTool: () => import_BaseBoxShapeTool.BaseBoxShapeTool,
25
25
  BaseBoxShapeUtil: () => import_BaseBoxShapeUtil.BaseBoxShapeUtil,
26
+ BaseFrameLikeShapeUtil: () => import_BaseFrameLikeShapeUtil.BaseFrameLikeShapeUtil,
26
27
  BindingUtil: () => import_BindingUtil.BindingUtil,
27
28
  BoundsSnaps: () => import_BoundsSnaps.BoundsSnaps,
28
29
  Box: () => import_Box.Box,
@@ -82,6 +83,8 @@ __export(index_exports, {
82
83
  OptionalErrorBoundary: () => import_ErrorBoundary.OptionalErrorBoundary,
83
84
  PI: () => import_utils2.PI,
84
85
  PI2: () => import_utils2.PI2,
86
+ PerformanceApiAdapter: () => import_PerformanceApiAdapter.PerformanceApiAdapter,
87
+ PerformanceManager: () => import_PerformanceManager.PerformanceManager,
85
88
  Point2d: () => import_Point2d.Point2d,
86
89
  Polygon2d: () => import_Polygon2d.Polygon2d,
87
90
  Polyline2d: () => import_Polyline2d.Polyline2d,
@@ -301,8 +304,11 @@ var import_TextManager = require("./lib/editor/managers/TextManager/TextManager"
301
304
  var import_defaultThemes = require("./lib/editor/managers/ThemeManager/defaultThemes");
302
305
  var import_ThemeManager = require("./lib/editor/managers/ThemeManager/ThemeManager");
303
306
  var import_TickManager = require("./lib/editor/managers/TickManager/TickManager");
307
+ var import_PerformanceApiAdapter = require("./lib/editor/managers/PerformanceManager/PerformanceApiAdapter");
308
+ var import_PerformanceManager = require("./lib/editor/managers/PerformanceManager/PerformanceManager");
304
309
  var import_UserPreferencesManager = require("./lib/editor/managers/UserPreferencesManager/UserPreferencesManager");
305
310
  var import_BaseBoxShapeUtil = require("./lib/editor/shapes/BaseBoxShapeUtil");
311
+ var import_BaseFrameLikeShapeUtil = require("./lib/editor/shapes/BaseFrameLikeShapeUtil");
306
312
  var import_GroupShapeUtil = require("./lib/editor/shapes/group/GroupShapeUtil");
307
313
  var import_ShapeUtil = require("./lib/editor/shapes/ShapeUtil");
308
314
  var import_getPerfectDashProps = require("./lib/editor/shapes/shared/getPerfectDashProps");
@@ -385,7 +391,7 @@ var import_uniq = require("./lib/utils/uniq");
385
391
  var import_defaultThemes2 = require("./lib/editor/managers/ThemeManager/defaultThemes");
386
392
  (0, import_utils.registerTldrawLibraryVersion)(
387
393
  "@tldraw/editor",
388
- "4.6.0-canary.ab4e1d4fd85b",
394
+ "4.6.0-canary.abd30e51f1f3",
389
395
  "cjs"
390
396
  );
391
397
  //# sourceMappingURL=index.js.map