kritzel-stencil 0.1.15 → 0.1.16

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 (70) hide show
  1. package/dist/cjs/{default-line-tool.config-DuwiflC4.js → default-line-tool.config-BXYWjUSM.js} +44 -9
  2. package/dist/cjs/index.cjs.js +1 -1
  3. package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +22 -11
  4. package/dist/collection/classes/core/core.class.js +3 -0
  5. package/dist/collection/classes/managers/cursor.manager.js +2 -2
  6. package/dist/collection/classes/objects/base-object.class.js +7 -0
  7. package/dist/collection/classes/objects/path.class.js +32 -0
  8. package/dist/collection/classes/registries/icon-registry.class.js +1 -1
  9. package/dist/collection/classes/tools/text-tool.class.js +4 -6
  10. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +11 -5
  11. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.js +4 -2
  12. package/dist/collection/constants/version.js +1 -1
  13. package/dist/collection/themes/dark-theme.js +0 -1
  14. package/dist/collection/themes/light-theme.js +0 -1
  15. package/dist/components/index.js +1 -1
  16. package/dist/components/kritzel-back-to-content.js +1 -1
  17. package/dist/components/kritzel-brush-style.js +1 -1
  18. package/dist/components/kritzel-color-palette.js +1 -1
  19. package/dist/components/kritzel-color.js +1 -1
  20. package/dist/components/kritzel-context-menu.js +1 -1
  21. package/dist/components/kritzel-controls.js +1 -1
  22. package/dist/components/kritzel-editor.js +1 -1
  23. package/dist/components/kritzel-engine.js +1 -1
  24. package/dist/components/kritzel-export.js +1 -1
  25. package/dist/components/kritzel-icon.js +1 -1
  26. package/dist/components/kritzel-master-detail.js +1 -1
  27. package/dist/components/kritzel-menu-item.js +1 -1
  28. package/dist/components/kritzel-menu.js +1 -1
  29. package/dist/components/kritzel-more-menu.js +1 -1
  30. package/dist/components/kritzel-settings.js +1 -1
  31. package/dist/components/kritzel-split-button.js +1 -1
  32. package/dist/components/kritzel-stroke-size.js +1 -1
  33. package/dist/components/kritzel-tool-config.js +1 -1
  34. package/dist/components/kritzel-utility-panel.js +1 -1
  35. package/dist/components/kritzel-workspace-manager.js +1 -1
  36. package/dist/components/{p-hIj0tNZB.js → p-BGwkUUZk.js} +1 -1
  37. package/dist/components/p-BrAnZtQA.js +1 -0
  38. package/dist/components/{p-CYPjUjdI.js → p-Bzv0vavh.js} +1 -1
  39. package/dist/components/{p-BXNQ6L9k.js → p-C9HB5kJ3.js} +1 -1
  40. package/dist/components/{p-C5flBv2m.js → p-C__BfmIJ.js} +1 -1
  41. package/dist/components/p-Cpb-fnoO.js +1 -0
  42. package/dist/components/p-Cuf-GvO0.js +1 -0
  43. package/dist/components/{p-CIAs81AV.js → p-DKNtjoqf.js} +1 -1
  44. package/dist/components/{p-Dme4j-Ei.js → p-DgZY07rl.js} +1 -1
  45. package/dist/components/{p-BMYSfzzJ.js → p-DoE6WkDw.js} +1 -1
  46. package/dist/components/{p-et8QBqmj.js → p-GeVIjnFi.js} +1 -1
  47. package/dist/components/p-UNc_oph8.js +1 -0
  48. package/dist/components/{p-NBmc8spY.js → p-bE-Bpn0g.js} +2 -2
  49. package/dist/components/{p-B5R3r6_m.js → p-dQFQsn5l.js} +1 -1
  50. package/dist/components/{p-Cz1aTJ3F.js → p-dYHgrz6o.js} +1 -1
  51. package/dist/components/{p-ki9PrPGQ.js → p-hmtjxvkm.js} +1 -1
  52. package/dist/components/{p-BbfgUPVl.js → p-ltqCvPCv.js} +1 -1
  53. package/dist/components/{p-DRXq8ybi.js → p-y6zswJUQ.js} +1 -1
  54. package/dist/components/{p-CinNuTeF.js → p-yWjTje8m.js} +1 -1
  55. package/dist/esm/{default-line-tool.config-CuDRR6We.js → default-line-tool.config-BKFxgp0p.js} +44 -9
  56. package/dist/esm/index.js +2 -2
  57. package/dist/esm/kritzel-back-to-content_32.entry.js +22 -11
  58. package/dist/stencil/index.esm.js +1 -1
  59. package/dist/stencil/p-BKFxgp0p.js +1 -0
  60. package/dist/stencil/{p-781f1927.entry.js → p-afc040bc.entry.js} +2 -2
  61. package/dist/stencil/stencil.esm.js +1 -1
  62. package/dist/types/classes/objects/base-object.class.d.ts +5 -0
  63. package/dist/types/classes/objects/path.class.d.ts +6 -0
  64. package/dist/types/constants/version.d.ts +1 -1
  65. package/package.json +1 -1
  66. package/dist/components/p-BqZdHh6f.js +0 -1
  67. package/dist/components/p-D9GoermT.js +0 -1
  68. package/dist/components/p-DBmK9l5y.js +0 -1
  69. package/dist/components/p-DPPpa9So.js +0 -1
  70. package/dist/stencil/p-CuDRR6We.js +0 -1
