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.
- package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +32 -18
- package/dist/collection/classes/core/store.class.js +3 -0
- package/dist/collection/classes/core/viewport.class.js +0 -6
- package/dist/collection/classes/structures/object-map.structure.js +3 -0
- package/dist/collection/classes/structures/quadtree.structure.js +13 -1
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +2 -1
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +6 -7
- package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +4 -2
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/kritzel-workspace-manager.js +1 -1
- package/dist/components/{p-dwP3Ewwh.js → p-BT8qoqo4.js} +1 -1
- package/dist/components/p-CXGqvg3q.js +1 -0
- package/dist/components/{p-C30Sf5sI.js → p-DCbOCSX1.js} +1 -1
- package/dist/esm/kritzel-back-to-content_32.entry.js +32 -18
- package/dist/stencil/p-4d01c7a6.entry.js +9 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/core/store.class.d.ts +1 -0
- package/dist/types/classes/structures/object-map.structure.d.ts +1 -0
- package/dist/types/classes/structures/quadtree.structure.d.ts +4 -1
- package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +0 -1
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +84 -84
- package/dist/components/p-ZkkRyYc_.js +0 -1
- 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: '
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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.
|
|
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
|
-
|
|
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
|
|
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);
|
|
@@ -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: '
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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"; }
|
package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js
CHANGED
|
@@ -27,9 +27,11 @@ export class KritzelWorkspaceManager {
|
|
|
27
27
|
}
|
|
28
28
|
async initializeEngine() {
|
|
29
29
|
await customElements.whenDefined('kritzel-engine');
|
|
30
|
-
|
|
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
|
|
34
|
+
console.warn('kritzel-engine not found in kritzel-editor.');
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
async select(item, parent) {
|
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-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}
|