kritzel-stencil 0.1.9 → 0.1.10

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 (28) hide show
  1. package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +32 -18
  2. package/dist/collection/classes/core/store.class.js +3 -0
  3. package/dist/collection/classes/core/viewport.class.js +0 -6
  4. package/dist/collection/classes/structures/object-map.structure.js +3 -0
  5. package/dist/collection/classes/structures/quadtree.structure.js +13 -1
  6. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +2 -1
  7. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +6 -7
  8. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +4 -2
  9. package/dist/collection/constants/version.js +1 -1
  10. package/dist/components/index.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-workspace-manager.js +1 -1
  15. package/dist/components/{p-dwP3Ewwh.js → p-BT8qoqo4.js} +1 -1
  16. package/dist/components/p-CXGqvg3q.js +1 -0
  17. package/dist/components/{p-C30Sf5sI.js → p-DCbOCSX1.js} +1 -1
  18. package/dist/esm/kritzel-back-to-content_32.entry.js +32 -18
  19. package/dist/stencil/p-4d01c7a6.entry.js +9 -0
  20. package/dist/stencil/stencil.esm.js +1 -1
  21. package/dist/types/classes/core/store.class.d.ts +1 -0
  22. package/dist/types/classes/structures/object-map.structure.d.ts +1 -0
  23. package/dist/types/classes/structures/quadtree.structure.d.ts +4 -1
  24. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +0 -1
  25. package/dist/types/constants/version.d.ts +1 -1
  26. package/package.json +84 -84
  27. package/dist/components/p-ZkkRyYc_.js +0 -1
  28. package/dist/stencil/p-73be6ea9.entry.js +0 -9
@@ -1710,6 +1710,7 @@ const KritzelEditor = class {
1710
1710
  this.undoState = event.detail;
1711
1711
  }
1712
1712
  handleObjectsInViewportChange(event) {
1713
+ console.log(event.detail.length);
1713
1714
  const hasVisibleObjects = event.detail.length > 0;
1714
1715
  this.isBackToContentButtonVisible = !hasVisibleObjects;
1715
1716
  }
@@ -1765,7 +1766,7 @@ const KritzelEditor = class {
1765
1766
  }
1766
1767
  }