@@ -397,6 +397,13 @@ class KritzelBaseObject {
397
397
  edit(_event) {
398
398
  // This method can be overridden by subclasses to handle edit actions.
399
399
  }
400
+ /**
401
+ * Called after properties are updated via updateObject.
402
+ * Override in subclasses to perform custom logic when specific properties change.
403
+ */
404
+ onAfterUpdate(_changedProperties) {
405
+ // Default implementation does nothing
406
+ }
400
407
  hitTest(_x, _y) {
401
408
  return true; // Default implementation, can be overridden by subclasses
402
409
  }
@@ -14089,7 +14096,6 @@ const lightTheme = {
14089
14096
  dividerColor: '#e0e0e0',
14090
14097
  focusColor: '#007acc',
14091
14098
  focusRingColor: 'rgba(0, 122, 255, 0.3)',
14092
- pointerCursor: 'pointer',
14093
14099
  hoverBackground: 'hsl(0, 0%, 0%, 4.3%)',
14094
14100
  iconColor: 'currentColor',
14095
14101
  scrollbarThumbColor: '#ebebeb',
@@ -14323,7 +14329,6 @@ const darkTheme = {
14323
14329
  dividerColor: '#3a3a3a',
14324
14330
  focusColor: '#4da3ff',
14325
14331
  focusRingColor: 'rgba(0, 122, 255, 0.4)',
14326
- pointerCursor: 'pointer',
14327
14332
  hoverBackground: 'hsl(0, 0%, 100%, 8%)',
14328
14333
  iconColor: 'currentColor',
14329
14334
  scrollbarThumbColor: '#555555',
@@ -15101,6 +15106,12 @@ class KritzelPath extends KritzelBaseObject {
15101
15106
  const scaleY = height / this.height;
15102
15107
  this.width = width;
15103
15108
  this.height = height;
15109
+ if (this.points.length === 1) {
15110
+ const p = this.points[0];
15111
+ const spreadX = Math.max(0, width - this.strokeWidth) / scaleX;
15112
+ const spreadY = Math.max(0, height - this.strokeWidth) / scaleY;
15113
+ this.points.push([p[0] + spreadX, p[1] + spreadY]);
15114
+ }
15104
15115
  this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);
15105
15116
  this.d = this.generateSvgPath();
15106
15117
  this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;
@@ -15201,6 +15212,13 @@ class KritzelPath extends KritzelBaseObject {
15201
15212
  this._adjustedPoints = null;
15202
15213
  this._core.store.state.objects.update(this);
15203
15214
  }
15215
+ onAfterUpdate(changedProperties) {
15216
+ if (changedProperties.includes('strokeWidth')) {
15217
+ this.d = this.generateSvgPath();
15218
+ this.updateBoundingBox();
15219
+ this._adjustedPoints = null;
15220
+ }
15221
+ }
15204
15222
  computeAdjustedPoints() {
15205
15223
  if (!this.points?.length) {
15206
15224
  return [];
@@ -15268,6 +15286,25 @@ class KritzelPath extends KritzelBaseObject {
15268
15286
  this.translateX = (this.x + this.translateX) / this.scale;
15269
15287
  this.translateY = (this.y + this.translateY) / this.scale;
15270
15288
  }
15289
+ /**
15290
+ * Updates width, height, x, y based on current points and strokeWidth.
15291
+ * Does NOT modify translateX/translateY (use updateDimensions for initial setup).
15292
+ */
15293
+ updateBoundingBox() {
15294
+ const rotatedPoints = this.points.map(([x, y]) => {
15295
+ const rotatedX = x * Math.cos(this.rotation) - y * Math.sin(this.rotation);
15296
+ const rotatedY = x * Math.sin(this.rotation) + y * Math.cos(this.rotation);
15297
+ return [rotatedX, rotatedY];
15298
+ });
15299
+ const minX = Math.min(...rotatedPoints.map(p => p[0] - this.strokeWidth / 2));
15300
+ const minY = Math.min(...rotatedPoints.map(p => p[1] - this.strokeWidth / 2));
15301
+ const maxX = Math.max(...rotatedPoints.map(p => p[0] + this.strokeWidth / 2));
15302
+ const maxY = Math.max(...rotatedPoints.map(p => p[1] + this.strokeWidth / 2));
15303
+ this.width = maxX - minX + this.lineSlack;
15304
+ this.height = maxY - minY + this.lineSlack;
15305
+ this.x = minX;
15306
+ this.y = minY;
15307
+ }
15271
15308
  generateSvgPath() {
15272
15309
  const stroke = this.getStrokeFromPoints(this.points, this.strokeWidth);
15273
15310
  return this.getSvgPathFromStroke(stroke);
@@ -17454,12 +17491,11 @@ class KritzelTextTool extends KritzelBaseTool {
17454
17491
  const clientY = event.clientY - this._core.store.offsetY;
17455
17492
  const viewportScale = this._core.store.state.scale;
17456
17493
  const lockScale = this._core.store.state.lockDrawingScale;
17457
- const divider = lockScale ? viewportScale : 1;
17458
17494
  const text = KritzelText.create(this._core, this.fontSize, this.fontFamily, lockScale ? 1 : viewportScale);
17459
17495
  text.fontColor = this.fontColor;
17460
17496
  text.opacity = this.opacity;
17461
- text.translateX = (clientX - this._core.store.state.translateX) / divider;
17462
- text.translateY = (clientY - this._core.store.state.translateY) / divider;
17497
+ text.translateX = (clientX - this._core.store.state.translateX) / viewportScale;
17498
+ text.translateY = (clientY - this._core.store.state.translateY) / viewportScale;
17463
17499
  text.zIndex = this._core.store.currentZIndex;
17464
17500
  this._core.store.state.objects.insert(text);
17465
17501
  this._core.rerender();
@@ -17492,12 +17528,11 @@ class KritzelTextTool extends KritzelBaseTool {
17492
17528
  const clientY = Math.round(activePointers[0].clientY - this._core.store.offsetY);
17493
17529
  const viewportScale = this._core.store.state.scale;
17494
17530
  const lockScale = this._core.store.state.lockDrawingScale;
17495
- const divider = lockScale ? viewportScale : 1;
17496
17531
  const text = KritzelText.create(this._core, this.fontSize, this.fontFamily, lockScale ? 1 : viewportScale);
17497
17532
  text.fontColor = this.fontColor;
17498
17533
  text.opacity = this.opacity;
17499
- text.translateX = (clientX - this._core.store.state.translateX) / divider;
17500
- text.translateY = (clientY - this._core.store.state.translateY) / divider;
17534
+ text.translateX = (clientX - this._core.store.state.translateX) / viewportScale;
17535
+ text.translateY = (clientY - this._core.store.state.translateY) / viewportScale;
17501
17536
  text.zIndex = this._core.store.currentZIndex;
17502
17537
  this._core.store.state.objects.insert(text);
17503
17538
  this._core.rerender();
@@ -17548,7 +17583,7 @@ KritzelIconRegistry.registerIcons({
17548
17583
  'image': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>',
17549
17584
  'chevron-down': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',
17550
17585
  'chevron-up': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m18 15-6-6-6 6"/></svg>',
17551
- 'chevron-left': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left-icon lucide-chevron-left"><path d="m15 18-6-6 6-6"/></svg>',
17586
+ 'chevron-left': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left-icon lucide-chevron-left"><path d="m15 18-6-6 6-6"/></svg>',
17552
17587
  'chevron-right': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right-icon lucide-chevron-right"><path d="m9 18 6-6-6-6"/></svg>',
17553
17588
  'chevrons-left': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-left-icon lucide-chevrons-left"><path d="m11 17-5-5 5-5"/><path d="m18 17-5-5 5-5"/></svg>',
17554
17589
  'copy': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy-icon lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>',
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var defaultLineTool_config = require('./default-line-tool.config-DuwiflC4.js');
3
+ var defaultLineTool_config = require('./default-line-tool.config-BXYWjUSM.js');
4
4
 
5
5
  /**
6
6
  * BroadcastChannel sync provider for cross-tab synchronization
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-i21-qqbc.js');
4
- var defaultLineTool_config = require('./default-line-tool.config-DuwiflC4.js');
4
+ var defaultLineTool_config = require('./default-line-tool.config-BXYWjUSM.js');
5
5
 
6
6
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
7
7
 
@@ -20209,12 +20209,12 @@ class KritzelCursorManager {
20209
20209
  // Reset cursor on old target
20210
20210
  if (this._targetElement) {
20211
20211
  this._targetElement.style.cursor = '';
20212
- this._targetElement.style.removeProperty('--kritzel-pointer-cursor');
20212
+ this._targetElement.style.removeProperty('--kritzel-global-pointer-cursor');
20213
20213
  }
20214
20214
  this._targetElement = element;
20215
20215
  // Set the pointer cursor CSS variable for child components to use
20216
20216
  if (this._targetElement) {
20217
- this._targetElement.style.setProperty('--kritzel-pointer-cursor', defaultLineTool_config.KritzelCursorHelper.getPointerCursor());
20217
+ this._targetElement.style.setProperty('--kritzel-global-pointer-cursor', defaultLineTool_config.KritzelCursorHelper.getPointerCursor());
20218
20218
  }
20219
20219
  }
20220
20220
  /**
@@ -20525,11 +20525,14 @@ class KritzelCore {
20525
20525
  this._store.state.objects.remove(o => o.id === object.id);
20526
20526
  }
20527
20527
  updateObject(object, updatedProperties) {
20528
+ const changedKeys = [];
20528
20529
  for (const key in updatedProperties) {
20529
20530
  if (updatedProperties.hasOwnProperty(key)) {
20530
20531
  object[key] = updatedProperties[key];
20532
+ changedKeys.push(key);
20531
20533
  }
20532
20534
  }
20535
+ object.onAfterUpdate(changedKeys);
20533
20536
  this._store.state.objects.update(object);
20534
20537
  }
20535
20538
  addSelectionGroup(selectionGroup) {
@@ -22586,8 +22589,10 @@ const KritzelEngine = class {
22586
22589
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
22587
22590
  strokeLinecap: 'round',
22588
22591
  fill: 'none',
22589
- } })), !this.isSelecting && (index.h("g", { class: "selection-line-handles", style: { pointerEvents: 'auto' } }, index.h("circle", { class: "selection-line-handle start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
22592
+ } })), !this.isSelecting && (index.h("g", { class: "selection-line-handles", style: { pointerEvents: 'auto' } }, index.h("circle", { class: "selection-line-handle start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
22590
22593
  fill: 'var(--kritzel-selection-handle-color, #000000)',
22594
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
22595
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
22591
22596
  paintOrder: 'fill',
22592
22597
  } }), index.h("circle", { class: "selection-line-handle-overlay start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
22593
22598
  fill: 'transparent',
@@ -22596,8 +22601,10 @@ const KritzelEngine = class {
22596
22601
  ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x
22597
22602
  : (object.startX - object.x + object.endX - object.x) / 2, cy: object.controlY !== undefined
22598
22603
  ? (object.startY + 2 * object.controlY + object.endY) / 4 - object.y
22599
- : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
22604
+ : (object.startY - object.y + object.endY - object.y) / 2, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
22600
22605
  fill: 'var(--kritzel-selection-handle-color, #000000)',
22606
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
22607
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
22601
22608
  paintOrder: 'fill',
22602
22609
  } }), index.h("circle", { class: "selection-line-handle-overlay center", cx: object.controlX !== undefined
22603
22610
  ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x
@@ -22606,8 +22613,10 @@ const KritzelEngine = class {
22606
22613
  : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
22607
22614
  fill: 'transparent',
22608
22615
  paintOrder: 'fill',
22609
- } }), index.h("circle", { class: "selection-line-handle end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
22616
+ } }), index.h("circle", { class: "selection-line-handle end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
22610
22617
  fill: 'var(--kritzel-selection-handle-color, #000000)',
22618
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
22619
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
22611
22620
  paintOrder: 'fill',
22612
22621
  } }), index.h("circle", { class: "selection-line-handle-overlay end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
22613
22622
  fill: 'transparent',
@@ -22686,7 +22695,7 @@ const KritzelEngine = class {
22686
22695
  stroke: 'var(--kritzel-snap-indicator-stroke, #007bff)',
22687
22696
  strokeWidth: data.indicatorStrokeWidth,
22688
22697
  } }))));
22689
- })()), this.core.store.state.isContextMenuVisible && (index.h("kritzel-context-menu", { key: '951133ef09893b3ab59a27ad0e4bc6c0d371ef28', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
22698
+ })()), this.core.store.state.isContextMenuVisible && (index.h("kritzel-context-menu", { key: 'a2860f9b1ccfa0183324939b7c11987e6aaaa168', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
22690
22699
  position: 'fixed',
22691
22700
  left: `${this.core.store.state.contextMenuX}px`,
22692
22701
  top: `${this.core.store.state.contextMenuY}px`,
@@ -22697,7 +22706,7 @@ const KritzelEngine = class {
22697
22706
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
22698
22707
  }, this.core.store.selectionGroup?.objects);
22699
22708
  this.hideContextMenu();
22700
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof defaultLineTool_config.KritzelEraserTool && !this.core.store.state.isScaling && index.h("kritzel-cursor-trail", { key: 'aa44b379924d80b8e3413e240a7b3f184a332875', core: this.core })));
22709
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof defaultLineTool_config.KritzelEraserTool && !this.core.store.state.isScaling && index.h("kritzel-cursor-trail", { key: '20dc66627a01cb9840807b3fe9d96be8599a48f8', core: this.core })));
22701
22710
  }
22702
22711
  static get watchers() { return {
22703
22712
  "workspace": [{
@@ -23708,7 +23717,7 @@ const KritzelPortal = class {
23708
23717
  * This file is auto-generated by the version bump scripts.
23709
23718
  * Do not modify manually.
23710
23719
  */
23711
- const KRITZEL_VERSION = '0.1.15';
23720
+ const KRITZEL_VERSION = '0.1.16';
23712
23721
 
23713
23722
  const kritzelSettingsCss = () => `:host{display:contents}kritzel-dialog{--kritzel-dialog-body-padding:0;--kritzel-dialog-width-large:800px;--kritzel-dialog-height-large:500px}.footer-button{padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px}.cancel-button{border:1px solid #ebebeb;background:#fff;color:inherit}.cancel-button:hover{background:#f5f5f5}.settings-content{padding:0}.settings-content h3{margin:0 0 16px 0;font-size:18px;font-weight:600;color:var(--kritzel-settings-content-heading-color, #333333)}.settings-content p{margin:0;font-size:14px;color:var(--kritzel-settings-content-text-color, #666666);line-height:1.5}.settings-group{display:flex;flex-direction:column;gap:24px}.settings-item{display:flex;flex-direction:column;gap:8px}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.settings-label{font-size:14px;font-weight:500;color:var(--kritzel-settings-label-color, #333333);margin:0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}`;
23714
23723
 
@@ -24123,7 +24132,7 @@ const KritzelToolConfig = class {
24123
24132
  handlePropertyChange = (propertyName, value) => {
24124
24133
  // Special handling for shape fill
24125
24134
  if ((this.config.type === 'shape' || this.config.type === 'selection') && propertyName === 'fillColor') {
24126
- const newFillColor = value === 'filled' ? this.tool[this.config.colorProperty] : 'transparent';
24135
+ const newFillColor = value === 'filled' ? this.tool[this.config.colorProperty] : { light: 'transparent', dark: 'transparent' };
24127
24136
  this.tool.fillColor = newFillColor;
24128
24137
  // When switching to fill mode, also update stroke color to match
24129
24138
  if (value === 'filled') {
@@ -24142,7 +24151,9 @@ const KritzelToolConfig = class {
24142
24151
  };
24143
24152
  getShapeFillValue() {
24144
24153
  const fillColor = this.tool.fillColor;
24145
- return fillColor === 'transparent' ? 'transparent' : 'filled';
24154
+ const isTransparent = typeof fillColor === 'string' ? fillColor === 'transparent' :
24155
+ (fillColor.light === 'transparent' && fillColor.dark === 'transparent');
24156
+ return isTransparent ? 'transparent' : 'filled';
24146
24157
  }
24147
24158
  renderControl(control) {
24148
24159
  const value = this.tool[control.propertyName];
@@ -232,11 +232,14 @@ export class KritzelCore {
232
232
  this._store.state.objects.remove(o => o.id === object.id);
233
233
  }
234
234
  updateObject(object, updatedProperties) {
235
+ const changedKeys = [];
235
236
  for (const key in updatedProperties) {
236
237
  if (updatedProperties.hasOwnProperty(key)) {
237
238
  object[key] = updatedProperties[key];
239
+ changedKeys.push(key);
238
240
  }
239
241
  }
242
+ object.onAfterUpdate(changedKeys);
240
243
  this._store.state.objects.update(object);
241
244
  }
242
245
  addSelectionGroup(selectionGroup) {
@@ -18,12 +18,12 @@ export class KritzelCursorManager {
18
18
  // Reset cursor on old target
19
19
  if (this._targetElement) {
20
20
  this._targetElement.style.cursor = '';
21
- this._targetElement.style.removeProperty('--kritzel-pointer-cursor');
21
+ this._targetElement.style.removeProperty('--kritzel-global-pointer-cursor');
22
22
  }
23
23
  this._targetElement = element;
24
24
  // Set the pointer cursor CSS variable for child components to use
25
25
  if (this._targetElement) {
26
- this._targetElement.style.setProperty('--kritzel-pointer-cursor', KritzelCursorHelper.getPointerCursor());
26
+ this._targetElement.style.setProperty('--kritzel-global-pointer-cursor', KritzelCursorHelper.getPointerCursor());
27
27
  }
28
28
  }
29
29
  /**
@@ -218,6 +218,13 @@ export class KritzelBaseObject {
218
218
  edit(_event) {
219
219
  // This method can be overridden by subclasses to handle edit actions.
220
220
  }
221
+ /**
222
+ * Called after properties are updated via updateObject.
223
+ * Override in subclasses to perform custom logic when specific properties change.
224
+ */
225
+ onAfterUpdate(_changedProperties) {
226
+ // Default implementation does nothing
227
+ }
221
228
  hitTest(_x, _y) {
222
229
  return true; // Default implementation, can be overridden by subclasses
223
230
  }
@@ -61,6 +61,12 @@ export class KritzelPath extends KritzelBaseObject {
61
61
  const scaleY = height / this.height;
62
62
  this.width = width;
63
63
  this.height = height;
64
+ if (this.points.length === 1) {
65
+ const p = this.points[0];
66
+ const spreadX = Math.max(0, width - this.strokeWidth) / scaleX;
67
+ const spreadY = Math.max(0, height - this.strokeWidth) / scaleY;
68
+ this.points.push([p[0] + spreadX, p[1] + spreadY]);
69
+ }
64
70
  this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);
65
71
  this.d = this.generateSvgPath();
66
72
  this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;
@@ -161,6 +167,13 @@ export class KritzelPath extends KritzelBaseObject {
161
167
  this._adjustedPoints = null;
162
168
  this._core.store.state.objects.update(this);
163
169
  }
170
+ onAfterUpdate(changedProperties) {
171
+ if (changedProperties.includes('strokeWidth')) {
172
+ this.d = this.generateSvgPath();
173
+ this.updateBoundingBox();
174
+ this._adjustedPoints = null;
175
+ }
176
+ }
164
177
  computeAdjustedPoints() {
165
178
  if (!this.points?.length) {
166
179
  return [];
@@ -228,6 +241,25 @@ export class KritzelPath extends KritzelBaseObject {
228
241
  this.translateX = (this.x + this.translateX) / this.scale;
229
242
  this.translateY = (this.y + this.translateY) / this.scale;
230
243
  }
244
+ /**
245
+ * Updates width, height, x, y based on current points and strokeWidth.
246
+ * Does NOT modify translateX/translateY (use updateDimensions for initial setup).
247
+ */
248
+ updateBoundingBox() {
249
+ const rotatedPoints = this.points.map(([x, y]) => {
250
+ const rotatedX = x * Math.cos(this.rotation) - y * Math.sin(this.rotation);
251
+ const rotatedY = x * Math.sin(this.rotation) + y * Math.cos(this.rotation);
252
+ return [rotatedX, rotatedY];
253
+ });
254
+ const minX = Math.min(...rotatedPoints.map(p => p[0] - this.strokeWidth / 2));
255
+ const minY = Math.min(...rotatedPoints.map(p => p[1] - this.strokeWidth / 2));
256
+ const maxX = Math.max(...rotatedPoints.map(p => p[0] + this.strokeWidth / 2));
257
+ const maxY = Math.max(...rotatedPoints.map(p => p[1] + this.strokeWidth / 2));
258
+ this.width = maxX - minX + this.lineSlack;
259
+ this.height = maxY - minY + this.lineSlack;
260
+ this.x = minX;
261
+ this.y = minY;
262
+ }
231
263
  generateSvgPath() {
232
264
  const stroke = this.getStrokeFromPoints(this.points, this.strokeWidth);
233
265
  return this.getSvgPathFromStroke(stroke);
@@ -34,7 +34,7 @@ KritzelIconRegistry.registerIcons({
34
34
  'image': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>',
35
35
  'chevron-down': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',
36
36
  'chevron-up': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m18 15-6-6-6 6"/></svg>',
37
- 'chevron-left': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left-icon lucide-chevron-left"><path d="m15 18-6-6 6-6"/></svg>',
37
+ 'chevron-left': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left-icon lucide-chevron-left"><path d="m15 18-6-6 6-6"/></svg>',
38
38
  'chevron-right': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right-icon lucide-chevron-right"><path d="m9 18 6-6-6-6"/></svg>',
39
39
  'chevrons-left': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-left-icon lucide-chevrons-left"><path d="m11 17-5-5 5-5"/><path d="m18 17-5-5 5-5"/></svg>',
40
40
  'copy': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy-icon lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>',
@@ -42,12 +42,11 @@ export class KritzelTextTool extends KritzelBaseTool {
42
42
  const clientY = event.clientY - this._core.store.offsetY;
43
43
  const viewportScale = this._core.store.state.scale;
44
44
  const lockScale = this._core.store.state.lockDrawingScale;
45
- const divider = lockScale ? viewportScale : 1;
46
45
  const text = KritzelText.create(this._core, this.fontSize, this.fontFamily, lockScale ? 1 : viewportScale);
47
46
  text.fontColor = this.fontColor;
48
47
  text.opacity = this.opacity;
49
- text.translateX = (clientX - this._core.store.state.translateX) / divider;
50
- text.translateY = (clientY - this._core.store.state.translateY) / divider;
48
+ text.translateX = (clientX - this._core.store.state.translateX) / viewportScale;
49
+ text.translateY = (clientY - this._core.store.state.translateY) / viewportScale;
51
50
  text.zIndex = this._core.store.currentZIndex;
52
51
  this._core.store.state.objects.insert(text);
53
52
  this._core.rerender();
@@ -80,12 +79,11 @@ export class KritzelTextTool extends KritzelBaseTool {
80
79
  const clientY = Math.round(activePointers[0].clientY - this._core.store.offsetY);
81
80
  const viewportScale = this._core.store.state.scale;
82
81
  const lockScale = this._core.store.state.lockDrawingScale;
83
- const divider = lockScale ? viewportScale : 1;
84
82
  const text = KritzelText.create(this._core, this.fontSize, this.fontFamily, lockScale ? 1 : viewportScale);
85
83
  text.fontColor = this.fontColor;
86
84
  text.opacity = this.opacity;
87
- text.translateX = (clientX - this._core.store.state.translateX) / divider;
88
- text.translateY = (clientY - this._core.store.state.translateY) / divider;
85
+ text.translateX = (clientX - this._core.store.state.translateX) / viewportScale;
86
+ text.translateY = (clientY - this._core.store.state.translateY) / viewportScale;
89
87
  text.zIndex = this._core.store.currentZIndex;
90
88
  this._core.store.state.objects.insert(text);
91
89
  this._core.rerender();
@@ -677,8 +677,10 @@ export class KritzelEngine {
677
677
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
678
678
  strokeLinecap: 'round',
679
679
  fill: 'none',
680
- } })), !this.isSelecting && (h("g", { class: "selection-line-handles", style: { pointerEvents: 'auto' } }, h("circle", { class: "selection-line-handle start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
680
+ } })), !this.isSelecting && (h("g", { class: "selection-line-handles", style: { pointerEvents: 'auto' } }, h("circle", { class: "selection-line-handle start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
681
681
  fill: 'var(--kritzel-selection-handle-color, #000000)',
682
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
683
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
682
684
  paintOrder: 'fill',
683
685
  } }), h("circle", { class: "selection-line-handle-overlay start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
684
686
  fill: 'transparent',
@@ -687,8 +689,10 @@ export class KritzelEngine {
687
689
  ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x
688
690
  : (object.startX - object.x + object.endX - object.x) / 2, cy: object.controlY !== undefined
689
691
  ? (object.startY + 2 * object.controlY + object.endY) / 4 - object.y
690
- : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
692
+ : (object.startY - object.y + object.endY - object.y) / 2, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
691
693
  fill: 'var(--kritzel-selection-handle-color, #000000)',
694
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
695
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
692
696
  paintOrder: 'fill',
693
697
  } }), h("circle", { class: "selection-line-handle-overlay center", cx: object.controlX !== undefined
694
698
  ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x
@@ -697,8 +701,10 @@ export class KritzelEngine {
697
701
  : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
698
702
  fill: 'transparent',
699
703
  paintOrder: 'fill',
700
- } }), h("circle", { class: "selection-line-handle end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
704
+ } }), h("circle", { class: "selection-line-handle end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${((baseHandleSize - 1) * object.scale) / this.core.store.state?.scale}`, style: {
701
705
  fill: 'var(--kritzel-selection-handle-color, #000000)',
706
+ stroke: 'var(--kritzel-selection-handle-stroke-color, #007AFF)',
707
+ strokeWidth: `calc(2px * ${object.scale} / ${this.core.store.state?.scale})`,
702
708
  paintOrder: 'fill',
703
709
  } }), h("circle", { class: "selection-line-handle-overlay end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
704
710
  fill: 'transparent',
@@ -777,7 +783,7 @@ export class KritzelEngine {
777
783
  stroke: 'var(--kritzel-snap-indicator-stroke, #007bff)',
778
784
  strokeWidth: data.indicatorStrokeWidth,
779
785
  } }))));
780
- })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '951133ef09893b3ab59a27ad0e4bc6c0d371ef28', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
786
+ })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: 'a2860f9b1ccfa0183324939b7c11987e6aaaa168', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
781
787
  position: 'fixed',
782
788
  left: `${this.core.store.state.contextMenuX}px`,
783
789
  top: `${this.core.store.state.contextMenuY}px`,
@@ -788,7 +794,7 @@ export class KritzelEngine {
788
794
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
789
795
  }, this.core.store.selectionGroup?.objects);
790
796
  this.hideContextMenu();
791
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'aa44b379924d80b8e3413e240a7b3f184a332875', core: this.core })));
797
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '20dc66627a01cb9840807b3fe9d96be8599a48f8', core: this.core })));
792
798
  }
793
799
  static get is() { return "kritzel-engine"; }
794
800
  static get encapsulation() { return "shadow"; }
@@ -120,7 +120,7 @@ export class KritzelToolConfig {
120
120
  handlePropertyChange = (propertyName, value) => {
121
121
  // Special handling for shape fill
122
122
  if ((this.config.type === 'shape' || this.config.type === 'selection') && propertyName === 'fillColor') {
123
- const newFillColor = value === 'filled' ? this.tool[this.config.colorProperty] : 'transparent';
123
+ const newFillColor = value === 'filled' ? this.tool[this.config.colorProperty] : { light: 'transparent', dark: 'transparent' };
124
124
  this.tool.fillColor = newFillColor;
125
125
  // When switching to fill mode, also update stroke color to match
126
126
  if (value === 'filled') {
@@ -139,7 +139,9 @@ export class KritzelToolConfig {
139
139
  };
140
140
  getShapeFillValue() {
141
141
  const fillColor = this.tool.fillColor;
142
- return fillColor === 'transparent' ? 'transparent' : 'filled';
142
+ const isTransparent = typeof fillColor === 'string' ? fillColor === 'transparent' :
143
+ (fillColor.light === 'transparent' && fillColor.dark === 'transparent');
144
+ return isTransparent ? 'transparent' : 'filled';
143
145
  }
144
146
  renderControl(control) {
145
147
  const value = this.tool[control.propertyName];
@@ -3,4 +3,4 @@
3
3
  * This file is auto-generated by the version bump scripts.
4
4
  * Do not modify manually.
5
5
  */
6
- export const KRITZEL_VERSION = '0.1.15';
6
+ export const KRITZEL_VERSION = '0.1.16';
@@ -8,7 +8,6 @@ export const darkTheme = {
8
8
  dividerColor: '#3a3a3a',
9
9
  focusColor: '#4da3ff',
10
10
  focusRingColor: 'rgba(0, 122, 255, 0.4)',
11
- pointerCursor: 'pointer',
12
11
  hoverBackground: 'hsl(0, 0%, 100%, 8%)',
13
12
  iconColor: 'currentColor',
14
13
  scrollbarThumbColor: '#555555',
@@ -8,7 +8,6 @@ export const lightTheme = {
8
8
  dividerColor: '#e0e0e0',
9
9
  focusColor: '#007acc',
10
10
  focusRingColor: 'rgba(0, 122, 255, 0.3)',
11
- pointerCursor: 'pointer',
12
11
  hoverBackground: 'hsl(0, 0%, 0%, 4.3%)',
13
12
  iconColor: 'currentColor',
14
13
  scrollbarThumbColor: '#ebebeb',
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-BqZdHh6f.js";import{w as t,a as i,t as o,r as n,b as m,e as u,c as p,d as z,f as C,g as k,s as x,h as y,i as S,v as j,j as T,o as w,k as v,l as B,m as M,O as P,n as W,p as U,q as H,u as A,x as L,y as O,z as N,A as _,B as $,C as R,H as Y,D as q}from"./p-NBmc8spY.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-NBmc8spY.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-D9GoermT.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class X{doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=C();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=k(new Uint8Array(e));switch(n(s)){case 0:const e=m(s);p(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=m(s),r=u(this.doc,n);if(r.length>0){const e=C();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=C();t(e,2),i(e,z(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const Z=new Map,Q="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:S(t.newValue||"")}),w(this._onChange)}postMessage(e){j.setItem(this.room,T(v(e)))}close(){B(this._onChange)}}:BroadcastChannel,V=e=>x(Z,e,(()=>{const t=y(),s=new Q(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),ee=(e,t,s=null)=>{const i=V(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},te=(e,s)=>{t(e,0);const o=z(s);i(e,o)},se=(e,s,o)=>{t(e,1),i(e,u(s,o))},ie=(e,t,s,i)=>{try{p(t,m(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},oe=ie;class ne extends P{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=U();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&re(this,t,"timeout")}),W(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:U()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),H(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const re=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:U()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},le=(e,s,i=e.states)=>{const n=s.length,r=C();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),A(r,JSON.stringify(l))}return o(r)},ae=[];ae[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{se(t,s,m(e))})(e,t,s);break;case 1:ie(e,s,i,o);break;case 2:oe(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},ae[3]=(e,s,o)=>{t(e,1),i(e,le(o.awareness,Array.from(o.awareness.getStates().keys())))},ae[1]=(e,t,s)=>{((e,t,s)=>{const i=k(t),o=U(),r=[],l=[],a=[],c=[],d=n(i);for(let t=0;t<d;t++){const t=n(i);let s=n(i);const d=JSON.parse(M(i)),h=e.meta.get(t),m=e.states.get(t),u=void 0===h?0:h.clock;(u<s||u===s&&null===d&&e.states.has(t))&&(null===d?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,d),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===h&&null!==d?r.push(t):void 0!==h&&null===d?c.push(t):null!==d&&(H(d,m)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,m(t),s)},ae[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,M(e))})(t,0,((e,t)=>ce(s,t)))};const ce=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),de=(e,t,s)=>{const i=k(t),o=C(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},he=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,re(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(me,$(100*R(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},me=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=U();const i=de(e,new Uint8Array(t.data),!0);N(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{he(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=U(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=C();if(t(n,0),te(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=C();t(n,1),i(n,le(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},ue=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&ee(e.bcChannel,t,e)};class fe extends O{constructor(e,s,n,{connect:r=!0,awareness:l=new ne(n),params:a={},protocols:c=[],WebSocketPolyfill:d=WebSocket,resyncInterval:h=-1,maxBackoffTime:m=2500,disableBc:u=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=m,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=d,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=u,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ae.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,h>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=C();t(e,0),te(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=de(this,new Uint8Array(e),!1);N(t)>1&&ee(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=C();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),ue(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=C();t(a,1),i(a,le(l,r)),ue(this,o(a))},this._exitHandler=()=>{re(this.awareness,[n.clientID],"app closed")},_&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<U()-this.wsLastMessageReceived&&he(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>L(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),_&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{V(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=C();t(e,0),te(e,this.doc),ee(this.bcChannel,o(e),this);const s=C();t(s,0),se(s,this.doc),ee(this.bcChannel,o(s),this);const n=C();t(n,3),ee(this.bcChannel,o(n),this);const r=C();t(r,1),i(r,le(this.awareness,[this.doc.clientID])),ee(this.bcChannel,o(r),this)}disconnectBc(){const e=C();t(e,1),i(e,le(this.awareness,[this.doc.clientID],new Map)),ue(this,o(e)),this.bcconnected&&(((e,t)=>{const s=V(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),Z.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&he(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(me(this),this.connectBc())}}class pe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new fe(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new pe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class ze{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||ze.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new Y(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new Y(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(ze.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),ze.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),ze.sharedWebSocketProvider=new q(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),ze.sharedWebSocketProvider}static destroySharedWebSocket(){ze.sharedWebSocketProvider&&(ze.sharedWebSocketProvider.destroy(),ze.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return ze.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new ze(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{X as BroadcastSyncProvider,ze as HocuspocusSyncProvider,pe as WebSocketSyncProvider}
1
+ export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-Cuf-GvO0.js";import{w as t,a as i,t as o,r as n,b as u,e as m,c as p,d as z,f as C,g as k,s as x,h as y,i as S,v as j,j as T,o as w,k as v,l as M,m as P,O as B,n as W,p as U,q as H,u as A,x as L,y as O,z as N,A as _,B as $,C as R,H as Y,D as q}from"./p-bE-Bpn0g.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-bE-Bpn0g.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-UNc_oph8.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class X{doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=C();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=k(new Uint8Array(e));switch(n(s)){case 0:const e=u(s);p(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=u(s),r=m(this.doc,n);if(r.length>0){const e=C();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=C();t(e,2),i(e,z(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const Q=new Map,V="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:S(t.newValue||"")}),w(this._onChange)}postMessage(e){j.setItem(this.room,T(v(e)))}close(){M(this._onChange)}}:BroadcastChannel,Z=e=>x(Q,e,(()=>{const t=y(),s=new V(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),ee=(e,t,s=null)=>{const i=Z(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},te=(e,s)=>{t(e,0);const o=z(s);i(e,o)},se=(e,s,o)=>{t(e,1),i(e,m(s,o))},ie=(e,t,s,i)=>{try{p(t,u(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},oe=ie;class ne extends B{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=U();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&re(this,t,"timeout")}),W(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:U()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),H(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const re=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:U()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},le=(e,s,i=e.states)=>{const n=s.length,r=C();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),A(r,JSON.stringify(l))}return o(r)},ae=[];ae[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{se(t,s,u(e))})(e,t,s);break;case 1:ie(e,s,i,o);break;case 2:oe(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},ae[3]=(e,s,o)=>{t(e,1),i(e,le(o.awareness,Array.from(o.awareness.getStates().keys())))},ae[1]=(e,t,s)=>{((e,t,s)=>{const i=k(t),o=U(),r=[],l=[],a=[],c=[],h=n(i);for(let t=0;t<h;t++){const t=n(i);let s=n(i);const h=JSON.parse(P(i)),d=e.meta.get(t),u=e.states.get(t),m=void 0===d?0:d.clock;(m<s||m===s&&null===h&&e.states.has(t))&&(null===h?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,h),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===d&&null!==h?r.push(t):void 0!==d&&null===h?c.push(t):null!==h&&(H(h,u)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,u(t),s)},ae[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ce(s,t)))};const ce=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),he=(e,t,s)=>{const i=k(t),o=C(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},de=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,re(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(ue,$(100*R(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},ue=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=U();const i=he(e,new Uint8Array(t.data),!0);N(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{de(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=U(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=C();if(t(n,0),te(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=C();t(n,1),i(n,le(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},me=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&ee(e.bcChannel,t,e)};class fe extends O{constructor(e,s,n,{connect:r=!0,awareness:l=new ne(n),params:a={},protocols:c=[],WebSocketPolyfill:h=WebSocket,resyncInterval:d=-1,maxBackoffTime:u=2500,disableBc:m=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=u,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=h,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=m,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ae.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,d>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=C();t(e,0),te(e,n),this.ws.send(o(e))}}),d)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=he(this,new Uint8Array(e),!1);N(t)>1&&ee(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=C();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),me(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=C();t(a,1),i(a,le(l,r)),me(this,o(a))},this._exitHandler=()=>{re(this.awareness,[n.clientID],"app closed")},_&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<U()-this.wsLastMessageReceived&&de(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>L(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),_&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{Z(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=C();t(e,0),te(e,this.doc),ee(this.bcChannel,o(e),this);const s=C();t(s,0),se(s,this.doc),ee(this.bcChannel,o(s),this);const n=C();t(n,3),ee(this.bcChannel,o(n),this);const r=C();t(r,1),i(r,le(this.awareness,[this.doc.clientID])),ee(this.bcChannel,o(r),this)}disconnectBc(){const e=C();t(e,1),i(e,le(this.awareness,[this.doc.clientID],new Map)),me(this,o(e)),this.bcconnected&&(((e,t)=>{const s=Z(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),Q.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&de(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(ue(this),this.connectBc())}}class pe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new fe(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new pe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class ze{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||ze.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new Y(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new Y(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(ze.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),ze.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),ze.sharedWebSocketProvider=new q(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),ze.sharedWebSocketProvider}static destroySharedWebSocket(){ze.sharedWebSocketProvider&&(ze.sharedWebSocketProvider.destroy(),ze.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return ze.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new ze(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{X as BroadcastSyncProvider,ze as HocuspocusSyncProvider,pe as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-CinNuTeF.js";const p=o,r=s;export{p as KritzelBackToContent,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-yWjTje8m.js";const j=o,m=s;export{j as KritzelBackToContent,m as defineCustomElement}