kritzel-stencil 0.1.24 → 0.1.25
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/{default-line-tool.config-Ba74O1gD.js → default-line-tool.config-nMR5iYBB.js} +67 -41
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +2 -2
- package/dist/collection/classes/handlers/move.handler.js +4 -2
- package/dist/collection/classes/handlers/rotation.handler.js +0 -4
- package/dist/collection/classes/handlers/selection.handler.js +35 -20
- package/dist/collection/classes/objects/selection-group.class.js +28 -15
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.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-DYAnRoi2.js → p-8uGOVKdw.js} +1 -1
- package/dist/components/{p-DAPeFBqC.js → p-B-muKisW.js} +1 -1
- package/dist/components/{p-0YNMEgri.js → p-BkLVv1nj.js} +1 -1
- package/dist/components/{p-8fc2rB08.js → p-CkN6-oE3.js} +1 -1
- package/dist/components/{p-mPdux0tA.js → p-DmN0DKS3.js} +1 -1
- package/dist/esm/{default-line-tool.config-BW07ZETV.js → default-line-tool.config-OwcgiNEW.js} +67 -41
- package/dist/esm/index.js +2 -2
- package/dist/esm/kritzel-back-to-content_32.entry.js +2 -2
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/{p-e28ee5ef.entry.js → p-00e3ec46.entry.js} +2 -2
- package/dist/stencil/{p-BW07ZETV.js → p-OwcgiNEW.js} +1 -1
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/handlers/rotation.handler.d.ts +0 -2
- package/dist/types/classes/objects/selection-group.class.d.ts +7 -2
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/cjs/{default-line-tool.config-Ba74O1gD.js → default-line-tool.config-nMR5iYBB.js}
RENAMED
|
@@ -16827,13 +16827,15 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
16827
16827
|
minY;
|
|
16828
16828
|
maxY;
|
|
16829
16829
|
// Getter to retrieve actual objects from the store by their IDs
|
|
16830
|
+
// Optimized: Single filter pass with Set lookup - O(n+m) instead of O(n×m)
|
|
16830
16831
|
get objects() {
|
|
16832
|
+
const idSet = new Set(this.objectIds);
|
|
16833
|
+
const foundObjects = this._core.store.state.objects.filter(obj => idSet.has(obj.id));
|
|
16834
|
+
// Preserve the original order from objectIds
|
|
16835
|
+
const objectMap = new Map(foundObjects.map(obj => [obj.id, obj]));
|
|
16831
16836
|
return this.objectIds
|
|
16832
|
-
.map(id =>
|
|
16833
|
-
|
|
16834
|
-
return found.length > 0 ? found[0] : null;
|
|
16835
|
-
})
|
|
16836
|
-
.filter(obj => obj !== null);
|
|
16837
|
+
.map(id => objectMap.get(id))
|
|
16838
|
+
.filter((obj) => obj !== undefined);
|
|
16837
16839
|
}
|
|
16838
16840
|
get length() {
|
|
16839
16841
|
return this.objectIds.length;
|
|
@@ -16904,11 +16906,13 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
16904
16906
|
}
|
|
16905
16907
|
/**
|
|
16906
16908
|
* Capture snapshots of current object states for undo/redo operations
|
|
16909
|
+
* @param cachedObjects Optional pre-fetched objects array to avoid redundant getter calls
|
|
16907
16910
|
*/
|
|
16908
|
-
captureUnchangedSnapshots() {
|
|
16911
|
+
captureUnchangedSnapshots(cachedObjects) {
|
|
16909
16912
|
this.unchangedObjectSnapshots.clear();
|
|
16910
16913
|
this.snapshotRotation = this.rotation;
|
|
16911
|
-
this.objects
|
|
16914
|
+
const children = cachedObjects ?? this.objects;
|
|
16915
|
+
children.forEach(obj => {
|
|
16912
16916
|
this.unchangedObjectSnapshots.set(obj.id, {
|
|
16913
16917
|
id: obj.id,
|
|
16914
16918
|
translateX: obj.translateX,
|
|
@@ -16983,7 +16987,9 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
16983
16987
|
const cosR = Math.cos(rotation);
|
|
16984
16988
|
const sinR = Math.sin(rotation);
|
|
16985
16989
|
this._core.store.state.objects.transaction(() => {
|
|
16986
|
-
|
|
16990
|
+
// Cache objects once to avoid repeated getter calls during resize
|
|
16991
|
+
const children = this.objects;
|
|
16992
|
+
children.forEach(child => {
|
|
16987
16993
|
// Calculate child center
|
|
16988
16994
|
const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;
|
|
16989
16995
|
const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;
|
|
@@ -17024,8 +17030,8 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
17024
17030
|
this._core.anchorManager.updateAnchorsForObject(child.id);
|
|
17025
17031
|
});
|
|
17026
17032
|
// Refresh dimensions and update the SelectionGroup to propagate changes to other tabs
|
|
17027
|
-
this.refreshObjectDimensions();
|
|
17028
|
-
this.captureUnchangedSnapshots();
|
|
17033
|
+
this.refreshObjectDimensions(children);
|
|
17034
|
+
this.captureUnchangedSnapshots(children);
|
|
17029
17035
|
this._core.store.state.objects.update(this);
|
|
17030
17036
|
});
|
|
17031
17037
|
}
|
|
@@ -17036,10 +17042,12 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
17036
17042
|
const angle = value - this.snapshotRotation;
|
|
17037
17043
|
const cos = Math.cos(angle);
|
|
17038
17044
|
const sin = Math.sin(angle);
|
|
17045
|
+
// Cache objects once to avoid repeated getter calls during rotation
|
|
17046
|
+
const children = this.objects;
|
|
17039
17047
|
this._core.store.state.objects.transaction(() => {
|
|
17040
17048
|
// Update the SelectionGroup itself to propagate rotation to other tabs
|
|
17041
17049
|
this._core.store.state.objects.update(this);
|
|
17042
|
-
|
|
17050
|
+
children.forEach(child => {
|
|
17043
17051
|
const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);
|
|
17044
17052
|
if (!unchangedSnapshot)
|
|
17045
17053
|
return;
|
|
@@ -17067,9 +17075,14 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
17067
17075
|
}
|
|
17068
17076
|
return selectionGroup;
|
|
17069
17077
|
}
|
|
17070
|
-
|
|
17071
|
-
|
|
17072
|
-
|
|
17078
|
+
/**
|
|
17079
|
+
* Refreshes the selection group's bounding box dimensions based on contained objects.
|
|
17080
|
+
* @param cachedObjects Optional pre-fetched objects array to avoid redundant getter calls
|
|
17081
|
+
*/
|
|
17082
|
+
refreshObjectDimensions(cachedObjects) {
|
|
17083
|
+
const children = cachedObjects ?? this.objects;
|
|
17084
|
+
if (children.length === 1) {
|
|
17085
|
+
const obj = children[0];
|
|
17073
17086
|
this.minX = obj.boundingBox.x / this.scale;
|
|
17074
17087
|
this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;
|
|
17075
17088
|
this.minY = obj.boundingBox.y / this.scale;
|
|
@@ -17087,7 +17100,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
17087
17100
|
let maxX = -Infinity;
|
|
17088
17101
|
let minY = Infinity;
|
|
17089
17102
|
let maxY = -Infinity;
|
|
17090
|
-
|
|
17103
|
+
children.forEach(obj => {
|
|
17091
17104
|
const polygon = obj.rotatedPolygon;
|
|
17092
17105
|
const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
|
|
17093
17106
|
corners.forEach(corner => {
|
|
@@ -17910,12 +17923,14 @@ class KritzelMoveHandler extends KritzelBaseHandler {
|
|
|
17910
17923
|
}
|
|
17911
17924
|
// Only disconnect lines if the selection group contains ONLY lines.
|
|
17912
17925
|
// If moving lines with other objects (e.g. shapes they might be anchored to), prevent auto-disconnect.
|
|
17913
|
-
|
|
17926
|
+
// Cache objects once to avoid repeated getter calls
|
|
17927
|
+
const children = selectionGroup.objects;
|
|
17928
|
+
const onlyLines = children.every(obj => obj instanceof KritzelLine);
|
|
17914
17929
|
if (!onlyLines) {
|
|
17915
17930
|
return;
|
|
17916
17931
|
}
|
|
17917
17932
|
// Find and disconnect anchors from all anchored lines in the selection
|
|
17918
|
-
for (const obj of
|
|
17933
|
+
for (const obj of children) {
|
|
17919
17934
|
// Skip if already disconnected in this drag session
|
|
17920
17935
|
if (this.disconnectedLineIds.has(obj.id)) {
|
|
17921
17936
|
continue;
|
|
@@ -18156,7 +18171,6 @@ class KritzelResizeHandler extends KritzelBaseHandler {
|
|
|
18156
18171
|
class KritzelRotationHandler extends KritzelBaseHandler {
|
|
18157
18172
|
initialRotation = 0;
|
|
18158
18173
|
rotation = 0;
|
|
18159
|
-
unchangedObjects = [];
|
|
18160
18174
|
initialSelectionGroupRotation = 0;
|
|
18161
18175
|
constructor(core) {
|
|
18162
18176
|
super(core);
|
|
@@ -18164,7 +18178,6 @@ class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
18164
18178
|
reset() {
|
|
18165
18179
|
this.initialRotation = 0;
|
|
18166
18180
|
this.rotation = 0;
|
|
18167
|
-
this.unchangedObjects = [];
|
|
18168
18181
|
}
|
|
18169
18182
|
handlePointerDown(event) {
|
|
18170
18183
|
if (event.pointerType === 'mouse') {
|
|
@@ -18182,7 +18195,6 @@ class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
18182
18195
|
const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
|
|
18183
18196
|
this.initialSelectionGroupRotation = selectionGroup.rotation;
|
|
18184
18197
|
this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;
|
|
18185
|
-
this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());
|
|
18186
18198
|
}
|
|
18187
18199
|
}
|
|
18188
18200
|
}
|
|
@@ -18206,7 +18218,6 @@ class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
18206
18218
|
const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
|
|
18207
18219
|
this.initialSelectionGroupRotation = selectionGroup.rotation;
|
|
18208
18220
|
this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;
|
|
18209
|
-
this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());
|
|
18210
18221
|
clearTimeout(this._core.store.state.longTouchTimeout);
|
|
18211
18222
|
}
|
|
18212
18223
|
}
|
|
@@ -18474,10 +18485,22 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
18474
18485
|
}
|
|
18475
18486
|
updateSelectedObjects() {
|
|
18476
18487
|
const selectionBox = this._core.store.selectionBox;
|
|
18477
|
-
if (selectionBox)
|
|
18478
|
-
|
|
18479
|
-
|
|
18480
|
-
|
|
18488
|
+
if (!selectionBox)
|
|
18489
|
+
return;
|
|
18490
|
+
// Compute rotatedPolygon once per update (not per object)
|
|
18491
|
+
const selectionPolygon = selectionBox.rotatedPolygon;
|
|
18492
|
+
// Use quadtree spatial query to get only nearby candidates - O(log n + k) instead of O(n)
|
|
18493
|
+
const selectionBounds = selectionBox.rotatedBoundingBox;
|
|
18494
|
+
const candidates = this._core.store.state.objects.query(selectionBounds);
|
|
18495
|
+
// Clear selection on all non-selection objects first
|
|
18496
|
+
this._core.store.allNonSelectionObjects.forEach(obj => {
|
|
18497
|
+
obj.isSelected = false;
|
|
18498
|
+
});
|
|
18499
|
+
// Only test candidates that overlap the bounding box
|
|
18500
|
+
for (const object of candidates) {
|
|
18501
|
+
if (object instanceof KritzelSelectionBox)
|
|
18502
|
+
continue;
|
|
18503
|
+
object.isSelected = object.hitTestPolygon(selectionPolygon);
|
|
18481
18504
|
}
|
|
18482
18505
|
}
|
|
18483
18506
|
handleSelectionClick(event) {
|
|
@@ -18524,25 +18547,28 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
18524
18547
|
if (selectedObjects.length === 0) {
|
|
18525
18548
|
return;
|
|
18526
18549
|
}
|
|
18527
|
-
//
|
|
18528
|
-
const
|
|
18529
|
-
|
|
18530
|
-
|
|
18531
|
-
const
|
|
18532
|
-
|
|
18533
|
-
// Add the parent group instead of the child
|
|
18534
|
-
resolvedObjects.set(parentGroup.id, parentGroup);
|
|
18535
|
-
}
|
|
18536
|
-
else {
|
|
18537
|
-
// Not a child of any group, add the object itself
|
|
18538
|
-
resolvedObjects.set(obj.id, obj);
|
|
18550
|
+
// Build parent group lookup map ONCE - O(g * c) instead of O(n * g * c)
|
|
18551
|
+
const allGroups = this._core.store.state.objects.filter(obj => obj.__class__ === 'KritzelGroup');
|
|
18552
|
+
const childToParentMap = new Map();
|
|
18553
|
+
for (const group of allGroups) {
|
|
18554
|
+
for (const childId of group.childIds) {
|
|
18555
|
+
childToParentMap.set(childId, group);
|
|
18539
18556
|
}
|
|
18557
|
+
}
|
|
18558
|
+
// Resolve child objects to their parent groups in a single pass - O(n)
|
|
18559
|
+
const resolvedObjects = new Map();
|
|
18560
|
+
for (const obj of selectedObjects) {
|
|
18561
|
+
const parentGroup = childToParentMap.get(obj.id);
|
|
18562
|
+
const toSelect = parentGroup || obj;
|
|
18563
|
+
resolvedObjects.set(toSelect.id, toSelect);
|
|
18540
18564
|
obj.isSelected = false;
|
|
18541
|
-
}
|
|
18565
|
+
}
|
|
18566
|
+
// Create selection group and set all IDs at once (no per-item refresh)
|
|
18542
18567
|
const selectionGroup = KritzelSelectionGroup.create(this._core);
|
|
18543
|
-
resolvedObjects.
|
|
18544
|
-
|
|
18545
|
-
|
|
18568
|
+
selectionGroup.objectIds = Array.from(resolvedObjects.keys());
|
|
18569
|
+
// Only refresh dimensions and capture snapshots ONCE at the end - O(n) instead of O(n²)
|
|
18570
|
+
selectionGroup.captureUnchangedSnapshots();
|
|
18571
|
+
selectionGroup.refreshObjectDimensions();
|
|
18546
18572
|
selectionGroup.isSelected = true;
|
|
18547
18573
|
if (selectionGroup.length === 1) {
|
|
18548
18574
|
selectionGroup.rotation = selectionGroup.objects[0].rotation;
|
package/dist/cjs/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-i21-qqbc.js');
|
|
4
|
-
var defaultLineTool_config = require('./default-line-tool.config-
|
|
4
|
+
var defaultLineTool_config = require('./default-line-tool.config-nMR5iYBB.js');
|
|
5
5
|
|
|
6
6
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
7
7
|
|
|
@@ -23742,7 +23742,7 @@ const KritzelPortal = class {
|
|
|
23742
23742
|
* This file is auto-generated by the version bump scripts.
|
|
23743
23743
|
* Do not modify manually.
|
|
23744
23744
|
*/
|
|
23745
|
-
const KRITZEL_VERSION = '0.1.
|
|
23745
|
+
const KRITZEL_VERSION = '0.1.25';
|
|
23746
23746
|
|
|
23747
23747
|
const kritzelSettingsCss = () => `:host{display:contents}kritzel-dialog{--kritzel-dialog-body-padding:0;--kritzel-dialog-width-large:800px;--kritzel-dialog-height-large:500px}.footer-button{padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px}.cancel-button{border:1px solid #ebebeb;background:#fff;color:inherit}.cancel-button:hover{background:#f5f5f5}.settings-content{padding:0}.settings-content h3{margin:0 0 16px 0;font-size:18px;font-weight:600;color:var(--kritzel-settings-content-heading-color, #333333)}.settings-content p{margin:0;font-size:14px;color:var(--kritzel-settings-content-text-color, #666666);line-height:1.5}.settings-group{display:flex;flex-direction:column;gap:24px}.settings-item{display:flex;flex-direction:column;gap:8px}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.settings-label{font-size:14px;font-weight:500;color:var(--kritzel-settings-label-color, #333333);margin:0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}`;
|
|
23748
23748
|
|
|
@@ -184,12 +184,14 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
|
|
|
184
184
|
}
|
|
185
185
|
// Only disconnect lines if the selection group contains ONLY lines.
|
|
186
186
|
// If moving lines with other objects (e.g. shapes they might be anchored to), prevent auto-disconnect.
|
|
187
|
-
|
|
187
|
+
// Cache objects once to avoid repeated getter calls
|
|
188
|
+
const children = selectionGroup.objects;
|
|
189
|
+
const onlyLines = children.every(obj => obj instanceof KritzelLine);
|
|
188
190
|
if (!onlyLines) {
|
|
189
191
|
return;
|
|
190
192
|
}
|
|
191
193
|
// Find and disconnect anchors from all anchored lines in the selection
|
|
192
|
-
for (const obj of
|
|
194
|
+
for (const obj of children) {
|
|
193
195
|
// Skip if already disconnected in this drag session
|
|
194
196
|
if (this.disconnectedLineIds.has(obj.id)) {
|
|
195
197
|
continue;
|
|
@@ -3,7 +3,6 @@ import { KritzelBaseHandler } from "./base.handler";
|
|
|
3
3
|
export class KritzelRotationHandler extends KritzelBaseHandler {
|
|
4
4
|
initialRotation = 0;
|
|
5
5
|
rotation = 0;
|
|
6
|
-
unchangedObjects = [];
|
|
7
6
|
initialSelectionGroupRotation = 0;
|
|
8
7
|
constructor(core) {
|
|
9
8
|
super(core);
|
|
@@ -11,7 +10,6 @@ export class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
11
10
|
reset() {
|
|
12
11
|
this.initialRotation = 0;
|
|
13
12
|
this.rotation = 0;
|
|
14
|
-
this.unchangedObjects = [];
|
|
15
13
|
}
|
|
16
14
|
handlePointerDown(event) {
|
|
17
15
|
if (event.pointerType === 'mouse') {
|
|
@@ -29,7 +27,6 @@ export class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
29
27
|
const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
|
|
30
28
|
this.initialSelectionGroupRotation = selectionGroup.rotation;
|
|
31
29
|
this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;
|
|
32
|
-
this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
32
|
}
|
|
@@ -53,7 +50,6 @@ export class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
53
50
|
const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
|
|
54
51
|
this.initialSelectionGroupRotation = selectionGroup.rotation;
|
|
55
52
|
this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;
|
|
56
|
-
this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());
|
|
57
53
|
clearTimeout(this._core.store.state.longTouchTimeout);
|
|
58
54
|
}
|
|
59
55
|
}
|
|
@@ -186,10 +186,22 @@ export class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
186
186
|
}
|
|
187
187
|
updateSelectedObjects() {
|
|
188
188
|
const selectionBox = this._core.store.selectionBox;
|
|
189
|
-
if (selectionBox)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
if (!selectionBox)
|
|
190
|
+
return;
|
|
191
|
+
// Compute rotatedPolygon once per update (not per object)
|
|
192
|
+
const selectionPolygon = selectionBox.rotatedPolygon;
|
|
193
|
+
// Use quadtree spatial query to get only nearby candidates - O(log n + k) instead of O(n)
|
|
194
|
+
const selectionBounds = selectionBox.rotatedBoundingBox;
|
|
195
|
+
const candidates = this._core.store.state.objects.query(selectionBounds);
|
|
196
|
+
// Clear selection on all non-selection objects first
|
|
197
|
+
this._core.store.allNonSelectionObjects.forEach(obj => {
|
|
198
|
+
obj.isSelected = false;
|
|
199
|
+
});
|
|
200
|
+
// Only test candidates that overlap the bounding box
|
|
201
|
+
for (const object of candidates) {
|
|
202
|
+
if (object instanceof KritzelSelectionBox)
|
|
203
|
+
continue;
|
|
204
|
+
object.isSelected = object.hitTestPolygon(selectionPolygon);
|
|
193
205
|
}
|
|
194
206
|
}
|
|
195
207
|
handleSelectionClick(event) {
|
|
@@ -236,25 +248,28 @@ export class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
236
248
|
if (selectedObjects.length === 0) {
|
|
237
249
|
return;
|
|
238
250
|
}
|
|
239
|
-
//
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
// Add the parent group instead of the child
|
|
246
|
-
resolvedObjects.set(parentGroup.id, parentGroup);
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
// Not a child of any group, add the object itself
|
|
250
|
-
resolvedObjects.set(obj.id, obj);
|
|
251
|
+
// Build parent group lookup map ONCE - O(g * c) instead of O(n * g * c)
|
|
252
|
+
const allGroups = this._core.store.state.objects.filter(obj => obj.__class__ === 'KritzelGroup');
|
|
253
|
+
const childToParentMap = new Map();
|
|
254
|
+
for (const group of allGroups) {
|
|
255
|
+
for (const childId of group.childIds) {
|
|
256
|
+
childToParentMap.set(childId, group);
|
|
251
257
|
}
|
|
258
|
+
}
|
|
259
|
+
// Resolve child objects to their parent groups in a single pass - O(n)
|
|
260
|
+
const resolvedObjects = new Map();
|
|
261
|
+
for (const obj of selectedObjects) {
|
|
262
|
+
const parentGroup = childToParentMap.get(obj.id);
|
|
263
|
+
const toSelect = parentGroup || obj;
|
|
264
|
+
resolvedObjects.set(toSelect.id, toSelect);
|
|
252
265
|
obj.isSelected = false;
|
|
253
|
-
}
|
|
266
|
+
}
|
|
267
|
+
// Create selection group and set all IDs at once (no per-item refresh)
|
|
254
268
|
const selectionGroup = KritzelSelectionGroup.create(this._core);
|
|
255
|
-
resolvedObjects.
|
|
256
|
-
|
|
257
|
-
|
|
269
|
+
selectionGroup.objectIds = Array.from(resolvedObjects.keys());
|
|
270
|
+
// Only refresh dimensions and capture snapshots ONCE at the end - O(n) instead of O(n²)
|
|
271
|
+
selectionGroup.captureUnchangedSnapshots();
|
|
272
|
+
selectionGroup.refreshObjectDimensions();
|
|
258
273
|
selectionGroup.isSelected = true;
|
|
259
274
|
if (selectionGroup.length === 1) {
|
|
260
275
|
selectionGroup.rotation = selectionGroup.objects[0].rotation;
|
|
@@ -13,13 +13,15 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
13
13
|
minY;
|
|
14
14
|
maxY;
|
|
15
15
|
// Getter to retrieve actual objects from the store by their IDs
|
|
16
|
+
// Optimized: Single filter pass with Set lookup - O(n+m) instead of O(n×m)
|
|
16
17
|
get objects() {
|
|
18
|
+
const idSet = new Set(this.objectIds);
|
|
19
|
+
const foundObjects = this._core.store.state.objects.filter(obj => idSet.has(obj.id));
|
|
20
|
+
// Preserve the original order from objectIds
|
|
21
|
+
const objectMap = new Map(foundObjects.map(obj => [obj.id, obj]));
|
|
17
22
|
return this.objectIds
|
|
18
|
-
.map(id =>
|
|
19
|
-
|
|
20
|
-
return found.length > 0 ? found[0] : null;
|
|
21
|
-
})
|
|
22
|
-
.filter(obj => obj !== null);
|
|
23
|
+
.map(id => objectMap.get(id))
|
|
24
|
+
.filter((obj) => obj !== undefined);
|
|
23
25
|
}
|
|
24
26
|
get length() {
|
|
25
27
|
return this.objectIds.length;
|
|
@@ -90,11 +92,13 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
90
92
|
}
|
|
91
93
|
/**
|
|
92
94
|
* Capture snapshots of current object states for undo/redo operations
|
|
95
|
+
* @param cachedObjects Optional pre-fetched objects array to avoid redundant getter calls
|
|
93
96
|
*/
|
|
94
|
-
captureUnchangedSnapshots() {
|
|
97
|
+
captureUnchangedSnapshots(cachedObjects) {
|
|
95
98
|
this.unchangedObjectSnapshots.clear();
|
|
96
99
|
this.snapshotRotation = this.rotation;
|
|
97
|
-
this.objects
|
|
100
|
+
const children = cachedObjects ?? this.objects;
|
|
101
|
+
children.forEach(obj => {
|
|
98
102
|
this.unchangedObjectSnapshots.set(obj.id, {
|
|
99
103
|
id: obj.id,
|
|
100
104
|
translateX: obj.translateX,
|
|
@@ -169,7 +173,9 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
169
173
|
const cosR = Math.cos(rotation);
|
|
170
174
|
const sinR = Math.sin(rotation);
|
|
171
175
|
this._core.store.state.objects.transaction(() => {
|
|
172
|
-
|
|
176
|
+
// Cache objects once to avoid repeated getter calls during resize
|
|
177
|
+
const children = this.objects;
|
|
178
|
+
children.forEach(child => {
|
|
173
179
|
// Calculate child center
|
|
174
180
|
const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;
|
|
175
181
|
const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;
|
|
@@ -210,8 +216,8 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
210
216
|
this._core.anchorManager.updateAnchorsForObject(child.id);
|
|
211
217
|
});
|
|
212
218
|
// Refresh dimensions and update the SelectionGroup to propagate changes to other tabs
|
|
213
|
-
this.refreshObjectDimensions();
|
|
214
|
-
this.captureUnchangedSnapshots();
|
|
219
|
+
this.refreshObjectDimensions(children);
|
|
220
|
+
this.captureUnchangedSnapshots(children);
|
|
215
221
|
this._core.store.state.objects.update(this);
|
|
216
222
|
});
|
|
217
223
|
}
|
|
@@ -222,10 +228,12 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
222
228
|
const angle = value - this.snapshotRotation;
|
|
223
229
|
const cos = Math.cos(angle);
|
|
224
230
|
const sin = Math.sin(angle);
|
|
231
|
+
// Cache objects once to avoid repeated getter calls during rotation
|
|
232
|
+
const children = this.objects;
|
|
225
233
|
this._core.store.state.objects.transaction(() => {
|
|
226
234
|
// Update the SelectionGroup itself to propagate rotation to other tabs
|
|
227
235
|
this._core.store.state.objects.update(this);
|
|
228
|
-
|
|
236
|
+
children.forEach(child => {
|
|
229
237
|
const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);
|
|
230
238
|
if (!unchangedSnapshot)
|
|
231
239
|
return;
|
|
@@ -253,9 +261,14 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
253
261
|
}
|
|
254
262
|
return selectionGroup;
|
|
255
263
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
264
|
+
/**
|
|
265
|
+
* Refreshes the selection group's bounding box dimensions based on contained objects.
|
|
266
|
+
* @param cachedObjects Optional pre-fetched objects array to avoid redundant getter calls
|
|
267
|
+
*/
|
|
268
|
+
refreshObjectDimensions(cachedObjects) {
|
|
269
|
+
const children = cachedObjects ?? this.objects;
|
|
270
|
+
if (children.length === 1) {
|
|
271
|
+
const obj = children[0];
|
|
259
272
|
this.minX = obj.boundingBox.x / this.scale;
|
|
260
273
|
this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;
|
|
261
274
|
this.minY = obj.boundingBox.y / this.scale;
|
|
@@ -273,7 +286,7 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
273
286
|
let maxX = -Infinity;
|
|
274
287
|
let minY = Infinity;
|
|
275
288
|
let maxY = -Infinity;
|
|
276
|
-
|
|
289
|
+
children.forEach(obj => {
|
|
277
290
|
const polygon = obj.rotatedPolygon;
|
|
278
291
|
const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
|
|
279
292
|
corners.forEach(corner => {
|
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-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-DAPeFBqC.js";import{w as t,a as i,t as o,r as n,b as u,e as m,c as p,d as z,f as C,g as k,s as x,h as y,i as S,v as j,j as T,o as w,k as v,l as P,m as M,O as B,n as W,p as U,q as A,u as H,x as L,y as O,z as N,A as _,B as $,C as R,H as q,D as X}from"./p-mPdux0tA.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-mPdux0tA.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-BX4JyoOd.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.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{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{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.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{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{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";class Y{doc;channel;_synced=!1;constructor(e,t,s){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),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=C();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=k(new Uint8Array(e));switch(n(s)){case 0:const e=u(s);p(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=u(s),r=m(this.doc,n);if(r.length>0){const e=C();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=C();t(e,2),i(e,z(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const Q=new Map,V="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:S(t.newValue||"")}),w(this._onChange)}postMessage(e){j.setItem(this.room,T(v(e)))}close(){P(this._onChange)}}:BroadcastChannel,Z=e=>x(Q,e,(()=>{const t=y(),s=new V(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),ee=(e,t,s=null)=>{const i=Z(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},te=(e,s)=>{t(e,0);const o=z(s);i(e,o)},se=(e,s,o)=>{t(e,1),i(e,m(s,o))},ie=(e,t,s,i)=>{try{p(t,u(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},oe=ie;class ne extends B{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=U();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&re(this,t,"timeout")}),W(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:U()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),A(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const re=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:U()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},le=(e,s,i=e.states)=>{const n=s.length,r=C();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),H(r,JSON.stringify(l))}return o(r)},ae=[];ae[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{se(t,s,u(e))})(e,t,s);break;case 1:ie(e,s,i,o);break;case 2:oe(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},ae[3]=(e,s,o)=>{t(e,1),i(e,le(o.awareness,Array.from(o.awareness.getStates().keys())))},ae[1]=(e,t,s)=>{((e,t,s)=>{const i=k(t),o=U(),r=[],l=[],a=[],c=[],d=n(i);for(let t=0;t<d;t++){const t=n(i);let s=n(i);const d=JSON.parse(M(i)),h=e.meta.get(t),u=e.states.get(t),m=void 0===h?0:h.clock;(m<s||m===s&&null===d&&e.states.has(t))&&(null===d?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,d),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===h&&null!==d?r.push(t):void 0!==h&&null===d?c.push(t):null!==d&&(A(d,u)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,u(t),s)},ae[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,M(e))})(t,0,((e,t)=>ce(s,t)))};const ce=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),de=(e,t,s)=>{const i=k(t),o=C(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},he=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,re(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(ue,$(100*R(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},ue=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=U();const i=de(e,new Uint8Array(t.data),!0);N(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{he(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=U(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=C();if(t(n,0),te(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=C();t(n,1),i(n,le(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},me=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&ee(e.bcChannel,t,e)};class fe extends O{constructor(e,s,n,{connect:r=!0,awareness:l=new ne(n),params:a={},protocols:c=[],WebSocketPolyfill:d=WebSocket,resyncInterval:h=-1,maxBackoffTime:u=2500,disableBc:m=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=u,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=d,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=m,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ae.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,h>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=C();t(e,0),te(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=de(this,new Uint8Array(e),!1);N(t)>1&&ee(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=C();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),me(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=C();t(a,1),i(a,le(l,r)),me(this,o(a))},this._exitHandler=()=>{re(this.awareness,[n.clientID],"app closed")},_&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<U()-this.wsLastMessageReceived&&he(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>L(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),_&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{Z(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=C();t(e,0),te(e,this.doc),ee(this.bcChannel,o(e),this);const s=C();t(s,0),se(s,this.doc),ee(this.bcChannel,o(s),this);const n=C();t(n,3),ee(this.bcChannel,o(n),this);const r=C();t(r,1),i(r,le(this.awareness,[this.doc.clientID])),ee(this.bcChannel,o(r),this)}disconnectBc(){const e=C();t(e,1),i(e,le(this.awareness,[this.doc.clientID],new Map)),me(this,o(e)),this.bcconnected&&(((e,t)=>{const s=Z(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),Q.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&he(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(ue(this),this.connectBc())}}class pe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new fe(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new pe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class ze{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||ze.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new q(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new q(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(ze.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),ze.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),ze.sharedWebSocketProvider=new X(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),ze.sharedWebSocketProvider}static destroySharedWebSocket(){ze.sharedWebSocketProvider&&(ze.sharedWebSocketProvider.destroy(),ze.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return ze.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new ze(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{Y as BroadcastSyncProvider,ze as HocuspocusSyncProvider,pe as WebSocketSyncProvider}
|
|
1
|
+
export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-B-muKisW.js";import{w as t,a as i,t as o,r as n,b as u,e as m,c as p,d as z,f as C,g as k,s as S,h as x,i as y,v as j,j as T,o as w,k as v,l as M,m as P,O as B,n as W,p as U,q as H,u as A,x as L,y as O,z as N,A as _,B as $,C as R,H as X,D as Y}from"./p-DmN0DKS3.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-DmN0DKS3.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-BX4JyoOd.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.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{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{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.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{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{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";class q{doc;channel;_synced=!1;constructor(e,t,s){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),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=C();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=k(new Uint8Array(e));switch(n(s)){case 0:const e=u(s);p(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=u(s),r=m(this.doc,n);if(r.length>0){const e=C();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=C();t(e,2),i(e,z(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const Q=new Map,V="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:y(t.newValue||"")}),w(this._onChange)}postMessage(e){j.setItem(this.room,T(v(e)))}close(){M(this._onChange)}}:BroadcastChannel,Z=e=>S(Q,e,(()=>{const t=x(),s=new V(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),ee=(e,t,s=null)=>{const i=Z(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},te=(e,s)=>{t(e,0);const o=z(s);i(e,o)},se=(e,s,o)=>{t(e,1),i(e,m(s,o))},ie=(e,t,s,i)=>{try{p(t,u(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},oe=ie;class ne extends B{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=U();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&re(this,t,"timeout")}),W(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:U()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),H(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const re=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:U()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},le=(e,s,i=e.states)=>{const n=s.length,r=C();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),A(r,JSON.stringify(l))}return o(r)},ae=[];ae[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{se(t,s,u(e))})(e,t,s);break;case 1:ie(e,s,i,o);break;case 2:oe(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},ae[3]=(e,s,o)=>{t(e,1),i(e,le(o.awareness,Array.from(o.awareness.getStates().keys())))},ae[1]=(e,t,s)=>{((e,t,s)=>{const i=k(t),o=U(),r=[],l=[],a=[],c=[],d=n(i);for(let t=0;t<d;t++){const t=n(i);let s=n(i);const d=JSON.parse(P(i)),h=e.meta.get(t),u=e.states.get(t),m=void 0===h?0:h.clock;(m<s||m===s&&null===d&&e.states.has(t))&&(null===d?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,d),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===h&&null!==d?r.push(t):void 0!==h&&null===d?c.push(t):null!==d&&(H(d,u)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,u(t),s)},ae[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ce(s,t)))};const ce=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),de=(e,t,s)=>{const i=k(t),o=C(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},he=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,re(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(ue,$(100*R(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},ue=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=U();const i=de(e,new Uint8Array(t.data),!0);N(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{he(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=U(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=C();if(t(n,0),te(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=C();t(n,1),i(n,le(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},me=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&ee(e.bcChannel,t,e)};class fe extends O{constructor(e,s,n,{connect:r=!0,awareness:l=new ne(n),params:a={},protocols:c=[],WebSocketPolyfill:d=WebSocket,resyncInterval:h=-1,maxBackoffTime:u=2500,disableBc:m=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=u,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=d,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=m,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ae.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,h>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=C();t(e,0),te(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=de(this,new Uint8Array(e),!1);N(t)>1&&ee(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=C();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),me(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=C();t(a,1),i(a,le(l,r)),me(this,o(a))},this._exitHandler=()=>{re(this.awareness,[n.clientID],"app closed")},_&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<U()-this.wsLastMessageReceived&&he(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>L(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),_&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{Z(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=C();t(e,0),te(e,this.doc),ee(this.bcChannel,o(e),this);const s=C();t(s,0),se(s,this.doc),ee(this.bcChannel,o(s),this);const n=C();t(n,3),ee(this.bcChannel,o(n),this);const r=C();t(r,1),i(r,le(this.awareness,[this.doc.clientID])),ee(this.bcChannel,o(r),this)}disconnectBc(){const e=C();t(e,1),i(e,le(this.awareness,[this.doc.clientID],new Map)),me(this,o(e)),this.bcconnected&&(((e,t)=>{const s=Z(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),Q.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&he(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(ue(this),this.connectBc())}}class pe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new fe(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new pe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class ze{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||ze.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new X(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new X(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(ze.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),ze.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),ze.sharedWebSocketProvider=new Y(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),ze.sharedWebSocketProvider}static destroySharedWebSocket(){ze.sharedWebSocketProvider&&(ze.sharedWebSocketProvider.destroy(),ze.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return ze.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new ze(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{q as BroadcastSyncProvider,ze as HocuspocusSyncProvider,pe as WebSocketSyncProvider}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as o,d as
|
|
1
|
+
import{K as o,d as s}from"./p-BkLVv1nj.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
|