@tldraw/editor 3.12.0-canary.5710af1760dc → 3.12.0-canary.5fcdc0f29d81

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 (51) hide show
  1. package/dist-cjs/index.d.ts +3 -0
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/components/Shape.js +10 -14
  4. package/dist-cjs/lib/components/Shape.js.map +2 -2
  5. package/dist-cjs/lib/editor/Editor.js +9 -2
  6. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  7. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +1 -1
  8. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +2 -2
  9. package/dist-cjs/lib/editor/managers/FontManager.js +1 -1
  10. package/dist-cjs/lib/editor/managers/FontManager.js.map +2 -2
  11. package/dist-cjs/lib/editor/tools/StateNode.js +4 -1
  12. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  13. package/dist-cjs/lib/hooks/useCanvasEvents.js +12 -7
  14. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +3 -3
  15. package/dist-cjs/lib/primitives/geometry/Group2d.js +1 -1
  16. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  17. package/dist-cjs/lib/utils/debug-flags.js +2 -1
  18. package/dist-cjs/lib/utils/debug-flags.js.map +2 -2
  19. package/dist-cjs/version.js +3 -3
  20. package/dist-cjs/version.js.map +1 -1
  21. package/dist-esm/index.d.mts +3 -0
  22. package/dist-esm/index.mjs +1 -1
  23. package/dist-esm/lib/components/Shape.mjs +11 -15
  24. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  25. package/dist-esm/lib/editor/Editor.mjs +9 -2
  26. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  27. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +1 -1
  28. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +2 -2
  29. package/dist-esm/lib/editor/managers/FontManager.mjs +1 -1
  30. package/dist-esm/lib/editor/managers/FontManager.mjs.map +2 -2
  31. package/dist-esm/lib/editor/tools/StateNode.mjs +4 -1
  32. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  33. package/dist-esm/lib/hooks/useCanvasEvents.mjs +12 -7
  34. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +3 -3
  35. package/dist-esm/lib/primitives/geometry/Group2d.mjs +1 -1
  36. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  37. package/dist-esm/lib/utils/debug-flags.mjs +2 -1
  38. package/dist-esm/lib/utils/debug-flags.mjs.map +2 -2
  39. package/dist-esm/version.mjs +3 -3
  40. package/dist-esm/version.mjs.map +1 -1
  41. package/editor.css +17 -11
  42. package/package.json +7 -7
  43. package/src/lib/components/Shape.tsx +15 -19
  44. package/src/lib/editor/Editor.ts +12 -3
  45. package/src/lib/editor/derivations/notVisibleShapes.ts +1 -1
  46. package/src/lib/editor/managers/FontManager.ts +1 -1
  47. package/src/lib/editor/tools/StateNode.ts +6 -1
  48. package/src/lib/hooks/useCanvasEvents.ts +14 -7
  49. package/src/lib/primitives/geometry/Group2d.ts +1 -1
  50. package/src/lib/utils/debug-flags.ts +1 -0
  51. package/src/version.ts +3 -3
