kritzel-stencil 0.1.0 → 0.1.1

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 (35) hide show
  1. package/dist/cjs/{default-line-tool.config-7eJND6Jb.js → default-line-tool.config-SdMGkNhv.js} +68 -15
  2. package/dist/cjs/index.cjs.js +1 -1
  3. package/dist/cjs/kritzel-color_22.cjs.entry.js +66 -46
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/stencil.cjs.js +1 -1
  6. package/dist/collection/classes/handlers/move.handler.js +6 -0
  7. package/dist/collection/classes/objects/line.class.js +62 -15
  8. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +66 -0
  9. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +66 -44
  10. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  11. package/dist/components/index.js +1 -1
  12. package/dist/components/kritzel-controls.js +1 -1
  13. package/dist/components/kritzel-editor.js +1 -1
  14. package/dist/components/kritzel-engine.js +1 -1
  15. package/dist/components/kritzel-utility-panel.js +1 -1
  16. package/dist/components/p-D4n7UbGY.js +1 -0
  17. package/dist/components/{p-DB5s1NY4.js → p-XGgKC_Fe.js} +1 -1
  18. package/dist/components/p-exWKDgI8.js +9 -0
  19. package/dist/esm/{default-line-tool.config-CD5sTKH-.js → default-line-tool.config-Cw8mdDpt.js} +68 -15
  20. package/dist/esm/index.js +2 -2
  21. package/dist/esm/kritzel-color_22.entry.js +66 -46
  22. package/dist/esm/loader.js +1 -1
  23. package/dist/esm/stencil.js +1 -1
  24. package/dist/stencil/index.esm.js +1 -1
  25. package/dist/stencil/p-Cw8mdDpt.js +1 -0
  26. package/dist/stencil/p-d21a009f.entry.js +9 -0
  27. package/dist/stencil/stencil.esm.js +1 -1
  28. package/dist/types/classes/managers/anchor.manager.d.ts +1 -1
  29. package/dist/types/classes/objects/line.class.d.ts +2 -0
  30. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +6 -0
  31. package/package.json +1 -1
  32. package/dist/components/p-B7Fdo5QJ.js +0 -1
  33. package/dist/components/p-D3LRBk2t.js +0 -9
  34. package/dist/stencil/p-381c0e9c.entry.js +0 -9
  35. package/dist/stencil/p-CD5sTKH-.js +0 -1
