@tldraw/editor 5.4.0-canary.042da660fa66 → 5.4.0-canary.059d049864ed
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 +31 -1
- package/dist-cjs/index.js +1 -1
- package/dist-cjs/lib/components/MenuClickCapture.js +6 -8
- package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
- package/dist-cjs/lib/components/default-components/CanvasOverlays.js +1 -3
- package/dist-cjs/lib/components/default-components/CanvasOverlays.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +1 -1
- package/dist-cjs/lib/config/TLUserPreferences.js +6 -2
- package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
- package/dist-cjs/lib/config/createTLStore.js +1 -1
- package/dist-cjs/lib/config/createTLStore.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +139 -268
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js +8 -8
- package/dist-cjs/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js +2 -1
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +79 -6
- package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js +0 -2
- package/dist-cjs/lib/editor/managers/SnapManager/BoundsSnaps.js.map +2 -2
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +1 -0
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
- package/dist-cjs/lib/editor/overlays/OverlayManager.js +3 -7
- package/dist-cjs/lib/editor/overlays/OverlayManager.js.map +2 -2
- package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js +0 -1
- package/dist-cjs/lib/editor/overlays/strokeShapeIndicators.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js +3 -1
- package/dist-cjs/lib/editor/shapes/BaseFrameLikeShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +1 -0
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +1 -1
- package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
- package/dist-cjs/lib/editor/tools/StateNode.js +3 -2
- package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
- package/dist-cjs/lib/globals/menus.js +9 -4
- package/dist-cjs/lib/globals/menus.js.map +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js +2 -0
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useDocumentEvents.js +9 -7
- package/dist-cjs/lib/hooks/useDocumentEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useLocalStore.js +10 -6
- package/dist-cjs/lib/hooks/useLocalStore.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js +1 -0
- package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePeerIds.js +2 -1
- package/dist-cjs/lib/hooks/usePeerIds.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +2 -1
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +4 -3
- package/dist-cjs/lib/primitives/Vec.js.map +2 -2
- package/dist-cjs/lib/primitives/utils.js +2 -1
- package/dist-cjs/lib/primitives/utils.js.map +2 -2
- package/dist-cjs/lib/utils/rotation.js +1 -9
- package/dist-cjs/lib/utils/rotation.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 +31 -1
- package/dist-esm/index.mjs +1 -1
- package/dist-esm/lib/components/MenuClickCapture.mjs +6 -8
- package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/CanvasOverlays.mjs +1 -3
- package/dist-esm/lib/components/default-components/CanvasOverlays.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +1 -1
- package/dist-esm/lib/config/TLUserPreferences.mjs +6 -2
- package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
- package/dist-esm/lib/config/createTLStore.mjs +1 -1
- package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +147 -269
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs +9 -9
- package/dist-esm/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs +2 -1
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +81 -8
- package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs +0 -2
- package/dist-esm/lib/editor/managers/SnapManager/BoundsSnaps.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +1 -0
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
- package/dist-esm/lib/editor/overlays/OverlayManager.mjs +3 -7
- package/dist-esm/lib/editor/overlays/OverlayManager.mjs.map +2 -2
- package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs +0 -1
- package/dist-esm/lib/editor/overlays/strokeShapeIndicators.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs +3 -1
- package/dist-esm/lib/editor/shapes/BaseFrameLikeShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +1 -0
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +1 -1
- package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/StateNode.mjs +3 -2
- package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
- package/dist-esm/lib/globals/menus.mjs +9 -4
- package/dist-esm/lib/globals/menus.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +2 -0
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs +9 -7
- package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useLocalStore.mjs +11 -7
- package/dist-esm/lib/hooks/useLocalStore.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs +1 -0
- package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePeerIds.mjs +2 -1
- package/dist-esm/lib/hooks/usePeerIds.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +2 -1
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +4 -3
- package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
- package/dist-esm/lib/primitives/utils.mjs +2 -1
- package/dist-esm/lib/primitives/utils.mjs.map +2 -2
- package/dist-esm/lib/utils/rotation.mjs +1 -9
- package/dist-esm/lib/utils/rotation.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/lib/components/MenuClickCapture.tsx +19 -18
- package/src/lib/components/default-components/CanvasOverlays.tsx +1 -3
- package/src/lib/components/default-components/DefaultErrorFallback.tsx +1 -1
- package/src/lib/config/TLUserPreferences.test.ts +18 -1
- package/src/lib/config/TLUserPreferences.ts +8 -4
- package/src/lib/config/createTLStore.ts +1 -1
- package/src/lib/editor/Editor.ts +196 -341
- package/src/lib/editor/managers/CollaboratorsManager/CollaboratorsManager.ts +9 -9
- package/src/lib/editor/managers/FontManager/FontManager.ts +2 -1
- package/src/lib/editor/managers/InputsManager/InputsManager.test.ts +199 -3
- package/src/lib/editor/managers/InputsManager/InputsManager.ts +128 -9
- package/src/lib/editor/managers/SnapManager/BoundsSnaps.ts +0 -2
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +1 -0
- package/src/lib/editor/overlays/OverlayManager.ts +3 -7
- package/src/lib/editor/overlays/strokeShapeIndicators.ts +0 -1
- package/src/lib/editor/shapes/BaseFrameLikeShapeUtil.tsx +5 -1
- package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +3 -0
- package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +4 -1
- package/src/lib/editor/tools/StateNode.test.ts +64 -0
- package/src/lib/editor/tools/StateNode.ts +12 -2
- package/src/lib/globals/menus.test.ts +33 -0
- package/src/lib/globals/menus.ts +11 -4
- package/src/lib/hooks/useCanvasEvents.ts +2 -0
- package/src/lib/hooks/useDocumentEvents.ts +14 -7
- package/src/lib/hooks/useLocalStore.ts +16 -8
- package/src/lib/hooks/usePassThroughWheelEvents.ts +3 -0
- package/src/lib/hooks/usePeerIds.ts +2 -1
- package/src/lib/primitives/Box.test.ts +9 -1
- package/src/lib/primitives/Box.ts +3 -1
- package/src/lib/primitives/Vec.test.ts +10 -0
- package/src/lib/primitives/Vec.ts +4 -4
- package/src/lib/primitives/utils.test.ts +10 -1
- package/src/lib/primitives/utils.ts +4 -1
- package/src/lib/test/useCanvasEvents.test.tsx +74 -0
- package/src/lib/test/useDocumentEvents.test.tsx +31 -0
- package/src/lib/test/usePassThroughWheelEvents.test.tsx +25 -2
- package/src/lib/utils/rotation.ts +4 -12
- package/src/version.ts +3 -3
|
@@ -72,6 +72,22 @@ export function MenuClickCapture() {
|
|
|
72
72
|
const button = getPointerEventButton(e)
|
|
73
73
|
if (button !== 0 && button !== 2) return
|
|
74
74
|
|
|
75
|
+
if (button === 2 && editor.options.rightClickPanning) {
|
|
76
|
+
// Forward right-click pointerdown through the canvas's own handler so
|
|
77
|
+
// pointer capture is set on the canvas (load-bearing: without this
|
|
78
|
+
// the context menu briefly flashes closed during consecutive right-clicks).
|
|
79
|
+
// The canvas owns the rest of the gesture, so don't capture or mark
|
|
80
|
+
// pointing here: this element's pointerup would never fire, leaving it
|
|
81
|
+
// mounted over the canvas after the menu closes.
|
|
82
|
+
// We don't clearOpenMenus() — Radix's DismissableLayer closes the menu
|
|
83
|
+
// via outside-click detection, keeping its internal state in sync.
|
|
84
|
+
const canvas =
|
|
85
|
+
editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas') ?? e.currentTarget
|
|
86
|
+
canvasEvents.onPointerDown?.({ ...e, currentTarget: canvas })
|
|
87
|
+
swallowNextNativeContextMenu()
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
75
91
|
flushSync(() => setIsPointing(true))
|
|
76
92
|
setPointerCapture(e.currentTarget, e)
|
|
77
93
|
rPointerState.current = {
|
|
@@ -82,23 +98,9 @@ export function MenuClickCapture() {
|
|
|
82
98
|
}
|
|
83
99
|
|
|
84
100
|
if (button === 2) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// contextmenu that would otherwise briefly open a new one (causing a flash).
|
|
88
|
-
swallowNextNativeContextMenu()
|
|
89
|
-
editor.menus.clearOpenMenus()
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
// Forward right-click pointerdown through the canvas's own handler so
|
|
93
|
-
// pointer capture is also set on the canvas (load-bearing: without this
|
|
94
|
-
// the context menu briefly flashes closed during consecutive right-clicks).
|
|
95
|
-
// We don't clearOpenMenus() — Radix's DismissableLayer closes the menu
|
|
96
|
-
// via outside-click detection, keeping its internal state in sync.
|
|
97
|
-
const canvas =
|
|
98
|
-
editor.getContainer().querySelector<HTMLDivElement>('.tl-canvas') ?? e.currentTarget
|
|
99
|
-
canvasEvents.onPointerDown?.({ ...e, currentTarget: canvas })
|
|
101
|
+
// Right-click panning off: swallow the native contextmenu that would otherwise
|
|
102
|
+
// briefly open a new menu (causing a flash) once the open one closes below.
|
|
100
103
|
swallowNextNativeContextMenu()
|
|
101
|
-
return
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
editor.menus.clearOpenMenus()
|
|
@@ -113,8 +115,7 @@ export function MenuClickCapture() {
|
|
|
113
115
|
|
|
114
116
|
// Left-click: wait for the drag threshold before forwarding anything, then
|
|
115
117
|
// replay pointerdown at the original start so the editor records the
|
|
116
|
-
// correct drag origin. Right-click forwards moves immediately
|
|
117
|
-
// was already dispatched in handlePointerDown).
|
|
118
|
+
// correct drag origin. Right-click forwards moves immediately.
|
|
118
119
|
if (state.button !== 2 && !state.isDragging) {
|
|
119
120
|
if (
|
|
120
121
|
Vec.Dist2(state.start, new Vec(e.clientX, e.clientY)) <=
|
|
@@ -94,11 +94,9 @@ export const CanvasOverlays = memo(function CanvasOverlays() {
|
|
|
94
94
|
if (!shape || shape.type === 'group') continue
|
|
95
95
|
|
|
96
96
|
const geometry = editor.getShapeGeometry(shape)
|
|
97
|
-
const
|
|
98
|
-
if (!pageTransform) continue
|
|
97
|
+
const m = editor.getShapePageTransform(shape)
|
|
99
98
|
|
|
100
99
|
ctx.save()
|
|
101
|
-
const m = pageTransform
|
|
102
100
|
ctx.transform(m.a, m.b, m.c, m.d, m.e, m.f)
|
|
103
101
|
|
|
104
102
|
// Outline
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { deleteFromLocalStorage, setInLocalStorage } from '@tldraw/utils'
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
2
3
|
import { defaultUserPreferences, userTypeValidator } from './TLUserPreferences'
|
|
3
4
|
|
|
4
5
|
describe('TLUserPreferences consistency', () => {
|
|
@@ -39,3 +40,19 @@ describe('TLUserPreferences consistency', () => {
|
|
|
39
40
|
expect(validatorKeys).toEqual(expected)
|
|
40
41
|
})
|
|
41
42
|
})
|
|
43
|
+
|
|
44
|
+
describe('loading stored preferences', () => {
|
|
45
|
+
afterEach(() => {
|
|
46
|
+
deleteFromLocalStorage('TLDRAW_USER_DATA_v3')
|
|
47
|
+
vi.resetModules()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it.each([
|
|
51
|
+
['corrupt json', '{not json'],
|
|
52
|
+
['a snapshot whose user is not an object', JSON.stringify({ version: 1, user: null })],
|
|
53
|
+
])('falls back to fresh preferences for %s', async (_label, stored) => {
|
|
54
|
+
setInLocalStorage('TLDRAW_USER_DATA_v3', stored)
|
|
55
|
+
const { getUserPreferences } = await import('./TLUserPreferences')
|
|
56
|
+
expect(getUserPreferences().id).toEqual(expect.any(String))
|
|
57
|
+
})
|
|
58
|
+
})
|
|
@@ -201,9 +201,9 @@ function migrateUserPreferences(userData: unknown): TLUserPreferences {
|
|
|
201
201
|
|
|
202
202
|
const snapshot = structuredClone(userData) as any
|
|
203
203
|
|
|
204
|
-
migrateSnapshot(snapshot)
|
|
205
|
-
|
|
206
204
|
try {
|
|
205
|
+
// migration dereferences `user`, which malformed stored data may not have as an object
|
|
206
|
+
migrateSnapshot(snapshot)
|
|
207
207
|
return userTypeValidator.validate(snapshot.user)
|
|
208
208
|
} catch {
|
|
209
209
|
return getFreshUserPreferences()
|
|
@@ -211,8 +211,12 @@ function migrateUserPreferences(userData: unknown): TLUserPreferences {
|
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
function loadUserPreferences(): TLUserPreferences {
|
|
214
|
-
|
|
215
|
-
|
|
214
|
+
let userData: unknown = null
|
|
215
|
+
try {
|
|
216
|
+
userData = JSON.parse(getFromLocalStorage(USER_DATA_KEY) || 'null')
|
|
217
|
+
} catch {
|
|
218
|
+
// corrupt stored data is treated as absent rather than blocking the editor from mounting
|
|
219
|
+
}
|
|
216
220
|
|
|
217
221
|
return migrateUserPreferences(userData)
|
|
218
222
|
}
|