@tldraw/editor 3.16.0-canary.ffdf566dd0a8 → 3.16.0-internal.a478398270c6
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 +16 -213
- package/dist-cjs/index.js +1 -8
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +0 -2
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/SVGContainer.js +1 -1
- package/dist-cjs/lib/components/SVGContainer.js.map +2 -2
- package/dist-cjs/lib/components/Shape.js +26 -4
- package/dist-cjs/lib/components/Shape.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultBrush.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCursor.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultGrid.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultGrid.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultHandles.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultHandles.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js +1 -1
- package/dist-cjs/lib/components/default-components/DefaultSnapIndictor.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultSpinner.js +15 -27
- package/dist-cjs/lib/components/default-components/DefaultSpinner.js.map +3 -3
- package/dist-cjs/lib/config/TLUserPreferences.js +2 -14
- package/dist-cjs/lib/config/TLUserPreferences.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +52 -107
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +3 -13
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/tools/StateNode.js +1 -20
- package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
- package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
- package/dist-cjs/lib/hooks/useEditor.js +4 -1
- package/dist-cjs/lib/hooks/useEditor.js.map +2 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js +0 -2
- package/dist-cjs/lib/hooks/useEditorComponents.js.map +2 -2
- package/dist-cjs/lib/license/Watermark.js +2 -2
- package/dist-cjs/lib/license/Watermark.js.map +2 -2
- package/dist-cjs/lib/options.js +0 -1
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Arc2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Circle2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +1 -3
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +1 -1
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/geometry-constants.js +2 -2
- package/dist-cjs/lib/primitives/geometry/geometry-constants.js.map +2 -2
- package/dist-cjs/lib/primitives/intersect.js +4 -4
- package/dist-cjs/lib/primitives/intersect.js.map +2 -2
- package/dist-cjs/lib/primitives/utils.js +0 -4
- package/dist-cjs/lib/primitives/utils.js.map +2 -2
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.js +1 -0
- package/dist-cjs/lib/utils/sync/TLLocalSyncClient.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 +16 -213
- package/dist-esm/index.mjs +2 -16
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +0 -2
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/SVGContainer.mjs +1 -1
- package/dist-esm/lib/components/SVGContainer.mjs.map +2 -2
- package/dist-esm/lib/components/Shape.mjs +26 -4
- package/dist-esm/lib/components/Shape.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultBrush.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCursor.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultGrid.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultGrid.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultHandles.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultHandles.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs +1 -1
- package/dist-esm/lib/components/default-components/DefaultSnapIndictor.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultSpinner.mjs +15 -17
- package/dist-esm/lib/components/default-components/DefaultSpinner.mjs.map +2 -2
- package/dist-esm/lib/config/TLUserPreferences.mjs +2 -14
- package/dist-esm/lib/config/TLUserPreferences.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +52 -107
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +3 -13
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/tools/StateNode.mjs +1 -20
- package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEditor.mjs +4 -1
- package/dist-esm/lib/hooks/useEditor.mjs.map +2 -2
- package/dist-esm/lib/hooks/useEditorComponents.mjs +0 -4
- package/dist-esm/lib/hooks/useEditorComponents.mjs.map +2 -2
- package/dist-esm/lib/license/Watermark.mjs +2 -2
- package/dist-esm/lib/license/Watermark.mjs.map +2 -2
- package/dist-esm/lib/options.mjs +0 -1
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +1 -3
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/geometry-constants.mjs +2 -2
- package/dist-esm/lib/primitives/geometry/geometry-constants.mjs.map +2 -2
- package/dist-esm/lib/primitives/intersect.mjs +5 -5
- package/dist-esm/lib/primitives/intersect.mjs.map +2 -2
- package/dist-esm/lib/primitives/utils.mjs +0 -4
- package/dist-esm/lib/primitives/utils.mjs.map +2 -2
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs +1 -0
- package/dist-esm/lib/utils/sync/TLLocalSyncClient.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +27 -23
- package/package.json +8 -9
- package/src/index.ts +1 -15
- package/src/lib/TldrawEditor.tsx +0 -2
- package/src/lib/components/SVGContainer.tsx +1 -1
- package/src/lib/components/Shape.tsx +21 -6
- package/src/lib/components/default-components/DefaultBrush.tsx +1 -1
- package/src/lib/components/default-components/DefaultCanvas.tsx +1 -1
- package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -1
- package/src/lib/components/default-components/DefaultCursor.tsx +1 -1
- package/src/lib/components/default-components/DefaultGrid.tsx +1 -1
- package/src/lib/components/default-components/DefaultHandles.tsx +1 -5
- package/src/lib/components/default-components/DefaultShapeIndicator.tsx +1 -1
- package/src/lib/components/default-components/DefaultSnapIndictor.tsx +1 -1
- package/src/lib/components/default-components/DefaultSpinner.tsx +12 -12
- package/src/lib/config/TLUserPreferences.ts +0 -14
- package/src/lib/editor/Editor.test.ts +0 -407
- package/src/lib/editor/Editor.ts +72 -140
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +0 -34
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +0 -13
- package/src/lib/editor/shapes/ShapeUtil.ts +0 -57
- package/src/lib/editor/tools/StateNode.ts +1 -27
- package/src/lib/editor/types/misc-types.ts +1 -73
- package/src/lib/hooks/useEditor.tsx +5 -6
- package/src/lib/hooks/useEditorComponents.tsx +2 -8
- package/src/lib/license/Watermark.tsx +2 -2
- package/src/lib/options.ts +0 -2
- package/src/lib/primitives/geometry/Arc2d.ts +2 -2
- package/src/lib/primitives/geometry/Circle2d.ts +2 -2
- package/src/lib/primitives/geometry/CubicBezier2d.ts +1 -4
- package/src/lib/primitives/geometry/Ellipse2d.ts +2 -2
- package/src/lib/primitives/geometry/geometry-constants.ts +1 -2
- package/src/lib/primitives/intersect.ts +5 -12
- package/src/lib/primitives/utils.ts +0 -11
- package/src/lib/test/currentToolIdMask.test.ts +49 -0
- package/src/lib/utils/sync/TLLocalSyncClient.ts +1 -0
- package/src/version.ts +3 -3
- package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js +0 -53
- package/dist-cjs/lib/components/default-components/DefaultShapeWrapper.js.map +0 -7
- package/dist-cjs/lib/hooks/useStateAttribute.js +0 -35
- package/dist-cjs/lib/hooks/useStateAttribute.js.map +0 -7
- package/dist-cjs/lib/utils/EditorAtom.js +0 -45
- package/dist-cjs/lib/utils/EditorAtom.js.map +0 -7
- package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs +0 -23
- package/dist-esm/lib/components/default-components/DefaultShapeWrapper.mjs.map +0 -7
- package/dist-esm/lib/hooks/useStateAttribute.mjs +0 -15
- package/dist-esm/lib/hooks/useStateAttribute.mjs.map +0 -7
- package/dist-esm/lib/utils/EditorAtom.mjs +0 -25
- package/dist-esm/lib/utils/EditorAtom.mjs.map +0 -7
- package/src/lib/components/default-components/DefaultShapeWrapper.tsx +0 -35
- package/src/lib/editor/tools/StateNode.test.ts +0 -285
- package/src/lib/hooks/useStateAttribute.ts +0 -15
- package/src/lib/primitives/intersect.test.ts +0 -946
- package/src/lib/utils/EditorAtom.ts +0 -37
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
import { createTLStore } from '../../config/createTLStore'
|
|
2
|
-
import { Editor } from '../Editor'
|
|
3
|
-
import { StateNode } from './StateNode'
|
|
4
|
-
|
|
5
|
-
describe('StateNode.addChild', () => {
|
|
6
|
-
// Test state node classes for addChild tests
|
|
7
|
-
class ParentState extends StateNode {
|
|
8
|
-
static override id = 'parent'
|
|
9
|
-
static override initial = 'child1'
|
|
10
|
-
static override children() {
|
|
11
|
-
return [ChildState1]
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
class ChildState1 extends StateNode {
|
|
16
|
-
static override id = 'child1'
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
class ChildState2 extends StateNode {
|
|
20
|
-
static override id = 'child2'
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
class ChildState3 extends StateNode {
|
|
24
|
-
static override id = 'child3'
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
class LeafState extends StateNode {
|
|
28
|
-
static override id = 'leaf'
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
class RootState extends StateNode {
|
|
32
|
-
static override id = 'root'
|
|
33
|
-
static override initial = 'child1'
|
|
34
|
-
static override children() {
|
|
35
|
-
return [ChildState1]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
class RootStateWithoutChildren extends StateNode {
|
|
40
|
-
static override id = 'rootWithoutChildren'
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
let editor: Editor
|
|
44
|
-
|
|
45
|
-
beforeEach(() => {
|
|
46
|
-
editor = new Editor({
|
|
47
|
-
initialState: 'parent',
|
|
48
|
-
shapeUtils: [],
|
|
49
|
-
bindingUtils: [],
|
|
50
|
-
tools: [
|
|
51
|
-
ParentState,
|
|
52
|
-
ChildState1,
|
|
53
|
-
ChildState2,
|
|
54
|
-
ChildState3,
|
|
55
|
-
LeafState,
|
|
56
|
-
RootState,
|
|
57
|
-
RootStateWithoutChildren,
|
|
58
|
-
],
|
|
59
|
-
store: createTLStore({ shapeUtils: [], bindingUtils: [] }),
|
|
60
|
-
getContainer: () => document.body,
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('should add a child to a branch state node', () => {
|
|
65
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
66
|
-
|
|
67
|
-
// Initially should have one child
|
|
68
|
-
expect(Object.keys(parentState.children!)).toHaveLength(1)
|
|
69
|
-
expect(parentState.children!['child1']).toBeDefined()
|
|
70
|
-
|
|
71
|
-
// Add a new child
|
|
72
|
-
parentState.addChild(ChildState2)
|
|
73
|
-
|
|
74
|
-
// Should now have two children
|
|
75
|
-
expect(Object.keys(parentState.children!)).toHaveLength(2)
|
|
76
|
-
expect(parentState.children!['child1']).toBeDefined()
|
|
77
|
-
expect(parentState.children!['child2']).toBeDefined()
|
|
78
|
-
expect(parentState.children!['child2']).toBeInstanceOf(ChildState2)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('should add a child to a root state node', () => {
|
|
82
|
-
const rootState = editor.root.children!['root'] as RootState
|
|
83
|
-
|
|
84
|
-
// Initially should have one child
|
|
85
|
-
expect(Object.keys(rootState.children!)).toHaveLength(1)
|
|
86
|
-
expect(rootState.children!['child1']).toBeDefined()
|
|
87
|
-
|
|
88
|
-
// Add a new child
|
|
89
|
-
rootState.addChild(ChildState2)
|
|
90
|
-
|
|
91
|
-
// Should now have two children
|
|
92
|
-
expect(Object.keys(rootState.children!)).toHaveLength(2)
|
|
93
|
-
expect(rootState.children!['child1']).toBeDefined()
|
|
94
|
-
expect(rootState.children!['child2']).toBeDefined()
|
|
95
|
-
expect(rootState.children!['child2']).toBeInstanceOf(ChildState2)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('should throw an error when trying to add a child to a leaf state node', () => {
|
|
99
|
-
const leafState = editor.root.children!['leaf'] as LeafState
|
|
100
|
-
|
|
101
|
-
// Leaf state should not have children
|
|
102
|
-
expect(leafState.children).toBeUndefined()
|
|
103
|
-
|
|
104
|
-
// Should throw an error when trying to add a child
|
|
105
|
-
expect(() => {
|
|
106
|
-
leafState.addChild(ChildState2)
|
|
107
|
-
}).toThrow('StateNode.addChild: cannot add child to a leaf node')
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('should return the parent state node for chaining', () => {
|
|
111
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
112
|
-
|
|
113
|
-
const result = parentState.addChild(ChildState2)
|
|
114
|
-
|
|
115
|
-
expect(result).toBe(parentState)
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should create the child with the correct editor and parent', () => {
|
|
119
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
120
|
-
|
|
121
|
-
parentState.addChild(ChildState2)
|
|
122
|
-
const childState = parentState.children!['child2'] as ChildState2
|
|
123
|
-
|
|
124
|
-
expect(childState.editor).toBe(editor)
|
|
125
|
-
expect(childState.parent).toBe(parentState)
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
it('should allow adding multiple children', () => {
|
|
129
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
130
|
-
|
|
131
|
-
// Add multiple children
|
|
132
|
-
parentState.addChild(ChildState2).addChild(ChildState3)
|
|
133
|
-
|
|
134
|
-
// Should have three children
|
|
135
|
-
expect(Object.keys(parentState.children!)).toHaveLength(3)
|
|
136
|
-
expect(parentState.children!['child1']).toBeDefined()
|
|
137
|
-
expect(parentState.children!['child2']).toBeDefined()
|
|
138
|
-
expect(parentState.children!['child3']).toBeDefined()
|
|
139
|
-
expect(parentState.children!['child2']).toBeInstanceOf(ChildState2)
|
|
140
|
-
expect(parentState.children!['child3']).toBeInstanceOf(ChildState3)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
it('should allow transitioning to added children', () => {
|
|
144
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
145
|
-
|
|
146
|
-
// Add a new child
|
|
147
|
-
parentState.addChild(ChildState2)
|
|
148
|
-
|
|
149
|
-
// Should be able to transition to the new child
|
|
150
|
-
expect(() => {
|
|
151
|
-
parentState.transition('child2')
|
|
152
|
-
}).not.toThrow()
|
|
153
|
-
|
|
154
|
-
// The current state should be the new child
|
|
155
|
-
expect(parentState.getCurrent()?.id).toBe('child2')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it('should maintain existing children when adding new ones', () => {
|
|
159
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
160
|
-
const originalChild = parentState.children!['child1']
|
|
161
|
-
|
|
162
|
-
// Add a new child
|
|
163
|
-
parentState.addChild(ChildState2)
|
|
164
|
-
|
|
165
|
-
// Original child should still exist and be the same instance
|
|
166
|
-
expect(parentState.children!['child1']).toBe(originalChild)
|
|
167
|
-
expect(parentState.children!['child1']).toBeInstanceOf(ChildState1)
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
it('should initialize children object for root nodes without static children', () => {
|
|
171
|
-
// Create a StateNode directly as a root node (no parent)
|
|
172
|
-
const mockEditor = {} as Editor
|
|
173
|
-
const rootStateWithoutChildren = new RootStateWithoutChildren(mockEditor, undefined)
|
|
174
|
-
|
|
175
|
-
// Root state without static children should not have children initially
|
|
176
|
-
expect(rootStateWithoutChildren.children).toBeUndefined()
|
|
177
|
-
|
|
178
|
-
// Adding a child should initialize the children object
|
|
179
|
-
rootStateWithoutChildren.addChild(ChildState2)
|
|
180
|
-
|
|
181
|
-
// Should now have children object with the added child
|
|
182
|
-
expect(rootStateWithoutChildren.children).toBeDefined()
|
|
183
|
-
expect(Object.keys(rootStateWithoutChildren.children!)).toHaveLength(1)
|
|
184
|
-
expect(rootStateWithoutChildren.children!['child2']).toBeDefined()
|
|
185
|
-
expect(rootStateWithoutChildren.children!['child2']).toBeInstanceOf(ChildState2)
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
it('should throw an error when trying to add a child with a duplicate ID', () => {
|
|
189
|
-
const parentState = editor.root.children!['parent'] as ParentState
|
|
190
|
-
|
|
191
|
-
// Initially should have one child
|
|
192
|
-
expect(Object.keys(parentState.children!)).toHaveLength(1)
|
|
193
|
-
expect(parentState.children!['child1']).toBeDefined()
|
|
194
|
-
|
|
195
|
-
// Should throw an error when trying to add a child with the same ID
|
|
196
|
-
expect(() => {
|
|
197
|
-
parentState.addChild(ChildState1)
|
|
198
|
-
}).toThrow("StateNode.addChild: a child with id 'child1' already exists")
|
|
199
|
-
|
|
200
|
-
// Should still have only one child
|
|
201
|
-
expect(Object.keys(parentState.children!)).toHaveLength(1)
|
|
202
|
-
expect(parentState.children!['child1']).toBeDefined()
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
it('should throw an error when trying to add a child with a duplicate ID to a root state', () => {
|
|
206
|
-
const rootState = editor.root.children!['root'] as RootState
|
|
207
|
-
|
|
208
|
-
// Initially should have one child
|
|
209
|
-
expect(Object.keys(rootState.children!)).toHaveLength(1)
|
|
210
|
-
expect(rootState.children!['child1']).toBeDefined()
|
|
211
|
-
|
|
212
|
-
// Should throw an error when trying to add a child with the same ID
|
|
213
|
-
expect(() => {
|
|
214
|
-
rootState.addChild(ChildState1)
|
|
215
|
-
}).toThrow("StateNode.addChild: a child with id 'child1' already exists")
|
|
216
|
-
|
|
217
|
-
// Should still have only one child
|
|
218
|
-
expect(Object.keys(rootState.children!)).toHaveLength(1)
|
|
219
|
-
expect(rootState.children!['child1']).toBeDefined()
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
it('should throw an error when trying to add a child with a duplicate ID to a root state without static children', () => {
|
|
223
|
-
// Create a StateNode directly as a root node (no parent)
|
|
224
|
-
const mockEditor = {} as Editor
|
|
225
|
-
const rootStateWithoutChildren = new RootStateWithoutChildren(mockEditor, undefined)
|
|
226
|
-
|
|
227
|
-
// Add a child first
|
|
228
|
-
rootStateWithoutChildren.addChild(ChildState1)
|
|
229
|
-
|
|
230
|
-
// Should throw an error when trying to add a child with the same ID
|
|
231
|
-
expect(() => {
|
|
232
|
-
rootStateWithoutChildren.addChild(ChildState1)
|
|
233
|
-
}).toThrow("StateNode.addChild: a child with id 'child1' already exists")
|
|
234
|
-
|
|
235
|
-
// Should still have only one child
|
|
236
|
-
expect(Object.keys(rootStateWithoutChildren.children!)).toHaveLength(1)
|
|
237
|
-
expect(rootStateWithoutChildren.children!['child1']).toBeDefined()
|
|
238
|
-
})
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
describe('current tool id mask', () => {
|
|
242
|
-
// Tool mask test classes
|
|
243
|
-
class ToolA extends StateNode {
|
|
244
|
-
static override id = 'A'
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
class ToolB extends StateNode {
|
|
248
|
-
static override id = 'B'
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
class ToolC extends StateNode {
|
|
252
|
-
static override id = 'C'
|
|
253
|
-
|
|
254
|
-
override onEnter() {
|
|
255
|
-
this.setCurrentToolIdMask('A')
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
let toolMaskEditor: Editor
|
|
260
|
-
|
|
261
|
-
beforeEach(() => {
|
|
262
|
-
toolMaskEditor = new Editor({
|
|
263
|
-
initialState: 'A',
|
|
264
|
-
shapeUtils: [],
|
|
265
|
-
bindingUtils: [],
|
|
266
|
-
tools: [ToolA, ToolB, ToolC],
|
|
267
|
-
store: createTLStore({ shapeUtils: [], bindingUtils: [] }),
|
|
268
|
-
getContainer: () => document.body,
|
|
269
|
-
})
|
|
270
|
-
})
|
|
271
|
-
|
|
272
|
-
it('starts with the correct tool id', () => {
|
|
273
|
-
expect(toolMaskEditor.getCurrentToolId()).toBe('A')
|
|
274
|
-
})
|
|
275
|
-
|
|
276
|
-
it('updates the current tool id', () => {
|
|
277
|
-
toolMaskEditor.setCurrentTool('B')
|
|
278
|
-
expect(toolMaskEditor.getCurrentToolId()).toBe('B')
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
it('masks the current tool id', () => {
|
|
282
|
-
toolMaskEditor.setCurrentTool('C')
|
|
283
|
-
expect(toolMaskEditor.getCurrentToolId()).toBe('A')
|
|
284
|
-
})
|
|
285
|
-
})
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { react } from '@tldraw/state'
|
|
2
|
-
import { useLayoutEffect } from 'react'
|
|
3
|
-
import { useEditor } from './useEditor'
|
|
4
|
-
|
|
5
|
-
export function useStateAttribute() {
|
|
6
|
-
const editor = useEditor()
|
|
7
|
-
|
|
8
|
-
// we use a layout effect because we don't want there to be any perceptible delay between the
|
|
9
|
-
// editor mounting and this attribute being applied, because styles may depend on it:
|
|
10
|
-
useLayoutEffect(() => {
|
|
11
|
-
return react('stateAttribute', () => {
|
|
12
|
-
editor.getContainer().setAttribute('data-state', editor.getPath())
|
|
13
|
-
})
|
|
14
|
-
}, [editor])
|
|
15
|
-
}
|