1767
1768
  render() {
1768
- return (index.h(index.Host, { key: 'e239e70c120784d4331d3fdfadfd7fb2623a73f0' }, index.h("div", { key: '4e4a1db1d4e89a6ba4e0042413aa36a26b61e665', class: "top-left-buttons" }, index.h("kritzel-workspace-manager", { key: '102f3e93167dda9abdcf4ca058b053eb5fe4f670', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), index.h("kritzel-back-to-content", { key: '37e0d96e16f84a12aa346d508e8d9f5790942b0a', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), index.h("kritzel-engine", { key: '3983972874985b2e157e9c55511e462e8b569b05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), index.h("kritzel-controls", { key: 'ea8b2465b097f03303909814e678d6c4a5338979', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), index.h("div", { key: '412f719a47092ce40427bccece81e97b6a0e92d4', class: "top-right-buttons" }, index.h("kritzel-settings", { key: 'f1f742106784d2e1635ecfe1319e6b96b47b7166', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), index.h("kritzel-export", { key: '2aebe55d30b4dbc1b05ea6b5614c0dabc4729c3b', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), index.h("kritzel-more-menu", { key: '9a41d3e54d3864f7ac8d9774221097ae0126818b', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
1769
+ return (index.h(index.Host, { key: '18113021f28ed340017ed15b3db83f275a1a45e0' }, index.h("div", { key: '75c4fc6fb48133edc3b9b2152c09d1b77dc3efc6', class: "top-left-buttons" }, index.h("kritzel-workspace-manager", { key: 'c6a68abaf70ebcf37af1870b832c9a2bd2c984fb', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), index.h("kritzel-back-to-content", { key: 'e2be6fadb0a44dd6cc7a061767bc25b11dde5bf3', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), index.h("kritzel-engine", { key: '16c19e74e9a3bd61845fa3542a5a84a12a3c8a05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), index.h("kritzel-controls", { key: 'bb328c89b4ebbcce215e6ddf710126e7a71b5d30', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), index.h("div", { key: 'e7fd78379d8acc4715605c267aa352430633f6ac', class: "top-right-buttons" }, index.h("kritzel-settings", { key: '13db94ca32cabfbd2d6664c58f55e30fcbf99221', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), index.h("kritzel-export", { key: 'a7aa9b6ada8b0d47edf418c392d6d04598d36925', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), index.h("kritzel-more-menu", { key: '70a1a954f678e6b634d5965b23f570f79824af43', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
1769
1770
  }
1770
1771
  static get watchers() { return {
1771
1772
  "isEngineReady": [{
@@ -19128,7 +19129,6 @@ class KritzelViewport {
19128
19129
  this._core.store.state.skipContextMenu = true;
19129
19130
  this._core.rerender();
19130
19131
  this._debounceUpdate();
19131
- this._core.engine.emitObjectsInViewportChange();
19132
19132
  }
19133
19133
  }
19134
19134
  if (event.pointerType === 'touch') {
@@ -19165,7 +19165,6 @@ class KritzelViewport {
19165
19165
  this._core.store.state.hasViewportChanged = true;
19166
19166
  this._core.rerender();
19167
19167
  this._debounceUpdate();
19168
- this._core.engine.emitObjectsInViewportChange();
19169
19168
  }
19170
19169
  }
19171
19170
  }
@@ -19202,7 +19201,6 @@ class KritzelViewport {
19202
19201
  this._core.store.state.hasViewportChanged = true;
19203
19202
  this._core.rerender();
19204
19203
  this._debounceUpdate();
19205
- this._core.engine.emitObjectsInViewportChange();
19206
19204
  }
19207
19205
  centerFitInViewport(object) {
19208
19206
  const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);
@@ -19232,7 +19230,6 @@ class KritzelViewport {
19232
19230
  this._core.rerender();
19233
19231
  this._debounceUpdate();
19234
19232
  this._debounceEndScaling();
19235
- this._core.engine.emitObjectsInViewportChange();
19236
19233
  }
19237
19234
  handlePan(event) {
19238
19235
  const panSpeed = 0.8;
@@ -19241,7 +19238,6 @@ class KritzelViewport {
19241
19238
  this._core.store.state.hasViewportChanged = true;
19242
19239
  this._core.rerender();
19243
19240
  this._debounceUpdate();
19244
- this._core.engine.emitObjectsInViewportChange();
19245
19241
  }
19246
19242
  /**
19247
19243
  * Cancels any ongoing viewport animation.
@@ -19283,7 +19279,6 @@ class KritzelViewport {
19283
19279
  else {
19284
19280
  this._animationFrameId = null;
19285
19281
  this._debounceUpdate();
19286
- this._core.engine.emitObjectsInViewportChange();
19287
19282
  }
19288
19283
  };
19289
19284
  this._animationFrameId = requestAnimationFrame(animate);
@@ -19674,6 +19669,11 @@ class KritzelQuadtree {
19674
19669
  capacity;
19675
19670
  objects = [];
19676
19671
  children = null;
19672
+ _size = 0;
19673
+ /** Total number of objects in the quadtree (O(1) access) */
19674
+ get size() {
19675
+ return this._size;
19676
+ }
19677
19677
  constructor(bounds, capacity = 16) {
19678
19678
  this.bounds = bounds;
19679
19679
  this.capacity = capacity;
@@ -19681,6 +19681,7 @@ class KritzelQuadtree {
19681
19681
  reset() {
19682
19682
  this.objects = [];
19683
19683
  this.children = null;
19684
+ this._size = 0;
19684
19685
  }
19685
19686
  insert(object) {
19686
19687
  if (!this.intersects(object.rotatedBoundingBox, this.bounds)) {
@@ -19688,6 +19689,7 @@ class KritzelQuadtree {
19688
19689
  }
19689
19690
  if (this.objects.length < this.capacity && this.children === null) {
19690
19691
  this.objects.push(object);
19692
+ this._size++;
19691
19693
  return true;
19692
19694
  }
19693
19695
  if (this.children === null) {
@@ -19695,6 +19697,7 @@ class KritzelQuadtree {
19695
19697
  }
19696
19698
  for (const child of this.children) {
19697
19699
  if (child.insert(object)) {
19700
+ this._size++;
19698
19701
  return true;
19699
19702
  }
19700
19703
  }
@@ -19716,15 +19719,19 @@ class KritzelQuadtree {
19716
19719
  return false;
19717
19720
  }
19718
19721
  remove(predicate) {
19722
+ let removed = 0;
19719
19723
  const index = this.objects.findIndex(o => predicate(o));
19720
19724
  if (index !== -1) {
19721
19725
  this.objects.splice(index, 1);
19726
+ removed++;
19722
19727
  }
19723
19728
  if (this.children !== null) {
19724
19729
  for (const child of this.children) {
19725
- child.remove(predicate);
19730
+ removed += child.remove(predicate);
19726
19731
  }
19727
19732
  }
19733
+ this._size -= removed;
19734
+ return removed;
19728
19735
  }
19729
19736
  query(range) {
19730
19737
  const results = [];
@@ -19810,6 +19817,9 @@ class KritzelObjectMap {
19810
19817
  redoStackSize: this._undoManager ? this._undoManager.redoStack.length : 0,
19811
19818
  };
19812
19819
  }
19820
+ get totalCount() {
19821
+ return this.quadtree.size;
19822
+ }
19813
19823
  constructor() {
19814
19824
  this.quadtree = new KritzelQuadtree({
19815
19825
  x: -Infinity,
@@ -20106,6 +20116,9 @@ class KritzelStore {
20106
20116
  get currentZIndex() {
20107
20117
  return Math.max(0, ...this._state.objects.filter(o => !(o instanceof defaultLineTool_config.KritzelSelectionGroup) && !(o instanceof defaultLineTool_config.KritzelSelectionBox)).map(o => o.zIndex)) + 1;
20108
20118
  }
20119
+ get totalObjectCount() {
20120
+ return this._state.objects.totalCount;
20121
+ }
20109
20122
  get allObjects() {
20110
20123
  return this._state.objects.allObjects();
20111
20124
  }
@@ -22331,10 +22344,6 @@ const KritzelEngine = class {
22331
22344
  this.objectsSelectionChange.emit();
22332
22345
  }
22333
22346
  }
22334
- emitObjectsInViewportChange() {
22335
- const objects = this.core.store.objectsInViewport;
22336
- this.objectsInViewportChange.emit(objects);
22337
- }
22338
22347
  _registerStateChangeListeners() {
22339
22348
  this.core.store.onStateChange('activeTool', this._handleActiveToolChange.bind(this));
22340
22349
  }
@@ -22369,7 +22378,10 @@ const KritzelEngine = class {
22369
22378
  };
22370
22379
  const visibleObjects = this.core.store.state.objects.query(viewportBounds).sort((a, b) => a.zIndex - b.zIndex);
22371
22380
  this.core.cursorManager.applyCursor();
22372
- return (index.h(index.Host, { key: '6e770afe9be9151cd94f3bdee7cdf30f24539e89' }, this.core.store.state.debugInfo.showViewportInfo && (index.h("div", { key: '5f72b0428061ac923cb2e50de7372d13862c4cfd', class: "debug-panel" }, index.h("div", { key: '96c8e5d5f60c828f2d2d12b82462955245f34046' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), index.h("div", { key: 'ed34ba298599a753c3b7d535b759630f63a226dd' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), index.h("div", { key: '25813767911cf07fb1e348e849000c1a7a40d30b' }, "TranslateX: ", this.core.store.state?.translateX), index.h("div", { key: 'd82ed8a94bea9b0b7b264226a61b6a977a984514' }, "TranslateY: ", this.core.store.state?.translateY), index.h("div", { key: 'd448438bda9c4c3be1e4279aa76a0ccccd4755ba' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), index.h("div", { key: 'a664623bb626901b650db14576db28d76f409b02' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), index.h("div", { key: 'a9ea1237f4f4cf9454729fa766050bc44e2ef812' }, "PointerCount: ", this.core.store.state.pointers.size), index.h("div", { key: 'e8fbdca2c13b0b015b709ed6995e359b07c90c62' }, "Scale: ", this.core.store.state?.scale), index.h("div", { key: 'e14adc6154c5a85ef06712982df00d17516fc696' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), index.h("div", { key: '0b22c996079f53f48046b96af39e22dcabaa12b5' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), index.h("div", { key: 'dc60d9bc8cfeb2d050f22225318c8e8a4e015a41' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), index.h("div", { key: '625fc2bd1a7aaf735a2dba5375fc847853347c41' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), index.h("div", { key: '1fd739d47bfd3da4700edb1b66de4944d27574e1' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), index.h("div", { key: '39c6987001711eadb2ad03ca77a5e9a16d2cfcef' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), index.h("div", { key: 'e602303527f833a1feabfe89289e8e0df109df24' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), index.h("div", { key: '9a81988b74aa398935469fc1dd0ade01eff5398e' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), index.h("div", { key: '21e15a261055f1918105a1cf1dcefa625f08638a' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), index.h("div", { key: 'd5f3d4b36939b6b9854e6042fa3aadca1f5459bc' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), index.h("div", { key: '11a42eff762d412f24c3d946579daadb6c6321e3' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), index.h("div", { key: '5dc6bf2c1ab6c70f3a42ea154fa4f3c0670fef8d' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), index.h("div", { key: '198a5021998646fd824d31d65e7869ed3e23768e' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), index.h("div", { key: '29ee254c92e1f60e09d40321b7535bf1d9aee27a' }, "PointerX: ", this.core.store.state?.pointerX), index.h("div", { key: '8352fd67fa257ba0088d9196d0c130034abe4c88' }, "PointerY: ", this.core.store.state?.pointerY), index.h("div", { key: '1e911bb79a52b082ef77ea916fb2a4044a53cbd1' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), index.h("div", { key: '28fa76f1e7ce4559e81ee2f8267dc73d647e51ab' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), index.h("div", { key: '7aaaa3e9a7efaca4c3d4ef52a406c142001bfd21', id: "origin", class: "origin", style: {
22381
+ if (this.core.store.totalObjectCount > 0) {
22382
+ this.objectsInViewportChange.emit(visibleObjects);
22383
+ }
22384
+ return (index.h(index.Host, { key: '00c29d6a19a47011b0e9ba6977b43e0706f0ec44' }, this.core.store.state.debugInfo.showViewportInfo && (index.h("div", { key: '51a0815ac76961d4c618895f54e99a399814e936', class: "debug-panel" }, index.h("div", { key: '46cbc830f3ccfb1f3b6c76bae58447c60a2c73ac' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), index.h("div", { key: '592fd839603ee14c85e32b68c25653ddd346c74d' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), index.h("div", { key: '3dcb028c0b3a74072df636fba71ecd690cc97b92' }, "TranslateX: ", this.core.store.state?.translateX), index.h("div", { key: '4ec69c521e629d211020b062d8ebbfa5e628e1bd' }, "TranslateY: ", this.core.store.state?.translateY), index.h("div", { key: '7775563a5a8eb7e4a5af5377b725fcfb153f668d' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), index.h("div", { key: '627b6471401b4ef24ca5226057f7ba57c1877d0b' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), index.h("div", { key: '64de38db4971e00e7df3db2e457f7ce222af2367' }, "PointerCount: ", this.core.store.state.pointers.size), index.h("div", { key: '175231bc3822428cf9984d29ed5b5da2ef0a9e3d' }, "Scale: ", this.core.store.state?.scale), index.h("div", { key: '9cef3fe5c5971265ffd403ceb528825a589ab3e0' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), index.h("div", { key: 'aa8cd5f64a78636640cb515ddf472f3d1f75d9fc' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), index.h("div", { key: '9d938b280e5bc5993254dbc826967cb7a4ab1cdf' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), index.h("div", { key: 'e7873b4f7be3a8f2e399ece7172a9b93fb3dd24c' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), index.h("div", { key: '215fdbbee5aae35fd41c39c08d8583e1b6f1eec5' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), index.h("div", { key: '3ec27b5b312f257294b62403ccb1b595b4804730' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), index.h("div", { key: 'ecc397837a917eb3a270bf9500bee66697ee2f30' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), index.h("div", { key: '1a1ab9d4b3e1597eb895bf73a5866b6067ee648e' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), index.h("div", { key: 'd09983fe1af7b4163ed5ce6ac4fc7b9ed3bebcce' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), index.h("div", { key: '72e0ae5e6c06d124dd02253b7757d2750d7ed296' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), index.h("div", { key: 'a03399a8bc693058ff46b0d526f9c606b15a0417' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), index.h("div", { key: 'b3293f7075f26290827490af6c93151d2bbc13af' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), index.h("div", { key: 'b3592b410a81ec5b5c8c1424f05386fc685b8e0a' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), index.h("div", { key: '433b489b98c25504fdba7d34f12c1f9421d2df78' }, "PointerX: ", this.core.store.state?.pointerX), index.h("div", { key: '8e3416a277dd1a0f35208dc19cb9a2c0f38aeb85' }, "PointerY: ", this.core.store.state?.pointerY), index.h("div", { key: '69d2920c5f13961baa619f30e36288783173ddd1' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), index.h("div", { key: '1175f72816f38d24d986f3e78a1f312cc99aea7c' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), index.h("div", { key: '0f9c1a69ecd260287647967109619c83761abf81', id: "origin", class: "origin", style: {
22373
22385
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
22374
22386
  } }, visibleObjects?.map(object => {
22375
22387
  return (index.h("div", { key: object.id, style: {
@@ -22618,7 +22630,7 @@ const KritzelEngine = class {
22618
22630
  stroke: 'var(--kritzel-snap-indicator-stroke, #007bff)',
22619
22631
  strokeWidth: data.indicatorStrokeWidth,
22620
22632
  } }))));
22621
- })()), this.core.store.state.isContextMenuVisible && (index.h("kritzel-context-menu", { key: 'c1b0197bb02b9067c6ee028319310134eeb27969', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
22633
+ })()), this.core.store.state.isContextMenuVisible && (index.h("kritzel-context-menu", { key: '6bc7badd1372727cda363f335c358323e25eef40', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
22622
22634
  position: 'fixed',
22623
22635
  left: `${this.core.store.state.contextMenuX}px`,
22624
22636
  top: `${this.core.store.state.contextMenuY}px`,
@@ -22629,7 +22641,7 @@ const KritzelEngine = class {
22629
22641
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
22630
22642
  }, this.core.store.selectionGroup?.objects);
22631
22643
  this.hideContextMenu();
22632
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof defaultLineTool_config.KritzelEraserTool && !this.core.store.state.isScaling && index.h("kritzel-cursor-trail", { key: 'fb14837c3afab1de4c6f4a4ca514b949bd0c5bf6', core: this.core })));
22644
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof defaultLineTool_config.KritzelEraserTool && !this.core.store.state.isScaling && index.h("kritzel-cursor-trail", { key: '48318d12506f588d510645ee1fdd5f08c511adf9', core: this.core })));
22633
22645
  }
22634
22646
  static get watchers() { return {
22635
22647
  "workspace": [{
@@ -23599,7 +23611,7 @@ const KritzelPortal = class {
23599
23611
  * This file is auto-generated by the version bump scripts.
23600
23612
  * Do not modify manually.
23601
23613
  */
23602
- const KRITZEL_VERSION = '0.1.9';
23614
+ const KRITZEL_VERSION = '0.1.10';
23603
23615
 
23604
23616
  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}`;
23605
23617
 
@@ -24216,9 +24228,11 @@ const KritzelWorkspaceManager = class {
24216
24228
  }
24217
24229
  async initializeEngine() {
24218
24230
  await customElements.whenDefined('kritzel-engine');
24219
- this.kritzelEngineRef = this.host.parentElement.querySelector('kritzel-engine');
24231
+ // Search for kritzel-engine in the closest kritzel-editor ancestor
24232
+ const editor = this.host.closest('kritzel-editor');
24233
+ this.kritzelEngineRef = editor?.querySelector('kritzel-engine') ?? null;
24220
24234
  if (!this.kritzelEngineRef) {
24221
- console.warn('kritzel-engine not found in parent element.');
24235
+ console.warn('kritzel-engine not found in kritzel-editor.');
24222
24236
  }
24223
24237
  }
24224
24238
  async select(item, parent) {
@@ -14,6 +14,9 @@ export class KritzelStore {
14
14
  get currentZIndex() {
15
15
  return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;
16
16
  }
17
+ get totalObjectCount() {
18
+ return this._state.objects.totalCount;
19
+ }
17
20
  get allObjects() {
18
21
  return this._state.objects.allObjects();
19
22
  }
@@ -98,7 +98,6 @@ export class KritzelViewport {
98
98
  this._core.store.state.skipContextMenu = true;
99
99
  this._core.rerender();
100
100
  this._debounceUpdate();
101
- this._core.engine.emitObjectsInViewportChange();
102
101
  }
103
102
  }
104
103
  if (event.pointerType === 'touch') {
@@ -135,7 +134,6 @@ export class KritzelViewport {
135
134
  this._core.store.state.hasViewportChanged = true;
136
135
  this._core.rerender();
137
136
  this._debounceUpdate();
138
- this._core.engine.emitObjectsInViewportChange();
139
137
  }
140
138
  }
141
139
  }
@@ -172,7 +170,6 @@ export class KritzelViewport {
172
170
  this._core.store.state.hasViewportChanged = true;
173
171
  this._core.rerender();
174
172
  this._debounceUpdate();
175
- this._core.engine.emitObjectsInViewportChange();
176
173
  }
177
174
  centerFitInViewport(object) {
178
175
  const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);
@@ -202,7 +199,6 @@ export class KritzelViewport {
202
199
  this._core.rerender();
203
200
  this._debounceUpdate();
204
201
  this._debounceEndScaling();
205
- this._core.engine.emitObjectsInViewportChange();
206
202
  }
207
203
  handlePan(event) {
208
204
  const panSpeed = 0.8;
@@ -211,7 +207,6 @@ export class KritzelViewport {
211
207
  this._core.store.state.hasViewportChanged = true;
212
208
  this._core.rerender();
213
209
  this._debounceUpdate();
214
- this._core.engine.emitObjectsInViewportChange();
215
210
  }
216
211
  /**
217
212
  * Cancels any ongoing viewport animation.
@@ -253,7 +248,6 @@ export class KritzelViewport {
253
248
  else {
254
249
  this._animationFrameId = null;
255
250
  this._debounceUpdate();
256
- this._core.engine.emitObjectsInViewportChange();
257
251
  }
258
252
  };
259
253
  this._animationFrameId = requestAnimationFrame(animate);
@@ -32,6 +32,9 @@ export class KritzelObjectMap {
32
32
  redoStackSize: this._undoManager ? this._undoManager.redoStack.length : 0,
33
33
  };
34
34
  }
35
+ get totalCount() {
36
+ return this.quadtree.size;
37
+ }
35
38
  constructor() {
36
39
  this.quadtree = new KritzelQuadtree({
37
40
  x: -Infinity,
@@ -3,6 +3,11 @@ export class KritzelQuadtree {
3
3
  capacity;
4
4
  objects = [];
5
5
  children = null;
6
+ _size = 0;
7
+ /** Total number of objects in the quadtree (O(1) access) */
8
+ get size() {
9
+ return this._size;
10
+ }
6
11
  constructor(bounds, capacity = 16) {
7
12
  this.bounds = bounds;
8
13
  this.capacity = capacity;
@@ -10,6 +15,7 @@ export class KritzelQuadtree {
10
15
  reset() {
11
16
  this.objects = [];
12
17
  this.children = null;
18
+ this._size = 0;
13
19
  }
14
20
  insert(object) {
15
21
  if (!this.intersects(object.rotatedBoundingBox, this.bounds)) {
@@ -17,6 +23,7 @@ export class KritzelQuadtree {
17
23
  }
18
24
  if (this.objects.length < this.capacity && this.children === null) {
19
25
  this.objects.push(object);
26
+ this._size++;
20
27
  return true;
21
28
  }
22
29
  if (this.children === null) {
@@ -24,6 +31,7 @@ export class KritzelQuadtree {
24
31
  }
25
32
  for (const child of this.children) {
26
33
  if (child.insert(object)) {
34
+ this._size++;
27
35
  return true;
28
36
  }
29
37
  }
@@ -45,15 +53,19 @@ export class KritzelQuadtree {
45
53
  return false;
46
54
  }
47
55
  remove(predicate) {
56
+ let removed = 0;
48
57
  const index = this.objects.findIndex(o => predicate(o));
49
58
  if (index !== -1) {
50
59
  this.objects.splice(index, 1);
60
+ removed++;
51
61
  }
52
62
  if (this.children !== null) {
53
63
  for (const child of this.children) {
54
- child.remove(predicate);
64
+ removed += child.remove(predicate);
55
65
  }
56
66
  }
67
+ this._size -= removed;
68
+ return removed;
57
69
  }
58
70
  query(range) {
59
71
  const results = [];
@@ -258,6 +258,7 @@ export class KritzelEditor {
258
258
  this.undoState = event.detail;
259
259
  }
260
260
  handleObjectsInViewportChange(event) {
261
+ console.log(event.detail.length);
261
262
  const hasVisibleObjects = event.detail.length > 0;
262
263
  this.isBackToContentButtonVisible = !hasVisibleObjects;
263
264
  }
@@ -313,7 +314,7 @@ export class KritzelEditor {
313
314
  }
314
315
  }
315
316
  render() {
316
- return (h(Host, { key: 'e239e70c120784d4331d3fdfadfd7fb2623a73f0' }, h("div", { key: '4e4a1db1d4e89a6ba4e0042413aa36a26b61e665', class: "top-left-buttons" }, h("kritzel-workspace-manager", { key: '102f3e93167dda9abdcf4ca058b053eb5fe4f670', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-back-to-content", { key: '37e0d96e16f84a12aa346d508e8d9f5790942b0a', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), h("kritzel-engine", { key: '3983972874985b2e157e9c55511e462e8b569b05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), h("kritzel-controls", { key: 'ea8b2465b097f03303909814e678d6c4a5338979', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: '412f719a47092ce40427bccece81e97b6a0e92d4', class: "top-right-buttons" }, h("kritzel-settings", { key: 'f1f742106784d2e1635ecfe1319e6b96b47b7166', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: '2aebe55d30b4dbc1b05ea6b5614c0dabc4729c3b', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), h("kritzel-more-menu", { key: '9a41d3e54d3864f7ac8d9774221097ae0126818b', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
317
+ return (h(Host, { key: '18113021f28ed340017ed15b3db83f275a1a45e0' }, h("div", { key: '75c4fc6fb48133edc3b9b2152c09d1b77dc3efc6', class: "top-left-buttons" }, h("kritzel-workspace-manager", { key: 'c6a68abaf70ebcf37af1870b832c9a2bd2c984fb', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-back-to-content", { key: 'e2be6fadb0a44dd6cc7a061767bc25b11dde5bf3', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), h("kritzel-engine", { key: '16c19e74e9a3bd61845fa3542a5a84a12a3c8a05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), h("kritzel-controls", { key: 'bb328c89b4ebbcce215e6ddf710126e7a71b5d30', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: 'e7fd78379d8acc4715605c267aa352430633f6ac', class: "top-right-buttons" }, h("kritzel-settings", { key: '13db94ca32cabfbd2d6664c58f55e30fcbf99221', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: 'a7aa9b6ada8b0d47edf418c392d6d04598d36925', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), h("kritzel-more-menu", { key: '70a1a954f678e6b634d5965b23f570f79824af43', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
317
318
  }
318
319
  static get is() { return "kritzel-editor"; }
319
320
  static get originalStyleUrls() {
@@ -432,10 +432,6 @@ export class KritzelEngine {
432
432
  this.objectsSelectionChange.emit();
433
433
  }
434
434
  }
435
- emitObjectsInViewportChange() {
436
- const objects = this.core.store.objectsInViewport;
437
- this.objectsInViewportChange.emit(objects);
438
- }
439
435
  _registerStateChangeListeners() {
440
436
  this.core.store.onStateChange('activeTool', this._handleActiveToolChange.bind(this));
441
437
  }
@@ -470,7 +466,10 @@ export class KritzelEngine {
470
466
  };
471
467
  const visibleObjects = this.core.store.state.objects.query(viewportBounds).sort((a, b) => a.zIndex - b.zIndex);
472
468
  this.core.cursorManager.applyCursor();
473
- return (h(Host, { key: '6e770afe9be9151cd94f3bdee7cdf30f24539e89' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: '5f72b0428061ac923cb2e50de7372d13862c4cfd', class: "debug-panel" }, h("div", { key: '96c8e5d5f60c828f2d2d12b82462955245f34046' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: 'ed34ba298599a753c3b7d535b759630f63a226dd' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '25813767911cf07fb1e348e849000c1a7a40d30b' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: 'd82ed8a94bea9b0b7b264226a61b6a977a984514' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: 'd448438bda9c4c3be1e4279aa76a0ccccd4755ba' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: 'a664623bb626901b650db14576db28d76f409b02' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: 'a9ea1237f4f4cf9454729fa766050bc44e2ef812' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: 'e8fbdca2c13b0b015b709ed6995e359b07c90c62' }, "Scale: ", this.core.store.state?.scale), h("div", { key: 'e14adc6154c5a85ef06712982df00d17516fc696' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '0b22c996079f53f48046b96af39e22dcabaa12b5' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: 'dc60d9bc8cfeb2d050f22225318c8e8a4e015a41' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '625fc2bd1a7aaf735a2dba5375fc847853347c41' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '1fd739d47bfd3da4700edb1b66de4944d27574e1' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '39c6987001711eadb2ad03ca77a5e9a16d2cfcef' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: 'e602303527f833a1feabfe89289e8e0df109df24' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '9a81988b74aa398935469fc1dd0ade01eff5398e' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '21e15a261055f1918105a1cf1dcefa625f08638a' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'd5f3d4b36939b6b9854e6042fa3aadca1f5459bc' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: '11a42eff762d412f24c3d946579daadb6c6321e3' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '5dc6bf2c1ab6c70f3a42ea154fa4f3c0670fef8d' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '198a5021998646fd824d31d65e7869ed3e23768e' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: '29ee254c92e1f60e09d40321b7535bf1d9aee27a' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '8352fd67fa257ba0088d9196d0c130034abe4c88' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '1e911bb79a52b082ef77ea916fb2a4044a53cbd1' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '28fa76f1e7ce4559e81ee2f8267dc73d647e51ab' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: '7aaaa3e9a7efaca4c3d4ef52a406c142001bfd21', id: "origin", class: "origin", style: {
469
+ if (this.core.store.totalObjectCount > 0) {
470
+ this.objectsInViewportChange.emit(visibleObjects);
471
+ }
472
+ return (h(Host, { key: '00c29d6a19a47011b0e9ba6977b43e0706f0ec44' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: '51a0815ac76961d4c618895f54e99a399814e936', class: "debug-panel" }, h("div", { key: '46cbc830f3ccfb1f3b6c76bae58447c60a2c73ac' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '592fd839603ee14c85e32b68c25653ddd346c74d' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '3dcb028c0b3a74072df636fba71ecd690cc97b92' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '4ec69c521e629d211020b062d8ebbfa5e628e1bd' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '7775563a5a8eb7e4a5af5377b725fcfb153f668d' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '627b6471401b4ef24ca5226057f7ba57c1877d0b' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '64de38db4971e00e7df3db2e457f7ce222af2367' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: '175231bc3822428cf9984d29ed5b5da2ef0a9e3d' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '9cef3fe5c5971265ffd403ceb528825a589ab3e0' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: 'aa8cd5f64a78636640cb515ddf472f3d1f75d9fc' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '9d938b280e5bc5993254dbc826967cb7a4ab1cdf' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'e7873b4f7be3a8f2e399ece7172a9b93fb3dd24c' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '215fdbbee5aae35fd41c39c08d8583e1b6f1eec5' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '3ec27b5b312f257294b62403ccb1b595b4804730' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: 'ecc397837a917eb3a270bf9500bee66697ee2f30' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '1a1ab9d4b3e1597eb895bf73a5866b6067ee648e' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: 'd09983fe1af7b4163ed5ce6ac4fc7b9ed3bebcce' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: '72e0ae5e6c06d124dd02253b7757d2750d7ed296' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: 'a03399a8bc693058ff46b0d526f9c606b15a0417' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'b3293f7075f26290827490af6c93151d2bbc13af' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'b3592b410a81ec5b5c8c1424f05386fc685b8e0a' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: '433b489b98c25504fdba7d34f12c1f9421d2df78' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '8e3416a277dd1a0f35208dc19cb9a2c0f38aeb85' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '69d2920c5f13961baa619f30e36288783173ddd1' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '1175f72816f38d24d986f3e78a1f312cc99aea7c' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: '0f9c1a69ecd260287647967109619c83761abf81', id: "origin", class: "origin", style: {
474
473
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
475
474
  } }, visibleObjects?.map(object => {
476
475
  return (h("div", { key: object.id, style: {
@@ -719,7 +718,7 @@ export class KritzelEngine {
719
718
  stroke: 'var(--kritzel-snap-indicator-stroke, #007bff)',
720
719
  strokeWidth: data.indicatorStrokeWidth,
721
720
  } }))));
722
- })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: 'c1b0197bb02b9067c6ee028319310134eeb27969', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
721
+ })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '6bc7badd1372727cda363f335c358323e25eef40', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
723
722
  position: 'fixed',
724
723
  left: `${this.core.store.state.contextMenuX}px`,
725
724
  top: `${this.core.store.state.contextMenuY}px`,
@@ -730,7 +729,7 @@ export class KritzelEngine {
730
729
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
731
730
  }, this.core.store.selectionGroup?.objects);
732
731
  this.hideContextMenu();
733
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'fb14837c3afab1de4c6f4a4ca514b949bd0c5bf6', core: this.core })));
732
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '48318d12506f588d510645ee1fdd5f08c511adf9', core: this.core })));
734
733
  }
735
734
  static get is() { return "kritzel-engine"; }
736
735
  static get encapsulation() { return "shadow"; }
@@ -27,9 +27,11 @@ export class KritzelWorkspaceManager {
27
27
  }
28
28
  async initializeEngine() {
29
29
  await customElements.whenDefined('kritzel-engine');
30
- this.kritzelEngineRef = this.host.parentElement.querySelector('kritzel-engine');
30
+ // Search for kritzel-engine in the closest kritzel-editor ancestor
31
+ const editor = this.host.closest('kritzel-editor');
32
+ this.kritzelEngineRef = editor?.querySelector('kritzel-engine') ?? null;
31
33
  if (!this.kritzelEngineRef) {
32
- console.warn('kritzel-engine not found in parent element.');
34
+ console.warn('kritzel-engine not found in kritzel-editor.');
33
35
  }
34
36
  }
35
37
  async select(item, parent) {
@@ -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.9';
6
+ export const KRITZEL_VERSION = '0.1.10';
@@ -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-CVPA34Tp.js";import{w as t,a as i,t as o,r as n,b as l,e as u,c as m,d as p,f as z,g as C,s as k,h as S,i as x,v as y,j,o as w,k as T,l as v,m as P,O as M,n as B,p as W,q as U,u as A,x as H,y as L,z as O,A as N,B as _,C as $,H as R,D as Y}from"./p-C30Sf5sI.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-C30Sf5sI.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{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=z();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=C(new Uint8Array(e));switch(n(s)){case 0:const e=l(s);m(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=l(s),r=u(this.doc,n);if(r.length>0){const e=z();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=z();t(e,2),i(e,p(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 V=new Map,X="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:x(t.newValue||"")}),w(this._onChange)}postMessage(e){y.setItem(this.room,j(T(e)))}close(){v(this._onChange)}}:BroadcastChannel,Q=e=>k(V,e,(()=>{const t=S(),s=new X(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),Z=(e,t,s=null)=>{const i=Q(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},ee=(e,s)=>{t(e,0);const o=p(s);i(e,o)},te=(e,s,o)=>{t(e,1),i(e,u(s,o))},se=(e,t,s,i)=>{try{m(t,l(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},ie=se;class oe extends M{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=W();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&&ne(this,t,"timeout")}),B(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:W()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),U(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 ne=(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:W()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},re=(e,s,i=e.states)=>{const n=s.length,r=z();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)},le=[];le[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)=>{te(t,s,l(e))})(e,t,s);break;case 1:se(e,s,i,o);break;case 2:ie(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)},le[3]=(e,s,o)=>{t(e,1),i(e,re(o.awareness,Array.from(o.awareness.getStates().keys())))},le[1]=(e,t,s)=>{((e,t,s)=>{const i=C(t),o=W(),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&&(U(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,l(t),s)},le[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ae(s,t)))};const ae=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),ce=(e,t,s)=>{const i=C(t),o=z(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},de=(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,ne(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(he,_(100*$(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},he=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=W();const i=ce(e,new Uint8Array(t.data),!0);O(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{de(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=W(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=z();if(t(n,0),ee(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=z();t(n,1),i(n,re(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},ue=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&Z(e.bcChannel,t,e)};class me extends L{constructor(e,s,n,{connect:r=!0,awareness:l=new oe(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=le.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=z();t(e,0),ee(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=ce(this,new Uint8Array(e),!1);O(t)>1&&Z(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=z();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),ue(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=z();t(a,1),i(a,re(l,r)),ue(this,o(a))},this._exitHandler=()=>{ne(this.awareness,[n.clientID],"app closed")},N&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<W()-this.wsLastMessageReceived&&de(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>H(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(),N&&"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)=>{Q(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=z();t(e,0),ee(e,this.doc),Z(this.bcChannel,o(e),this);const s=z();t(s,0),te(s,this.doc),Z(this.bcChannel,o(s),this);const n=z();t(n,3),Z(this.bcChannel,o(n),this);const r=z();t(r,1),i(r,re(this.awareness,[this.doc.clientID])),Z(this.bcChannel,o(r),this)}disconnectBc(){const e=z();t(e,1),i(e,re(this.awareness,[this.doc.clientID],new Map)),ue(this,o(e)),this.bcconnected&&(((e,t)=>{const s=Q(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),V.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&de(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(he(this),this.connectBc())}}class fe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new me(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 fe(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 pe{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||pe.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 R(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 R(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(pe.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),pe.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),pe.sharedWebSocketProvider=new Y(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),pe.sharedWebSocketProvider}static destroySharedWebSocket(){pe.sharedWebSocketProvider&&(pe.sharedWebSocketProvider.destroy(),pe.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return pe.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new pe(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,pe as HocuspocusSyncProvider,fe 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-CVPA34Tp.js";import{w as t,a as i,t as o,r as n,b as l,e as u,c as m,d as p,f as z,g as C,s as k,h as S,i as x,v as y,j,o as w,k as T,l as v,m as P,O as M,n as B,p as W,q as U,u as A,x as H,y as O,z as L,A as N,B as _,C as $,H as R,D as X}from"./p-DCbOCSX1.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-DCbOCSX1.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{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=z();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=C(new Uint8Array(e));switch(n(s)){case 0:const e=l(s);m(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=l(s),r=u(this.doc,n);if(r.length>0){const e=z();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=z();t(e,2),i(e,p(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:x(t.newValue||"")}),w(this._onChange)}postMessage(e){y.setItem(this.room,j(T(e)))}close(){v(this._onChange)}}:BroadcastChannel,Q=e=>k(q,e,(()=>{const t=S(),s=new V(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),Z=(e,t,s=null)=>{const i=Q(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},ee=(e,s)=>{t(e,0);const o=p(s);i(e,o)},te=(e,s,o)=>{t(e,1),i(e,u(s,o))},se=(e,t,s,i)=>{try{m(t,l(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},ie=se;class oe extends M{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=W();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&&ne(this,t,"timeout")}),B(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:W()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),U(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 ne=(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:W()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},re=(e,s,i=e.states)=>{const n=s.length,r=z();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)},le=[];le[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)=>{te(t,s,l(e))})(e,t,s);break;case 1:se(e,s,i,o);break;case 2:ie(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)},le[3]=(e,s,o)=>{t(e,1),i(e,re(o.awareness,Array.from(o.awareness.getStates().keys())))},le[1]=(e,t,s)=>{((e,t,s)=>{const i=C(t),o=W(),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&&(U(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,l(t),s)},le[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ae(s,t)))};const ae=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),ce=(e,t,s)=>{const i=C(t),o=z(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},de=(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,ne(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(he,_(100*$(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},he=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=W();const i=ce(e,new Uint8Array(t.data),!0);L(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{de(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=W(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=z();if(t(n,0),ee(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=z();t(n,1),i(n,re(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},ue=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&Z(e.bcChannel,t,e)};class me extends O{constructor(e,s,n,{connect:r=!0,awareness:l=new oe(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=le.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=z();t(e,0),ee(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=ce(this,new Uint8Array(e),!1);L(t)>1&&Z(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=z();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),ue(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=z();t(a,1),i(a,re(l,r)),ue(this,o(a))},this._exitHandler=()=>{ne(this.awareness,[n.clientID],"app closed")},N&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<W()-this.wsLastMessageReceived&&de(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>H(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(),N&&"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)=>{Q(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=z();t(e,0),ee(e,this.doc),Z(this.bcChannel,o(e),this);const s=z();t(s,0),te(s,this.doc),Z(this.bcChannel,o(s),this);const n=z();t(n,3),Z(this.bcChannel,o(n),this);const r=z();t(r,1),i(r,re(this.awareness,[this.doc.clientID])),Z(this.bcChannel,o(r),this)}disconnectBc(){const e=z();t(e,1),i(e,re(this.awareness,[this.doc.clientID],new Map)),ue(this,o(e)),this.bcconnected&&(((e,t)=>{const s=Q(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&&de(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(he(this),this.connectBc())}}class fe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new me(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 fe(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 pe{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||pe.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 R(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 R(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(pe.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),pe.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),pe.sharedWebSocketProvider=new X(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),pe.sharedWebSocketProvider}static destroySharedWebSocket(){pe.sharedWebSocketProvider&&(pe.sharedWebSocketProvider.destroy(),pe.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return pe.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new pe(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,pe as HocuspocusSyncProvider,fe as WebSocketSyncProvider}