@tldraw/editor 3.16.0-canary.c349490eaef0 → 3.16.0-canary.c360426d8b7a
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.
- package/dist-cjs/index.d.ts +28 -27
- package/dist-cjs/index.js +4 -2
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +2 -0
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +4 -4
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +0 -29
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js +17 -17
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useDocumentEvents.js +4 -4
- package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +1 -1
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useHandleEvents.js +6 -6
- package/dist-cjs/lib/hooks/useHandleEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useSelectionEvents.js +8 -8
- package/dist-cjs/lib/hooks/useSelectionEvents.js.map +2 -2
- package/dist-cjs/lib/license/Watermark.js +2 -3
- package/dist-cjs/lib/license/Watermark.js.map +2 -2
- package/dist-cjs/lib/utils/dom.js +12 -1
- package/dist-cjs/lib/utils/dom.js.map +2 -2
- package/dist-cjs/lib/utils/getPointerInfo.js +3 -2
- package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +28 -27
- package/dist-esm/index.mjs +7 -3
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +2 -0
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -5
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +0 -29
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +24 -18
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs +10 -5
- package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useHandleEvents.mjs +12 -7
- package/dist-esm/lib/hooks/useHandleEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useSelectionEvents.mjs +15 -9
- package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +2 -2
- package/dist-esm/lib/license/Watermark.mjs +3 -4
- package/dist-esm/lib/license/Watermark.mjs.map +2 -2
- package/dist-esm/lib/utils/dom.mjs +12 -1
- package/dist-esm/lib/utils/dom.mjs.map +2 -2
- package/dist-esm/lib/utils/getPointerInfo.mjs +3 -2
- package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +2 -0
- package/src/lib/TldrawEditor.tsx +2 -0
- package/src/lib/components/default-components/DefaultCanvas.tsx +5 -5
- package/src/lib/editor/Editor.ts +0 -33
- package/src/lib/hooks/useCanvasEvents.ts +24 -18
- package/src/lib/hooks/useDocumentEvents.ts +10 -5
- package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +2 -2
- package/src/lib/hooks/useHandleEvents.ts +12 -7
- package/src/lib/hooks/useSelectionEvents.ts +15 -9
- package/src/lib/license/Watermark.tsx +3 -4
- package/src/lib/utils/dom.test.ts +24 -33
- package/src/lib/utils/dom.ts +31 -1
- package/src/lib/utils/getPointerInfo.ts +3 -3
- package/src/version.ts +3 -3
|
@@ -1,27 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { markEventAsHandled, wasEventAlreadyHandled } from './dom'
|
|
2
2
|
|
|
3
3
|
describe('Event handling utilities', () => {
|
|
4
|
-
let editor: TestEditor
|
|
5
|
-
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
editor = new TestEditor()
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
afterEach(() => {
|
|
11
|
-
editor.dispose()
|
|
12
|
-
})
|
|
13
4
|
describe('markEventAsHandled and wasEventAlreadyHandled', () => {
|
|
14
5
|
it('should track events as handled', () => {
|
|
15
6
|
const mockEvent = new PointerEvent('pointerdown', { pointerId: 1 })
|
|
16
7
|
|
|
17
8
|
// Initially, event should not be marked as handled
|
|
18
|
-
expect(
|
|
9
|
+
expect(wasEventAlreadyHandled(mockEvent)).toBe(false)
|
|
19
10
|
|
|
20
11
|
// Mark the event as handled
|
|
21
|
-
|
|
12
|
+
markEventAsHandled(mockEvent)
|
|
22
13
|
|
|
23
14
|
// Now it should be marked as handled
|
|
24
|
-
expect(
|
|
15
|
+
expect(wasEventAlreadyHandled(mockEvent)).toBe(true)
|
|
25
16
|
})
|
|
26
17
|
|
|
27
18
|
it('should work with React synthetic events', () => {
|
|
@@ -29,15 +20,15 @@ describe('Event handling utilities', () => {
|
|
|
29
20
|
const syntheticEvent = { nativeEvent }
|
|
30
21
|
|
|
31
22
|
// Initially not handled
|
|
32
|
-
expect(
|
|
33
|
-
expect(
|
|
23
|
+
expect(wasEventAlreadyHandled(syntheticEvent)).toBe(false)
|
|
24
|
+
expect(wasEventAlreadyHandled(nativeEvent)).toBe(false)
|
|
34
25
|
|
|
35
26
|
// Mark synthetic event as handled
|
|
36
|
-
|
|
27
|
+
markEventAsHandled(syntheticEvent)
|
|
37
28
|
|
|
38
29
|
// Both synthetic and native should be marked as handled
|
|
39
|
-
expect(
|
|
40
|
-
expect(
|
|
30
|
+
expect(wasEventAlreadyHandled(syntheticEvent)).toBe(true)
|
|
31
|
+
expect(wasEventAlreadyHandled(nativeEvent)).toBe(true)
|
|
41
32
|
})
|
|
42
33
|
|
|
43
34
|
it('should handle multiple different events independently', () => {
|
|
@@ -46,18 +37,18 @@ describe('Event handling utilities', () => {
|
|
|
46
37
|
const event3 = new MouseEvent('click')
|
|
47
38
|
|
|
48
39
|
// Mark only event1 as handled
|
|
49
|
-
|
|
40
|
+
markEventAsHandled(event1)
|
|
50
41
|
|
|
51
|
-
expect(
|
|
52
|
-
expect(
|
|
53
|
-
expect(
|
|
42
|
+
expect(wasEventAlreadyHandled(event1)).toBe(true)
|
|
43
|
+
expect(wasEventAlreadyHandled(event2)).toBe(false)
|
|
44
|
+
expect(wasEventAlreadyHandled(event3)).toBe(false)
|
|
54
45
|
|
|
55
46
|
// Mark event2 as handled
|
|
56
|
-
|
|
47
|
+
markEventAsHandled(event2)
|
|
57
48
|
|
|
58
|
-
expect(
|
|
59
|
-
expect(
|
|
60
|
-
expect(
|
|
49
|
+
expect(wasEventAlreadyHandled(event1)).toBe(true)
|
|
50
|
+
expect(wasEventAlreadyHandled(event2)).toBe(true)
|
|
51
|
+
expect(wasEventAlreadyHandled(event3)).toBe(false)
|
|
61
52
|
})
|
|
62
53
|
|
|
63
54
|
it('should not interfere with event properties', () => {
|
|
@@ -68,7 +59,7 @@ describe('Event handling utilities', () => {
|
|
|
68
59
|
})
|
|
69
60
|
|
|
70
61
|
// Mark as handled
|
|
71
|
-
|
|
62
|
+
markEventAsHandled(event)
|
|
72
63
|
|
|
73
64
|
// Event properties should remain unchanged
|
|
74
65
|
expect(event.pointerId).toBe(1)
|
|
@@ -87,17 +78,17 @@ describe('Event handling utilities', () => {
|
|
|
87
78
|
],
|
|
88
79
|
})
|
|
89
80
|
|
|
90
|
-
expect(
|
|
91
|
-
|
|
92
|
-
expect(
|
|
81
|
+
expect(wasEventAlreadyHandled(touchEvent)).toBe(false)
|
|
82
|
+
markEventAsHandled(touchEvent)
|
|
83
|
+
expect(wasEventAlreadyHandled(touchEvent)).toBe(true)
|
|
93
84
|
})
|
|
94
85
|
|
|
95
86
|
it('should work with keyboard events', () => {
|
|
96
87
|
const keyEvent = new KeyboardEvent('keydown', { key: 'Enter' })
|
|
97
88
|
|
|
98
|
-
expect(
|
|
99
|
-
|
|
100
|
-
expect(
|
|
89
|
+
expect(wasEventAlreadyHandled(keyEvent)).toBe(false)
|
|
90
|
+
markEventAsHandled(keyEvent)
|
|
91
|
+
expect(wasEventAlreadyHandled(keyEvent)).toBe(true)
|
|
101
92
|
})
|
|
102
93
|
})
|
|
103
94
|
})
|
package/src/lib/utils/dom.ts
CHANGED
|
@@ -81,13 +81,43 @@ export function releasePointerCapture(
|
|
|
81
81
|
/**
|
|
82
82
|
* Calls `event.stopPropagation()`.
|
|
83
83
|
*
|
|
84
|
-
* @deprecated Use {@link
|
|
84
|
+
* @deprecated Use {@link markEventAsHandled} instead, or manually call `event.stopPropagation()` if
|
|
85
85
|
* that's what you really want.
|
|
86
86
|
*
|
|
87
87
|
* @public
|
|
88
88
|
*/
|
|
89
89
|
export const stopEventPropagation = (e: any) => e.stopPropagation()
|
|
90
90
|
|
|
91
|
+
const handledEvents = new WeakSet<Event>()
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* In tldraw, events are sometimes handled by multiple components. For example, the shapes might
|
|
95
|
+
* have events, but the canvas handles events too. The way that the canvas handles events can
|
|
96
|
+
* interfere with the with the shapes event handlers - for example, it calls `.preventDefault()` on
|
|
97
|
+
* `pointerDown`, which also prevents `click` events from firing on the shapes.
|
|
98
|
+
*
|
|
99
|
+
* You can use `.stopPropagation()` to prevent the event from propagating to the rest of the DOM,
|
|
100
|
+
* but that can impact non-tldraw event handlers set up elsewhere. By using `markEventAsHandled`,
|
|
101
|
+
* you'll stop other parts of tldraw from handling the event without impacting other, non-tldraw
|
|
102
|
+
* event handlers. See also {@link wasEventAlreadyHandled}.
|
|
103
|
+
*
|
|
104
|
+
* @public
|
|
105
|
+
*/
|
|
106
|
+
export function markEventAsHandled(e: Event | { nativeEvent: Event }) {
|
|
107
|
+
const nativeEvent = 'nativeEvent' in e ? e.nativeEvent : e
|
|
108
|
+
handledEvents.add(nativeEvent)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Checks if an event has already been handled. See {@link markEventAsHandled}.
|
|
113
|
+
*
|
|
114
|
+
* @public
|
|
115
|
+
*/
|
|
116
|
+
export function wasEventAlreadyHandled(e: Event | { nativeEvent: Event }) {
|
|
117
|
+
const nativeEvent = 'nativeEvent' in e ? e.nativeEvent : e
|
|
118
|
+
return handledEvents.has(nativeEvent)
|
|
119
|
+
}
|
|
120
|
+
|
|
91
121
|
/** @internal */
|
|
92
122
|
export const setStyleProperty = (
|
|
93
123
|
elm: HTMLElement | null,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { markEventAsHandled } from './dom'
|
|
2
2
|
import { isAccelKey } from './keyboard'
|
|
3
3
|
|
|
4
4
|
/** @public */
|
|
5
|
-
export function getPointerInfo(
|
|
6
|
-
|
|
5
|
+
export function getPointerInfo(e: React.PointerEvent | PointerEvent) {
|
|
6
|
+
markEventAsHandled(e)
|
|
7
7
|
|
|
8
8
|
return {
|
|
9
9
|
point: {
|
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.16.0-canary.
|
|
4
|
+
export const version = '3.16.0-canary.c360426d8b7a'
|
|
5
5
|
export const publishDates = {
|
|
6
6
|
major: '2024-09-13T14:36:29.063Z',
|
|
7
|
-
minor: '2025-09-
|
|
8
|
-
patch: '2025-09-
|
|
7
|
+
minor: '2025-09-17T15:16:03.696Z',
|
|
8
|
+
patch: '2025-09-17T15:16:03.696Z',
|
|
9
9
|
}
|