@@ -22,6 +22,7 @@ export class KritzelLine extends KritzelBaseObject {
22
22
  isDebugInfoVisible = true;
23
23
  isCompleted = false;
24
24
  _adjustedPoints = null;
25
+ _clipInfo = null;
25
26
  get d() {
26
27
  if (this.controlX !== undefined && this.controlY !== undefined) {
27
28
  return `M ${this.startX} ${this.startY} Q ${this.controlX} ${this.controlY} ${this.endX} ${this.endY}`;
@@ -99,6 +100,7 @@ export class KritzelLine extends KritzelBaseObject {
99
100
  this.translateX = x;
100
101
  this.translateY = y;
101
102
  this._adjustedPoints = null;
103
+ this._clipInfo = null;
102
104
  this._core.store.state.objects.update(this);
103
105
  // Update anchors after the line is updated
104
106
  this._core.anchorManager.updateAnchorsForObject(this.id);
@@ -112,6 +114,7 @@ export class KritzelLine extends KritzelBaseObject {
112
114
  rotate(value) {
113
115
  this.rotation = value;
114
116
  this._adjustedPoints = null;
117
+ this._clipInfo = null;
115
118
  this._core.store.state.objects.update(this);
116
119
  }
117
120
  move(startX, startY, endX, endY) {
@@ -127,6 +130,7 @@ export class KritzelLine extends KritzelBaseObject {
127
130
  this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);
128
131
  }
129
132
  this._adjustedPoints = null;
133
+ this._clipInfo = null;
130
134
  this._core.store.state.objects.update(this);
131
135
  }
132
136
  hitTest(x, y) {
@@ -138,12 +142,16 @@ export class KritzelLine extends KritzelBaseObject {
138
142
  }
139
143
  // For curved lines, use distance to the Bezier curve
140
144
  if (this.controlX !== undefined && this.controlY !== undefined) {
141
- const distance = this.pointToBezierDistance(x, y);
145
+ const clip = this.getClipInfo();
146
+ const startT = clip.start?.t ?? 0;
147
+ const endT = clip.end?.t ?? 1;
148
+ const distance = this.pointToBezierDistance(x, y, startT, endT);
142
149
  return distance <= halfStroke;
143
150
  }
144
151
  // For straight lines, use distance to line segment
145
- const p1 = this._adjustedPoints[0];
146
- const p2 = this._adjustedPoints[1];
152
+ const clip = this.getClipInfo();
153
+ const p1 = clip.start ? [clip.start.x, clip.start.y] : this._adjustedPoints[0];
154
+ const p2 = clip.end ? [clip.end.x, clip.end.y] : this._adjustedPoints[1];
147
155
  const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);
148
156
  return distance <= halfStroke;
149
157
  }
@@ -152,6 +160,7 @@ export class KritzelLine extends KritzelBaseObject {
152
160
  if (this._adjustedPoints === null) {
153
161
  this._adjustedPoints = this.computeAdjustedPoints();
154
162
  }
163
+ const clip = this.getClipInfo();
155
164
  const polyPoints = [
156
165
  { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },
157
166
  { x: polygon.bottomRight.x, y: polygon.bottomRight.y },
@@ -159,7 +168,11 @@ export class KritzelLine extends KritzelBaseObject {
159
168
  { x: polygon.topLeft.x, y: polygon.topLeft.y },
160
169
  ];
161
170
  // Check if any endpoint is inside the polygon
162
- for (const [px, py] of this._adjustedPoints) {
171
+ // Use clipped endpoints
172
+ const p1 = clip.start ? [clip.start.x, clip.start.y] : this._adjustedPoints[0];
173
+ const p2 = clip.end ? [clip.end.x, clip.end.y] : this._adjustedPoints[1];
174
+ const endpoints = [p1, p2];
175
+ for (const [px, py] of endpoints) {
163
176
  if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {
164
177
  return true;
165
178
  }
@@ -175,9 +188,12 @@ export class KritzelLine extends KritzelBaseObject {
175
188
  const p0 = this._adjustedPoints[0];
176
189
  const p2 = this._adjustedPoints[1];
177
190
  const controlAdjusted = this.computeAdjustedControlPoint();
191
+ const startT = clip.start?.t ?? 0;
192
+ const endT = clip.end?.t ?? 1;
178
193
  const samples = 20;
179
- for (let i = 1; i < samples; i++) {
180
- const t = i / samples;
194
+ for (let i = 0; i <= samples; i++) {
195
+ const fraction = i / samples;
196
+ const t = startT + fraction * (endT - startT);
181
197
  const oneMinusT = 1 - t;
182
198
  const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];
183
199
  const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];
@@ -197,19 +213,19 @@ export class KritzelLine extends KritzelBaseObject {
197
213
  return false;
198
214
  }
199
215
  // For straight lines, check if line intersects any polygon edge
200
- const p1 = { x: this._adjustedPoints[0][0], y: this._adjustedPoints[0][1] };
201
- const p2 = { x: this._adjustedPoints[1][0], y: this._adjustedPoints[1][1] };
216
+ const checkP1 = { x: p1[0], y: p1[1] };
217
+ const checkP2 = { x: p2[0], y: p2[1] };
202
218
  for (let j = 0; j < polyPoints.length; j++) {
203
219
  const q1 = polyPoints[j];
204
220
  const q2 = polyPoints[(j + 1) % polyPoints.length];
205
- if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {
221
+ if (KritzelGeometryHelper.intersectLines(checkP1, checkP2, q1, q2)) {
206
222
  return true;
207
223
  }
208
224
  // Check distance from polygon edges to line segment
209
- const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1.x, p1.y, p2.x, p2.y);
210
- const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1.x, p1.y, p2.x, p2.y);
211
- const d3 = this.pointToLineSegmentDistance(p1.x, p1.y, q1.x, q1.y, q2.x, q2.y);
212
- const d4 = this.pointToLineSegmentDistance(p2.x, p2.y, q1.x, q1.y, q2.x, q2.y);
225
+ const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, checkP1.x, checkP1.y, checkP2.x, checkP2.y);
226
+ const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, checkP1.x, checkP1.y, checkP2.x, checkP2.y);
227
+ const d3 = this.pointToLineSegmentDistance(checkP1.x, checkP1.y, q1.x, q1.y, q2.x, q2.y);
228
+ const d4 = this.pointToLineSegmentDistance(checkP2.x, checkP2.y, q1.x, q1.y, q2.x, q2.y);
213
229
  const minD = Math.min(d1, d2, d3, d4);
214
230
  if (minD <= halfStroke) {
215
231
  return true;
@@ -221,6 +237,7 @@ export class KritzelLine extends KritzelBaseObject {
221
237
  this.translateX = x;
222
238
  this.translateY = y;
223
239
  this._adjustedPoints = null;
240
+ this._clipInfo = null;
224
241
  this._core.store.state.objects.update(this);
225
242
  }
226
243
  /**
@@ -279,6 +296,7 @@ export class KritzelLine extends KritzelBaseObject {
279
296
  this.translateY += correctionY / this.scale;
280
297
  // Clear cached adjusted points
281
298
  this._adjustedPoints = null;
299
+ this._clipInfo = null;
282
300
  this._core.store.state.objects.update(this);
283
301
  }
284
302
  updateControlPoint(newX, newY) {
@@ -321,6 +339,7 @@ export class KritzelLine extends KritzelBaseObject {
321
339
  this.translateY += correctionY / this.scale;
322
340
  // Clear cached adjusted points
323
341
  this._adjustedPoints = null;
342
+ this._clipInfo = null;
324
343
  this._core.store.state.objects.update(this);
325
344
  }
326
345
  computeAdjustedPoints() {
@@ -377,7 +396,7 @@ export class KritzelLine extends KritzelBaseObject {
377
396
  * Calculates the minimum distance from a point to a quadratic Bezier curve.
378
397
  * Uses sampling along the curve to find the closest point.
379
398
  */
380
- pointToBezierDistance(x, y) {
399
+ pointToBezierDistance(x, y, startT = 0, endT = 1) {
381
400
  if (this._adjustedPoints === null) {
382
401
  this._adjustedPoints = this.computeAdjustedPoints();
383
402
  }
@@ -388,7 +407,8 @@ export class KritzelLine extends KritzelBaseObject {
388
407
  let minDistance = Infinity;
389
408
  const samples = 20; // Number of samples along the curve
390
409
  for (let i = 0; i <= samples; i++) {
391
- const t = i / samples;
410
+ const fraction = i / samples;
411
+ const t = startT + fraction * (endT - startT);
392
412
  const oneMinusT = 1 - t;
393
413
  // Quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂
394
414
  const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];
@@ -402,6 +422,33 @@ export class KritzelLine extends KritzelBaseObject {
402
422
  }
403
423
  return minDistance;
404
424
  }
425
+ getClipInfo() {
426
+ if (this._clipInfo)
427
+ return this._clipInfo;
428
+ const startAnchor = this.startAnchor;
429
+ const endAnchor = this.endAnchor;
430
+ const result = {};
431
+ if (startAnchor) {
432
+ const target = this._core.anchorManager.findAnchorTarget(this, 'start');
433
+ if (target) {
434
+ const clip = this._core.anchorManager.computeAnchorClipInfo(this, 'start', target);
435
+ if (clip) {
436
+ result.start = { x: clip.worldX, y: clip.worldY, t: clip.t };
437
+ }
438
+ }
439
+ }
440
+ if (endAnchor) {
441
+ const target = this._core.anchorManager.findAnchorTarget(this, 'end');
442
+ if (target) {
443
+ const clip = this._core.anchorManager.computeAnchorClipInfo(this, 'end', target);
444
+ if (clip) {
445
+ result.end = { x: clip.worldX, y: clip.worldY, t: clip.t };
446
+ }
447
+ }
448
+ }
449
+ this._clipInfo = result;
450
+ return result;
451
+ }
405
452
  /**
406
453
  * Computes the adjusted control point in world coordinates, accounting for rotation and translation.
407
454
  */
@@ -2,6 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  user-select: none;
5
+ max-width: calc(100vw - 28px);
5
6
  }
6
7
 
7
8
  :host(.mobile) {
@@ -23,6 +24,57 @@
23
24
  border: var(--kritzel-controls-border, 1px solid #ebebeb);
24
25
  z-index: 10000;
25
26
  position: relative;
27
+ max-width: 100%;
28
+ overflow: hidden;
29
+ }
30
+
31
+ .kritzel-tools-scroll {
32
+ display: flex;
33
+ flex-direction: row;
34
+ align-items: center;
35
+ gap: var(--kritzel-controls-gap, 8px);
36
+ overflow-x: auto;
37
+ overflow-y: hidden;
38
+ flex: 1 1 auto;
39
+ min-width: 0;
40
+
41
+ /* Hide scrollbar for all browsers */
42
+ scrollbar-width: none;
43
+ -ms-overflow-style: none;
44
+ }
45
+
46
+ .kritzel-tools-scroll::-webkit-scrollbar {
47
+ display: none;
48
+ }
49
+
50
+ /* Scroll indicator gradients */
51
+ .scroll-indicator-left,
52
+ .scroll-indicator-right {
53
+ position: absolute;
54
+ top: 0;
55
+ bottom: 0;
56
+ width: 24px;
57
+ pointer-events: none;
58
+ opacity: 0;
59
+ transition: opacity 0.2s ease-out;
60
+ z-index: 1;
61
+ }
62
+
63
+ .scroll-indicator-left {
64
+ left: 0;
65
+ background: linear-gradient(to right, var(--kritzel-controls-background-color, #ffffff), transparent);
66
+ border-radius: var(--kritzel-controls-border-radius, 16px) 0 0 var(--kritzel-controls-border-radius, 16px);
67
+ }
68
+
69
+ .scroll-indicator-right {
70
+ right: 0;
71
+ background: linear-gradient(to left, var(--kritzel-controls-background-color, #ffffff), transparent);
72
+ border-radius: 0 var(--kritzel-controls-border-radius, 16px) var(--kritzel-controls-border-radius, 16px) 0;
73
+ }
74
+
75
+ .scroll-indicator-left.visible,
76
+ .scroll-indicator-right.visible {
77
+ opacity: 1;
26
78
  }
27
79
 
28
80
  .kritzel-control {
@@ -185,6 +237,7 @@
185
237
  height: 40px;
186
238
  box-sizing: border-box;
187
239
  -webkit-tap-highlight-color: transparent;
240
+ flex-shrink: 0;
188
241
 
189
242
  /* Hidden state - collapsed */
190
243
  width: 0;
@@ -202,6 +255,19 @@
202
255
  opacity: 1;
203
256
  pointer-events: auto;
204
257
  margin-left: 0;
258
+ overflow: visible;
259
+ }
260
+
261
+ /* Left gradient on config container */
262
+ .config-gradient-left {
263
+ position: absolute;
264
+ top: 0;
265
+ bottom: 0;
266
+ left: -16px;
267
+ width: 16px;
268
+ background: linear-gradient(to right, transparent, var(--kritzel-controls-background-color, #ffffff));
269
+ pointer-events: none;
270
+ z-index: 1;
205
271
  }
206
272
 
207
273
  .kritzel-config {
@@ -14,6 +14,8 @@ export class KritzelControls {
14
14
  isTouchDevice = KritzelDevicesHelper.isTouchDevice();
15
15
  selectedSubOptions = new Map();
16
16
  openSubMenuControl = null;
17
+ canScrollLeft = false;
18
+ canScrollRight = false;
17
19
  handleDocumentClick(event) {
18
20
  const element = event.target;
19
21
  if (!this.kritzelEngine || element.closest('.kritzel-tooltip')) {
@@ -37,6 +39,7 @@ export class KritzelControls {
37
39
  }
38
40
  kritzelEngine = null;
39
41
  tooltipRef = null;
42
+ toolsScrollRef = null;
40
43
  get activeToolAsTextTool() {
41
44
  return this.activeControl?.tool;
42
45
  }
@@ -48,6 +51,20 @@ export class KritzelControls {
48
51
  await this.initializeTools();
49
52
  this.isControlsReady.emit();
50
53
  }
54
+ componentDidLoad() {
55
+ this.updateScrollIndicators();
56
+ }
57
+ updateScrollIndicators() {
58
+ if (!this.toolsScrollRef)
59
+ return;
60
+ const { scrollLeft, scrollWidth, clientWidth } = this.toolsScrollRef;
61
+ const threshold = 2; // Small threshold to account for rounding
62
+ this.canScrollLeft = scrollLeft > threshold;
63
+ this.canScrollRight = scrollLeft + clientWidth < scrollWidth - threshold;
64
+ }
65
+ handleToolsScroll = () => {
66
+ this.updateScrollIndicators();
67
+ };
51
68
  async initializeEngine() {
52
69
  await customElements.whenDefined('kritzel-engine');
53
70
  this.kritzelEngine = this.host.parentElement.querySelector('kritzel-engine');
@@ -142,55 +159,58 @@ export class KritzelControls {
142
159
  render() {
143
160
  const hasConfigUI = this.activeControl?.tool instanceof KritzelBrushTool ||
144
161
  this.activeControl?.tool instanceof KritzelTextTool;
145
- return (h(Host, { key: 'ed5816cbeb8fe8b91e14b23bf61df4753fb0da0f', class: {
162
+ // Separate tool controls from config control
163
+ const toolControls = this.controls.filter(c => c.type === 'tool');
164
+ const configControl = this.controls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
165
+ return (h(Host, { key: '78858516fdd1ccec007c9c8ddfc846d7907df664', class: {
146
166
  mobile: this.isTouchDevice,
147
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '7218fff9c89f525baf655eea46aec1698a28babd', style: {
167
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: 'f24a6dc28e86a543a6e9d6ed2d3a5ca552eb7c48', style: {
148
168
  position: 'absolute',
149
169
  bottom: '56px',
150
170
  left: '12px',
151
- }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '1dc0fa7b02a953474aae9c7822c651d5006e89e5', class: "kritzel-controls" }, this.controls.map(control => {
152
- if (control.type === 'tool') {
153
- // Check if this control has sub-options (split-button)
154
- if (control.subOptions?.length) {
155
- const selectedSubOption = this.getSelectedSubOption(control);
156
- const isActive = this.activeControl?.name === control.name;
157
- const isSubMenuOpen = this.openSubMenuControl?.name === control.name;
158
- return (h("div", { class: {
159
- 'kritzel-control-split': true,
160
- 'selected': isActive,
161
- }, key: control.name, ref: el => {
162
- if (el)
163
- control._anchorRef = el;
164
- } }, h("button", { class: "kritzel-control-main", onClick: () => this.handleControlClick(control), title: selectedSubOption?.label }, h("kritzel-icon", { name: selectedSubOption?.icon || control.icon })), h("button", { class: {
165
- 'kritzel-control-dropdown': true,
166
- 'visible': isActive,
167
- }, onClick: (e) => this.toggleSubMenu(e, control), "aria-label": "Select shape type", "aria-expanded": isSubMenuOpen ? 'true' : 'false', tabIndex: isActive ? 0 : -1 }, h("kritzel-icon", { name: "chevron-down", size: 12 })), h("kritzel-tooltip", { isVisible: isSubMenuOpen, anchorElement: control._anchorRef, onTooltipClosed: () => { this.openSubMenuControl = null; } }, h("div", { class: "kritzel-submenu-content" }, control.subOptions.map(option => (h("button", { class: {
168
- 'kritzel-submenu-item': true,
169
- 'active': option.id === selectedSubOption?.id,
170
- }, key: option.id, onClick: () => this.selectSubOption(control, option) }, h("kritzel-icon", { name: option.icon, size: 20 }), h("span", null, option.label))))))));
171
- }
172
- // Regular tool control (no sub-options)
173
- return (h("button", { class: {
174
- 'kritzel-control': true,
175
- 'selected': this.activeControl?.name === control?.name,
176
- }, key: control.name, onClick: _event => this.handleControlClick?.(control) }, h("kritzel-icon", { name: control.icon })));
177
- }
178
- if (control.type === 'config' && control.name === this.firstConfig?.name && this.activeControl) {
171
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '50dfa80ac8f76a2a00f3fa171a3d6d8503fb0857', class: "kritzel-controls" }, h("div", { key: '75230491b29899e3e08ecf7cf0adae274bd34728', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'be5939db03ffe6bb72c38c1c753963f120bf9c58', class: "kritzel-tools-scroll", ref: el => {
172
+ this.toolsScrollRef = el;
173
+ // Update indicators when ref is set
174
+ if (el)
175
+ this.updateScrollIndicators();
176
+ }, onScroll: this.handleToolsScroll }, toolControls.map(control => {
177
+ // Check if this control has sub-options (split-button)
178
+ if (control.subOptions?.length) {
179
+ const selectedSubOption = this.getSelectedSubOption(control);
180
+ const isActive = this.activeControl?.name === control.name;
181
+ const isSubMenuOpen = this.openSubMenuControl?.name === control.name;
179
182
  return (h("div", { class: {
180
- 'kritzel-config-container': true,
181
- 'visible': hasConfigUI,
182
- }, key: control.name }, h("kritzel-tooltip", { ref: el => (this.tooltipRef = el), isVisible: this.isTooltipVisible, anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), onTooltipClosed: () => this.handleTooltipClosed() }, h("div", { style: { width: '294px', height: '100%' } }, this.activeControl.name === 'brush' && (h("kritzel-control-brush-config", { tool: this.activeToolAsBrushTool, onToolChange: event => this.handleToolChange?.(event) })), this.activeControl.name === 'text' && (h("kritzel-control-text-config", { tool: this.activeToolAsTextTool, onToolChange: event => this.handleToolChange?.(event) })))), h("div", { tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", onClick: event => this.handleConfigClick?.(event), onKeyDown: event => {
183
- if (event.key === 'Enter') {
184
- this.handleConfigClick?.(event);
185
- }
186
- }, style: {
187
- cursor: 'pointer',
188
- } }, this.activeControl.tool instanceof KritzelBrushTool && (h("div", { class: "color-container" }, h("kritzel-color", { value: this.activeToolAsBrushTool?.color, size: this.activeToolAsBrushTool?.size, style: {
189
- borderRadius: '50%',
190
- border: 'none',
191
- } }))), this.activeControl.tool instanceof KritzelTextTool && (h("div", { class: "font-container" }, h("kritzel-font", { fontFamily: this.activeToolAsTextTool?.fontFamily, size: this.activeToolAsTextTool?.fontSize, color: this.activeToolAsTextTool?.fontColor }))))));
183
+ 'kritzel-control-split': true,
184
+ 'selected': isActive,
185
+ }, key: control.name, ref: el => {
186
+ if (el)
187
+ control._anchorRef = el;
188
+ } }, h("button", { class: "kritzel-control-main", onClick: () => this.handleControlClick(control), title: selectedSubOption?.label }, h("kritzel-icon", { name: selectedSubOption?.icon || control.icon })), h("button", { class: {
189
+ 'kritzel-control-dropdown': true,
190
+ 'visible': isActive,
191
+ }, onClick: (e) => this.toggleSubMenu(e, control), "aria-label": "Select shape type", "aria-expanded": isSubMenuOpen ? 'true' : 'false', tabIndex: isActive ? 0 : -1 }, h("kritzel-icon", { name: "chevron-down", size: 12 })), h("kritzel-tooltip", { isVisible: isSubMenuOpen, anchorElement: control._anchorRef, onTooltipClosed: () => { this.openSubMenuControl = null; } }, h("div", { class: "kritzel-submenu-content" }, control.subOptions.map(option => (h("button", { class: {
192
+ 'kritzel-submenu-item': true,
193
+ 'active': option.id === selectedSubOption?.id,
194
+ }, key: option.id, onClick: () => this.selectSubOption(control, option) }, h("kritzel-icon", { name: option.icon, size: 20 }), h("span", null, option.label))))))));
192
195
  }
193
- }))));
196
+ // Regular tool control (no sub-options)
197
+ return (h("button", { class: {
198
+ 'kritzel-control': true,
199
+ 'selected': this.activeControl?.name === control?.name,
200
+ }, key: control.name, onClick: _event => this.handleControlClick?.(control) }, h("kritzel-icon", { name: control.icon })));
201
+ })), h("div", { key: '27aa7dd0f1a93a435eebc78c8abe6bc4c8b578f0', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight } }), configControl && this.activeControl && (h("div", { class: {
202
+ 'kritzel-config-container': true,
203
+ 'visible': hasConfigUI,
204
+ }, key: configControl.name }, h("div", { key: '68c28268a98d4cc3bf949acbdea50ed2ec83c0db', class: "config-gradient-left" }), h("kritzel-tooltip", { key: '76af8159e08e78b32ab6798ef408e9246e77afbf', ref: el => (this.tooltipRef = el), isVisible: this.isTooltipVisible, anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), onTooltipClosed: () => this.handleTooltipClosed() }, h("div", { key: '32cce44dd99f5bdbc730a66997af6930e8da4110', style: { width: '294px', height: '100%' } }, this.activeControl.name === 'brush' && (h("kritzel-control-brush-config", { key: 'da8ce6b563e276cd1566f31e96146e58b3cfa21f', tool: this.activeToolAsBrushTool, onToolChange: event => this.handleToolChange?.(event) })), this.activeControl.name === 'text' && (h("kritzel-control-text-config", { key: 'f7f9d55e52feba674521d5f8a20d4e7f62b14347', tool: this.activeToolAsTextTool, onToolChange: event => this.handleToolChange?.(event) })))), h("div", { key: '59082cc78fabaf11468c41c5333ebc21f9e491c1', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", onClick: event => this.handleConfigClick?.(event), onKeyDown: event => {
205
+ if (event.key === 'Enter') {
206
+ this.handleConfigClick?.(event);
207
+ }
208
+ }, style: {
209
+ cursor: 'pointer',
210
+ } }, this.activeControl.tool instanceof KritzelBrushTool && (h("div", { key: 'd77c688e9f92293e8a7e63ad63483552479a96ef', class: "color-container" }, h("kritzel-color", { key: '42272e42b004f8de4711032f47c5ac2b2724953f', value: this.activeToolAsBrushTool?.color, size: this.activeToolAsBrushTool?.size, style: {
211
+ borderRadius: '50%',
212
+ border: 'none',
213
+ } }))), this.activeControl.tool instanceof KritzelTextTool && (h("div", { key: '6f9d8bc06a57717c3a683f20610395f7ea4df48e', class: "font-container" }, h("kritzel-font", { key: '6079881df1283fd176b223506deb9ac5ee9c81e3', fontFamily: this.activeToolAsTextTool?.fontFamily, size: this.activeToolAsTextTool?.fontSize, color: this.activeToolAsTextTool?.fontColor })))))))));
194
214
  }
195
215
  static get is() { return "kritzel-controls"; }
196
216
  static get encapsulation() { return "shadow"; }
@@ -307,7 +327,9 @@ export class KritzelControls {
307
327
  "isTooltipVisible": {},
308
328
  "isTouchDevice": {},
309
329
  "selectedSubOptions": {},
310
- "openSubMenuControl": {}
330
+ "openSubMenuControl": {},
331
+ "canScrollLeft": {},
332
+ "canScrollRight": {}
311
333
  };
312
334
  }
313
335
  static get events() {
@@ -17,7 +17,7 @@ export class KritzelUtilityPanel {
17
17
  this.redo.emit();
18
18
  }
19
19
  render() {
20
- return (h(Host, { key: '998008f3c138f18d0e3f5183c3280e646e6c8e73' }, h("button", { key: '2ea58a2df20e038e00c0090c44714efbc1221314', class: "utility-button", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '1843d211731f83f2f828b17f0bc0cf83a76705e1', name: "undo" })), h("button", { key: '71064186570d8e849a634a4c68e96f3fba1ebdab', class: "utility-button", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: '12694a6dcddc1f893752d3edcc1deafe700cff5c', name: "redo" })), h("div", { key: '5bbfb5e535d9e0a861d227df57bd5cc7ab8c22fb', class: "utility-separator" }), h("button", { key: 'fda95410a66afa98c0abf6eb82e323f926ef596a', class: "utility-button" }, h("kritzel-icon", { key: '0d1d77f6d65481825c2edbdb38de821a2de7b043', name: "delete", onClick: () => this.delete.emit() }))));
20
+ return (h(Host, { key: 'e8a12bdde840301c5bd9448e2c6be1c3cd558c38' }, h("button", { key: '9ffc5db3ac9d31e6e66822ebcbd60bd60c413062', class: "utility-button", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: 'caec852e6f83132e46b3ef87c376f62a03554f6b', name: "undo" })), h("button", { key: '6b5eaebd6f1dcfa5fbb96719b8456647132c1415', class: "utility-button", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'bbb07b34186f3a2f1a586a629f0cca738ca924bf', name: "redo" })), h("div", { key: '5a80149b3231e23b1e16fd7f52c4b4b2a5108e75', class: "utility-separator" }), h("button", { key: 'b7d826a7e6667a3a8e28c11507bfc760dc9526e0', class: "utility-button" }, h("kritzel-icon", { key: 'c47c4acead03cee13c64045b817aa166f397ce90', name: "delete", onClick: () => this.delete.emit() }))));
21
21
  }
22
22
  static get is() { return "kritzel-utility-panel"; }
23
23
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Bj_Og27M.js";export{b as KritzelBrushTool,a as KritzelPath,K as KritzelText,c as KritzelTextTool}from"./p-Cp15toXH.js";import{w as t,a as e,t as i,r as o,b as n,e as l,c as h,d,f as u,g as m,s as f,h as p,i as z,v as C,j as k,o as y,k as S,l as x,m as w,O as v,n as j,p as T,q as B,u as W,x as U,y as H,z as A,A as O,B as _,C as $,H as R,D as X}from"./p-D3LRBk2t.js";export{N as IndexedDBSyncProvider,Q as KritzelAnchorManager,P as KritzelAppStateMap,L as KritzelCursorHelper,I as KritzelEraserTool,F as KritzelGroup,K as KritzelImage,J as KritzelImageTool,E as KritzelLine,G as KritzelLineTool,M as KritzelSelectionTool}from"./p-D3LRBk2t.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{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{KritzelControlBrushConfig,defineCustomElement as defineCustomElementKritzelControlBrushConfig}from"./kritzel-control-brush-config.js";export{KritzelControlTextConfig,defineCustomElement as defineCustomElementKritzelControlTextConfig}from"./kritzel-control-text-config.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.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{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class Y{doc;channel;_synced=!1;constructor(t,e,s){this.doc=e,this.channel=new BroadcastChannel(t),this.channel.onmessage=t=>{this.handleMessage(t.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+t)}handleDocUpdate=(s,o)=>{if(o!==this){const o=u();t(o,0),e(o,s),this.channel.postMessage(i(o))}};handleMessage(s){const r=m(new Uint8Array(s));switch(o(r)){case 0:const s=n(r);h(this.doc,s,this);break;case 1:this.broadcastSync();break;case 2:const o=n(r),c=l(this.doc,o);if(c.length>0){const s=u();t(s,0),e(s,c),this.channel.postMessage(i(s))}}}broadcastSync(){const s=u();t(s,2),e(s,d(this.doc)),this.channel.postMessage(i(s))}async connect(){if(!this._synced)return new Promise((t=>{const e=()=>{this._synced?t():setTimeout(e,50)};e()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const q=new Map,V="undefined"==typeof BroadcastChannel?class{constructor(t){this.room=t,this.onmessage=null,this._onChange=e=>e.key===t&&null!==this.onmessage&&this.onmessage({data:z(e.newValue||"")}),y(this._onChange)}postMessage(t){C.setItem(this.room,k(S(t)))}close(){x(this._onChange)}}:BroadcastChannel,Z=t=>f(q,t,(()=>{const e=p(),s=new V(t);return s.onmessage=t=>e.forEach((e=>e(t.data,"broadcastchannel"))),{bc:s,subs:e}})),tt=(t,e,s=null)=>{const i=Z(t);i.bc.postMessage(e),i.subs.forEach((t=>t(e,s)))},et=(s,i)=>{t(s,0);const o=d(i);e(s,o)},st=(s,i,o)=>{t(s,1),e(s,l(i,o))},it=(t,e,s,i)=>{try{h(e,n(t),s)}catch(t){null!=i&&i(t),console.error("Caught error while handling a Yjs update",t)}},ot=it;class nt extends v{constructor(t){super(),this.doc=t,this.clientID=t.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const t=T();null!==this.getLocalState()&&15e3<=t-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const e=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=t-s.lastUpdated&&this.states.has(i)&&e.push(i)})),e.length>0&&rt(this,e,"timeout")}),j(3e3)),t.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(t){const e=this.clientID,s=this.meta.get(e),i=void 0===s?0:s.clock+1,o=this.states.get(e);null===t?this.states.delete(e):this.states.set(e,t),this.meta.set(e,{clock:i,lastUpdated:T()});const n=[],r=[],l=[],c=[];null===t?c.push(e):null==o?null!=t&&n.push(e):(r.push(e),B(o,t)||l.push(e)),(n.length>0||l.length>0||c.length>0)&&this.emit("change",[{added:n,updated:l,removed:c},"local"]),this.emit("update",[{added:n,updated:r,removed:c},"local"])}setLocalStateField(t,e){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[t]:e})}getStates(){return this.states}}const rt=(t,e,s)=>{const i=[];for(let s=0;s<e.length;s++){const o=e[s];if(t.states.has(o)){if(t.states.delete(o),o===t.clientID){const e=t.meta.get(o);t.meta.set(o,{clock:e.clock+1,lastUpdated:T()})}i.push(o)}}i.length>0&&(t.emit("change",[{added:[],updated:[],removed:i},s]),t.emit("update",[{added:[],updated:[],removed:i},s]))},lt=(e,s,o=e.states)=>{const n=s.length,r=u();t(r,n);for(let i=0;i<n;i++){const n=s[i],l=o.get(n)||null,c=e.meta.get(n).clock;t(r,n),t(r,c),W(r,JSON.stringify(l))}return i(r)},ct=[];ct[0]=(e,s,i,r)=>{t(e,0);const l=((t,e,s,i,r)=>{const l=o(t);switch(l){case 0:((t,e,s)=>{st(e,s,n(t))})(t,e,s);break;case 1:it(t,s,i,r);break;case 2:ot(t,s,i,r);break;default:throw Error("Unknown message type")}return l})(s,e,i.doc,i);r&&1===l&&!i.synced&&(i.synced=!0)},ct[3]=(s,i,o)=>{t(s,1),e(s,lt(o.awareness,Array.from(o.awareness.getStates().keys())))},ct[1]=(t,e,s)=>{((t,e,s)=>{const i=m(e),n=T(),r=[],l=[],c=[],a=[],h=o(i);for(let e=0;e<h;e++){const e=o(i);let s=o(i);const h=JSON.parse(w(i)),d=t.meta.get(e),u=t.states.get(e),m=void 0===d?0:d.clock;(m<s||m===s&&null===h&&t.states.has(e))&&(null===h?e===t.clientID&&null!=t.getLocalState()?s++:t.states.delete(e):t.states.set(e,h),t.meta.set(e,{clock:s,lastUpdated:n}),void 0===d&&null!==h?r.push(e):void 0!==d&&null===h?a.push(e):null!==h&&(B(h,u)||c.push(e),l.push(e)))}(r.length>0||c.length>0||a.length>0)&&t.emit("change",[{added:r,updated:c,removed:a},s]),(r.length>0||l.length>0||a.length>0)&&t.emit("update",[{added:r,updated:l,removed:a},s])})(s.awareness,n(e),s)},ct[2]=(t,e,s)=>{((t,e,s)=>{0===o(t)&&s(0,w(t))})(e,0,((t,e)=>at(s,e)))};const at=(t,e)=>console.warn(`Permission denied to access ${t.url}.\n${e}`),ht=(t,e,s)=>{const i=m(e),n=u(),r=o(i),l=t.messageHandlers[r];return l?l(n,i,t,s,r):console.error("Unable to compute message"),n},dt=(t,e,s)=>{e===t.ws&&(t.emit("connection-close",[s,t]),t.ws=null,e.close(),t.wsconnecting=!1,t.wsconnected?(t.wsconnected=!1,t.synced=!1,rt(t.awareness,Array.from(t.awareness.getStates().keys()).filter((e=>e!==t.doc.clientID)),t),t.emit("status",[{status:"disconnected"}])):t.wsUnsuccessfulReconnects++,setTimeout(ut,_(100*$(2,t.wsUnsuccessfulReconnects),t.maxBackoffTime),t))},ut=s=>{if(s.shouldConnect&&null===s.ws){const o=new s._WS(s.url,s.protocols);o.binaryType="arraybuffer",s.ws=o,s.wsconnecting=!0,s.wsconnected=!1,s.synced=!1,o.onmessage=t=>{s.wsLastMessageReceived=T();const e=ht(s,new Uint8Array(t.data),!0);A(e)>1&&o.send(i(e))},o.onerror=t=>{s.emit("connection-error",[t,s])},o.onclose=t=>{dt(s,o,t)},o.onopen=()=>{s.wsLastMessageReceived=T(),s.wsconnecting=!1,s.wsconnected=!0,s.wsUnsuccessfulReconnects=0,s.emit("status",[{status:"connected"}]);const n=u();if(t(n,0),et(n,s.doc),o.send(i(n)),null!==s.awareness.getLocalState()){const n=u();t(n,1),e(n,lt(s.awareness,[s.doc.clientID])),o.send(i(n))}},s.emit("status",[{status:"connecting"}])}},mt=(t,e)=>{const s=t.ws;t.wsconnected&&s&&s.readyState===s.OPEN&&s.send(e),t.bcconnected&&tt(t.bcChannel,e,t)};class ft extends H{constructor(s,o,n,{connect:r=!0,awareness:l=new nt(n),params:c={},protocols:a=[],WebSocketPolyfill:h=WebSocket,resyncInterval:d=-1,maxBackoffTime:m=2500,disableBc:f=!1}={}){for(super();"/"===s[s.length-1];)s=s.slice(0,s.length-1);this.serverUrl=s,this.bcChannel=s+"/"+o,this.maxBackoffTime=m,this.params=c,this.protocols=a,this.roomname=o,this.doc=n,this._WS=h,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=f,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ct.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=u();t(e,0),et(e,n),this.ws.send(i(e))}}),d)),this._bcSubscriber=(t,e)=>{if(e!==this){const e=ht(this,new Uint8Array(t),!1);A(e)>1&&tt(this.bcChannel,i(e),this)}},this._updateHandler=(s,o)=>{if(o!==this){const o=u();t(o,0),((s,i)=>{t(s,2),e(s,i)})(o,s),mt(this,i(o))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:s,updated:o,removed:n})=>{const r=s.concat(o).concat(n),c=u();t(c,1),e(c,lt(l,r)),mt(this,i(c))},this._exitHandler=()=>{rt(this.awareness,[n.clientID],"app closed")},O&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<T()-this.wsLastMessageReceived&&dt(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const t=(()=>U(this.params,((t,e)=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===t.length?"":"?"+t)}get synced(){return this._synced}set synced(t){this._synced!==t&&(this._synced=t,this.emit("synced",[t]),this.emit("sync",[t]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),O&&"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||(((t,e)=>{Z(this.bcChannel).subs.add(e)})(0,this._bcSubscriber),this.bcconnected=!0);const s=u();t(s,0),et(s,this.doc),tt(this.bcChannel,i(s),this);const o=u();t(o,0),st(o,this.doc),tt(this.bcChannel,i(o),this);const n=u();t(n,3),tt(this.bcChannel,i(n),this);const r=u();t(r,1),e(r,lt(this.awareness,[this.doc.clientID])),tt(this.bcChannel,i(r),this)}disconnectBc(){const s=u();t(s,1),e(s,lt(this.awareness,[this.doc.clientID],new Map)),mt(this,i(s)),this.bcconnected&&(((t,e)=>{const s=Z(t);s.subs.delete(e)&&0===s.subs.size&&(s.bc.close(),q.delete(t))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&dt(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(ut(this),this.connectBc())}}class pt{provider;isConnected=!1;constructor(t,e,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||t;this.provider=new ft(i,o,e,{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(t){return{create:(e,s)=>new pt(e,s,t)}}setupEventListeners(){this.provider.on("status",(({status:t})=>{"connected"===t?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===t&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(t=>{t&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((t,e)=>{const s=setTimeout((()=>{e(Error("WebSocket connection timeout"))}),1e4),i=({status:e})=>{"connected"===e&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,t())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,t())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class zt{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(t,e,s){const i=s?.name||t,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||zt.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const t={websocketProvider:n,name:i,document:e,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&&(t.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(t.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(t.onStatus=s.onStatus),this.provider=new R(t),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const t={url:o,name:i,document:e,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&&(t.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(t.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(t.onStatus=s.onStatus),s?.WebSocketPolyfill&&(t.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new R(t),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(t){if(zt.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),zt.sharedWebSocketProvider;const e={url:t.url};return t.WebSocketPolyfill&&(e.WebSocketPolyfill=t.WebSocketPolyfill),t.onConnect&&(e.onConnect=t.onConnect),t.onDisconnect&&(e.onDisconnect=t.onDisconnect),t.onStatus&&(e.onStatus=t.onStatus),zt.sharedWebSocketProvider=new X(e),console.info("Shared Hocuspocus WebSocket created: "+t.url),zt.sharedWebSocketProvider}static destroySharedWebSocket(){zt.sharedWebSocketProvider&&(zt.sharedWebSocketProvider.destroy(),zt.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return zt.sharedWebSocketProvider}static with(t){return{create:(e,s)=>new zt(e,s,t)}}async connect(){if(!this.isSynced)return new Promise(((t,e)=>{const s=setTimeout((()=>{e(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),t()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void t();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{Y as BroadcastSyncProvider,zt as HocuspocusSyncProvider,pt as WebSocketSyncProvider}
1
+ export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Bj_Og27M.js";export{b as KritzelBrushTool,a as KritzelPath,K as KritzelText,c as KritzelTextTool}from"./p-Cp15toXH.js";import{w as t,a as e,t as i,r as o,b as n,e as l,c as h,d,f as u,g as m,s as f,h as p,i as z,v as C,j as k,o as y,k as x,l as S,m as w,O as v,n as j,p as T,q as B,u as W,x as U,y as H,z as A,A as O,B as _,C as $,H as R,D as X}from"./p-exWKDgI8.js";export{N as IndexedDBSyncProvider,Q as KritzelAnchorManager,P as KritzelAppStateMap,L as KritzelCursorHelper,I as KritzelEraserTool,F as KritzelGroup,K as KritzelImage,J as KritzelImageTool,E as KritzelLine,G as KritzelLineTool,M as KritzelSelectionTool}from"./p-exWKDgI8.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{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{KritzelControlBrushConfig,defineCustomElement as defineCustomElementKritzelControlBrushConfig}from"./kritzel-control-brush-config.js";export{KritzelControlTextConfig,defineCustomElement as defineCustomElementKritzelControlTextConfig}from"./kritzel-control-text-config.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.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{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class Y{doc;channel;_synced=!1;constructor(t,e,s){this.doc=e,this.channel=new BroadcastChannel(t),this.channel.onmessage=t=>{this.handleMessage(t.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+t)}handleDocUpdate=(s,o)=>{if(o!==this){const o=u();t(o,0),e(o,s),this.channel.postMessage(i(o))}};handleMessage(s){const r=m(new Uint8Array(s));switch(o(r)){case 0:const s=n(r);h(this.doc,s,this);break;case 1:this.broadcastSync();break;case 2:const o=n(r),c=l(this.doc,o);if(c.length>0){const s=u();t(s,0),e(s,c),this.channel.postMessage(i(s))}}}broadcastSync(){const s=u();t(s,2),e(s,d(this.doc)),this.channel.postMessage(i(s))}async connect(){if(!this._synced)return new Promise((t=>{const e=()=>{this._synced?t():setTimeout(e,50)};e()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const q=new Map,V="undefined"==typeof BroadcastChannel?class{constructor(t){this.room=t,this.onmessage=null,this._onChange=e=>e.key===t&&null!==this.onmessage&&this.onmessage({data:z(e.newValue||"")}),y(this._onChange)}postMessage(t){C.setItem(this.room,k(x(t)))}close(){S(this._onChange)}}:BroadcastChannel,Z=t=>f(q,t,(()=>{const e=p(),s=new V(t);return s.onmessage=t=>e.forEach((e=>e(t.data,"broadcastchannel"))),{bc:s,subs:e}})),tt=(t,e,s=null)=>{const i=Z(t);i.bc.postMessage(e),i.subs.forEach((t=>t(e,s)))},et=(s,i)=>{t(s,0);const o=d(i);e(s,o)},st=(s,i,o)=>{t(s,1),e(s,l(i,o))},it=(t,e,s,i)=>{try{h(e,n(t),s)}catch(t){null!=i&&i(t),console.error("Caught error while handling a Yjs update",t)}},ot=it;class nt extends v{constructor(t){super(),this.doc=t,this.clientID=t.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const t=T();null!==this.getLocalState()&&15e3<=t-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const e=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=t-s.lastUpdated&&this.states.has(i)&&e.push(i)})),e.length>0&&rt(this,e,"timeout")}),j(3e3)),t.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(t){const e=this.clientID,s=this.meta.get(e),i=void 0===s?0:s.clock+1,o=this.states.get(e);null===t?this.states.delete(e):this.states.set(e,t),this.meta.set(e,{clock:i,lastUpdated:T()});const n=[],r=[],l=[],c=[];null===t?c.push(e):null==o?null!=t&&n.push(e):(r.push(e),B(o,t)||l.push(e)),(n.length>0||l.length>0||c.length>0)&&this.emit("change",[{added:n,updated:l,removed:c},"local"]),this.emit("update",[{added:n,updated:r,removed:c},"local"])}setLocalStateField(t,e){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[t]:e})}getStates(){return this.states}}const rt=(t,e,s)=>{const i=[];for(let s=0;s<e.length;s++){const o=e[s];if(t.states.has(o)){if(t.states.delete(o),o===t.clientID){const e=t.meta.get(o);t.meta.set(o,{clock:e.clock+1,lastUpdated:T()})}i.push(o)}}i.length>0&&(t.emit("change",[{added:[],updated:[],removed:i},s]),t.emit("update",[{added:[],updated:[],removed:i},s]))},lt=(e,s,o=e.states)=>{const n=s.length,r=u();t(r,n);for(let i=0;i<n;i++){const n=s[i],l=o.get(n)||null,c=e.meta.get(n).clock;t(r,n),t(r,c),W(r,JSON.stringify(l))}return i(r)},ct=[];ct[0]=(e,s,i,r)=>{t(e,0);const l=((t,e,s,i,r)=>{const l=o(t);switch(l){case 0:((t,e,s)=>{st(e,s,n(t))})(t,e,s);break;case 1:it(t,s,i,r);break;case 2:ot(t,s,i,r);break;default:throw Error("Unknown message type")}return l})(s,e,i.doc,i);r&&1===l&&!i.synced&&(i.synced=!0)},ct[3]=(s,i,o)=>{t(s,1),e(s,lt(o.awareness,Array.from(o.awareness.getStates().keys())))},ct[1]=(t,e,s)=>{((t,e,s)=>{const i=m(e),n=T(),r=[],l=[],c=[],a=[],h=o(i);for(let e=0;e<h;e++){const e=o(i);let s=o(i);const h=JSON.parse(w(i)),d=t.meta.get(e),u=t.states.get(e),m=void 0===d?0:d.clock;(m<s||m===s&&null===h&&t.states.has(e))&&(null===h?e===t.clientID&&null!=t.getLocalState()?s++:t.states.delete(e):t.states.set(e,h),t.meta.set(e,{clock:s,lastUpdated:n}),void 0===d&&null!==h?r.push(e):void 0!==d&&null===h?a.push(e):null!==h&&(B(h,u)||c.push(e),l.push(e)))}(r.length>0||c.length>0||a.length>0)&&t.emit("change",[{added:r,updated:c,removed:a},s]),(r.length>0||l.length>0||a.length>0)&&t.emit("update",[{added:r,updated:l,removed:a},s])})(s.awareness,n(e),s)},ct[2]=(t,e,s)=>{((t,e,s)=>{0===o(t)&&s(0,w(t))})(e,0,((t,e)=>at(s,e)))};const at=(t,e)=>console.warn(`Permission denied to access ${t.url}.\n${e}`),ht=(t,e,s)=>{const i=m(e),n=u(),r=o(i),l=t.messageHandlers[r];return l?l(n,i,t,s,r):console.error("Unable to compute message"),n},dt=(t,e,s)=>{e===t.ws&&(t.emit("connection-close",[s,t]),t.ws=null,e.close(),t.wsconnecting=!1,t.wsconnected?(t.wsconnected=!1,t.synced=!1,rt(t.awareness,Array.from(t.awareness.getStates().keys()).filter((e=>e!==t.doc.clientID)),t),t.emit("status",[{status:"disconnected"}])):t.wsUnsuccessfulReconnects++,setTimeout(ut,_(100*$(2,t.wsUnsuccessfulReconnects),t.maxBackoffTime),t))},ut=s=>{if(s.shouldConnect&&null===s.ws){const o=new s._WS(s.url,s.protocols);o.binaryType="arraybuffer",s.ws=o,s.wsconnecting=!0,s.wsconnected=!1,s.synced=!1,o.onmessage=t=>{s.wsLastMessageReceived=T();const e=ht(s,new Uint8Array(t.data),!0);A(e)>1&&o.send(i(e))},o.onerror=t=>{s.emit("connection-error",[t,s])},o.onclose=t=>{dt(s,o,t)},o.onopen=()=>{s.wsLastMessageReceived=T(),s.wsconnecting=!1,s.wsconnected=!0,s.wsUnsuccessfulReconnects=0,s.emit("status",[{status:"connected"}]);const n=u();if(t(n,0),et(n,s.doc),o.send(i(n)),null!==s.awareness.getLocalState()){const n=u();t(n,1),e(n,lt(s.awareness,[s.doc.clientID])),o.send(i(n))}},s.emit("status",[{status:"connecting"}])}},mt=(t,e)=>{const s=t.ws;t.wsconnected&&s&&s.readyState===s.OPEN&&s.send(e),t.bcconnected&&tt(t.bcChannel,e,t)};class ft extends H{constructor(s,o,n,{connect:r=!0,awareness:l=new nt(n),params:c={},protocols:a=[],WebSocketPolyfill:h=WebSocket,resyncInterval:d=-1,maxBackoffTime:m=2500,disableBc:f=!1}={}){for(super();"/"===s[s.length-1];)s=s.slice(0,s.length-1);this.serverUrl=s,this.bcChannel=s+"/"+o,this.maxBackoffTime=m,this.params=c,this.protocols=a,this.roomname=o,this.doc=n,this._WS=h,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=f,this.wsUnsuccessfulReconnects=0,this.messageHandlers=ct.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=u();t(e,0),et(e,n),this.ws.send(i(e))}}),d)),this._bcSubscriber=(t,e)=>{if(e!==this){const e=ht(this,new Uint8Array(t),!1);A(e)>1&&tt(this.bcChannel,i(e),this)}},this._updateHandler=(s,o)=>{if(o!==this){const o=u();t(o,0),((s,i)=>{t(s,2),e(s,i)})(o,s),mt(this,i(o))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:s,updated:o,removed:n})=>{const r=s.concat(o).concat(n),c=u();t(c,1),e(c,lt(l,r)),mt(this,i(c))},this._exitHandler=()=>{rt(this.awareness,[n.clientID],"app closed")},O&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<T()-this.wsLastMessageReceived&&dt(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const t=(()=>U(this.params,((t,e)=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===t.length?"":"?"+t)}get synced(){return this._synced}set synced(t){this._synced!==t&&(this._synced=t,this.emit("synced",[t]),this.emit("sync",[t]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),O&&"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||(((t,e)=>{Z(this.bcChannel).subs.add(e)})(0,this._bcSubscriber),this.bcconnected=!0);const s=u();t(s,0),et(s,this.doc),tt(this.bcChannel,i(s),this);const o=u();t(o,0),st(o,this.doc),tt(this.bcChannel,i(o),this);const n=u();t(n,3),tt(this.bcChannel,i(n),this);const r=u();t(r,1),e(r,lt(this.awareness,[this.doc.clientID])),tt(this.bcChannel,i(r),this)}disconnectBc(){const s=u();t(s,1),e(s,lt(this.awareness,[this.doc.clientID],new Map)),mt(this,i(s)),this.bcconnected&&(((t,e)=>{const s=Z(t);s.subs.delete(e)&&0===s.subs.size&&(s.bc.close(),q.delete(t))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&dt(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(ut(this),this.connectBc())}}class pt{provider;isConnected=!1;constructor(t,e,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||t;this.provider=new ft(i,o,e,{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(t){return{create:(e,s)=>new pt(e,s,t)}}setupEventListeners(){this.provider.on("status",(({status:t})=>{"connected"===t?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===t&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(t=>{t&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((t,e)=>{const s=setTimeout((()=>{e(Error("WebSocket connection timeout"))}),1e4),i=({status:e})=>{"connected"===e&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,t())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,t())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class zt{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(t,e,s){const i=s?.name||t,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||zt.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const t={websocketProvider:n,name:i,document:e,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&&(t.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(t.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(t.onStatus=s.onStatus),this.provider=new R(t),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const t={url:o,name:i,document:e,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&&(t.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(t.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(t.onStatus=s.onStatus),s?.WebSocketPolyfill&&(t.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new R(t),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(t){if(zt.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),zt.sharedWebSocketProvider;const e={url:t.url};return t.WebSocketPolyfill&&(e.WebSocketPolyfill=t.WebSocketPolyfill),t.onConnect&&(e.onConnect=t.onConnect),t.onDisconnect&&(e.onDisconnect=t.onDisconnect),t.onStatus&&(e.onStatus=t.onStatus),zt.sharedWebSocketProvider=new X(e),console.info("Shared Hocuspocus WebSocket created: "+t.url),zt.sharedWebSocketProvider}static destroySharedWebSocket(){zt.sharedWebSocketProvider&&(zt.sharedWebSocketProvider.destroy(),zt.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return zt.sharedWebSocketProvider}static with(t){return{create:(e,s)=>new zt(e,s,t)}}async connect(){if(!this.isSynced)return new Promise(((t,e)=>{const s=setTimeout((()=>{e(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),t()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void t();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{Y as BroadcastSyncProvider,zt as HocuspocusSyncProvider,pt as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-B7Fdo5QJ.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-D4n7UbGY.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
@@ -1 +1 @@
1
- import{p as e,H as t,c as s,h as o,d as a,t as i}from"./p-Bj_Og27M.js";import{K as r,d as n}from"./p-DTezr6w9.js";import{S as c,R as l,T as p,M as f,G as d,I as m,U as k,J as h,V as b}from"./p-D3LRBk2t.js";import{b as u,c as g,d as y}from"./p-Cp15toXH.js";import{K as z}from"./p-n789Y3S-.js";import{K as j}from"./p-l10It7Nm.js";import{d as C}from"./p-CXzfYQ_u.js";import{d as w}from"./p-Du1vxHy8.js";import{d as E}from"./p-IAqZFssU.js";import{d as x}from"./p-CeKT_dTd.js";import{d as I}from"./p-C3UriJh7.js";import{d as R}from"./p-B7Fdo5QJ.js";import{d as O}from"./p-D1tfzpy8.js";import{d as v}from"./p-g0N9j_uT.js";import{d as W}from"./p-C4krHoUl.js";import{d as S}from"./p-C-d2IH4v.js";import{d as F}from"./p-BXaWhpO2.js";import{d as M,a as V}from"./p-1z-ds26_.js";import{d as D}from"./p-Cy77SpWt.js";import{d as T}from"./p-D5ZsALCP.js";import{d as A}from"./p-CF5L2Gdl.js";import{d as B}from"./p-BtuXeItZ.js";import{d as U}from"./p-DB5s1NY4.js";import{d as P}from"./p-4FEa4ADy.js";const K={type:"pen",color:"#000000",size:16,palettes:{pen:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#9fa8da","#d1c4e9"],highlighter:["#0000006e","#ff52526e","#ffbb006e","#00c8536e","#0000FF6e","#d500f96e","#fafafa6e","#a527146e","#ee81006e","#558b2f6e","#01579b6e","#8e24aa6e","#90a4ae6e","#ff40816e","#ff6e406e","#aeea006e","#304ffe6e","#7c4dff6e","#cfd8dc6e","#f8bbd06e","#ffccbc6e","#f0f4c36e","#9fa8da6e","#d1c4e96e"]}},Y={color:"#000000",size:8,fontFamily:"Arial",palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#9fa8da","#d1c4e9"]},_={color:"#000000",size:4,palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#b3e5fc","#e1bee7"],arrows:{end:{enabled:!0,style:"triangle"}}},G={shapeType:c.Rectangle,fillColor:"transparent",strokeColor:"#000000",strokeWidth:4,fontColor:"#000000",fontSize:16,fontFamily:"Arial",palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae"]},H=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.isReady=s(this,"isReady"),this.objectsChange=s(this,"objectsChange"),this.undoStateChange=s(this,"undoStateChange")}get host(){return this}scaleMax=l;scaleMin=p;controls=[{name:"selection",type:"tool",isDefault:!0,tool:f,icon:"cursor"},{name:"brush",type:"tool",tool:u,icon:"pen",config:K},{name:"line",type:"tool",tool:d,icon:"arrow",config:_},{name:"eraser",type:"tool",tool:m,icon:"eraser"},{name:"text",type:"tool",tool:g,icon:"type",config:Y},{name:"shape",type:"tool",tool:k,icon:"shape-rectangle",config:G,subOptions:[{id:"rectangle",icon:"shape-rectangle",label:"Rectangle",value:c.Rectangle,toolProperty:"shapeType"},{id:"ellipse",icon:"shape-ellipse",label:"Ellipse",value:c.Ellipse,toolProperty:"shapeType"},{id:"triangle",icon:"shape-triangle",label:"Triangle",value:c.Triangle,toolProperty:"shapeType"}]},{name:"image",type:"tool",tool:h,icon:"image"},{name:"config",type:"config"}];globalContextMenuItems=[{label:"Paste",icon:"paste",disabled:async()=>0===(await this.engineRef.getCopiedObjects()).length,action:e=>this.engineRef.paste(e.x,e.y)},{label:"Select All",icon:"select-all",action:()=>this.selectAllObjectsInViewport()}];objectContextMenuItems=[{label:"Copy",icon:"copy",action:()=>this.engineRef.copy()},{label:"Paste",icon:"paste",disabled:async()=>0===(await this.engineRef.getCopiedObjects()).length,action:e=>this.engineRef.paste(e.x,e.y)},{label:"Delete",icon:"delete",action:()=>this.engineRef.delete()},{label:"Bring to Front",icon:"bring-to-front",action:()=>this.engineRef.bringToFront()},{label:"Send to Back",icon:"send-to-back",action:()=>this.engineRef.sendToBack()},{label:"Group",icon:"group",disabled:async()=>(await this.engineRef.getSelectedObjects()).length<2,action:()=>this.engineRef.group()},{label:"Ungroup",icon:"ungroup",disabled:async()=>!(await this.engineRef.getSelectedObjects()).some((e=>"KritzelGroup"===e.__class__)),action:()=>this.engineRef.ungroup()}];customSvgIcons={};isControlsVisible=!0;isUtilityPanelVisible=!0;syncConfig;isReady;objectsChange;undoStateChange;isEngineReady=!1;isControlsReady=!1;isWorkspaceManagerReady=!1;workspaces=[];activeWorkspace;isVirtualKeyboardOpen=!1;undoState=null;onIsEngineReady(e){e&&this.isControlsReady&&this.checkIsReady()}onIsControlsReady(e){e&&this.isEngineReady&&this.checkIsReady()}onWorkspacesChange(e){if(this.activeWorkspace){const t=e.find((e=>e.id===this.activeWorkspace.id));t&&t!==this.activeWorkspace&&(this.activeWorkspace=t)}}onTouchStart(e){e.cancelable&&e.preventDefault()}async getObjectById(e){return this.engineRef.getObjectById(e)}async addObject(e){return this.engineRef.addObject(e)}async updateObject(e,t){return this.engineRef.updateObject(e,t)}async removeObject(e){return this.engineRef.removeObject(e)}async getSelectedObjects(){return this.engineRef.getSelectedObjects()}async selectObjects(e){return this.engineRef.selectObjects(e)}async selectAllObjectsInViewport(){return this.engineRef.selectAllObjectsInViewport()}async clearSelection(){this.engineRef.clearSelection()}async centerObjectInViewport(e){return this.engineRef.centerObjectInViewport(e)}async createWorkspace(e,t){const s=new z("workspace-"+Date.now(),e,t);return this.engineRef.createWorkspace(s)}async updateWorkspace(e){return this.engineRef.updateWorkspace(e)}async deleteWorkspace(e){return this.engineRef.deleteWorkspace(e)}async getWorkspaces(){return this.engineRef.getWorkspaces()}async getActiveWorkspace(){return this.engineRef.getActiveWorkspace()}engineRef;controlsRef;splitButtonRef;componentDidLoad(){this.registerCustomSvgIcons(),this.listenForMobileKeyboard(),this.setOsSpecificCssVariables()}async checkIsReady(){await customElements.whenDefined("kritzel-editor"),await customElements.whenDefined("kritzel-workspace-manager"),await customElements.whenDefined("kritzel-controls"),await customElements.whenDefined("kritzel-engine"),this.isEngineReady&&this.isControlsReady&&this.isWorkspaceManagerReady&&this.isReady.emit(this.host)}onEngineReady(e){this.isEngineReady=!0,this.activeWorkspace=e.detail.activeWorkspace,this.workspaces=e.detail.workspaces}handleWorkspacesChange(e){this.workspaces=e.detail}handleObjectsChange(e){this.objectsChange.emit(e.detail)}handleUndoStateChange(e){this.undoStateChange.emit(e.detail),this.undoState=e.detail}registerCustomSvgIcons(){for(const[e,t]of Object.entries(this.customSvgIcons))r.register(e,t)}listenForMobileKeyboard(){y.onKeyboardVisibleChanged((e=>{this.isVirtualKeyboardOpen=e}))}setOsSpecificCssVariables(){switch(j.detectOS()){case"iOS":this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","14px"),this.host.style.setProperty("--kritzel-editor-controls-transition","cubic-bezier(0.25, 0.1, 0.25, 1.0)"),this.host.style.setProperty("--kritzel-editor-controls-transform","translateY(200%)"),this.host.style.setProperty("--kritzel-editor-controls-transition-duration","0.25s");break;case"Android":this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","24px");break;default:this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","14px")}}render(){return o(a,{key:"dd67bea86f807f0ccd5905183e73713a015d6bee"},o("kritzel-workspace-manager",{key:"557edc7e3a131d338be6df91698ba6923e7bc50e",workspaces:this.workspaces,activeWorkspace:this.activeWorkspace,onWorkspaceChange:e=>this.activeWorkspace=e.detail,onIsWorkspaceManagerReady:()=>this.isWorkspaceManagerReady=!0}),o("kritzel-engine",{key:"98969d0f2bb5a9a365885fb4765e0c04c1394caa",ref:e=>this.engineRef=e,workspace:this.activeWorkspace,syncConfig:this.syncConfig,scaleMax:this.scaleMax,scaleMin:this.scaleMin,globalContextMenuItems:this.globalContextMenuItems,objectContextMenuItems:this.objectContextMenuItems,onIsEngineReady:e=>this.onEngineReady(e),onWorkspacesChange:e=>this.handleWorkspacesChange(e),onObjectsChange:e=>this.handleObjectsChange(e),onUndoStateChange:e=>this.handleUndoStateChange(e)}),o("kritzel-controls",{key:"6092f393562af07643622c07d432f6100497aaf0",class:{"keyboard-open":this.isVirtualKeyboardOpen},style:{display:this.isControlsVisible?"flex":"none"},ref:e=>this.controlsRef=e,controls:this.controls,isUtilityPanelVisible:this.isUtilityPanelVisible,undoState:this.undoState,onIsControlsReady:()=>this.isControlsReady=!0}))}static get watchers(){return{isEngineReady:[{onIsEngineReady:0}],isControlsReady:[{onIsControlsReady:0}],workspaces:[{onWorkspacesChange:0}]}}static get style(){return"kritzel-editor{display:flex;margin:0;position:relative;overflow:hidden;width:100%;height:100%;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}kritzel-workspace-manager{position:absolute;top:var(--kritzel-editor-workspace-manager-top, 14px);left:var(--kritzel-editor-workspace-manager-left, 14px)}kritzel-controls{position:absolute;bottom:var(--kritzel-editor-controls-bottom, 14px);transition:transform var(--kritzel-editor-controls-transition-duration, 0.1s) var(--kritzel-editor-controls-transition, ease-in-out)}kritzel-controls.keyboard-open{transform:var(--kritzel-editor-controls-transform, translateY(300%))}"}},[512,"kritzel-editor",{scaleMax:[2,"scale-max"],scaleMin:[2,"scale-min"],controls:[16],globalContextMenuItems:[16],objectContextMenuItems:[16],customSvgIcons:[16],isControlsVisible:[4,"is-controls-visible"],isUtilityPanelVisible:[4,"is-utility-panel-visible"],syncConfig:[16],isEngineReady:[32],isControlsReady:[32],isWorkspaceManagerReady:[32],workspaces:[32],activeWorkspace:[32],isVirtualKeyboardOpen:[32],undoState:[32],getObjectById:[64],addObject:[64],updateObject:[64],removeObject:[64],getSelectedObjects:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],createWorkspace:[64],updateWorkspace:[64],deleteWorkspace:[64],getWorkspaces:[64],getActiveWorkspace:[64]},[[0,"dblclick","onTouchStart"]],{isEngineReady:[{onIsEngineReady:0}],isControlsReady:[{onIsControlsReady:0}],workspaces:[{onWorkspacesChange:0}]}]),L=H,X=function(){"undefined"!=typeof customElements&&["kritzel-editor","kritzel-color","kritzel-color-palette","kritzel-context-menu","kritzel-control-brush-config","kritzel-control-text-config","kritzel-controls","kritzel-cursor-trail","kritzel-dropdown","kritzel-engine","kritzel-font","kritzel-font-family","kritzel-font-size","kritzel-icon","kritzel-menu","kritzel-menu-item","kritzel-portal","kritzel-split-button","kritzel-stroke-size","kritzel-tooltip","kritzel-utility-panel","kritzel-workspace-manager"].forEach((e=>{switch(e){case"kritzel-editor":customElements.get(i(e))||customElements.define(i(e),H);break;case"kritzel-color":customElements.get(i(e))||C();break;case"kritzel-color-palette":customElements.get(i(e))||w();break;case"kritzel-context-menu":customElements.get(i(e))||E();break;case"kritzel-control-brush-config":customElements.get(i(e))||x();break;case"kritzel-control-text-config":customElements.get(i(e))||I();break;case"kritzel-controls":customElements.get(i(e))||R();break;case"kritzel-cursor-trail":customElements.get(i(e))||O();break;case"kritzel-dropdown":customElements.get(i(e))||v();break;case"kritzel-engine":customElements.get(i(e))||b();break;case"kritzel-font":customElements.get(i(e))||W();break;case"kritzel-font-family":customElements.get(i(e))||S();break;case"kritzel-font-size":customElements.get(i(e))||F();break;case"kritzel-icon":customElements.get(i(e))||n();break;case"kritzel-menu":customElements.get(i(e))||V();break;case"kritzel-menu-item":customElements.get(i(e))||M();break;case"kritzel-portal":customElements.get(i(e))||D();break;case"kritzel-split-button":customElements.get(i(e))||T();break;case"kritzel-stroke-size":customElements.get(i(e))||A();break;case"kritzel-tooltip":customElements.get(i(e))||B();break;case"kritzel-utility-panel":customElements.get(i(e))||U();break;case"kritzel-workspace-manager":customElements.get(i(e))||P()}}))};export{K as D,L as KritzelEditor,Y as a,_ as b,X as defineCustomElement}
1
+ import{p as e,H as t,c as s,h as o,d as a,t as i}from"./p-Bj_Og27M.js";import{K as r,d as n}from"./p-DTezr6w9.js";import{S as c,R as l,T as p,M as f,G as d,I as m,U as k,J as h,V as b}from"./p-exWKDgI8.js";import{b as u,c as g,d as y}from"./p-Cp15toXH.js";import{K as z}from"./p-n789Y3S-.js";import{K as j}from"./p-l10It7Nm.js";import{d as C}from"./p-CXzfYQ_u.js";import{d as w}from"./p-Du1vxHy8.js";import{d as E}from"./p-IAqZFssU.js";import{d as x}from"./p-CeKT_dTd.js";import{d as I}from"./p-C3UriJh7.js";import{d as R}from"./p-D4n7UbGY.js";import{d as O}from"./p-D1tfzpy8.js";import{d as W}from"./p-g0N9j_uT.js";import{d as v}from"./p-C4krHoUl.js";import{d as S}from"./p-C-d2IH4v.js";import{d as F}from"./p-BXaWhpO2.js";import{d as M,a as V}from"./p-1z-ds26_.js";import{d as D}from"./p-Cy77SpWt.js";import{d as T}from"./p-D5ZsALCP.js";import{d as A}from"./p-CF5L2Gdl.js";import{d as U}from"./p-BtuXeItZ.js";import{d as K}from"./p-XGgKC_Fe.js";import{d as P}from"./p-4FEa4ADy.js";const B={type:"pen",color:"#000000",size:16,palettes:{pen:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#9fa8da","#d1c4e9"],highlighter:["#0000006e","#ff52526e","#ffbb006e","#00c8536e","#0000FF6e","#d500f96e","#fafafa6e","#a527146e","#ee81006e","#558b2f6e","#01579b6e","#8e24aa6e","#90a4ae6e","#ff40816e","#ff6e406e","#aeea006e","#304ffe6e","#7c4dff6e","#cfd8dc6e","#f8bbd06e","#ffccbc6e","#f0f4c36e","#9fa8da6e","#d1c4e96e"]}},G={color:"#000000",size:8,fontFamily:"Arial",palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#9fa8da","#d1c4e9"]},_={color:"#000000",size:4,palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae","#ff4081","#ff6e40","#aeea00","#304ffe","#7c4dff","#cfd8dc","#f8bbd0","#ffccbc","#f0f4c3","#b3e5fc","#e1bee7"],arrows:{end:{enabled:!0,style:"triangle"}}},X={shapeType:c.Rectangle,fillColor:"transparent",strokeColor:"#000000",strokeWidth:4,fontColor:"#000000",fontSize:16,fontFamily:"Arial",palette:["#000000","#ff5252","#ffbc00","#00c853","#0000FF","#d500f9","#fafafa","#a52714","#ee8100","#558b2f","#01579b","#8e24aa","#90a4ae"]},Y=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.isReady=s(this,"isReady"),this.objectsChange=s(this,"objectsChange"),this.undoStateChange=s(this,"undoStateChange")}get host(){return this}scaleMax=l;scaleMin=p;controls=[{name:"selection",type:"tool",isDefault:!0,tool:f,icon:"cursor"},{name:"brush",type:"tool",tool:u,icon:"pen",config:B},{name:"line",type:"tool",tool:d,icon:"arrow",config:_},{name:"eraser",type:"tool",tool:m,icon:"eraser"},{name:"text",type:"tool",tool:g,icon:"type",config:G},{name:"shape",type:"tool",tool:k,icon:"shape-rectangle",config:X,subOptions:[{id:"rectangle",icon:"shape-rectangle",label:"Rectangle",value:c.Rectangle,toolProperty:"shapeType"},{id:"ellipse",icon:"shape-ellipse",label:"Ellipse",value:c.Ellipse,toolProperty:"shapeType"},{id:"triangle",icon:"shape-triangle",label:"Triangle",value:c.Triangle,toolProperty:"shapeType"}]},{name:"image",type:"tool",tool:h,icon:"image"},{name:"config",type:"config"}];globalContextMenuItems=[{label:"Paste",icon:"paste",disabled:async()=>0===(await this.engineRef.getCopiedObjects()).length,action:e=>this.engineRef.paste(e.x,e.y)},{label:"Select All",icon:"select-all",action:()=>this.selectAllObjectsInViewport()}];objectContextMenuItems=[{label:"Copy",icon:"copy",action:()=>this.engineRef.copy()},{label:"Paste",icon:"paste",disabled:async()=>0===(await this.engineRef.getCopiedObjects()).length,action:e=>this.engineRef.paste(e.x,e.y)},{label:"Delete",icon:"delete",action:()=>this.engineRef.delete()},{label:"Bring to Front",icon:"bring-to-front",action:()=>this.engineRef.bringToFront()},{label:"Send to Back",icon:"send-to-back",action:()=>this.engineRef.sendToBack()},{label:"Group",icon:"group",disabled:async()=>(await this.engineRef.getSelectedObjects()).length<2,action:()=>this.engineRef.group()},{label:"Ungroup",icon:"ungroup",disabled:async()=>!(await this.engineRef.getSelectedObjects()).some((e=>"KritzelGroup"===e.__class__)),action:()=>this.engineRef.ungroup()}];customSvgIcons={};isControlsVisible=!0;isUtilityPanelVisible=!0;syncConfig;isReady;objectsChange;undoStateChange;isEngineReady=!1;isControlsReady=!1;isWorkspaceManagerReady=!1;workspaces=[];activeWorkspace;isVirtualKeyboardOpen=!1;undoState=null;onIsEngineReady(e){e&&this.isControlsReady&&this.checkIsReady()}onIsControlsReady(e){e&&this.isEngineReady&&this.checkIsReady()}onWorkspacesChange(e){if(this.activeWorkspace){const t=e.find((e=>e.id===this.activeWorkspace.id));t&&t!==this.activeWorkspace&&(this.activeWorkspace=t)}}onTouchStart(e){e.cancelable&&e.preventDefault()}async getObjectById(e){return this.engineRef.getObjectById(e)}async addObject(e){return this.engineRef.addObject(e)}async updateObject(e,t){return this.engineRef.updateObject(e,t)}async removeObject(e){return this.engineRef.removeObject(e)}async getSelectedObjects(){return this.engineRef.getSelectedObjects()}async selectObjects(e){return this.engineRef.selectObjects(e)}async selectAllObjectsInViewport(){return this.engineRef.selectAllObjectsInViewport()}async clearSelection(){this.engineRef.clearSelection()}async centerObjectInViewport(e){return this.engineRef.centerObjectInViewport(e)}async createWorkspace(e,t){const s=new z("workspace-"+Date.now(),e,t);return this.engineRef.createWorkspace(s)}async updateWorkspace(e){return this.engineRef.updateWorkspace(e)}async deleteWorkspace(e){return this.engineRef.deleteWorkspace(e)}async getWorkspaces(){return this.engineRef.getWorkspaces()}async getActiveWorkspace(){return this.engineRef.getActiveWorkspace()}engineRef;controlsRef;splitButtonRef;componentDidLoad(){this.registerCustomSvgIcons(),this.listenForMobileKeyboard(),this.setOsSpecificCssVariables()}async checkIsReady(){await customElements.whenDefined("kritzel-editor"),await customElements.whenDefined("kritzel-workspace-manager"),await customElements.whenDefined("kritzel-controls"),await customElements.whenDefined("kritzel-engine"),this.isEngineReady&&this.isControlsReady&&this.isWorkspaceManagerReady&&this.isReady.emit(this.host)}onEngineReady(e){this.isEngineReady=!0,this.activeWorkspace=e.detail.activeWorkspace,this.workspaces=e.detail.workspaces}handleWorkspacesChange(e){this.workspaces=e.detail}handleObjectsChange(e){this.objectsChange.emit(e.detail)}handleUndoStateChange(e){this.undoStateChange.emit(e.detail),this.undoState=e.detail}registerCustomSvgIcons(){for(const[e,t]of Object.entries(this.customSvgIcons))r.register(e,t)}listenForMobileKeyboard(){y.onKeyboardVisibleChanged((e=>{this.isVirtualKeyboardOpen=e}))}setOsSpecificCssVariables(){switch(j.detectOS()){case"iOS":this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","14px"),this.host.style.setProperty("--kritzel-editor-controls-transition","cubic-bezier(0.25, 0.1, 0.25, 1.0)"),this.host.style.setProperty("--kritzel-editor-controls-transform","translateY(200%)"),this.host.style.setProperty("--kritzel-editor-controls-transition-duration","0.25s");break;case"Android":this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","24px");break;default:this.host.style.setProperty("--kritzel-editor-workspace-manager-top","14px"),this.host.style.setProperty("--kritzel-editor-workspace-manager-left","14px"),this.host.style.setProperty("--kritzel-editor-controls-bottom","14px")}}render(){return o(a,{key:"dd67bea86f807f0ccd5905183e73713a015d6bee"},o("kritzel-workspace-manager",{key:"557edc7e3a131d338be6df91698ba6923e7bc50e",workspaces:this.workspaces,activeWorkspace:this.activeWorkspace,onWorkspaceChange:e=>this.activeWorkspace=e.detail,onIsWorkspaceManagerReady:()=>this.isWorkspaceManagerReady=!0}),o("kritzel-engine",{key:"98969d0f2bb5a9a365885fb4765e0c04c1394caa",ref:e=>this.engineRef=e,workspace:this.activeWorkspace,syncConfig:this.syncConfig,scaleMax:this.scaleMax,scaleMin:this.scaleMin,globalContextMenuItems:this.globalContextMenuItems,objectContextMenuItems:this.objectContextMenuItems,onIsEngineReady:e=>this.onEngineReady(e),onWorkspacesChange:e=>this.handleWorkspacesChange(e),onObjectsChange:e=>this.handleObjectsChange(e),onUndoStateChange:e=>this.handleUndoStateChange(e)}),o("kritzel-controls",{key:"6092f393562af07643622c07d432f6100497aaf0",class:{"keyboard-open":this.isVirtualKeyboardOpen},style:{display:this.isControlsVisible?"flex":"none"},ref:e=>this.controlsRef=e,controls:this.controls,isUtilityPanelVisible:this.isUtilityPanelVisible,undoState:this.undoState,onIsControlsReady:()=>this.isControlsReady=!0}))}static get watchers(){return{isEngineReady:[{onIsEngineReady:0}],isControlsReady:[{onIsControlsReady:0}],workspaces:[{onWorkspacesChange:0}]}}static get style(){return"kritzel-editor{display:flex;margin:0;position:relative;overflow:hidden;width:100%;height:100%;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}kritzel-workspace-manager{position:absolute;top:var(--kritzel-editor-workspace-manager-top, 14px);left:var(--kritzel-editor-workspace-manager-left, 14px)}kritzel-controls{position:absolute;bottom:var(--kritzel-editor-controls-bottom, 14px);transition:transform var(--kritzel-editor-controls-transition-duration, 0.1s) var(--kritzel-editor-controls-transition, ease-in-out)}kritzel-controls.keyboard-open{transform:var(--kritzel-editor-controls-transform, translateY(300%))}"}},[512,"kritzel-editor",{scaleMax:[2,"scale-max"],scaleMin:[2,"scale-min"],controls:[16],globalContextMenuItems:[16],objectContextMenuItems:[16],customSvgIcons:[16],isControlsVisible:[4,"is-controls-visible"],isUtilityPanelVisible:[4,"is-utility-panel-visible"],syncConfig:[16],isEngineReady:[32],isControlsReady:[32],isWorkspaceManagerReady:[32],workspaces:[32],activeWorkspace:[32],isVirtualKeyboardOpen:[32],undoState:[32],getObjectById:[64],addObject:[64],updateObject:[64],removeObject:[64],getSelectedObjects:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],createWorkspace:[64],updateWorkspace:[64],deleteWorkspace:[64],getWorkspaces:[64],getActiveWorkspace:[64]},[[0,"dblclick","onTouchStart"]],{isEngineReady:[{onIsEngineReady:0}],isControlsReady:[{onIsControlsReady:0}],workspaces:[{onWorkspacesChange:0}]}]),H=Y,L=function(){"undefined"!=typeof customElements&&["kritzel-editor","kritzel-color","kritzel-color-palette","kritzel-context-menu","kritzel-control-brush-config","kritzel-control-text-config","kritzel-controls","kritzel-cursor-trail","kritzel-dropdown","kritzel-engine","kritzel-font","kritzel-font-family","kritzel-font-size","kritzel-icon","kritzel-menu","kritzel-menu-item","kritzel-portal","kritzel-split-button","kritzel-stroke-size","kritzel-tooltip","kritzel-utility-panel","kritzel-workspace-manager"].forEach((e=>{switch(e){case"kritzel-editor":customElements.get(i(e))||customElements.define(i(e),Y);break;case"kritzel-color":customElements.get(i(e))||C();break;case"kritzel-color-palette":customElements.get(i(e))||w();break;case"kritzel-context-menu":customElements.get(i(e))||E();break;case"kritzel-control-brush-config":customElements.get(i(e))||x();break;case"kritzel-control-text-config":customElements.get(i(e))||I();break;case"kritzel-controls":customElements.get(i(e))||R();break;case"kritzel-cursor-trail":customElements.get(i(e))||O();break;case"kritzel-dropdown":customElements.get(i(e))||W();break;case"kritzel-engine":customElements.get(i(e))||b();break;case"kritzel-font":customElements.get(i(e))||v();break;case"kritzel-font-family":customElements.get(i(e))||S();break;case"kritzel-font-size":customElements.get(i(e))||F();break;case"kritzel-icon":customElements.get(i(e))||n();break;case"kritzel-menu":customElements.get(i(e))||V();break;case"kritzel-menu-item":customElements.get(i(e))||M();break;case"kritzel-portal":customElements.get(i(e))||D();break;case"kritzel-split-button":customElements.get(i(e))||T();break;case"kritzel-stroke-size":customElements.get(i(e))||A();break;case"kritzel-tooltip":customElements.get(i(e))||U();break;case"kritzel-utility-panel":customElements.get(i(e))||K();break;case"kritzel-workspace-manager":customElements.get(i(e))||P()}}))};export{B as D,H as KritzelEditor,G as a,_ as b,L as defineCustomElement}
@@ -1 +1 @@
1
- import{W as o,V as s}from"./p-D3LRBk2t.js";const t=o,p=s;export{t as KritzelEngine,p as defineCustomElement}
1
+ import{W as o,V as s}from"./p-exWKDgI8.js";const p=o,r=s;export{p as KritzelEngine,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as s,d as o}from"./p-DB5s1NY4.js";const p=s,r=o;export{p as KritzelUtilityPanel,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-XGgKC_Fe.js";const p=o,r=s;export{p as KritzelUtilityPanel,r as defineCustomElement}