kritzel-stencil 0.1.80 → 0.1.82
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.cjs.js +1 -1
- package/dist/cjs/kritzel-active-users_42.cjs.entry.js +30 -37
- package/dist/cjs/{workspace.migrations-DUXtSb7C.js → workspace.migrations-4HATwIMK.js} +46 -58
- package/dist/collection/classes/core/core.class.js +6 -6
- package/dist/collection/classes/core/store.class.js +0 -12
- package/dist/collection/classes/objects/base-object.class.js +1 -1
- package/dist/collection/classes/objects/custom-element.class.js +1 -1
- package/dist/collection/classes/objects/group.class.js +1 -1
- package/dist/collection/classes/objects/image.class.js +1 -1
- package/dist/collection/classes/objects/line.class.js +1 -1
- package/dist/collection/classes/objects/path.class.js +1 -1
- package/dist/collection/classes/objects/selection-box.class.js +1 -1
- package/dist/collection/classes/objects/selection-group.class.js +1 -1
- package/dist/collection/classes/objects/shape.class.js +15 -21
- package/dist/collection/classes/objects/text.class.js +24 -30
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +21 -16
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/kritzel-awareness-cursors.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/kritzel-tool-config.js +1 -1
- package/dist/components/{p-xYCbKFih.js → p-B4h_tGG1.js} +1 -1
- package/dist/components/{p-BcwZ36sO.js → p-BPQOTise.js} +1 -1
- package/dist/components/{p-B-Gej_Ak.js → p-C35iuSnC.js} +1 -1
- package/dist/components/{p-BzQmBVwr.js → p-CgtykATT.js} +2 -2
- package/dist/components/{p-C_fSm7T4.js → p-DK_d3fKa.js} +1 -1
- package/dist/components/p-DQK_4lkI.js +1 -0
- package/dist/components/{p-CvyE2Wg-.js → p-DsfD4pGR.js} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/kritzel-active-users_42.entry.js +30 -37
- package/dist/esm/{workspace.migrations-OzSSw5kt.js → workspace.migrations-Be65cOkQ.js} +46 -58
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/p-Be65cOkQ.js +1 -0
- package/dist/stencil/p-f318b7d5.entry.js +9 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/core/store.class.d.ts +0 -8
- package/dist/types/classes/objects/shape.class.d.ts +0 -1
- package/dist/types/classes/objects/text.class.d.ts +0 -1
- package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +1 -0
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/components/p-C8WnYSHi.js +0 -1
- package/dist/stencil/p-OzSSw5kt.js +0 -1
- package/dist/stencil/p-f7be06a8.entry.js +0 -9
|
@@ -39,7 +39,7 @@ export class KritzelImage extends KritzelBaseObject {
|
|
|
39
39
|
const object = new KritzelImage();
|
|
40
40
|
object._core = core;
|
|
41
41
|
object.id = object.generateId();
|
|
42
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
42
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
43
43
|
object.userId = core.user?.id;
|
|
44
44
|
object.x = 0;
|
|
45
45
|
object.y = 0;
|
|
@@ -79,7 +79,7 @@ export class KritzelLine extends KritzelBaseObject {
|
|
|
79
79
|
const object = new KritzelLine();
|
|
80
80
|
object._core = core;
|
|
81
81
|
object.id = object.generateId();
|
|
82
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
82
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
83
83
|
object.userId = core.user?.id;
|
|
84
84
|
object.options = options;
|
|
85
85
|
object.startX = options?.startX ?? 0;
|
|
@@ -61,7 +61,7 @@ export class KritzelPath extends KritzelBaseObject {
|
|
|
61
61
|
const object = new KritzelPath();
|
|
62
62
|
object._core = core;
|
|
63
63
|
object.id = object.generateId();
|
|
64
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
64
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
65
65
|
object.userId = core.user?.id;
|
|
66
66
|
object.options = options;
|
|
67
67
|
object.points = options?.points ?? [];
|
|
@@ -18,7 +18,7 @@ export class KritzelSelectionBox extends KritzelBaseObject {
|
|
|
18
18
|
const object = new KritzelSelectionBox();
|
|
19
19
|
object._core = core;
|
|
20
20
|
object.id = object.generateId();
|
|
21
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
21
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
22
22
|
object.userId = core.user?.id;
|
|
23
23
|
object.scale = core.store.state.scale;
|
|
24
24
|
object.zIndex = 99999;
|
|
@@ -91,7 +91,7 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
91
91
|
const object = new KritzelSelectionGroup();
|
|
92
92
|
object._core = core;
|
|
93
93
|
object.id = object.generateId();
|
|
94
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
94
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
95
95
|
object.userId = core.user?.id;
|
|
96
96
|
object.clientId = core.store.objects?.localClientId ?? undefined;
|
|
97
97
|
object.scale = core.store.state.scale;
|
|
@@ -44,12 +44,6 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
44
44
|
get viewBox() {
|
|
45
45
|
return `${this.x} ${this.y} ${this.width} ${this.height}`;
|
|
46
46
|
}
|
|
47
|
-
get _editor() {
|
|
48
|
-
if (!this.editor) {
|
|
49
|
-
throw new Error('KritzelShape: editor is not initialized');
|
|
50
|
-
}
|
|
51
|
-
return this.editor;
|
|
52
|
-
}
|
|
53
47
|
/**
|
|
54
48
|
* Creates a new KritzelShape instance with optional configuration.
|
|
55
49
|
* This constructor initializes the shape with default values that can be
|
|
@@ -105,7 +99,7 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
105
99
|
const object = new KritzelShape();
|
|
106
100
|
object._core = core;
|
|
107
101
|
object.id = object.generateId();
|
|
108
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
102
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
109
103
|
object.userId = core.user?.id;
|
|
110
104
|
object.x = config?.x ?? 0;
|
|
111
105
|
object.y = config?.y ?? 0;
|
|
@@ -157,7 +151,7 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
157
151
|
if (element === null || this.isInViewport() === false) {
|
|
158
152
|
return;
|
|
159
153
|
}
|
|
160
|
-
if (this.isMounted && this.elementRef === element && this.
|
|
154
|
+
if (this.isMounted && this.elementRef === element && this.editor.dom.parentElement === element) {
|
|
161
155
|
return;
|
|
162
156
|
}
|
|
163
157
|
this.elementRef = element;
|
|
@@ -173,7 +167,7 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
173
167
|
* @returns void
|
|
174
168
|
*/
|
|
175
169
|
mountTextEditor(element) {
|
|
176
|
-
if (element === null
|
|
170
|
+
if (element === null) {
|
|
177
171
|
return;
|
|
178
172
|
}
|
|
179
173
|
element.style.fontFamily = this.fontFamily;
|
|
@@ -204,8 +198,8 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
204
198
|
}),
|
|
205
199
|
editable: () => false,
|
|
206
200
|
dispatchTransaction: transaction => {
|
|
207
|
-
const newState = this.
|
|
208
|
-
this.
|
|
201
|
+
const newState = this.editor.state.apply(transaction);
|
|
202
|
+
this.editor.updateState(newState);
|
|
209
203
|
if (transaction.docChanged) {
|
|
210
204
|
this.content = newState.doc.toJSON();
|
|
211
205
|
if (!transaction.getMeta('fromRemote')) {
|
|
@@ -267,12 +261,12 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
267
261
|
* @returns void
|
|
268
262
|
*/
|
|
269
263
|
focus(coords) {
|
|
270
|
-
const doc = this.
|
|
264
|
+
const doc = this.editor.state.doc;
|
|
271
265
|
if (coords?.x && coords?.y) {
|
|
272
|
-
const pos = this.
|
|
266
|
+
const pos = this.editor.posAtCoords({ left: coords.x, top: coords.y });
|
|
273
267
|
if (pos) {
|
|
274
|
-
this.
|
|
275
|
-
this.
|
|
268
|
+
this.editor.dispatch(this.editor.state.tr.setSelection(TextSelection.create(doc, pos.pos)));
|
|
269
|
+
this.editor.focus();
|
|
276
270
|
if (KritzelDevicesHelper.isIOS()) {
|
|
277
271
|
this.scrollIntoViewOnIOS();
|
|
278
272
|
}
|
|
@@ -280,8 +274,8 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
280
274
|
}
|
|
281
275
|
}
|
|
282
276
|
const end = Math.max(1, doc.content.size - 1);
|
|
283
|
-
this.
|
|
284
|
-
this.
|
|
277
|
+
this.editor.dispatch(this.editor.state.tr.setSelection(TextSelection.create(doc, end)));
|
|
278
|
+
this.editor.focus();
|
|
285
279
|
if (KritzelDevicesHelper.isIOS()) {
|
|
286
280
|
this.scrollIntoViewOnIOS();
|
|
287
281
|
}
|
|
@@ -319,7 +313,7 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
319
313
|
KritzelKeyboardHelper.disableInteractiveWidget();
|
|
320
314
|
this.uneditedObject = this.clone();
|
|
321
315
|
this._core.store.setState('activeTool', KritzelToolRegistry.getTool('shape'));
|
|
322
|
-
this.
|
|
316
|
+
this.editor.setProps({ editable: () => true });
|
|
323
317
|
this.isEditing = true;
|
|
324
318
|
this._core.rerender();
|
|
325
319
|
if (event?.clientX && event?.clientY) {
|
|
@@ -336,9 +330,9 @@ export class KritzelShape extends KritzelBaseObject {
|
|
|
336
330
|
* @returns void
|
|
337
331
|
*/
|
|
338
332
|
save() {
|
|
339
|
-
this.content = this.
|
|
340
|
-
this.
|
|
341
|
-
this.
|
|
333
|
+
this.content = this.editor.state.doc.toJSON();
|
|
334
|
+
this.editor.setProps({ editable: () => false });
|
|
335
|
+
this.editor.dom.blur();
|
|
342
336
|
this.isEditing = false;
|
|
343
337
|
this._core.store.objects.consolidateTemporaryItems();
|
|
344
338
|
this._core.store.objects.update(this);
|
|
@@ -28,12 +28,6 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
28
28
|
isEditing = false;
|
|
29
29
|
editor = null;
|
|
30
30
|
content = null;
|
|
31
|
-
get _editor() {
|
|
32
|
-
if (!this._editor) {
|
|
33
|
-
throw new Error('KritzelShape: editor is not initialized');
|
|
34
|
-
}
|
|
35
|
-
return this._editor;
|
|
36
|
-
}
|
|
37
31
|
_schema = new Schema({
|
|
38
32
|
nodes: addListNodes(schema.spec.nodes, 'paragraph block*', 'block'),
|
|
39
33
|
marks: schema.spec.marks,
|
|
@@ -45,10 +39,10 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
45
39
|
* @returns `true` if the editor is empty or contains only whitespace, `false` otherwise.
|
|
46
40
|
*/
|
|
47
41
|
get isEmpty() {
|
|
48
|
-
if (!this.
|
|
42
|
+
if (!this.editor) {
|
|
49
43
|
return true;
|
|
50
44
|
}
|
|
51
|
-
const doc = this.
|
|
45
|
+
const doc = this.editor.state.doc;
|
|
52
46
|
if (doc.content.size === 0) {
|
|
53
47
|
return true;
|
|
54
48
|
}
|
|
@@ -121,7 +115,7 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
121
115
|
const object = new KritzelText();
|
|
122
116
|
object._core = core;
|
|
123
117
|
object.id = object.generateId();
|
|
124
|
-
object.workspaceId = core.store.activeWorkspace.id;
|
|
118
|
+
object.workspaceId = core.store.state.activeWorkspace.id;
|
|
125
119
|
object.userId = core.user?.id;
|
|
126
120
|
object.fontSize = fontSize || 8;
|
|
127
121
|
object.fontFamily = fontFamily || 'Arial';
|
|
@@ -152,7 +146,7 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
152
146
|
element.style.fontFamily = this.fontFamily;
|
|
153
147
|
element.style.fontSize = `${this.fontSize}pt`;
|
|
154
148
|
element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
|
|
155
|
-
if (this.isMounted && this.elementRef === element && this.
|
|
149
|
+
if (this.isMounted && this.elementRef === element && this.editor.dom.parentElement === element) {
|
|
156
150
|
if (!this._core.store.state.isScaling && !this._core.store.state.isPanning) {
|
|
157
151
|
requestAnimationFrame(() => this.adjustSizeOnInput());
|
|
158
152
|
}
|
|
@@ -162,7 +156,7 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
162
156
|
this.elementRef.style.whiteSpace = 'pre-wrap';
|
|
163
157
|
this.elementRef.style.wordWrap = 'break-word';
|
|
164
158
|
this.elementRef.innerHTML = '';
|
|
165
|
-
this.elementRef.appendChild(this.
|
|
159
|
+
this.elementRef.appendChild(this.editor.dom);
|
|
166
160
|
this.isMounted = true;
|
|
167
161
|
requestAnimationFrame(() => this.adjustSizeOnInput());
|
|
168
162
|
}
|
|
@@ -180,8 +174,8 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
180
174
|
}),
|
|
181
175
|
editable: () => false,
|
|
182
176
|
dispatchTransaction: transaction => {
|
|
183
|
-
const newState = this.
|
|
184
|
-
this.
|
|
177
|
+
const newState = this.editor.state.apply(transaction);
|
|
178
|
+
this.editor.updateState(newState);
|
|
185
179
|
if (transaction.docChanged) {
|
|
186
180
|
this.content = newState.doc.toJSON();
|
|
187
181
|
this.adjustSizeOnInput();
|
|
@@ -199,11 +193,11 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
199
193
|
*/
|
|
200
194
|
setContent(content) {
|
|
201
195
|
this.content = content;
|
|
202
|
-
if (this.
|
|
203
|
-
const newDoc = this.
|
|
204
|
-
const tr = this.
|
|
196
|
+
if (this.editor && content) {
|
|
197
|
+
const newDoc = this.editor.state.schema.nodeFromJSON(content);
|
|
198
|
+
const tr = this.editor.state.tr.replaceWith(0, this.editor.state.doc.content.size, newDoc.content);
|
|
205
199
|
tr.setMeta('fromRemote', true);
|
|
206
|
-
this.
|
|
200
|
+
this.editor.dispatch(tr);
|
|
207
201
|
}
|
|
208
202
|
}
|
|
209
203
|
/**
|
|
@@ -268,13 +262,13 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
268
262
|
* @param coords.y - Y coordinate for cursor placement.
|
|
269
263
|
*/
|
|
270
264
|
focus(coords) {
|
|
271
|
-
if (this.
|
|
272
|
-
const doc = this.
|
|
265
|
+
if (this.editor) {
|
|
266
|
+
const doc = this.editor.state.doc;
|
|
273
267
|
if (coords.x && coords.y && !this.isEmpty) {
|
|
274
|
-
const pos = this.
|
|
268
|
+
const pos = this.editor.posAtCoords({ left: coords.x, top: coords.y });
|
|
275
269
|
if (pos) {
|
|
276
|
-
this.
|
|
277
|
-
this.
|
|
270
|
+
this.editor.dispatch(this.editor.state.tr.setSelection(TextSelection.create(doc, pos.pos)));
|
|
271
|
+
this.editor.focus();
|
|
278
272
|
if (KritzelDevicesHelper.isIOS()) {
|
|
279
273
|
this.scrollIntoViewOnIOS();
|
|
280
274
|
}
|
|
@@ -282,8 +276,8 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
282
276
|
}
|
|
283
277
|
}
|
|
284
278
|
const end = Math.max(1, doc.content.size - 1);
|
|
285
|
-
this.
|
|
286
|
-
this.
|
|
279
|
+
this.editor.dispatch(this.editor.state.tr.setSelection(TextSelection.create(doc, end)));
|
|
280
|
+
this.editor.focus();
|
|
287
281
|
if (KritzelDevicesHelper.isIOS()) {
|
|
288
282
|
this.scrollIntoViewOnIOS();
|
|
289
283
|
}
|
|
@@ -295,8 +289,8 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
295
289
|
*/
|
|
296
290
|
scrollIntoViewOnIOS() {
|
|
297
291
|
setTimeout(() => {
|
|
298
|
-
if (this.
|
|
299
|
-
this.
|
|
292
|
+
if (this.editor && this.editor.dom) {
|
|
293
|
+
this.editor.dom.scrollIntoView({
|
|
300
294
|
behavior: 'smooth',
|
|
301
295
|
block: 'center',
|
|
302
296
|
inline: 'nearest',
|
|
@@ -314,7 +308,7 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
314
308
|
KritzelKeyboardHelper.disableInteractiveWidget();
|
|
315
309
|
this.uneditedObject = this.clone();
|
|
316
310
|
this._core.store.setState('activeTool', KritzelToolRegistry.getTool('text'));
|
|
317
|
-
this.
|
|
311
|
+
this.editor.setProps({ editable: () => true });
|
|
318
312
|
this.isEditing = true;
|
|
319
313
|
this._core.rerender();
|
|
320
314
|
this.adjustSizeOnInput();
|
|
@@ -330,9 +324,9 @@ export class KritzelText extends KritzelBaseObject {
|
|
|
330
324
|
*/
|
|
331
325
|
save() {
|
|
332
326
|
requestAnimationFrame(() => this.adjustSizeOnInput());
|
|
333
|
-
this.content = this.
|
|
334
|
-
this.
|
|
335
|
-
this.
|
|
327
|
+
this.content = this.editor.state.doc.toJSON();
|
|
328
|
+
this.editor.setProps({ editable: () => false });
|
|
329
|
+
this.editor.dom.blur();
|
|
336
330
|
this.isEditing = false;
|
|
337
331
|
this._core.store.objects.consolidateTemporaryItems();
|
|
338
332
|
this._core.store.objects.update(this);
|
|
@@ -31,13 +31,13 @@ export class KritzelEngine {
|
|
|
31
31
|
}
|
|
32
32
|
// Let batched prop updates settle, then perform an idempotent re-check.
|
|
33
33
|
await Promise.resolve();
|
|
34
|
-
const currentWorkspaceId = this.core.store.activeWorkspace?.id;
|
|
34
|
+
const currentWorkspaceId = this.core.store.state.activeWorkspace?.id;
|
|
35
35
|
if (currentWorkspaceId === newWorkspaceId) {
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
38
|
this.core.beforeWorkspaceChange();
|
|
39
39
|
await this.initializeWorkspaceIfNeeded(newWorkspace);
|
|
40
|
-
this.activeWorkspaceChange.emit(this.core.store.activeWorkspace);
|
|
40
|
+
this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace);
|
|
41
41
|
}
|
|
42
42
|
/** Optional unique identifier for namespacing storage keys across multiple editor instances. */
|
|
43
43
|
editorId;
|
|
@@ -55,8 +55,11 @@ export class KritzelEngine {
|
|
|
55
55
|
this._syncConfigRevision++;
|
|
56
56
|
// Keep core config in sync immediately so late prop updates are not lost.
|
|
57
57
|
this.core.setSyncConfig(newValue);
|
|
58
|
-
// If syncConfig arrives after componentDidLoad, initialize Yjs now
|
|
59
|
-
|
|
58
|
+
// If syncConfig arrives after componentDidLoad, initialize Yjs now.
|
|
59
|
+
// Guard on _isViewportReady to avoid restoring viewport state before
|
|
60
|
+
// viewportWidth/viewportHeight are set (they default to 0 until the
|
|
61
|
+
// KritzelViewport constructor runs inside componentDidLoad's timeout).
|
|
62
|
+
if (newValue && !this._isYjsInitialized && this._isViewportReady) {
|
|
60
63
|
await this.initializeSyncAndWorkspace();
|
|
61
64
|
}
|
|
62
65
|
}
|
|
@@ -489,7 +492,7 @@ export class KritzelEngine {
|
|
|
489
492
|
object._core = this.core;
|
|
490
493
|
object.scale = this.core.store.state.scale;
|
|
491
494
|
object.zIndex = this.core.store.currentZIndex;
|
|
492
|
-
object.workspaceId = this.core.store.activeWorkspace.id;
|
|
495
|
+
object.workspaceId = this.core.store.state.activeWorkspace.id;
|
|
493
496
|
// Handle KritzelText: recreate the editor now that _core is available
|
|
494
497
|
// The editor's dispatchTransaction callback needs _core for persisting changes
|
|
495
498
|
if (KritzelClassHelper.isInstanceOf(object, 'KritzelText')) {
|
|
@@ -510,7 +513,7 @@ export class KritzelEngine {
|
|
|
510
513
|
child._core = this.core;
|
|
511
514
|
child.scale = this.core.store.state.scale;
|
|
512
515
|
child.zIndex = this.core.store.currentZIndex;
|
|
513
|
-
child.workspaceId = this.core.store.activeWorkspace.id;
|
|
516
|
+
child.workspaceId = this.core.store.state.activeWorkspace.id;
|
|
514
517
|
idRemapping.set(oldId, child.id);
|
|
515
518
|
object.childIds.push(child.id);
|
|
516
519
|
});
|
|
@@ -711,7 +714,7 @@ export class KritzelEngine {
|
|
|
711
714
|
// Save critical state before screenshot to restore after
|
|
712
715
|
const savedState = {
|
|
713
716
|
objects: this.core.store.objects,
|
|
714
|
-
activeWorkspace: this.core.store.activeWorkspace,
|
|
717
|
+
activeWorkspace: this.core.store.state.activeWorkspace,
|
|
715
718
|
workspaces: this.core.store.state.workspaces,
|
|
716
719
|
activeTool: this.core.store.state.activeTool,
|
|
717
720
|
isReady: this.core.store.state.isReady,
|
|
@@ -909,7 +912,7 @@ export class KritzelEngine {
|
|
|
909
912
|
* @returns A JSON string representing the complete workspace state.
|
|
910
913
|
*/
|
|
911
914
|
async exportAsJson() {
|
|
912
|
-
const workspace = this.core.store.activeWorkspace;
|
|
915
|
+
const workspace = this.core.store.state.activeWorkspace;
|
|
913
916
|
if (!workspace) {
|
|
914
917
|
throw new Error('Cannot export workspace: no active workspace is loaded');
|
|
915
918
|
}
|
|
@@ -985,7 +988,7 @@ export class KritzelEngine {
|
|
|
985
988
|
if (data.version && data.version !== WORKSPACE_EXPORT_VERSION) {
|
|
986
989
|
console.warn(`Workspace version mismatch: expected ${WORKSPACE_EXPORT_VERSION}, got ${data.version}`);
|
|
987
990
|
}
|
|
988
|
-
const activeWorkspace = this.core.store.activeWorkspace;
|
|
991
|
+
const activeWorkspace = this.core.store.state.activeWorkspace;
|
|
989
992
|
if (!activeWorkspace) {
|
|
990
993
|
throw new Error('Cannot load objects: no active workspace is loaded');
|
|
991
994
|
}
|
|
@@ -1125,7 +1128,7 @@ export class KritzelEngine {
|
|
|
1125
1128
|
}
|
|
1126
1129
|
/** Returns the currently active workspace. */
|
|
1127
1130
|
async getActiveWorkspace() {
|
|
1128
|
-
const activeWorkspace = this.core.store.activeWorkspace;
|
|
1131
|
+
const activeWorkspace = this.core.store.state.activeWorkspace;
|
|
1129
1132
|
if (!activeWorkspace) {
|
|
1130
1133
|
throw new Error('No active workspace is loaded');
|
|
1131
1134
|
}
|
|
@@ -1158,7 +1161,7 @@ export class KritzelEngine {
|
|
|
1158
1161
|
this.workspacesChange.emit(this.core.store.state.workspaces);
|
|
1159
1162
|
this.core.beforeWorkspaceChange();
|
|
1160
1163
|
await this.initializeWorkspaceIfNeeded(workspace);
|
|
1161
|
-
this.activeWorkspaceChange.emit(this.core.store.activeWorkspace);
|
|
1164
|
+
this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace);
|
|
1162
1165
|
}
|
|
1163
1166
|
/**
|
|
1164
1167
|
* Reinitializes sync by performing a full teardown and re-initialization.
|
|
@@ -1180,6 +1183,7 @@ export class KritzelEngine {
|
|
|
1180
1183
|
keyHandler;
|
|
1181
1184
|
contextMenuElement = null;
|
|
1182
1185
|
_lastHadSelectionGroup = false;
|
|
1186
|
+
_isViewportReady = false;
|
|
1183
1187
|
_isYjsInitialized = false;
|
|
1184
1188
|
_isResolvingActiveWorkspaceId = false;
|
|
1185
1189
|
_stateChangeListenersRegistered = false;
|
|
@@ -1238,6 +1242,7 @@ export class KritzelEngine {
|
|
|
1238
1242
|
this.contextMenuHandler = new KritzelContextMenuHandler(this.core, this.globalContextMenuItems, this.objectContextMenuItems);
|
|
1239
1243
|
this.keyHandler = new KritzelKeyHandler(this.core);
|
|
1240
1244
|
this.viewport = new KritzelViewport(this.core, this.host);
|
|
1245
|
+
this._isViewportReady = true;
|
|
1241
1246
|
// Initialize cursor manager with target element and shadow root
|
|
1242
1247
|
this.core.cursorManager.setTargetElement(this.cursorTarget || document.body);
|
|
1243
1248
|
if (this.host.shadowRoot) {
|
|
@@ -1303,7 +1308,7 @@ export class KritzelEngine {
|
|
|
1303
1308
|
await this.initializeWorkspaceIfNeeded(startupWorkspace);
|
|
1304
1309
|
}
|
|
1305
1310
|
// Emit initial active workspace once startup initialization has completed
|
|
1306
|
-
const initialActiveWorkspace = this.core.store.activeWorkspace;
|
|
1311
|
+
const initialActiveWorkspace = this.core.store.state.activeWorkspace;
|
|
1307
1312
|
if (initialActiveWorkspace) {
|
|
1308
1313
|
this.activeWorkspaceChange.emit(initialActiveWorkspace);
|
|
1309
1314
|
}
|
|
@@ -1332,7 +1337,7 @@ export class KritzelEngine {
|
|
|
1332
1337
|
if (!this.activeWorkspaceId || this._isResolvingActiveWorkspaceId) {
|
|
1333
1338
|
return;
|
|
1334
1339
|
}
|
|
1335
|
-
if (this.core.store.activeWorkspace?.id === this.activeWorkspaceId) {
|
|
1340
|
+
if (this.core.store.state.activeWorkspace?.id === this.activeWorkspaceId) {
|
|
1336
1341
|
return;
|
|
1337
1342
|
}
|
|
1338
1343
|
this._isResolvingActiveWorkspaceId = true;
|
|
@@ -1348,17 +1353,17 @@ export class KritzelEngine {
|
|
|
1348
1353
|
}
|
|
1349
1354
|
return;
|
|
1350
1355
|
}
|
|
1351
|
-
if (this.core.store.activeWorkspace?.id === workspace.id) {
|
|
1356
|
+
if (this.core.store.state.activeWorkspace?.id === workspace.id) {
|
|
1352
1357
|
return;
|
|
1353
1358
|
}
|
|
1354
1359
|
this.core.beforeWorkspaceChange();
|
|
1355
1360
|
await this.initializeWorkspaceIfNeeded(workspace);
|
|
1356
|
-
this.activeWorkspaceChange.emit(this.core.store.activeWorkspace);
|
|
1361
|
+
this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace);
|
|
1357
1362
|
}
|
|
1358
1363
|
async initializeWorkspaceIfNeeded(workspace, options) {
|
|
1359
1364
|
const targetWorkspaceId = workspace?.id ?? null;
|
|
1360
1365
|
const targetKey = targetWorkspaceId ?? (options?.skipFallbackCreation ? '__NO_FALLBACK__' : '__AUTO__');
|
|
1361
|
-
if (targetWorkspaceId && this.core.store.activeWorkspace?.id === targetWorkspaceId) {
|
|
1366
|
+
if (targetWorkspaceId && this.core.store.state.activeWorkspace?.id === targetWorkspaceId) {
|
|
1362
1367
|
return;
|
|
1363
1368
|
}
|
|
1364
1369
|
if (this._workspaceInitializationPromise && this._workspaceInitializationTargetKey === targetKey) {
|
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-BWj1eE2b.js";export{d as KritzelBrushTool,b as KritzelGroup,a as KritzelImage,e as KritzelLineTool,h as KritzelSelectionTool,c as KritzelShape,g as KritzelShapeTool,K as KritzelText,f as KritzelTextTool,S as ShapeType}from"./p-
|
|
1
|
+
export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-BWj1eE2b.js";export{d as KritzelBrushTool,b as KritzelGroup,a as KritzelImage,e as KritzelLineTool,h as KritzelSelectionTool,c as KritzelShape,g as KritzelShapeTool,K as KritzelText,f as KritzelTextTool,S as ShapeType}from"./p-BPQOTise.js";export{a as KritzelLine,K as KritzelPath}from"./p-DQK_4lkI.js";export{A as APP_STATE_MIGRATIONS,I as IndexedDBSyncProvider,d as KritzelAlignment,c as KritzelAnchorManager,b as KritzelCursorHelper,K as KritzelEraserTool,a as KritzelImageTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-CgtykATT.js";import*as t from"yjs";import{WebsocketProvider as i}from"y-websocket";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,H as HocuspocusSyncProvider,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelWorkspace,W as WORKSPACE_EXPORT_VERSION}from"./p-DhMlShij.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-CjazGGq3.js";export{C as CURRENT_APP_STATE_SCHEMA_VERSION,a as CURRENT_WORKSPACE_SCHEMA_VERSION}from"./p-CW-VyJgK.js";export{KritzelActiveUsers,defineCustomElement as defineCustomElementKritzelActiveUsers}from"./kritzel-active-users.js";export{KritzelAvatar,defineCustomElement as defineCustomElementKritzelAvatar}from"./kritzel-avatar.js";export{KritzelAwarenessCursors,defineCustomElement as defineCustomElementKritzelAwarenessCursors}from"./kritzel-awareness-cursors.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelButton,defineCustomElement as defineCustomElementKritzelButton}from"./kritzel-button.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCurrentUser,defineCustomElement as defineCustomElementKritzelCurrentUser}from"./kritzel-current-user.js";export{KritzelCurrentUserDialog,defineCustomElement as defineCustomElementKritzelCurrentUserDialog}from"./kritzel-current-user-dialog.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelInput,defineCustomElement as defineCustomElementKritzelInput}from"./kritzel-input.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelLoginDialog,defineCustomElement as defineCustomElementKritzelLoginDialog}from"./kritzel-login-dialog.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPillTabs,defineCustomElement as defineCustomElementKritzelPillTabs}from"./kritzel-pill-tabs.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelShareDialog,defineCustomElement as defineCustomElementKritzelShareDialog}from"./kritzel-share-dialog.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";const o=Math.floor,n=127,m=Number.MAX_SAFE_INTEGER;class u{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const z=()=>new u,E=e=>{const t=new Uint8Array((e=>{let t=e.cpos;for(let r=0;r<e.bufs.length;r++)t+=e.bufs[r].length;return t})(e));let r=0;for(let s=0;s<e.bufs.length;s++){const i=e.bufs[s];t.set(i,r),r+=i.length}return t.set(new Uint8Array(e.cbuf.buffer,0,e.cpos),r),t},p=(e,t)=>{const r=e.cbuf.length;e.cpos===r&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(2*r),e.cpos=0),e.cbuf[e.cpos++]=t},k=(e,t)=>{for(;t>n;)p(e,128|n&t),t=o(t/128);p(e,n&t)},x=(e,t)=>{k(e,t.byteLength),((e,t)=>{const r=e.cbuf.length,s=e.cpos,i=((e,t)=>e<t?e:t)(r-s,t.length),o=t.length-i;e.cbuf.set(t.subarray(0,i),s),e.cpos+=i,o>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*r,o)),e.cbuf.set(t.subarray(i)),e.cpos=o)})(e,t)},j=e=>Error(e),T=j("Unexpected end of array"),y=j("Integer out of Range");class w{constructor(e){this.arr=e,this.pos=0}}const P=e=>((e,t)=>{const r=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,r})(e,M(e)),M=e=>{let t=0,r=1;const s=e.arr.length;for(;e.pos<s;){const s=e.arr[e.pos++];if(t+=(s&n)*r,r*=128,s<128)return t;if(t>m)throw y}throw T};class U{type="local";doc;channel;_synced=!1;constructor(e,t,r){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),r?.quiet||console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,t)=>{if(t!==this){const t=z();k(t,0),x(t,e),this.channel.postMessage(E(t))}};handleMessage(e){const r=(e=>new w(e))(new Uint8Array(e));switch(M(r)){case 0:const e=P(r);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const s=P(r),i=t.encodeStateAsUpdate(this.doc,s);if(i.length>0){const e=z();k(e,0),x(e,i),this.channel.postMessage(E(e))}}}broadcastSync(){const e=z();k(e,2),x(e,t.encodeStateVector(this.doc)),this.channel.postMessage(E(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}class _{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,r){const s=r?.url||"ws://localhost:1234",o=r?.roomName||e;this.provider=new i(s,o,t,{params:r?.params,protocols:r?.protocols,WebSocketPolyfill:r?.WebSocketPolyfill,awareness:r?.awareness,maxBackoffTime:r?.maxBackoffTime,disableBc:!0}),this._quiet=r?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${s}/${o}`)}static with(e){return{create:(t,r,s)=>{const i=s?{...e,...s}:e;return new _(t,r,i)}}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const r=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),s=({status:t})=>{"connected"===t&&(clearTimeout(r),this.provider.off("status",s),this.isConnected=!0,e())};this.provider.on("status",s),this.provider.wsconnected&&(clearTimeout(r),this.provider.off("status",s),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}export{U as BroadcastSyncProvider,_ as WebSocketSyncProvider}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as o,d as s}from"./p-
|
|
1
|
+
import{K as o,d as s}from"./p-B4h_tGG1.js";const t=o,p=s;export{t as KritzelAwarenessCursors,p as defineCustomElement}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as o,d as s}from"./p-
|
|
1
|
+
import{K as o,d as s}from"./p-C35iuSnC.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
|