@@ -1216,7 +1216,6 @@ export class Editor extends EventEmitter<TLEventMap> {
1216
1216
  run(fn: () => void, opts?: TLEditorRunOptions): this {
1217
1217
  const previousIgnoreShapeLock = this._shouldIgnoreShapeLock
1218
1218
  this._shouldIgnoreShapeLock = opts?.ignoreShapeLock ?? previousIgnoreShapeLock
1219
-
1220
1219
  try {
1221
1220
  this.history.batch(fn, opts)
1222
1221
  } finally {
@@ -8139,8 +8138,18 @@ export class Editor extends EventEmitter<TLEventMap> {
8139
8138
  if (!currentTool) return styles
8140
8139
 
8141
8140
  if (currentTool.shapeType) {
8142
- for (const style of this.styleProps[currentTool.shapeType].keys()) {
8143
- styles.applyValue(style, this.getStyleForNextShape(style))
8141
+ if (
8142
+ currentTool.shapeType === 'frame' &&
8143
+ !(this.getShapeUtil('frame')!.options as any).showColors
8144
+ ) {
8145
+ for (const style of this.styleProps[currentTool.shapeType].keys()) {
8146
+ if (style.id === 'tldraw:color') continue
8147
+ styles.applyValue(style, this.getStyleForNextShape(style))
8148
+ }
8149
+ } else {
8150
+ for (const style of this.styleProps[currentTool.shapeType].keys()) {
8151
+ styles.applyValue(style, this.getStyleForNextShape(style))
8152
+ }
8144
8153
  }
8145
8154
  }
8146
8155
 
@@ -31,7 +31,7 @@ export const notVisibleShapes = (editor: Editor) => {
31
31
  })
32
32
  return notVisibleShapes
33
33
  }
34
- return computed<Set<TLShapeId>>('getCulledShapes', (prevValue) => {
34
+ return computed<Set<TLShapeId>>('notVisibleShapes', (prevValue) => {
35
35
  if (isUninitialized(prevValue)) {
36
36
  return fromScratch(editor)
37
37
  }
@@ -94,7 +94,7 @@ export class FontManager {
94
94
  const shapeUtil = this.editor.getShapeUtil(shape)
95
95
  return shapeUtil.getFontFaces(shape)
96
96
  },
97
- { areResultsEqual: areArraysShallowEqual }
97
+ { areResultsEqual: areArraysShallowEqual, areRecordsEqual: (a, b) => a.props === b.props }
98
98
  )
99
99
 
100
100
  this.shapeFontLoadStateCache = editor.store.createCache<(FontState | null)[], TLShape>(
@@ -38,6 +38,7 @@ export interface TLStateNodeConstructor {
38
38
  initial?: string
39
39
  children?(): TLStateNodeConstructor[]
40
40
  isLockable: boolean
41
+ useCoalescedEvents: boolean
41
42
  }
42
43
 
43
44
  /** @public */
@@ -47,7 +48,8 @@ export abstract class StateNode implements Partial<TLEventHandlers> {
47
48
  public editor: Editor,
48
49
  parent?: StateNode
49
50
  ) {
50
- const { id, children, initial, isLockable } = this.constructor as TLStateNodeConstructor
51
+ const { id, children, initial, isLockable, useCoalescedEvents } = this
52
+ .constructor as TLStateNodeConstructor
51
53
 
52
54
  this.id = id
53
55
  this._isActive = atom<boolean>('toolIsActive' + this.id, false)
@@ -83,6 +85,7 @@ export abstract class StateNode implements Partial<TLEventHandlers> {
83
85
  }
84
86
  }
85
87
  this.isLockable = isLockable
88
+ this.useCoalescedEvents = useCoalescedEvents
86
89
  this.performanceTracker = new PerformanceTracker()
87
90
  }
88
91
 
@@ -90,6 +93,7 @@ export abstract class StateNode implements Partial<TLEventHandlers> {
90
93
  static initial?: string
91
94
  static children?: () => TLStateNodeConstructor[]
92
95
  static isLockable = true
96
+ static useCoalescedEvents = false
93
97
 
94
98
  id: string
95
99
  type: 'branch' | 'leaf' | 'root'
@@ -97,6 +101,7 @@ export abstract class StateNode implements Partial<TLEventHandlers> {
97
101
  initial?: string
98
102
  children?: Record<string, StateNode>
99
103
  isLockable: boolean
104
+ useCoalescedEvents: boolean
100
105
  parent: StateNode
101
106
 
102
107
  /**
@@ -1,3 +1,4 @@
1
+ import { useValue } from '@tldraw/state-react'
1
2
  import React, { useMemo } from 'react'
2
3
  import { RIGHT_MOUSE_BUTTON } from '../constants'
3
4
  import {
@@ -11,6 +12,7 @@ import { useEditor } from './useEditor'
11
12
 
12
13
  export function useCanvasEvents() {
13
14
  const editor = useEditor()
15
+ const currentTool = useValue('current tool', () => editor.getCurrentTool(), [editor])
14
16
 
15
17
  const events = useMemo(
16
18
  function canvasEvents() {
@@ -49,12 +51,17 @@ export function useCanvasEvents() {
49
51
  lastX = e.clientX
50
52
  lastY = e.clientY
51
53
 
52
- editor.dispatch({
53
- type: 'pointer',
54
- target: 'canvas',
55
- name: 'pointer_move',
56
- ...getPointerInfo(e),
57
- })
54
+ // For tools that benefit from a higher fidelity of events,
55
+ // we dispatch the coalesced events.
56
+ const events = currentTool.useCoalescedEvents ? e.nativeEvent.getCoalescedEvents() : [e]
57
+ for (const singleEvent of events) {
58
+ editor.dispatch({
59
+ type: 'pointer',
60
+ target: 'canvas',
61
+ name: 'pointer_move',
62
+ ...getPointerInfo(singleEvent),
63
+ })
64
+ }
58
65
  }
59
66
 
60
67
  function onPointerUp(e: React.PointerEvent) {
@@ -159,7 +166,7 @@ export function useCanvasEvents() {
159
166
  onClick,
160
167
  }
161
168
  },
162
- [editor]
169
+ [editor, currentTool]
163
170
  )
164
171
 
165
172
  return events
@@ -102,6 +102,6 @@ export class Group2d extends Geometry2d {
102
102
  }
103
103
 
104
104
  getSvgPathData(): string {
105
- return this.children.map((c, i) => (c.isLabel ? '' : c.getSvgPathData(i === 0))).join(' ')
105
+ return this.children.map((c) => (c.isLabel ? '' : c.getSvgPathData(true))).join(' ')
106
106
  }
107
107
  }
@@ -53,6 +53,7 @@ export const debugFlags = {
53
53
  debugGeometry: createDebugValue('debugGeometry', { defaults: { all: false } }),
54
54
  hideShapes: createDebugValue('hideShapes', { defaults: { all: false } }),
55
55
  editOnType: createDebugValue('editOnType', { defaults: { all: false } }),
56
+ a11y: createDebugValue('a11y', { defaults: { all: false } }),
56
57
  } as const
57
58
 
58
59
  declare global {
package/src/version.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '3.12.0-canary.5710af1760dc'
4
+ export const version = '3.12.0-canary.5fcdc0f29d81'
5
5
  export const publishDates = {
6
6
  major: '2024-09-13T14:36:29.063Z',
7
- minor: '2025-03-21T11:09:10.441Z',
8
- patch: '2025-03-21T11:09:10.441Z',
7
+ minor: '2025-03-28T16:17:55.091Z',
8
+ patch: '2025-03-28T16:17:55.091Z',
9
9
  }