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.
Files changed (30) hide show
  1. package/dist/cjs/{default-line-tool.config-Ba74O1gD.js → default-line-tool.config-nMR5iYBB.js} +67 -41
  2. package/dist/cjs/index.cjs.js +1 -1
  3. package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +2 -2
  4. package/dist/collection/classes/handlers/move.handler.js +4 -2
  5. package/dist/collection/classes/handlers/rotation.handler.js +0 -4
  6. package/dist/collection/classes/handlers/selection.handler.js +35 -20
  7. package/dist/collection/classes/objects/selection-group.class.js +28 -15
  8. package/dist/collection/constants/version.js +1 -1
  9. package/dist/components/index.js +1 -1
  10. package/dist/components/kritzel-controls.js +1 -1
  11. package/dist/components/kritzel-editor.js +1 -1
  12. package/dist/components/kritzel-engine.js +1 -1
  13. package/dist/components/kritzel-settings.js +1 -1
  14. package/dist/components/kritzel-tool-config.js +1 -1
  15. package/dist/components/{p-DYAnRoi2.js → p-8uGOVKdw.js} +1 -1
  16. package/dist/components/{p-DAPeFBqC.js → p-B-muKisW.js} +1 -1
  17. package/dist/components/{p-0YNMEgri.js → p-BkLVv1nj.js} +1 -1
  18. package/dist/components/{p-8fc2rB08.js → p-CkN6-oE3.js} +1 -1
  19. package/dist/components/{p-mPdux0tA.js → p-DmN0DKS3.js} +1 -1
  20. package/dist/esm/{default-line-tool.config-BW07ZETV.js → default-line-tool.config-OwcgiNEW.js} +67 -41
  21. package/dist/esm/index.js +2 -2
  22. package/dist/esm/kritzel-back-to-content_32.entry.js +2 -2
  23. package/dist/stencil/index.esm.js +1 -1
  24. package/dist/stencil/{p-e28ee5ef.entry.js → p-00e3ec46.entry.js} +2 -2
  25. package/dist/stencil/{p-BW07ZETV.js → p-OwcgiNEW.js} +1 -1
  26. package/dist/stencil/stencil.esm.js +1 -1
  27. package/dist/types/classes/handlers/rotation.handler.d.ts +0 -2
  28. package/dist/types/classes/objects/selection-group.class.d.ts +7 -2
  29. package/dist/types/constants/version.d.ts +1 -1
  30. package/package.json +1 -1
@@ -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
- const found = this._core.store.state.objects.filter(obj => obj.id === id);
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.forEach(obj => {
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
- this.objects.forEach(child => {
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
- this.objects.forEach(child => {
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
- refreshObjectDimensions() {
17071
- if (this.objects.length === 1) {
17072
- const obj = this.objects[0];
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
- this.objects.forEach(obj => {
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
- const onlyLines = selectionGroup.objects.every(obj => obj instanceof KritzelLine);
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 selectionGroup.objects) {
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
- this._core.store.allObjects
18479
- .filter(o => !(o instanceof KritzelSelectionBox))
18480
- .forEach(object => (object.isSelected = object.hitTestPolygon(selectionBox.rotatedPolygon)));
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
- // Resolve child objects to their parent groups to avoid double-move
18528
- const resolvedObjects = new Map();
18529
- selectedObjects.forEach(obj => {
18530
- // Check if this object is a child of a KritzelGroup
18531
- const parentGroup = KritzelGroup.findParentGroup(this._core, obj.id);
18532
- if (parentGroup) {
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.forEach(o => {
18544
- selectionGroup.addOrRemove(o);
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;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var defaultLineTool_config = require('./default-line-tool.config-Ba74O1gD.js');
3
+ var defaultLineTool_config = require('./default-line-tool.config-nMR5iYBB.js');
4
4
 
5
5
  /**
6
6
  * BroadcastChannel sync provider for cross-tab synchronization
@@ -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-Ba74O1gD.js');
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.24';
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
- const onlyLines = selectionGroup.objects.every(obj => obj instanceof KritzelLine);
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 selectionGroup.objects) {
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
- this._core.store.allObjects
191
- .filter(o => !(o instanceof KritzelSelectionBox))
192
- .forEach(object => (object.isSelected = object.hitTestPolygon(selectionBox.rotatedPolygon)));
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
- // Resolve child objects to their parent groups to avoid double-move
240
- const resolvedObjects = new Map();
241
- selectedObjects.forEach(obj => {
242
- // Check if this object is a child of a KritzelGroup
243
- const parentGroup = KritzelGroup.findParentGroup(this._core, obj.id);
244
- if (parentGroup) {
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.forEach(o => {
256
- selectionGroup.addOrRemove(o);
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
- const found = this._core.store.state.objects.filter(obj => obj.id === id);
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.forEach(obj => {
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
- this.objects.forEach(child => {
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
- this.objects.forEach(child => {
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
- refreshObjectDimensions() {
257
- if (this.objects.length === 1) {
258
- const obj = this.objects[0];
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
- this.objects.forEach(obj => {
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 => {
@@ -3,4 +3,4 @@
3
3
  * This file is auto-generated by the version bump scripts.
4
4
  * Do not modify manually.
5
5
  */
6
- export const KRITZEL_VERSION = '0.1.24';
6
+ export const KRITZEL_VERSION = '0.1.25';
@@ -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 r}from"./p-0YNMEgri.js";const s=o,p=r;export{s as KritzelControls,p as defineCustomElement}
1
+ import{K as o,d as s}from"./p-BkLVv1nj.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}