kritzel-stencil 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/cjs/index.cjs.js +1 -1
  2. package/dist/cjs/kritzel-active-users_42.cjs.entry.js +108 -62
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/stencil.cjs.js +1 -1
  5. package/dist/cjs/{workspace.migrations-TAWnOE7r.js → workspace.migrations-CYeB_XRB.js} +167 -22
  6. package/dist/collection/classes/core/core.class.js +27 -19
  7. package/dist/collection/classes/handlers/selection.handler.js +36 -2
  8. package/dist/collection/classes/objects/group.class.js +69 -12
  9. package/dist/collection/classes/tools/text-tool.class.js +44 -8
  10. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +5 -5
  11. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +41 -17
  12. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.css +3 -2
  13. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.js +3 -2
  14. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +23 -1
  15. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +7 -10
  16. package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.js +1 -1
  17. package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.js +1 -1
  18. package/dist/collection/components/ui/kritzel-export/kritzel-export.js +1 -1
  19. package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.js +1 -1
  20. package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.js +1 -1
  21. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +1 -1
  22. package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.js +2 -2
  23. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  24. package/dist/collection/constants/version.js +1 -1
  25. package/dist/collection/themes/dark-theme.js +9 -0
  26. package/dist/collection/themes/light-theme.js +9 -0
  27. package/dist/components/index.js +1 -1
  28. package/dist/components/kritzel-awareness-cursors.js +1 -1
  29. package/dist/components/kritzel-color-palette.js +1 -1
  30. package/dist/components/kritzel-color.js +1 -1
  31. package/dist/components/kritzel-controls.js +1 -1
  32. package/dist/components/kritzel-current-user-dialog.js +1 -1
  33. package/dist/components/kritzel-current-user.js +1 -1
  34. package/dist/components/kritzel-dialog.js +1 -1
  35. package/dist/components/kritzel-editor.js +1 -1
  36. package/dist/components/kritzel-engine.js +1 -1
  37. package/dist/components/kritzel-export.js +1 -1
  38. package/dist/components/kritzel-login-dialog.js +1 -1
  39. package/dist/components/kritzel-menu-item.js +1 -1
  40. package/dist/components/kritzel-menu.js +1 -1
  41. package/dist/components/kritzel-more-menu.js +1 -1
  42. package/dist/components/kritzel-portal.js +1 -1
  43. package/dist/components/kritzel-settings.js +1 -1
  44. package/dist/components/kritzel-share-dialog.js +1 -1
  45. package/dist/components/kritzel-split-button.js +1 -1
  46. package/dist/components/kritzel-stroke-size.js +1 -1
  47. package/dist/components/kritzel-tool-config.js +1 -1
  48. package/dist/components/kritzel-utility-panel.js +1 -1
  49. package/dist/components/kritzel-workspace-manager.js +1 -1
  50. package/dist/components/p-0F9_lw6l.js +1 -0
  51. package/dist/components/{p-CFzvz-B2.js → p-0YBCp8Wh.js} +1 -1
  52. package/dist/components/{p-mYhFNPgz.js → p-BAjrJjMX.js} +1 -1
  53. package/dist/components/{p-R9M5PnAz.js → p-BDOSy6zd.js} +1 -1
  54. package/dist/components/p-BLjdzUzs.js +1 -0
  55. package/dist/components/{p-BFQVg_eQ.js → p-BSEdLfq2.js} +1 -1
  56. package/dist/components/{p-DkT0CXfN.js → p-Be6E_RMf.js} +1 -1
  57. package/dist/components/p-BeeKeeeo.js +1 -0
  58. package/dist/components/{p-CoyqJSjT.js → p-BmYsz1bP.js} +1 -1
  59. package/dist/components/{p-B4wyWc66.js → p-Bs7lEBy5.js} +2 -2
  60. package/dist/components/p-C-qyWv4d.js +1 -0
  61. package/dist/components/{p-ChqeIKg_.js → p-C1Fv9rVN.js} +1 -1
  62. package/dist/components/{p-CVQBfO3r.js → p-C1UNiqO2.js} +1 -1
  63. package/dist/components/{p-CekG3_ce.js → p-C2MdRsg6.js} +1 -1
  64. package/dist/components/{p-DoIOS3fS.js → p-CdaOQi45.js} +1 -1
  65. package/dist/components/{p-B2kHVHa_.js → p-CsMMZSAP.js} +1 -1
  66. package/dist/components/{p-ChQNi67Z.js → p-D9ifYAtg.js} +1 -1
  67. package/dist/components/{p-Dxb22STM.js → p-DYHF_MSN.js} +1 -1
  68. package/dist/components/{p-C3Dwuqka.js → p-Dg_nGsFe.js} +1 -1
  69. package/dist/components/{p-CzIuqMQA.js → p-DoDI-v-H.js} +1 -1
  70. package/dist/components/p-R60vdaIY.js +1 -0
  71. package/dist/components/{p-CU6kJPth.js → p-ZpItdhxS.js} +1 -1
  72. package/dist/components/{p--T9W9erA.js → p-yX5Zk5pS.js} +1 -1
  73. package/dist/esm/index.js +2 -2
  74. package/dist/esm/kritzel-active-users_42.entry.js +108 -62
  75. package/dist/esm/loader.js +1 -1
  76. package/dist/esm/stencil.js +1 -1
  77. package/dist/esm/{workspace.migrations-Dta1Yewh.js → workspace.migrations-BrA5xRPn.js} +167 -22
  78. package/dist/stencil/index.esm.js +1 -1
  79. package/dist/stencil/p-56b81681.entry.js +9 -0
  80. package/dist/stencil/p-BrA5xRPn.js +1 -0
  81. package/dist/stencil/stencil.esm.js +1 -1
  82. package/dist/types/classes/handlers/selection.handler.d.ts +15 -0
  83. package/dist/types/classes/objects/group.class.d.ts +15 -0
  84. package/dist/types/classes/tools/text-tool.class.d.ts +26 -8
  85. package/dist/types/components/shared/kritzel-portal/kritzel-portal.d.ts +1 -0
  86. package/dist/types/constants/version.d.ts +1 -1
  87. package/dist/types/interfaces/theme.interface.d.ts +12 -4
  88. package/package.json +1 -1
  89. package/dist/components/p-BYX50YSd.js +0 -1
  90. package/dist/components/p-BfJav4Zz.js +0 -1
  91. package/dist/components/p-CjazGGq3.js +0 -1
  92. package/dist/components/p-CqYIRmoh.js +0 -1
  93. package/dist/components/p-mDz63oKF.js +0 -1
  94. package/dist/stencil/p-22753671.entry.js +0 -9
  95. package/dist/stencil/p-Dta1Yewh.js +0 -1
