kritzel-stencil 0.3.13 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-active-users_42.cjs.entry.js +156 -25
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{schema.constants-CMFOYyBj.js → schema.constants-DJQTjcy7.js} +62 -0
- package/dist/cjs/stencil.cjs.js +1 -1
- package/dist/collection/classes/core/viewport.class.js +81 -0
- package/dist/collection/classes/objects/image.class.js +62 -0
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +86 -18
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +169 -17
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/kritzel-tool-config.js +1 -1
- package/dist/components/p-BTEV1WwT.js +1 -0
- package/dist/components/{p-ijIqLY9g.js → p-CUFKqzMC.js} +1 -1
- package/dist/components/{p-B9hLySCl.js → p-CUPYGT8c.js} +1 -1
- package/dist/components/p-Dc0a_Hb-.js +9 -0
- package/dist/components/{p-CVzH1Oil.js → p-J9_SwObO.js} +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/kritzel-active-users_42.entry.js +156 -25
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{schema.constants-NrtFvKER.js → schema.constants-DiCnmIYK.js} +62 -0
- package/dist/esm/stencil.js +1 -1
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/{p-NrtFvKER.js → p-DiCnmIYK.js} +1 -1
- package/dist/stencil/p-bbebe56c.entry.js +9 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/core/viewport.class.d.ts +30 -0
- package/dist/types/classes/objects/image.class.d.ts +15 -0
- package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +11 -3
- package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +33 -5
- package/dist/types/components.d.ts +28 -6
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/components/p-C-aFOO5p.js +0 -1
- package/dist/components/p-DplAQ6jk.js +0 -9
- package/dist/stencil/p-9adee165.entry.js +0 -9
|
@@ -581,6 +581,9 @@ export class KritzelEngine {
|
|
|
581
581
|
object.scale = object.scale ?? this.core.store.state.scale;
|
|
582
582
|
object.zIndex = this.core.store.currentZIndex;
|
|
583
583
|
object.workspaceId = this.core.store.state.activeWorkspace.id;
|
|
584
|
+
if (KritzelClassHelper.isInstanceOf(object, 'KritzelImage')) {
|
|
585
|
+
await object.prepareForInsert();
|
|
586
|
+
}
|
|
584
587
|
// Handle KritzelText: recreate the editor now that _core is available
|
|
585
588
|
// The editor's dispatchTransaction callback needs _core for persisting changes
|
|
586
589
|
if (KritzelClassHelper.isInstanceOf(object, 'KritzelText')) {
|
|
@@ -650,6 +653,7 @@ export class KritzelEngine {
|
|
|
650
653
|
await new Promise(resolve => {
|
|
651
654
|
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
652
655
|
});
|
|
656
|
+
this.emitObjectsChange();
|
|
653
657
|
this.emitObjectsAdded([object]);
|
|
654
658
|
return object;
|
|
655
659
|
}
|
|
@@ -665,6 +669,12 @@ export class KritzelEngine {
|
|
|
665
669
|
if (objects.length === 0) {
|
|
666
670
|
return [];
|
|
667
671
|
}
|
|
672
|
+
for (const object of objects) {
|
|
673
|
+
object._core = this.core;
|
|
674
|
+
if (KritzelClassHelper.isInstanceOf(object, 'KritzelImage')) {
|
|
675
|
+
await object.prepareForInsert();
|
|
676
|
+
}
|
|
677
|
+
}
|
|
668
678
|
this.core.store.objects.transaction(() => {
|
|
669
679
|
for (const object of objects) {
|
|
670
680
|
object.id = object.generateId();
|
|
@@ -726,6 +736,7 @@ export class KritzelEngine {
|
|
|
726
736
|
await new Promise(resolve => {
|
|
727
737
|
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
728
738
|
});
|
|
739
|
+
this.emitObjectsChange();
|
|
729
740
|
this.emitObjectsAdded(objects);
|
|
730
741
|
return objects;
|
|
731
742
|
}
|
|
@@ -739,6 +750,7 @@ export class KritzelEngine {
|
|
|
739
750
|
this.core.deselectAllObjects();
|
|
740
751
|
this.core.updateObject(object, updatedProperties);
|
|
741
752
|
this.core.rerender();
|
|
753
|
+
this.emitObjectsChange();
|
|
742
754
|
this.emitObjectsUpdated([{ object, changedProperties: Object.keys(updatedProperties) }]);
|
|
743
755
|
return object;
|
|
744
756
|
}
|
|
@@ -755,6 +767,7 @@ export class KritzelEngine {
|
|
|
755
767
|
this.core.deselectAllObjects();
|
|
756
768
|
objectsMap.remove(o => o.id === object.id);
|
|
757
769
|
this.core.rerender();
|
|
770
|
+
this.emitObjectsChange();
|
|
758
771
|
this.emitObjectsRemoved([object]);
|
|
759
772
|
return object;
|
|
760
773
|
}
|
|
@@ -777,6 +790,7 @@ export class KritzelEngine {
|
|
|
777
790
|
}
|
|
778
791
|
});
|
|
779
792
|
this.core.rerender();
|
|
793
|
+
this.emitObjectsChange();
|
|
780
794
|
this.emitObjectsRemoved(objects);
|
|
781
795
|
return objects;
|
|
782
796
|
}
|
|
@@ -891,6 +905,22 @@ export class KritzelEngine {
|
|
|
891
905
|
async zoomTo(scale, worldX, worldY) {
|
|
892
906
|
this.viewport.zoomTo(scale, worldX, worldY);
|
|
893
907
|
}
|
|
908
|
+
/**
|
|
909
|
+
* Zooms in by a fixed step, centered on the current viewport center, with a smooth animation.
|
|
910
|
+
* @param factor - Multiplicative zoom-in step.
|
|
911
|
+
* @param duration - Animation duration in milliseconds.
|
|
912
|
+
*/
|
|
913
|
+
async zoomIn(factor, duration) {
|
|
914
|
+
this.viewport.zoomIn(factor, duration);
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Zooms out by a fixed step, centered on the current viewport center, with a smooth animation.
|
|
918
|
+
* @param factor - Multiplicative zoom-out step.
|
|
919
|
+
* @param duration - Animation duration in milliseconds.
|
|
920
|
+
*/
|
|
921
|
+
async zoomOut(factor, duration) {
|
|
922
|
+
this.viewport.zoomOut(factor, duration);
|
|
923
|
+
}
|
|
894
924
|
/**
|
|
895
925
|
* Returns the current viewport state including position, scale, and dimensions.
|
|
896
926
|
* @returns The current viewport state.
|
|
@@ -927,11 +957,14 @@ export class KritzelEngine {
|
|
|
927
957
|
/**
|
|
928
958
|
* Captures a screenshot of the current viewport as a data URL.
|
|
929
959
|
* @param format - The image format: `'png'` (default) or `'svg'`.
|
|
960
|
+
* @param options - Optional screenshot settings.
|
|
961
|
+
* @param options.includeBackground - Whether to include the canvas background in the export. Defaults to `true`. Set to `false` for a transparent background.
|
|
930
962
|
* @returns A data URL string of the captured image.
|
|
931
963
|
*/
|
|
932
|
-
async getScreenshot(format = 'png') {
|
|
964
|
+
async getScreenshot(format = 'png', options) {
|
|
933
965
|
if (!this.host)
|
|
934
966
|
return null;
|
|
967
|
+
const includeBackground = options?.includeBackground ?? true;
|
|
935
968
|
// Save critical state before screenshot to restore after
|
|
936
969
|
const savedState = {
|
|
937
970
|
objects: this.core.store.objects,
|
|
@@ -943,7 +976,7 @@ export class KritzelEngine {
|
|
|
943
976
|
translateY: this.core.store.state.translateY,
|
|
944
977
|
scale: this.core.store.state.scale,
|
|
945
978
|
};
|
|
946
|
-
const
|
|
979
|
+
const screenshotOptions = {
|
|
947
980
|
filter: (node) => {
|
|
948
981
|
// Exclude the context menu, debug panel, and awareness cursors from the screenshot
|
|
949
982
|
if (node.tagName === 'KRITZEL-CONTEXT-MENU') {
|
|
@@ -958,13 +991,16 @@ export class KritzelEngine {
|
|
|
958
991
|
return true;
|
|
959
992
|
},
|
|
960
993
|
};
|
|
994
|
+
if (!includeBackground) {
|
|
995
|
+
screenshotOptions.backgroundColor = 'transparent';
|
|
996
|
+
}
|
|
961
997
|
let result;
|
|
962
998
|
try {
|
|
963
999
|
if (format === 'svg') {
|
|
964
|
-
result = await toSvg(this.host,
|
|
1000
|
+
result = await toSvg(this.host, screenshotOptions);
|
|
965
1001
|
}
|
|
966
1002
|
else {
|
|
967
|
-
result = await toPng(this.host,
|
|
1003
|
+
result = await toPng(this.host, screenshotOptions);
|
|
968
1004
|
}
|
|
969
1005
|
}
|
|
970
1006
|
finally {
|
|
@@ -981,14 +1017,18 @@ export class KritzelEngine {
|
|
|
981
1017
|
}
|
|
982
1018
|
return result;
|
|
983
1019
|
}
|
|
984
|
-
/**
|
|
985
|
-
|
|
1020
|
+
/**
|
|
1021
|
+
* Exports the current viewport as a PNG file and triggers a browser download.
|
|
1022
|
+
* @param options - Optional export settings.
|
|
1023
|
+
* @param options.includeBackground - Whether to include the canvas background. Defaults to `true`.
|
|
1024
|
+
*/
|
|
1025
|
+
async exportViewportAsPng(options) {
|
|
986
1026
|
try {
|
|
987
1027
|
const activeWorkspaceName = this.core.store.state?.activeWorkspace?.name || 'workspace';
|
|
988
1028
|
// timestamp format: YYYY-MM-DDTHH-mm-ss-sssZ, clearing colons/dots for safe filename
|
|
989
1029
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
990
1030
|
const filename = `${activeWorkspaceName}-${timestamp}.png`;
|
|
991
|
-
const dataUrl = await this.getScreenshot('png');
|
|
1031
|
+
const dataUrl = await this.getScreenshot('png', options);
|
|
992
1032
|
if (!dataUrl) {
|
|
993
1033
|
console.error('Failed to export viewport as PNG: screenshot could not be generated');
|
|
994
1034
|
return;
|
|
@@ -1002,14 +1042,18 @@ export class KritzelEngine {
|
|
|
1002
1042
|
console.error('Failed to export viewport as PNG:', error);
|
|
1003
1043
|
}
|
|
1004
1044
|
}
|
|
1005
|
-
/**
|
|
1006
|
-
|
|
1045
|
+
/**
|
|
1046
|
+
* Exports the current viewport as an SVG file and triggers a browser download.
|
|
1047
|
+
* @param options - Optional export settings.
|
|
1048
|
+
* @param options.includeBackground - Whether to include the canvas background. Defaults to `true`.
|
|
1049
|
+
*/
|
|
1050
|
+
async exportViewportAsSvg(options) {
|
|
1007
1051
|
try {
|
|
1008
1052
|
const activeWorkspaceName = this.core.store.state?.activeWorkspace?.name || 'workspace';
|
|
1009
1053
|
// timestamp format: YYYY-MM-DDTHH-mm-ss-sssZ, clearing colons/dots for safe filename
|
|
1010
1054
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
1011
1055
|
const filename = `${activeWorkspaceName}-${timestamp}.svg`;
|
|
1012
|
-
const dataUrl = await this.getScreenshot('svg');
|
|
1056
|
+
const dataUrl = await this.getScreenshot('svg', options);
|
|
1013
1057
|
if (!dataUrl) {
|
|
1014
1058
|
console.error('Failed to export viewport as SVG: screenshot could not be generated');
|
|
1015
1059
|
return;
|
|
@@ -3741,6 +3785,12 @@ export class KritzelEngine {
|
|
|
3741
3785
|
"id": "src/classes/objects/base-object.class.ts::KritzelBaseObject",
|
|
3742
3786
|
"referenceLocation": "KritzelBaseObject"
|
|
3743
3787
|
},
|
|
3788
|
+
"KritzelImage": {
|
|
3789
|
+
"location": "import",
|
|
3790
|
+
"path": "../../../classes/objects/image.class",
|
|
3791
|
+
"id": "src/classes/objects/image.class.ts::KritzelImage",
|
|
3792
|
+
"referenceLocation": "KritzelImage"
|
|
3793
|
+
},
|
|
3744
3794
|
"KritzelText": {
|
|
3745
3795
|
"location": "import",
|
|
3746
3796
|
"path": "../../../classes/objects/text.class",
|
|
@@ -3796,6 +3846,12 @@ export class KritzelEngine {
|
|
|
3796
3846
|
"id": "src/classes/objects/base-object.class.ts::KritzelBaseObject",
|
|
3797
3847
|
"referenceLocation": "KritzelBaseObject"
|
|
3798
3848
|
},
|
|
3849
|
+
"KritzelImage": {
|
|
3850
|
+
"location": "import",
|
|
3851
|
+
"path": "../../../classes/objects/image.class",
|
|
3852
|
+
"id": "src/classes/objects/image.class.ts::KritzelImage",
|
|
3853
|
+
"referenceLocation": "KritzelImage"
|
|
3854
|
+
},
|
|
3799
3855
|
"KritzelText": {
|
|
3800
3856
|
"location": "import",
|
|
3801
3857
|
"path": "../../../classes/objects/text.class",
|
|
@@ -4329,6 +4385,68 @@ export class KritzelEngine {
|
|
|
4329
4385
|
}]
|
|
4330
4386
|
}
|
|
4331
4387
|
},
|
|
4388
|
+
"zoomIn": {
|
|
4389
|
+
"complexType": {
|
|
4390
|
+
"signature": "(factor: number, duration: number) => Promise<void>",
|
|
4391
|
+
"parameters": [{
|
|
4392
|
+
"name": "factor",
|
|
4393
|
+
"type": "number",
|
|
4394
|
+
"docs": "- Multiplicative zoom-in step."
|
|
4395
|
+
}, {
|
|
4396
|
+
"name": "duration",
|
|
4397
|
+
"type": "number",
|
|
4398
|
+
"docs": "- Animation duration in milliseconds."
|
|
4399
|
+
}],
|
|
4400
|
+
"references": {
|
|
4401
|
+
"Promise": {
|
|
4402
|
+
"location": "global",
|
|
4403
|
+
"id": "global::Promise"
|
|
4404
|
+
}
|
|
4405
|
+
},
|
|
4406
|
+
"return": "Promise<void>"
|
|
4407
|
+
},
|
|
4408
|
+
"docs": {
|
|
4409
|
+
"text": "Zooms in by a fixed step, centered on the current viewport center, with a smooth animation.",
|
|
4410
|
+
"tags": [{
|
|
4411
|
+
"name": "param",
|
|
4412
|
+
"text": "factor - Multiplicative zoom-in step."
|
|
4413
|
+
}, {
|
|
4414
|
+
"name": "param",
|
|
4415
|
+
"text": "duration - Animation duration in milliseconds."
|
|
4416
|
+
}]
|
|
4417
|
+
}
|
|
4418
|
+
},
|
|
4419
|
+
"zoomOut": {
|
|
4420
|
+
"complexType": {
|
|
4421
|
+
"signature": "(factor: number, duration: number) => Promise<void>",
|
|
4422
|
+
"parameters": [{
|
|
4423
|
+
"name": "factor",
|
|
4424
|
+
"type": "number",
|
|
4425
|
+
"docs": "- Multiplicative zoom-out step."
|
|
4426
|
+
}, {
|
|
4427
|
+
"name": "duration",
|
|
4428
|
+
"type": "number",
|
|
4429
|
+
"docs": "- Animation duration in milliseconds."
|
|
4430
|
+
}],
|
|
4431
|
+
"references": {
|
|
4432
|
+
"Promise": {
|
|
4433
|
+
"location": "global",
|
|
4434
|
+
"id": "global::Promise"
|
|
4435
|
+
}
|
|
4436
|
+
},
|
|
4437
|
+
"return": "Promise<void>"
|
|
4438
|
+
},
|
|
4439
|
+
"docs": {
|
|
4440
|
+
"text": "Zooms out by a fixed step, centered on the current viewport center, with a smooth animation.",
|
|
4441
|
+
"tags": [{
|
|
4442
|
+
"name": "param",
|
|
4443
|
+
"text": "factor - Multiplicative zoom-out step."
|
|
4444
|
+
}, {
|
|
4445
|
+
"name": "param",
|
|
4446
|
+
"text": "duration - Animation duration in milliseconds."
|
|
4447
|
+
}]
|
|
4448
|
+
}
|
|
4449
|
+
},
|
|
4332
4450
|
"getViewport": {
|
|
4333
4451
|
"complexType": {
|
|
4334
4452
|
"signature": "() => Promise<KritzelViewportState>",
|
|
@@ -4487,17 +4605,25 @@ export class KritzelEngine {
|
|
|
4487
4605
|
},
|
|
4488
4606
|
"getScreenshot": {
|
|
4489
4607
|
"complexType": {
|
|
4490
|
-
"signature": "(format?: \"png\" | \"svg\") => Promise<string | null>",
|
|
4608
|
+
"signature": "(format?: \"png\" | \"svg\", options?: { includeBackground?: boolean; }) => Promise<string | null>",
|
|
4491
4609
|
"parameters": [{
|
|
4492
4610
|
"name": "format",
|
|
4493
4611
|
"type": "\"svg\" | \"png\"",
|
|
4494
4612
|
"docs": "- The image format: `'png'` (default) or `'svg'`."
|
|
4613
|
+
}, {
|
|
4614
|
+
"name": "options",
|
|
4615
|
+
"type": "{ includeBackground?: boolean; }",
|
|
4616
|
+
"docs": "- Optional screenshot settings."
|
|
4495
4617
|
}],
|
|
4496
4618
|
"references": {
|
|
4497
4619
|
"Promise": {
|
|
4498
4620
|
"location": "global",
|
|
4499
4621
|
"id": "global::Promise"
|
|
4500
4622
|
},
|
|
4623
|
+
"Record": {
|
|
4624
|
+
"location": "global",
|
|
4625
|
+
"id": "global::Record"
|
|
4626
|
+
},
|
|
4501
4627
|
"HTMLElement": {
|
|
4502
4628
|
"location": "global",
|
|
4503
4629
|
"id": "global::HTMLElement"
|
|
@@ -4510,6 +4636,12 @@ export class KritzelEngine {
|
|
|
4510
4636
|
"tags": [{
|
|
4511
4637
|
"name": "param",
|
|
4512
4638
|
"text": "format - The image format: `'png'` (default) or `'svg'`."
|
|
4639
|
+
}, {
|
|
4640
|
+
"name": "param",
|
|
4641
|
+
"text": "options - Optional screenshot settings."
|
|
4642
|
+
}, {
|
|
4643
|
+
"name": "param",
|
|
4644
|
+
"text": "options.includeBackground - Whether to include the canvas background in the export. Defaults to `true`. Set to `false` for a transparent background."
|
|
4513
4645
|
}, {
|
|
4514
4646
|
"name": "returns",
|
|
4515
4647
|
"text": "A data URL string of the captured image."
|
|
@@ -4518,8 +4650,12 @@ export class KritzelEngine {
|
|
|
4518
4650
|
},
|
|
4519
4651
|
"exportViewportAsPng": {
|
|
4520
4652
|
"complexType": {
|
|
4521
|
-
"signature": "() => Promise<void>",
|
|
4522
|
-
"parameters": [
|
|
4653
|
+
"signature": "(options?: { includeBackground?: boolean; }) => Promise<void>",
|
|
4654
|
+
"parameters": [{
|
|
4655
|
+
"name": "options",
|
|
4656
|
+
"type": "{ includeBackground?: boolean; }",
|
|
4657
|
+
"docs": "- Optional export settings."
|
|
4658
|
+
}],
|
|
4523
4659
|
"references": {
|
|
4524
4660
|
"Promise": {
|
|
4525
4661
|
"location": "global",
|
|
@@ -4530,13 +4666,23 @@ export class KritzelEngine {
|
|
|
4530
4666
|
},
|
|
4531
4667
|
"docs": {
|
|
4532
4668
|
"text": "Exports the current viewport as a PNG file and triggers a browser download.",
|
|
4533
|
-
"tags": [
|
|
4669
|
+
"tags": [{
|
|
4670
|
+
"name": "param",
|
|
4671
|
+
"text": "options - Optional export settings."
|
|
4672
|
+
}, {
|
|
4673
|
+
"name": "param",
|
|
4674
|
+
"text": "options.includeBackground - Whether to include the canvas background. Defaults to `true`."
|
|
4675
|
+
}]
|
|
4534
4676
|
}
|
|
4535
4677
|
},
|
|
4536
4678
|
"exportViewportAsSvg": {
|
|
4537
4679
|
"complexType": {
|
|
4538
|
-
"signature": "() => Promise<void>",
|
|
4539
|
-
"parameters": [
|
|
4680
|
+
"signature": "(options?: { includeBackground?: boolean; }) => Promise<void>",
|
|
4681
|
+
"parameters": [{
|
|
4682
|
+
"name": "options",
|
|
4683
|
+
"type": "{ includeBackground?: boolean; }",
|
|
4684
|
+
"docs": "- Optional export settings."
|
|
4685
|
+
}],
|
|
4540
4686
|
"references": {
|
|
4541
4687
|
"Promise": {
|
|
4542
4688
|
"location": "global",
|
|
@@ -4547,7 +4693,13 @@ export class KritzelEngine {
|
|
|
4547
4693
|
},
|
|
4548
4694
|
"docs": {
|
|
4549
4695
|
"text": "Exports the current viewport as an SVG file and triggers a browser download.",
|
|
4550
|
-
"tags": [
|
|
4696
|
+
"tags": [{
|
|
4697
|
+
"name": "param",
|
|
4698
|
+
"text": "options - Optional export settings."
|
|
4699
|
+
}, {
|
|
4700
|
+
"name": "param",
|
|
4701
|
+
"text": "options.includeBackground - Whether to include the canvas background. Defaults to `true`."
|
|
4702
|
+
}]
|
|
4551
4703
|
}
|
|
4552
4704
|
},
|
|
4553
4705
|
"getSelectedObjectsAsSvgString": {
|
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-B43upypT.js";export{K as KritzelBaseObject,b as KritzelLine,a as KritzelPath}from"./p-CFgkUYoO.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,f as KritzelAssetResolver,b as KritzelGroup,a as KritzelImage,e as KritzelSelectionTool,c as KritzelShape,K as KritzelText,d as KritzelTextTool,S as ShapeType}from"./p-B9hLySCl.js";export{A as APP_STATE_MIGRATIONS,g as KritzelAlignment,f as KritzelAnchorManager,K as KritzelBrushTool,e as KritzelCursorHelper,b as KritzelEraserTool,c as KritzelImageTool,a as KritzelLineTool,d as KritzelShapeTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-DplAQ6jk.js";import*as t from"yjs";import{IndexeddbPersistence as i}from"y-indexeddb";import{WebsocketProvider as n}from"y-websocket";import{H as o,a as m}from"./kritzel-editor.js";export{d as DEFAULT_ASSET_STORAGE_CONFIG,D as DEFAULT_BRUSH_CONFIG,c as DEFAULT_LINE_TOOL_CONFIG,b as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelWorkspace,W as WORKSPACE_EXPORT_VERSION}from"./p-DhMlShij.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-2xYAGd0I.js";export{C as CURRENT_APP_STATE_SCHEMA_VERSION,a as CURRENT_WORKSPACE_SCHEMA_VERSION}from"./p-CW-VyJgK.js";export{KritzelActiveUsers,defineCustomElement as defineCustomElementKritzelActiveUsers}from"./kritzel-active-users.js";export{KritzelAvatar,defineCustomElement as defineCustomElementKritzelAvatar}from"./kritzel-avatar.js";export{KritzelAwarenessCursors,defineCustomElement as defineCustomElementKritzelAwarenessCursors}from"./kritzel-awareness-cursors.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelButton,defineCustomElement as defineCustomElementKritzelButton}from"./kritzel-button.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCurrentUser,defineCustomElement as defineCustomElementKritzelCurrentUser}from"./kritzel-current-user.js";export{KritzelCurrentUserDialog,defineCustomElement as defineCustomElementKritzelCurrentUserDialog}from"./kritzel-current-user-dialog.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelInput,defineCustomElement as defineCustomElementKritzelInput}from"./kritzel-input.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelLoginDialog,defineCustomElement as defineCustomElementKritzelLoginDialog}from"./kritzel-login-dialog.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPillTabs,defineCustomElement as defineCustomElementKritzelPillTabs}from"./kritzel-pill-tabs.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelShareDialog,defineCustomElement as defineCustomElementKritzelShareDialog}from"./kritzel-share-dialog.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";const u=Math.floor,h=127,p=Number.MAX_SAFE_INTEGER;class z{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const E=()=>new z,y=e=>{const t=new Uint8Array((e=>{let t=e.cpos;for(let s=0;s<e.bufs.length;s++)t+=e.bufs[s].length;return t})(e));let s=0;for(let i=0;i<e.bufs.length;i++){const n=e.bufs[i];t.set(n,s),s+=n.length}return t.set(new Uint8Array(e.cbuf.buffer,0,e.cpos),s),t},w=(e,t)=>{const s=e.cbuf.length;e.cpos===s&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(2*s),e.cpos=0),e.cbuf[e.cpos++]=t},k=(e,t)=>{for(;t>h;)w(e,128|h&t),t=u(t/128);w(e,h&t)},x=(e,t)=>{k(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,n=((e,t)=>e<t?e:t)(s-i,t.length),o=t.length-n;e.cbuf.set(t.subarray(0,n),i),e.cpos+=n,o>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,o)),e.cbuf.set(t.subarray(n)),e.cpos=o)})(e,t)},T=e=>Error(e),j=T("Unexpected end of array"),P=T("Integer out of Range");class v{constructor(e){this.arr=e,this.pos=0}}const U=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,M(e)),M=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&h)*s,s*=128,i<128)return t;if(t>p)throw P}throw j};class F{type="local";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),s?.quiet||console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,t)=>{if(t!==this){const t=E();k(t,0),x(t,e),this.channel.postMessage(y(t))}};handleMessage(e){const s=(e=>new v(e))(new Uint8Array(e));switch(M(s)){case 0:const e=U(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=U(s),n=t.encodeStateAsUpdate(this.doc,i);if(n.length>0){const e=E();k(e,0),x(e,n),this.channel.postMessage(y(e))}}}broadcastSync(){const e=E();k(e,2),x(e,t.encodeStateVector(this.doc)),this.channel.postMessage(y(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const _=new Map;class O{type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,s)=>{s!==this&&_.set(this.cacheKey,t.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=_.get(this.cacheKey);e&&t.applyUpdate(this.doc,e,this),this.doc.on("update",this.handleUpdate),this.isConnected=!0}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleUpdate),this.isConnected=!1}static clear(e){void 0!==e?_.delete(e):_.clear()}}class ${type="local";provider;isConnected=!1;constructor(e,t,s){this.provider=new i(s?.name||e,t)}async connect(){if(!this.isConnected)return new Promise((e=>{this.provider.on("synced",(()=>{this.isConnected=!0,e()}))}))}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class H{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new n(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new H(t,s,n)}}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const 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}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class R{type="network";provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;isDestroyed=!1;connectTimeout=null;pendingConnectReject=null;connectionTimeoutMs;_connectionStatus="disconnected";visibilityHandler=null;onlineHandler=null;get awareness(){return this.provider.awareness}get connectionStatus(){return this._connectionStatus}static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,n=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||R.sharedWebSocketProvider,l={};void 0!==s?.delay&&(l.delay=s.delay),void 0!==s?.factor&&(l.factor=s.factor),void 0!==s?.maxAttempts&&(l.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(l.minDelay=s.minDelay),void 0!==s?.maxDelay&&(l.maxDelay=s.maxDelay);const a=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},c=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},d=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},m=e=>{this.isDestroyed||("connecting"===e.status&&(this._connectionStatus="connecting"),s?.onStatus&&s.onStatus(e))};if(r){this.usesSharedSocket=!0;const e={websocketProvider:r,name:i,document:t,token:s?.token||null,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new o(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:n,name:i,document:t,token:s?.token||null,autoConnect:!1,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new o(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${n}/${i}`)}this.setupBrowserEventListeners()}setupBrowserEventListeners(){"undefined"!=typeof document&&(this.visibilityHandler=()=>{"visible"!==document.visibilityState||this.isConnected||this.isDestroyed||this.provider.connect()},document.addEventListener("visibilitychange",this.visibilityHandler)),"undefined"!=typeof window&&(this.onlineHandler=()=>{this.isConnected||this.isDestroyed||this.provider.connect()},window.addEventListener("online",this.onlineHandler))}removeBrowserEventListeners(){this.visibilityHandler&&"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&"undefined"!=typeof window&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null)}static createSharedWebSocket(e){if(R.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),R.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),R.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),R.sharedWebSocketProvider}static destroySharedWebSocket(){R.sharedWebSocketProvider&&(R.sharedWebSocketProvider.destroy(),R.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return R.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new R(t,s,n)}}}async connect(){if(!this.isSynced&&!this.isDestroyed)return this._connectionStatus="connecting",new Promise(((e,t)=>{this.pendingConnectReject=t,this.connectTimeout=setTimeout((()=>{this.pendingConnectReject=null,this.connectTimeout=null,t(Error("Hocuspocus connection timeout"))}),this.connectionTimeoutMs);const s=()=>{this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),this.isDestroyed||e()};if(this.provider.on("synced",s),this.provider.isSynced)return this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}async reconnect(){return this.disconnect(),this.connect()}disconnect(){this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}destroy(){this.isDestroyed=!0,this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.removeBrowserEventListeners(),this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}}class B{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new B(e)}}async init(){this._options.quiet||console.info("HttpAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=t.id??this.generateUuid(),i={...t,id:s},n=await(this._options.headers?.())??{},o=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(o,e,i,n)).id??s,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.resolveUrl(e)}async fetch(e){const t=await this._options.resolveUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to fetch asset ${e}: ${i.status} ${i.statusText}`);return i.blob()}async delete(e){if(!this._options.deleteUrl)return;const t=await this._options.deleteUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{method:"DELETE",headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to delete asset ${e}: ${i.status} ${i.statusText}`);this._options.quiet||console.info("HttpAssetProvider: deleted asset "+e)}defaultUpload=async(e,t,s,i)=>{const n=new FormData;n.append("metadata",JSON.stringify(s)),n.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const o=await fetch(e,{method:"POST",headers:i,body:n});if(!o.ok)throw Error(`[HttpAssetProvider] Upload failed: ${o.status} ${o.statusText}`);return(o.headers.get("content-type")||"").includes("application/json")?await o.json():{}};extensionFromMime(e){const t=e.indexOf("/");return t>=0?e.slice(t+1):"bin"}generateUuid(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();const e=crypto.getRandomValues(new Uint8Array(16));e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e,(e=>e.toString(16).padStart(2,"0"))).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}}class N{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new N(e)}}async init(){this._options.quiet||console.info("PresignedAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=await this._options.getUploadDescriptor(t),i=s.method??"PUT",n={...s.headers??{}};let o;if(n["Content-Type"]||n["content-type"]||(n["Content-Type"]=t.mimeType),"POST"===i&&s.fields){const t=new FormData;for(const[e,i]of Object.entries(s.fields))t.append(e,i);t.append("file",e),o=t,delete n["Content-Type"],delete n["content-type"]}else o=e;const r=await fetch(s.url,{method:i,headers:n,body:o});if(!r.ok)throw Error(`[PresignedAssetProvider] Upload failed: ${r.status} ${r.statusText}`);return{id:s.id,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.getDownloadUrl(e)}async fetch(e){const t=await this._options.getDownloadUrl(e),s=await fetch(t);if(!s.ok)throw Error(`[PresignedAssetProvider] Failed to fetch asset ${e}: ${s.status} ${s.statusText}`);return s.blob()}async delete(e){this._options.deleteAsset&&(await this._options.deleteAsset(e),this._options.quiet||console.info("PresignedAssetProvider: deleted asset "+e))}}export{F as BroadcastSyncProvider,R as HocuspocusSyncProvider,B as HttpAssetProvider,O as InMemorySyncProvider,$ as IndexedDBSyncProvider,N as PresignedAssetProvider,H as WebSocketSyncProvider}
|
|
1
|
+
export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-B43upypT.js";export{K as KritzelBaseObject,b as KritzelLine,a as KritzelPath}from"./p-CFgkUYoO.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,f as KritzelAssetResolver,b as KritzelGroup,a as KritzelImage,e as KritzelSelectionTool,c as KritzelShape,K as KritzelText,d as KritzelTextTool,S as ShapeType}from"./p-CUPYGT8c.js";export{A as APP_STATE_MIGRATIONS,g as KritzelAlignment,f as KritzelAnchorManager,K as KritzelBrushTool,e as KritzelCursorHelper,b as KritzelEraserTool,c as KritzelImageTool,a as KritzelLineTool,d as KritzelShapeTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-Dc0a_Hb-.js";import*as t from"yjs";import{IndexeddbPersistence as i}from"y-indexeddb";import{WebsocketProvider as n}from"y-websocket";import{H as o,a as m}from"./kritzel-editor.js";export{d as DEFAULT_ASSET_STORAGE_CONFIG,D as DEFAULT_BRUSH_CONFIG,c as DEFAULT_LINE_TOOL_CONFIG,b as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelWorkspace,W as WORKSPACE_EXPORT_VERSION}from"./p-DhMlShij.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-2xYAGd0I.js";export{C as CURRENT_APP_STATE_SCHEMA_VERSION,a as CURRENT_WORKSPACE_SCHEMA_VERSION}from"./p-CW-VyJgK.js";export{KritzelActiveUsers,defineCustomElement as defineCustomElementKritzelActiveUsers}from"./kritzel-active-users.js";export{KritzelAvatar,defineCustomElement as defineCustomElementKritzelAvatar}from"./kritzel-avatar.js";export{KritzelAwarenessCursors,defineCustomElement as defineCustomElementKritzelAwarenessCursors}from"./kritzel-awareness-cursors.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelButton,defineCustomElement as defineCustomElementKritzelButton}from"./kritzel-button.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCurrentUser,defineCustomElement as defineCustomElementKritzelCurrentUser}from"./kritzel-current-user.js";export{KritzelCurrentUserDialog,defineCustomElement as defineCustomElementKritzelCurrentUserDialog}from"./kritzel-current-user-dialog.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelInput,defineCustomElement as defineCustomElementKritzelInput}from"./kritzel-input.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelLoginDialog,defineCustomElement as defineCustomElementKritzelLoginDialog}from"./kritzel-login-dialog.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPillTabs,defineCustomElement as defineCustomElementKritzelPillTabs}from"./kritzel-pill-tabs.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelShareDialog,defineCustomElement as defineCustomElementKritzelShareDialog}from"./kritzel-share-dialog.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";const u=Math.floor,h=127,z=Number.MAX_SAFE_INTEGER;class p{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const E=()=>new p,y=e=>{const t=new Uint8Array((e=>{let t=e.cpos;for(let s=0;s<e.bufs.length;s++)t+=e.bufs[s].length;return t})(e));let s=0;for(let i=0;i<e.bufs.length;i++){const n=e.bufs[i];t.set(n,s),s+=n.length}return t.set(new Uint8Array(e.cbuf.buffer,0,e.cpos),s),t},w=(e,t)=>{const s=e.cbuf.length;e.cpos===s&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(2*s),e.cpos=0),e.cbuf[e.cpos++]=t},k=(e,t)=>{for(;t>h;)w(e,128|h&t),t=u(t/128);w(e,h&t)},x=(e,t)=>{k(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,n=((e,t)=>e<t?e:t)(s-i,t.length),o=t.length-n;e.cbuf.set(t.subarray(0,n),i),e.cpos+=n,o>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,o)),e.cbuf.set(t.subarray(n)),e.cpos=o)})(e,t)},T=e=>Error(e),j=T("Unexpected end of array"),P=T("Integer out of Range");class v{constructor(e){this.arr=e,this.pos=0}}const U=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,M(e)),M=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&h)*s,s*=128,i<128)return t;if(t>z)throw P}throw j};class F{type="local";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),s?.quiet||console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,t)=>{if(t!==this){const t=E();k(t,0),x(t,e),this.channel.postMessage(y(t))}};handleMessage(e){const s=(e=>new v(e))(new Uint8Array(e));switch(M(s)){case 0:const e=U(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=U(s),n=t.encodeStateAsUpdate(this.doc,i);if(n.length>0){const e=E();k(e,0),x(e,n),this.channel.postMessage(y(e))}}}broadcastSync(){const e=E();k(e,2),x(e,t.encodeStateVector(this.doc)),this.channel.postMessage(y(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const _=new Map;class O{type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,s)=>{s!==this&&_.set(this.cacheKey,t.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=_.get(this.cacheKey);e&&t.applyUpdate(this.doc,e,this),this.doc.on("update",this.handleUpdate),this.isConnected=!0}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleUpdate),this.isConnected=!1}static clear(e){void 0!==e?_.delete(e):_.clear()}}class ${type="local";provider;isConnected=!1;constructor(e,t,s){this.provider=new i(s?.name||e,t)}async connect(){if(!this.isConnected)return new Promise((e=>{this.provider.on("synced",(()=>{this.isConnected=!0,e()}))}))}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class H{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new n(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new H(t,s,n)}}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const 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}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class R{type="network";provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;isDestroyed=!1;connectTimeout=null;pendingConnectReject=null;connectionTimeoutMs;_connectionStatus="disconnected";visibilityHandler=null;onlineHandler=null;get awareness(){return this.provider.awareness}get connectionStatus(){return this._connectionStatus}static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,n=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||R.sharedWebSocketProvider,l={};void 0!==s?.delay&&(l.delay=s.delay),void 0!==s?.factor&&(l.factor=s.factor),void 0!==s?.maxAttempts&&(l.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(l.minDelay=s.minDelay),void 0!==s?.maxDelay&&(l.maxDelay=s.maxDelay);const a=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},c=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},d=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},m=e=>{this.isDestroyed||("connecting"===e.status&&(this._connectionStatus="connecting"),s?.onStatus&&s.onStatus(e))};if(r){this.usesSharedSocket=!0;const e={websocketProvider:r,name:i,document:t,token:s?.token||null,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new o(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:n,name:i,document:t,token:s?.token||null,autoConnect:!1,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new o(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${n}/${i}`)}this.setupBrowserEventListeners()}setupBrowserEventListeners(){"undefined"!=typeof document&&(this.visibilityHandler=()=>{"visible"!==document.visibilityState||this.isConnected||this.isDestroyed||this.provider.connect()},document.addEventListener("visibilitychange",this.visibilityHandler)),"undefined"!=typeof window&&(this.onlineHandler=()=>{this.isConnected||this.isDestroyed||this.provider.connect()},window.addEventListener("online",this.onlineHandler))}removeBrowserEventListeners(){this.visibilityHandler&&"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&"undefined"!=typeof window&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null)}static createSharedWebSocket(e){if(R.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),R.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),R.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),R.sharedWebSocketProvider}static destroySharedWebSocket(){R.sharedWebSocketProvider&&(R.sharedWebSocketProvider.destroy(),R.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return R.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new R(t,s,n)}}}async connect(){if(!this.isSynced&&!this.isDestroyed)return this._connectionStatus="connecting",new Promise(((e,t)=>{this.pendingConnectReject=t,this.connectTimeout=setTimeout((()=>{this.pendingConnectReject=null,this.connectTimeout=null,t(Error("Hocuspocus connection timeout"))}),this.connectionTimeoutMs);const s=()=>{this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),this.isDestroyed||e()};if(this.provider.on("synced",s),this.provider.isSynced)return this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}async reconnect(){return this.disconnect(),this.connect()}disconnect(){this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}destroy(){this.isDestroyed=!0,this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.removeBrowserEventListeners(),this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}}class B{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new B(e)}}async init(){this._options.quiet||console.info("HttpAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=t.id??this.generateUuid(),i={...t,id:s},n=await(this._options.headers?.())??{},o=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(o,e,i,n)).id??s,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.resolveUrl(e)}async fetch(e){const t=await this._options.resolveUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to fetch asset ${e}: ${i.status} ${i.statusText}`);return i.blob()}async delete(e){if(!this._options.deleteUrl)return;const t=await this._options.deleteUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{method:"DELETE",headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to delete asset ${e}: ${i.status} ${i.statusText}`);this._options.quiet||console.info("HttpAssetProvider: deleted asset "+e)}defaultUpload=async(e,t,s,i)=>{const n=new FormData;n.append("metadata",JSON.stringify(s)),n.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const o=await fetch(e,{method:"POST",headers:i,body:n});if(!o.ok)throw Error(`[HttpAssetProvider] Upload failed: ${o.status} ${o.statusText}`);return(o.headers.get("content-type")||"").includes("application/json")?await o.json():{}};extensionFromMime(e){const t=e.indexOf("/");return t>=0?e.slice(t+1):"bin"}generateUuid(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();const e=crypto.getRandomValues(new Uint8Array(16));e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e,(e=>e.toString(16).padStart(2,"0"))).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}}class N{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new N(e)}}async init(){this._options.quiet||console.info("PresignedAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=await this._options.getUploadDescriptor(t),i=s.method??"PUT",n={...s.headers??{}};let o;if(n["Content-Type"]||n["content-type"]||(n["Content-Type"]=t.mimeType),"POST"===i&&s.fields){const t=new FormData;for(const[e,i]of Object.entries(s.fields))t.append(e,i);t.append("file",e),o=t,delete n["Content-Type"],delete n["content-type"]}else o=e;const r=await fetch(s.url,{method:i,headers:n,body:o});if(!r.ok)throw Error(`[PresignedAssetProvider] Upload failed: ${r.status} ${r.statusText}`);return{id:s.id,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.getDownloadUrl(e)}async fetch(e){const t=await this._options.getDownloadUrl(e),s=await fetch(t);if(!s.ok)throw Error(`[PresignedAssetProvider] Failed to fetch asset ${e}: ${s.status} ${s.statusText}`);return s.blob()}async delete(e){this._options.deleteAsset&&(await this._options.deleteAsset(e),this._options.quiet||console.info("PresignedAssetProvider: deleted asset "+e))}}export{F as BroadcastSyncProvider,R as HocuspocusSyncProvider,B as HttpAssetProvider,O as InMemorySyncProvider,$ as IndexedDBSyncProvider,N as PresignedAssetProvider,H as WebSocketSyncProvider}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as o,d as s}from"./p-
|
|
1
|
+
import{K as o,d as s}from"./p-J9_SwObO.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
|