@@ -10,14 +10,38 @@ import { DEFAULT_COLOR_PALETTE } from "../../constants/color-palette.constants";
10
10
  * Supports configurable font family, size, color, and opacity.
11
11
  */
12
12
  export class KritzelTextTool extends KritzelBaseTool {
13
- /** The font family for new text objects */
14
- fontFamily = 'Arial';
15
- /** The font size for new text objects in pixels */
16
- fontSize = 16;
17
- /** The font color for new text objects (supports theme-aware light/dark colors) */
18
- fontColor = DEFAULT_COLOR_PALETTE[0];
19
- /** The opacity of new text objects (0-1) */
20
- opacity = 1;
13
+ /** Backing field for {@link fontFamily}. */
14
+ _fontFamily = 'Arial';
15
+ /** Backing field for {@link fontSize}. */
16
+ _fontSize = 16;
17
+ /** Backing field for {@link fontColor}. */
18
+ _fontColor = DEFAULT_COLOR_PALETTE[0];
19
+ /** Backing field for {@link opacity}. */
20
+ _opacity = 1;
21
+ /** The font family for new text objects. */
22
+ get fontFamily() { return this._fontFamily; }
23
+ set fontFamily(value) {
24
+ this._fontFamily = value;
25
+ this.applyToActiveText({ fontFamily: value });
26
+ }
27
+ /** The font size for new text objects in pixels. */
28
+ get fontSize() { return this._fontSize; }
29
+ set fontSize(value) {
30
+ this._fontSize = value;
31
+ this.applyToActiveText({ fontSize: value });
32
+ }
33
+ /** The font color for new text objects (supports theme-aware light/dark colors). */
34
+ get fontColor() { return this._fontColor; }
35
+ set fontColor(value) {
36
+ this._fontColor = value;
37
+ this.applyToActiveText({ fontColor: value });
38
+ }
39
+ /** The opacity of new text objects (0-1). */
40
+ get opacity() { return this._opacity; }
41
+ set opacity(value) {
42
+ this._opacity = value;
43
+ this.applyToActiveText({ opacity: value });
44
+ }
21
45
  /** Available color palette for the text tool */
22
46
  palette = [...DEFAULT_COLOR_PALETTE];
23
47
  /**
@@ -27,6 +51,18 @@ export class KritzelTextTool extends KritzelBaseTool {
27
51
  constructor(core) {
28
52
  super(core);
29
53
  }
54
+ /**
55
+ * Propagates a property change to the text object that is currently being edited, if any.
56
+ * Mirrors the selection tool pattern of pushing tool-config changes down to live objects,
57
+ * but scoped to the single text in edit mode rather than the current selection.
58
+ */
59
+ applyToActiveText(updatedProperties) {
60
+ const activeText = this._core?.store?.activeText;
61
+ if (!activeText)
62
+ return;
63
+ this._core.updateObject(activeText, updatedProperties);
64
+ this._core.rerender();
65
+ }
30
66
  /**
31
67
  * Handles pointer down events for text creation and editing.
32
68
  * If clicking on an existing text object, enters edit mode for that object.
@@ -30,12 +30,12 @@ p, h1, h2, h3, h4, h5, h6, blockquote, pre {
30
30
  align-items: center;
31
31
  justify-content: center;
32
32
  gap: 10px;
33
- background-color: var(--kritzel-loading-overlay-background, rgba(255, 255, 255, 0.6));
34
- color: var(--kritzel-loading-overlay-color, #333);
33
+ background-color: var(--kritzel-engine-loading-overlay-background, rgba(255, 255, 255, 0.6));
34
+ color: var(--kritzel-engine-loading-overlay-color, #333);
35
35
  font-family: var(--kritzel-font-family, sans-serif);
36
36
  font-size: 1.25rem;
37
37
  pointer-events: all;
38
- animation: workspace-loading-fade-in 200ms ease-out var(--kritzel-loading-overlay-delay, 300ms) forwards;
38
+ animation: workspace-loading-fade-in 200ms ease-out var(--kritzel-engine-loading-overlay-delay, 300ms) forwards;
39
39
  opacity: 0;
40
40
  }
41
41
 
@@ -45,8 +45,8 @@ p, h1, h2, h3, h4, h5, h6, blockquote, pre {
45
45
  box-sizing: border-box;
46
46
  display: block;
47
47
  flex-shrink: 0;
48
- border: 2px solid var(--kritzel-loading-overlay-spinner-color, #cccccc);
49
- border-top-color: var(--kritzel-loading-overlay-spinner-active-color, #333333);
48
+ border: 2px solid var(--kritzel-engine-loading-overlay-spinner-color, #cccccc);
49
+ border-top-color: var(--kritzel-engine-loading-overlay-spinner-active-color, #333333);
50
50
  border-radius: 50%;
51
51
  animation: workspace-loading-spin 0.6s linear infinite;
52
52
  }
@@ -251,6 +251,7 @@ export class KritzelEngine {
251
251
  if (this.core.store.isDisabled) {
252
252
  return;
253
253
  }
254
+ const wasTracked = this.core.store.state.pointers.has(ev.pointerId);
254
255
  this.core.store.state.pointers.delete(ev.pointerId);
255
256
  if (this.host.hasPointerCapture(ev.pointerId)) {
256
257
  this.host.releasePointerCapture(ev.pointerId);
@@ -259,6 +260,12 @@ export class KritzelEngine {
259
260
  if (this.core.store.state.pointers.size === 0) {
260
261
  this.core.cursorManager.resetToDefault();
261
262
  }
263
+ // If the corresponding pointerdown was never processed (e.g. consumed by a capture-phase
264
+ // listener like a tooltip close handler), skip tool logic to avoid spurious interactions
265
+ // such as a selected text object entering edit mode when clicking to dismiss a popup.
266
+ if (!wasTracked) {
267
+ return;
268
+ }
262
269
  this.viewport.handlePointerUp(ev);
263
270
  this.core.store.state?.activeTool?.handlePointerUp(ev);
264
271
  }
@@ -531,23 +538,39 @@ export class KritzelEngine {
531
538
  object.setContent(pendingContent);
532
539
  }
533
540
  }
534
- // Handle KritzelGroup: flush pending children into the store
541
+ // Handle KritzelGroup: flush pending children (recursively for nested groups) into the store
535
542
  if (KritzelClassHelper.isInstanceOf(object, 'KritzelGroup') && object._pendingChildren.length > 0) {
536
- object.childIds = [];
537
- // Build a map of old ID new ID so we can remap anchor references
543
+ // Build a map of old ID → new ID across all nesting levels so we can
544
+ // remap anchor references regardless of how deeply nested the line is.
538
545
  const idRemapping = new Map();
539
- object._pendingChildren.forEach(child => {
540
- const oldId = child.id;
541
- child.id = child.generateId();
542
- child._core = this.core;
543
- child.scale = this.core.store.state.scale;
544
- child.zIndex = this.core.store.currentZIndex;
545
- child.workspaceId = this.core.store.state.activeWorkspace.id;
546
- idRemapping.set(oldId, child.id);
547
- object.childIds.push(child.id);
548
- });
549
- // Remap anchor references in lines before inserting into the store
550
- object._pendingChildren.forEach(child => {
546
+ const allFlushedChildren = [];
547
+ const flushGroup = (group) => {
548
+ if (group._pendingChildren.length === 0) {
549
+ return;
550
+ }
551
+ const pending = group._pendingChildren;
552
+ group._pendingChildren = [];
553
+ group.childIds = [];
554
+ pending.forEach(child => {
555
+ const oldId = child.id;
556
+ child.id = child.generateId();
557
+ child._core = this.core;
558
+ child.scale = this.core.store.state.scale;
559
+ child.zIndex = this.core.store.currentZIndex;
560
+ child.workspaceId = this.core.store.state.activeWorkspace.id;
561
+ idRemapping.set(oldId, child.id);
562
+ group.childIds.push(child.id);
563
+ allFlushedChildren.push(child);
564
+ // Recurse into nested groups before inserting so grandchildren get
565
+ // proper IDs and `childIds` references before the parent is added.
566
+ if (KritzelClassHelper.isInstanceOf(child, 'KritzelGroup')) {
567
+ flushGroup(child);
568
+ }
569
+ });
570
+ };
571
+ flushGroup(object);
572
+ // Remap anchor references in lines across all flushed descendants
573
+ allFlushedChildren.forEach(child => {
551
574
  if (KritzelClassHelper.isInstanceOf(child, 'KritzelLine')) {
552
575
  if (child.startAnchor && idRemapping.has(child.startAnchor.objectId)) {
553
576
  child.startAnchor = { objectId: idRemapping.get(child.startAnchor.objectId) };
@@ -557,10 +580,11 @@ export class KritzelEngine {
557
580
  }
558
581
  }
559
582
  });
560
- object._pendingChildren.forEach(child => {
583
+ // Insert all flushed descendants into the store
584
+ allFlushedChildren.forEach(child => {
561
585
  this.core.addObject(child);
562
586
  });
563
- object._pendingChildren = [];
587
+ // finalize() recurses into nested groups so all bounding boxes/snapshots align
564
588
  object.finalize();
565
589
  // Rebuild anchor index so anchored lines are tracked
566
590
  this.core.anchorManager.rebuildIndex();
@@ -71,8 +71,9 @@
71
71
  border-radius: 0;
72
72
  }
73
73
 
74
- /* Responsive: auto fullscreen on mobile when enabled */
75
- @media (max-width: 576px) {
74
+ /* Responsive: auto fullscreen on mobile when enabled (portrait) */
75
+ @media (max-width: 576px),
76
+ (max-height: 576px) and (orientation: landscape) {
76
77
  .backdrop:has(.fullscreen-on-mobile) {
77
78
  background-color: transparent;
78
79
  }
@@ -95,8 +95,9 @@ export class KritzelDialog {
95
95
  document.body.style.overflow = 'hidden';
96
96
  }
97
97
  lockMobileViewportHeight() {
98
- // Only lock height on mobile when fullscreenOnMobile is enabled
99
- if (!this.fullscreenOnMobile || window.innerWidth > 576) {
98
+ // Only lock height on mobile when fullscreenOnMobile is enabled.
99
+ // Use the smaller dimension so landscape phones (wide but short) are also detected.
100
+ if (!this.fullscreenOnMobile || Math.min(window.innerWidth, window.innerHeight) > 576) {
100
101
  this.mobileLockedHeight = null;
101
102
  return;
102
103
  }
@@ -40,6 +40,22 @@ export class KritzelPortal {
40
40
  this.closePortal();
41
41
  }
42
42
  }
43
+ handleOutsidePointerDown(event) {
44
+ if (!this.portal)
45
+ return;
46
+ const isLastPortal = this.lastAddedPortal === this.portal;
47
+ if (!isLastPortal)
48
+ return;
49
+ const path = event.composedPath();
50
+ const isInsidePortal = path.some(el => el === this.host);
51
+ const isOnAnchor = this.anchor && path.some(el => el === this.anchor);
52
+ if (!isInsidePortal && !isOnAnchor) {
53
+ event.stopPropagation();
54
+ event.preventDefault();
55
+ this.close.emit();
56
+ this.closePortal();
57
+ }
58
+ }
43
59
  handleKeyDown(event) {
44
60
  const isLastPortal = this.lastAddedPortal === this.portal;
45
61
  if (!isLastPortal)
@@ -261,7 +277,7 @@ export class KritzelPortal {
261
277
  this.portal.style.visibility = 'visible';
262
278
  }
263
279
  render() {
264
- return (h(Host, { key: '6acf9d402aa0ee151d93b912fc2b9d46cfe88d07', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: 'dbeff1735d422e818179346f5880555fbadddba9' })));
280
+ return (h(Host, { key: 'dcd8e6f3787c713012aeb6436bf63f2f4930c39e', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '830f51521a77f0a28471026494323e14ab4f9f9a' })));
265
281
  }
266
282
  static get is() { return "kritzel-portal"; }
267
283
  static get encapsulation() { return "shadow"; }
@@ -387,6 +403,12 @@ export class KritzelPortal {
387
403
  "target": "window",
388
404
  "capture": false,
389
405
  "passive": false
406
+ }, {
407
+ "name": "pointerdown",
408
+ "method": "handleOutsidePointerDown",
409
+ "target": "document",
410
+ "capture": true,
411
+ "passive": false
390
412
  }, {
391
413
  "name": "keydown",
392
414
  "method": "handleKeyDown",
@@ -66,10 +66,7 @@ export class KritzelControls {
66
66
  }
67
67
  handleDisplayValuesChange = (event) => {
68
68
  const newVal = event.detail;
69
- if (this.displayValues &&
70
- this.displayValues.color === newVal.color &&
71
- this.displayValues.size === newVal.size &&
72
- this.displayValues.fontFamily === newVal.fontFamily) {
69
+ if (this.displayValues && this.displayValues.color === newVal.color && this.displayValues.size === newVal.size && this.displayValues.fontFamily === newVal.fontFamily) {
73
70
  return;
74
71
  }
75
72
  this.displayValues = newVal;
@@ -201,13 +198,13 @@ export class KritzelControls {
201
198
  // Separate tool controls from config control
202
199
  const toolControls = this.controls.filter(c => c.type === 'tool' || c.type === 'separator');
203
200
  const configControl = this.controls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
204
- return (h(Host, { key: 'ea5e17d6995c228862b6d3375213b8f4ff05f04b', class: {
201
+ return (h(Host, { key: '93d08a3268edb67fc4cccb291b6e0aff6cf5a4bd', class: {
205
202
  mobile: this.isTouchDevice,
206
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '3296551d078f9d358efff1438fdcf723349fa5e1', style: {
203
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '8862ea7e524b3e23d87ffea2929e04df7231bb0c', style: {
207
204
  position: 'absolute',
208
205
  bottom: '56px',
209
206
  left: '12px',
210
- }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '9cbea189d5875cda4f09dc7228345e0cb268d47d', class: "kritzel-controls" }, h("div", { key: '0df655a7ac5bd6bc164b82703bc212b480058ba2', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'bc16b645b6c6a12ec6bd8420a8d84aee83d2b6d2', class: "kritzel-tools-scroll", ref: el => this.toolsScrollRef = el, onScroll: this.handleToolsScroll }, toolControls.map(control => {
207
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '2ea2a41ba4cda77f5abde9231d293da181a2a568', class: "kritzel-controls" }, h("div", { key: '6bd4f6d930a0a51d5549b6dbae1e7be14cbe7822', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'c712ca502a4ebd244394158b39391a49839bc386', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
211
208
  // Check if this control has sub-options (split-button)
212
209
  if (control.subOptions?.length) {
213
210
  const selectedSubOption = this.getSelectedSubOption(control);
@@ -237,10 +234,10 @@ export class KritzelControls {
237
234
  'kritzel-control': true,
238
235
  'selected': this.activeControl?.name === control?.name,
239
236
  }, key: control.name, "data-testid": `tool-${control.name}`, onClick: _event => this.handleControlClick?.(control) }, h("kritzel-icon", { name: control.icon })));
240
- })), h("div", { key: '2e0824a991997d52168a3d922c2214ed66f5bf57', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
237
+ })), h("div", { key: '6ca260915b2880443a324855a1de96d10affd256', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
241
238
  'kritzel-config-container': true,
242
239
  'visible': hasConfigUI,
243
- }, key: configControl.name }, h("div", { key: 'd2cb554f56ce0f3bfe72e85fcbb506199387c15f', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '39412859a99c71b536e0b2ed0045b671a975af7e', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: '1977ceddd337df53e8636e2bddd1d928aca3a1ff', tool: this.activeControl.tool, theme: this.theme, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: '06bd3bf3558931a0c2317e149d8990f42e77adae', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
240
+ }, key: configControl.name }, h("div", { key: '984d30bd7f508d2fc56a9e81692fdf05dfb852c9', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '90c59995d229c606b9bf3b625f6eefc0632371c6', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: 'cdb56f983e1f6840b11d06d166f982a93c07331b', tool: this.activeControl.tool, theme: this.theme, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: 'c79db07dd02995d3ee105e8d7a773f89cd7072a5', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
244
241
  if (el)
245
242
  this.configTriggerRef = el;
246
243
  }, onKeyDown: event => {
@@ -249,7 +246,7 @@ export class KritzelControls {
249
246
  }
250
247
  }, style: {
251
248
  cursor: 'pointer',
252
- } }, this.activeControl.tool instanceof KritzelTextTool && this.displayValues ? (h("div", { class: "font-container" }, h("kritzel-font", { fontFamily: this.displayValues.fontFamily, size: this.displayValues.size, color: this.displayValues.color }))) : this.displayValues && (h("div", { class: "color-container" }, h("kritzel-color", { value: this.displayValues.color, theme: this.theme, size: this.displayValues.size, style: {
249
+ } }, this.displayValues && (h("div", { key: '0573a22c3105076729eb986c98b7e8644392f767', class: "color-container" }, h("kritzel-color", { key: '1e9711c219a5c520873b3206072957f2d406c56c', value: this.displayValues.color, theme: this.theme, size: 18, style: {
253
250
  borderRadius: '50%',
254
251
  border: 'none',
255
252
  } })))))))));
@@ -15,7 +15,7 @@ export class KritzelCurrentUser {
15
15
  this.dialogRef?.open();
16
16
  };
17
17
  render() {
18
- return (h(Host, { key: 'a735cb9f16f4898fde0b52573affa2d270a8f1de' }, h("kritzel-avatar", { key: 'd449a515182718ab4ef3b26b2277696bbc7ab46f', user: this.user, size: this.avatarSize, onClick: this.handleAvatarClick }), h("kritzel-current-user-dialog", { key: '3542f6df43c9924218e344f70bdc398c74a8eae6', ref: el => (this.dialogRef = el), user: this.user })));
18
+ return (h(Host, { key: 'c392caf731f8352fd8e2a95918fe48a2f00dd9e5' }, h("kritzel-avatar", { key: 'b3bdce0efa0c0610aa028303386c643d53bc8300', user: this.user, size: this.avatarSize, onClick: this.handleAvatarClick }), h("kritzel-current-user-dialog", { key: '5e7af1aea468028e091ad8f461e4352cb9f9636b', ref: el => (this.dialogRef = el), user: this.user })));
19
19
  }
20
20
  static get is() { return "kritzel-current-user"; }
21
21
  static get encapsulation() { return "shadow"; }
@@ -21,7 +21,7 @@ export class KritzelCurrentUserDialog {
21
21
  }
22
22
  render() {
23
23
  const displayName = this.getDisplayName();
24
- return (h(Host, { key: '40c1a1bed0ddf02f9835199b5f7d2363e4d1902b' }, h("kritzel-dialog", { key: '8d10cd2dbdec06c0519f5a8f6f0f113d30b978aa', dialogTitle: "Account", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '24d8267d37fde77ce1a26efb84a9eaa3320dd6b7', class: "user-info" }, h("kritzel-avatar", { key: '282153dea220d8aa4a509764e2dcbcf20a6f2682', user: this.user, size: 80 }), displayName && h("div", { key: '3a908e583a8eb0aca4020eb78d76821b82b1c643', class: "user-name" }, displayName), this.user?.email && h("div", { key: '2aadf821b6f91c6bd76f10ff234d94ab8b79dd9c', class: "user-email" }, this.user.email)))));
24
+ return (h(Host, { key: 'e1dd44cdfdbaebfe886fed0d9feba2ef232b6615' }, h("kritzel-dialog", { key: '49dd037cca0741cc949f20d9d44cfd028492dc60', dialogTitle: "Account", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'ddcdfb82cc0c896025559888d475ab5c9ad59b4c', class: "user-info" }, h("kritzel-avatar", { key: '4d164b784cde6787d26ac164c7450c0352e6a7cb', user: this.user, size: 80 }), displayName && h("div", { key: '13ad719d8bd90cd608c78438fccbb38ed1d5e5ba', class: "user-name" }, displayName), this.user?.email && h("div", { key: 'df360afd434293d9c9d5fcf114713e0a6925a78e', class: "user-email" }, this.user.email)))));
25
25
  }
26
26
  static get is() { return "kritzel-current-user-dialog"; }
27
27
  static get encapsulation() { return "shadow"; }
@@ -65,7 +65,7 @@ export class KritzelExport {
65
65
  return (h("div", { class: "export-tab-content" }, h("kritzel-input", { label: "Filename", value: this.exportFilename, placeholder: "Enter filename", suffix: ".json", onValueChange: this.handleFilenameChange })));
66
66
  }
67
67
  render() {
68
- return (h(Host, { key: 'efeea781325e672e3f4c1579a50da1c928dc88b5' }, h("kritzel-dialog", { key: 'c5e60559a3022eec7d13a73b5ec858edb8e7ce1d', isOpen: this.isDialogOpen, dialogTitle: "Export", closable: true, onDialogClose: this.closeDialog }, h("div", { key: '1508001914a22cbb944502be7d33a04128548842', class: "export-content" }, h("kritzel-pill-tabs", { key: '9b0a21140fef986344d98b688729017cb66da493', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport(), h("button", { key: '70021cadab8b2840bbcf66afcd38c28c419facfe', class: "export-primary-button", onClick: this.handleExport }, "Export")))));
68
+ return (h(Host, { key: '5178e66f75b94697c771e2dc6fe7ce317e21cd1a' }, h("kritzel-dialog", { key: '01aae6955be6828945b20e8a8a4d7c49eb92b2e2', isOpen: this.isDialogOpen, dialogTitle: "Export", closable: true, onDialogClose: this.closeDialog }, h("div", { key: '57c6f6de2917fb51201d737c4d0e1877f5671466', class: "export-content" }, h("kritzel-pill-tabs", { key: '800b8c058078ba1bba06b5edbaf370c4fa3c6806', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport(), h("button", { key: '99fb3b3d8dc42fdb47a3110e8403dde4e508e6cd', class: "export-primary-button", onClick: this.handleExport }, "Export")))));
69
69
  }
70
70
  static get is() { return "kritzel-export"; }
71
71
  static get encapsulation() { return "shadow"; }
@@ -44,7 +44,7 @@ export class KritzelLoginDialog {
44
44
  this.dialogClosed.emit();
45
45
  };
46
46
  render() {
47
- return (h(Host, { key: '8cac83db48fef2531f1669c3f601526b1e5cdefa' }, h("kritzel-dialog", { key: '72e0f2eb8e19f3c1081bfd5e1183aa9ed1bc678a', dialogTitle: this.dialogTitle, isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'bb17bcf6f3486000c9056b3983810e016b0f05a3', class: "login-content" }, this.subtitle && (h("p", { key: 'cef17bc6f5078769b8deed6ec1c615a71fe0c611', class: "login-subtitle" }, this.subtitle)), h("div", { key: '8462ef9a62201cb15f8911432ca188cf49bc8a8d', class: "login-providers" }, this.providers.map(provider => (h("button", { key: provider.name, class: {
47
+ return (h(Host, { key: '1a664868b840030a773f61c2a0f4388dfb014675' }, h("kritzel-dialog", { key: '09ece6fb5949fc8b204f29cd931c583e525590e1', dialogTitle: this.dialogTitle, isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '57218d7762734929691b82700c31922f5a4991c8', class: "login-content" }, this.subtitle && (h("p", { key: '9ee071786f393857cd6a666e395526a139359d60', class: "login-subtitle" }, this.subtitle)), h("div", { key: 'a487687345aabcfb55976437ddc85feb464f0cae', class: "login-providers" }, this.providers.map(provider => (h("button", { key: provider.name, class: {
48
48
  'provider-button': true,
49
49
  'is-loading': this.loadingProvider === provider.name,
50
50
  'is-disabled': this.loadingProvider !== null && this.loadingProvider !== provider.name,
@@ -55,7 +55,7 @@ export class KritzelMoreMenu {
55
55
  this.closeMenu();
56
56
  };
57
57
  render() {
58
- return (h(Host, { key: '1bf8b30bc9c958911e544121db01d74948fb2695', class: { mobile: this.isTouchDevice } }, h("div", { key: '3aab8140694f15db066f7c46f243ebc29fb698c1', class: { 'more-menu-wrapper': true, visible: this.visible } }, h("button", { key: '55799f62f7bf72af751362315d38dc8b226c0950', class: "more-menu-button", onClick: this.toggleMenu }, h("kritzel-icon", { key: 'ee627acfcad95a1a978fb3c46d428181bbcb98c1', name: this.icon, size: this.iconSize })), h("kritzel-portal", { key: 'e4116b6583e34dd915ffb46ee3b7377ea2ff10e8', anchor: this.menuAnchor, offsetY: this.offsetY, onClose: this.closeMenu }, h("kritzel-menu", { key: 'a9f50ddf822b14bad8723c67a202dcaa257b817a', items: this.visibleItems, onItemSelect: this.handleMenuItemSelect })))));
58
+ return (h(Host, { key: '0e12ffc8c72566ec92080e6a19bd1d929795bef9', class: { mobile: this.isTouchDevice } }, h("div", { key: 'cc73b51c5aa39522a7ab7ec23d5c0a2732ed7acc', class: { 'more-menu-wrapper': true, visible: this.visible } }, h("button", { key: 'c35b8c7aa56e5e0e2773fed9fbbbead0b6b01a71', class: "more-menu-button", onClick: this.toggleMenu }, h("kritzel-icon", { key: '8b3261da5a10371a17b2562b71fde48dd0ba8ccd', name: this.icon, size: this.iconSize })), h("kritzel-portal", { key: 'be4a42061f27bbca3d435dec8e4dd25fc78febb0', anchor: this.menuAnchor, offsetY: this.offsetY, onClose: this.closeMenu }, h("kritzel-menu", { key: '763043f4d02819097396ce1baa85f398695e38b5', items: this.visibleItems, onItemSelect: this.handleMenuItemSelect })))));
59
59
  }
60
60
  static get is() { return "kritzel-more-menu"; }
61
61
  static get encapsulation() { return "shadow"; }
@@ -188,7 +188,7 @@ export class KritzelSettings {
188
188
  }
189
189
  }
190
190
  render() {
191
- return (h(Host, { key: '33618317a3d4a60cda4369cde1e694cd13116d0a' }, h("kritzel-dialog", { key: '274de12d633d430628c1ac2f1ac9779596d0d249', isOpen: this.isDialogOpen, dialogTitle: "Settings", size: "large", onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: 'd771531248ec5db38b2d711334c74dde28985f91', items: SETTINGS_CATEGORIES, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
191
+ return (h(Host, { key: '78a4eb80f2a4d9e7ef67d06bb39137dbde3a3301' }, h("kritzel-dialog", { key: '1adf437125186758f75dc085db9a4e0c572fccd9', isOpen: this.isDialogOpen, dialogTitle: "Settings", size: "large", onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: '68ed27f5c9c03589d0444c02ff0524dfcaa053a3', items: SETTINGS_CATEGORIES, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
192
192
  }
193
193
  static get is() { return "kritzel-settings"; }
194
194
  static get encapsulation() { return "shadow"; }
@@ -84,9 +84,9 @@ export class KritzelShareDialog {
84
84
  this.dialogClosed.emit();
85
85
  };
86
86
  render() {
87
- return (h(Host, { key: 'a104c14b2492d97f3ada98c9eaaa845d63074063' }, h("kritzel-dialog", { key: 'ae2155436f9dc7530dadfed5da92b2ae8781c3f5', dialogTitle: "Share Workspace", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'd419303e63e8183fec99ad2743d5d377c6b2b642', class: "share-content" }, h("div", { key: '913ee65831ff47e6d4d4ba2e26426892bc583827', class: "share-section" }, h("div", { key: 'c32d489e5f7891d23d133c1677c6022e9fc365ab', class: "share-row" }, h("div", { key: '1aa00b5578c657c20910bd1af44d166806d2fe3d', class: "share-label-group" }, h("label", { key: '2d00004314e0d1141397ee7af4e7f923e3182ebf', class: "share-label" }, "Link sharing"), h("p", { key: 'c698ba01de2b252cf6453e0d339044d78c0a701e', class: "share-description" }, this.internalIsPublic
87
+ return (h(Host, { key: 'bd58f146337b3eca96ca34408a3d30621f01765a' }, h("kritzel-dialog", { key: 'c152f4ec5739a18b265f9a8b161ec8501c1a053b', dialogTitle: "Share Workspace", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '2810061b1c99e4f4644342453de693e1cddf9a27', class: "share-content" }, h("div", { key: 'bc56de53fd6136c6867018af24019383094cab0d', class: "share-section" }, h("div", { key: '43464ffd61e5a19653cc081e823f01c0eb17e454', class: "share-row" }, h("div", { key: 'ed83ea6684695d09dc6af82b3367fbbff6e4c7e2', class: "share-label-group" }, h("label", { key: 'fe2eaf501dd80ad0b8d83f93a2dcdd18bc093d3b', class: "share-label" }, "Link sharing"), h("p", { key: '738f1a6afc0421380164b9d270920631cefdfd78', class: "share-description" }, this.internalIsPublic
88
88
  ? 'Anyone with the link can access this workspace.'
89
- : 'Link sharing is disabled. Only you can access this workspace.')), h("kritzel-slide-toggle", { key: 'dcc56bf4644c2c56438115b0e9efae7e74ac77d7', checked: this.internalIsPublic, onCheckedChange: this.handleToggleChange, label: "Enable link sharing" }))), this.internalIsPublic && (h("div", { key: '73c72ec32b5fdd74e333594d37aa9601ce274121', class: "share-section" }, h("div", { key: 'f7cf9d1f4c1680ed35c0751df8abf46fbaec2f52', class: "share-url-container" }, h("input", { key: '971c49e294ecf0d95854f54a42b1d45c6bd2c3ae', type: "text", class: "share-url-input", value: this.getShareUrl(), readOnly: true, onClick: (e) => e.target.select() }), h("button", { key: 'ff40fb3e0cc45b5b9d99b0b7f0ff7c3939f7ecb6', class: { 'copy-button': true, 'copy-success': this.copySuccess }, onClick: this.handleCopyUrl, title: this.copySuccess ? 'Copied!' : 'Copy link' }, h("kritzel-icon", { key: 'b299bb0c2a03f5522134f5b3cee5de6cc1d4df5d', name: this.copySuccess ? 'check' : 'copy', size: 18 })))))))));
89
+ : 'Link sharing is disabled. Only you can access this workspace.')), h("kritzel-slide-toggle", { key: '60f0200ea8f9c207cd5ee76f5a86f82707bb724b', checked: this.internalIsPublic, onCheckedChange: this.handleToggleChange, label: "Enable link sharing" }))), this.internalIsPublic && (h("div", { key: '83212a2a996b85996eee119d5535203f77d3c8dd', class: "share-section" }, h("div", { key: '297031b5aef2018f7aa33c32fd0f8c82f1ddb4cb', class: "share-url-container" }, h("input", { key: '467cca4a8c31b75daa82670f64b562730c241f52', type: "text", class: "share-url-input", value: this.getShareUrl(), readOnly: true, onClick: (e) => e.target.select() }), h("button", { key: 'fdc0f490339cb7050fb020cb1e83e51f6374b183', class: { 'copy-button': true, 'copy-success': this.copySuccess }, onClick: this.handleCopyUrl, title: this.copySuccess ? 'Copied!' : 'Copy link' }, h("kritzel-icon", { key: '5ff1a76d7977c75ea7bc8c339bdf515ba102e511', name: this.copySuccess ? 'check' : 'copy', size: 18 })))))))));
90
90
  }
91
91
  static get is() { return "kritzel-share-dialog"; }
92
92
  static get encapsulation() { return "shadow"; }
@@ -17,7 +17,7 @@ export class KritzelUtilityPanel {
17
17
  this.redo.emit();
18
18
  }
19
19
  render() {
20
- return (h(Host, { key: 'b49f6db6c0e574dc8a5a733c749ecda6f24f9d25' }, h("button", { key: 'f65be4fff352b55087f9cb880b9139802b4969e6', class: "utility-button", "data-testid": "utility-undo", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: 'd58906a4f105923237a98fe2e6b16a53dcccc3f6', name: "undo" })), h("button", { key: '2b7cf2235902920d6b18fe76d0ba2d1d70e4b2c8', class: "utility-button", "data-testid": "utility-redo", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: '9588ded274449358024e16e8783d30ef451a3a7c', name: "redo" })), h("div", { key: '6ab6db05e2ec35aa59524c41ccb7b339819c9d14', class: "utility-separator" }), h("button", { key: '0eb06eebbda95cebc4ea932b9ec45b2c06324f80', class: "utility-button", "data-testid": "utility-delete", onClick: () => this.delete.emit() }, h("kritzel-icon", { key: '10b51caad06e0a7489c6ef7155073891edad4b63', name: "delete" }))));
20
+ return (h(Host, { key: 'f800ea5843cf73ae132b56396ad05d664043f789' }, h("button", { key: 'd5dd4dc6e91c106eced7551c02d5f12a915b1d22', class: "utility-button", "data-testid": "utility-undo", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '64ac3c8f118c991b50dc99e70d4b952fc759c958', name: "undo" })), h("button", { key: '97a8d694fd999eb505fdcdb532d4476ce369e60d', class: "utility-button", "data-testid": "utility-redo", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'ba22d5c6b246967b00112dc2efeb26920187d88f', name: "redo" })), h("div", { key: 'a4aa6a3202640742826d2217f2bbae9ebd2b84da', class: "utility-separator" }), h("button", { key: '1de2a896a6a70c22f9fa16a21af10f07f4b0303a', class: "utility-button", "data-testid": "utility-delete", onClick: () => this.delete.emit() }, h("kritzel-icon", { key: '202612645c1a3e8ee7e4cc01a0305d4e673874e4', name: "delete" }))));
21
21
  }
22
22
  static get is() { return "kritzel-utility-panel"; }
23
23
  static get encapsulation() { return "shadow"; }
@@ -3,4 +3,4 @@
3
3
  * This file is auto-generated by the version bump scripts.
4
4
  * Do not modify manually.
5
5
  */
6
- export const KRITZEL_VERSION = '0.2.1';
6
+ export const KRITZEL_VERSION = '0.2.3';
@@ -116,6 +116,15 @@ export const darkTheme = {
116
116
  },
117
117
  engine: {
118
118
  backgroundColor: '#1a1a1a',
119
+ loadingOverlayBackground: 'rgba(26, 26, 26, 0.85)',
120
+ loadingOverlayColor: '#e0e0e0',
121
+ loadingOverlaySpinnerActiveColor: '#e0e0e0',
122
+ loadingOverlaySpinnerColor: '#555555',
123
+ },
124
+ snap: {
125
+ indicatorFill: 'rgba(10, 132, 255, 0.35)',
126
+ indicatorStroke: '#0A84FF',
127
+ lineStroke: 'rgba(255, 255, 255, 0.35)',
119
128
  },
120
129
  fontSize: {
121
130
  hoverBackgroundColor: '#3a3a3a',
@@ -117,6 +117,15 @@ export const lightTheme = {
117
117
  },
118
118
  engine: {
119
119
  backgroundColor: '#ffffff',
120
+ loadingOverlayBackground: 'rgba(255, 255, 255, 0.85)',
121
+ loadingOverlayColor: '#333333',
122
+ loadingOverlaySpinnerActiveColor: '#333333',
123
+ loadingOverlaySpinnerColor: '#cccccc',
124
+ },
125
+ snap: {
126
+ indicatorFill: 'rgba(59, 130, 246, 0.3)',
127
+ indicatorStroke: '#007bff',
128
+ lineStroke: 'rgba(0, 0, 0, 0.2)',
120
129
  },
121
130
  fontSize: {
122
131
  hoverBackgroundColor: '#ebebeb',
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-BWj1eE2b.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,i as KritzelAssetResolver,d as KritzelBrushTool,b as KritzelGroup,a as KritzelImage,e as KritzelLineTool,h as KritzelSelectionTool,c as KritzelShape,g as KritzelShapeTool,K as KritzelText,f as KritzelTextTool,S as ShapeType}from"./p-CVQBfO3r.js";export{a as KritzelLine,K as KritzelPath}from"./p-B2kHVHa_.js";export{A as APP_STATE_MIGRATIONS,I as IndexedDBSyncProvider,d as KritzelAlignment,c as KritzelAnchorManager,b as KritzelCursorHelper,K as KritzelEraserTool,a as KritzelImageTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-B4wyWc66.js";import*as t from"yjs";import{WebsocketProvider as o}from"y-websocket";import{H as n,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-CjazGGq3.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,z=127,p=Number.MAX_SAFE_INTEGER;class E{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const y=()=>new E,k=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 o=e.bufs[i];t.set(o,s),s+=o.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},x=(e,t)=>{for(;t>z;)w(e,128|z&t),t=u(t/128);w(e,z&t)},T=(e,t)=>{x(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,o=((e,t)=>e<t?e:t)(s-i,t.length),n=t.length-o;e.cbuf.set(t.subarray(0,o),i),e.cpos+=o,n>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,n)),e.cbuf.set(t.subarray(o)),e.cpos=n)})(e,t)},j=e=>Error(e),P=j("Unexpected end of array"),v=j("Integer out of Range");class U{constructor(e){this.arr=e,this.pos=0}}const M=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,_(e)),_=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&z)*s,s*=128,i<128)return t;if(t>p)throw v}throw P};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=y();x(t,0),T(t,e),this.channel.postMessage(k(t))}};handleMessage(e){const s=(e=>new U(e))(new Uint8Array(e));switch(_(s)){case 0:const e=M(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=M(s),o=t.encodeStateAsUpdate(this.doc,i);if(o.length>0){const e=y();x(e,0),T(e,o),this.channel.postMessage(k(e))}}}broadcastSync(){const e=y();x(e,2),T(e,t.encodeStateVector(this.doc)),this.channel.postMessage(k(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()}}class O{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",n=s?.roomName||e;this.provider=new o(i,n,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}/${n}`)}static with(e){return{create:(t,s,i)=>{const o=i?{...e,...i}:e;return new O(t,s,o)}}}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 ${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,o=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||$.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())},m=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},d=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:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new n(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,autoConnect:!1,onStatus:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new n(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${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($.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),$.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),$.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),$.sharedWebSocketProvider}static destroySharedWebSocket(){$.sharedWebSocketProvider&&($.sharedWebSocketProvider.destroy(),$.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return $.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const o=i?{...e,...i}:e;return new $(t,s,o)}}}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 H{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new H(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},o=await(this._options.headers?.())??{},n=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(n,e,i,o)).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 o=new FormData;o.append("metadata",JSON.stringify(s)),o.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const n=await fetch(e,{method:"POST",headers:i,body:o});if(!n.ok)throw Error(`[HttpAssetProvider] Upload failed: ${n.status} ${n.statusText}`);return(n.headers.get("content-type")||"").includes("application/json")?await n.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 B{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new B(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",o={...s.headers??{}};let n;if(o["Content-Type"]||o["content-type"]||(o["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),n=t,delete o["Content-Type"],delete o["content-type"]}else n=e;const r=await fetch(s.url,{method:i,headers:o,body:n});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,$ as HocuspocusSyncProvider,H as HttpAssetProvider,B as PresignedAssetProvider,O as WebSocketSyncProvider}
1
+ export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-BWj1eE2b.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,i as KritzelAssetResolver,d as KritzelBrushTool,b as KritzelGroup,a as KritzelImage,e as KritzelLineTool,h as KritzelSelectionTool,c as KritzelShape,g as KritzelShapeTool,K as KritzelText,f as KritzelTextTool,S as ShapeType}from"./p-C1UNiqO2.js";export{a as KritzelLine,K as KritzelPath}from"./p-CsMMZSAP.js";export{A as APP_STATE_MIGRATIONS,I as IndexedDBSyncProvider,d as KritzelAlignment,c as KritzelAnchorManager,b as KritzelCursorHelper,K as KritzelEraserTool,a as KritzelImageTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-Bs7lEBy5.js";import*as t from"yjs";import{WebsocketProvider as o}from"y-websocket";import{H as n,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-C-qyWv4d.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,z=127,p=Number.MAX_SAFE_INTEGER;class E{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const y=()=>new E,k=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 o=e.bufs[i];t.set(o,s),s+=o.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},x=(e,t)=>{for(;t>z;)w(e,128|z&t),t=u(t/128);w(e,z&t)},T=(e,t)=>{x(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,o=((e,t)=>e<t?e:t)(s-i,t.length),n=t.length-o;e.cbuf.set(t.subarray(0,o),i),e.cpos+=o,n>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,n)),e.cbuf.set(t.subarray(o)),e.cpos=n)})(e,t)},j=e=>Error(e),P=j("Unexpected end of array"),v=j("Integer out of Range");class U{constructor(e){this.arr=e,this.pos=0}}const M=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,F(e)),F=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&z)*s,s*=128,i<128)return t;if(t>p)throw v}throw P};class _{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=y();x(t,0),T(t,e),this.channel.postMessage(k(t))}};handleMessage(e){const s=(e=>new U(e))(new Uint8Array(e));switch(F(s)){case 0:const e=M(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=M(s),o=t.encodeStateAsUpdate(this.doc,i);if(o.length>0){const e=y();x(e,0),T(e,o),this.channel.postMessage(k(e))}}}broadcastSync(){const e=y();x(e,2),T(e,t.encodeStateVector(this.doc)),this.channel.postMessage(k(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()}}class O{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",n=s?.roomName||e;this.provider=new o(i,n,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}/${n}`)}static with(e){return{create:(t,s,i)=>{const o=i?{...e,...i}:e;return new O(t,s,o)}}}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 ${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,o=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||$.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())},m=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},d=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:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new n(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,autoConnect:!1,onStatus:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new n(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${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($.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),$.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),$.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),$.sharedWebSocketProvider}static destroySharedWebSocket(){$.sharedWebSocketProvider&&($.sharedWebSocketProvider.destroy(),$.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return $.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const o=i?{...e,...i}:e;return new $(t,s,o)}}}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},o=await(this._options.headers?.())??{},n=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(n,e,i,o)).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 o=new FormData;o.append("metadata",JSON.stringify(s)),o.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const n=await fetch(e,{method:"POST",headers:i,body:o});if(!n.ok)throw Error(`[HttpAssetProvider] Upload failed: ${n.status} ${n.statusText}`);return(n.headers.get("content-type")||"").includes("application/json")?await n.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 H{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new H(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",o={...s.headers??{}};let n;if(o["Content-Type"]||o["content-type"]||(o["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),n=t,delete o["Content-Type"],delete o["content-type"]}else n=e;const r=await fetch(s.url,{method:i,headers:o,body:n});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{_ as BroadcastSyncProvider,$ as HocuspocusSyncProvider,B as HttpAssetProvider,H as PresignedAssetProvider,O as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-DkT0CXfN.js";const p=o,r=s;export{p as KritzelAwarenessCursors,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-Be6E_RMf.js";const p=o,r=s;export{p as KritzelAwarenessCursors,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-C3Dwuqka.js";const a=o,p=s;export{a as KritzelColorPalette,p as defineCustomElement}
1
+ import{K as s,d as o}from"./p-Dg_nGsFe.js";const p=s,r=o;export{p as KritzelColorPalette,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-CekG3_ce.js";const e=o,p=s;export{e as KritzelColor,p as defineCustomElement}
1
+ import{K as s,d as o}from"./p-C2MdRsg6.js";const p=s,r=o;export{p as KritzelColor,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-mDz63oKF.js";const m=o,p=s;export{m as KritzelControls,p as defineCustomElement}
1
+ import{K as e,d as o}from"./p-BeeKeeeo.js";const s=e,p=o;export{s as KritzelControls,p as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-R9M5PnAz.js";const p=o,r=s;export{p as KritzelCurrentUserDialog,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-BDOSy6zd.js";const p=o,r=s;export{p as KritzelCurrentUserDialog,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-Dxb22STM.js";const p=o,r=s;export{p as KritzelCurrentUser,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-DYHF_MSN.js";const p=o,r=s;export{p as KritzelCurrentUser,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-BfJav4Zz.js";const a=o,p=s;export{a as KritzelDialog,p as defineCustomElement}
1
+ import{K as o,d as s}from"./p-0F9_lw6l.js";const p=o,r=s;export{p as KritzelDialog,r as defineCustomElement}