kritzel-stencil 0.3.11 → 0.3.13

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 (178) hide show
  1. package/dist/cjs/{index-CFnj_FXt.js → index-Xav9JFHg.js} +1 -1
  2. package/dist/cjs/index.cjs.js +41 -3
  3. package/dist/cjs/kritzel-active-users_42.cjs.entry.js +344 -138
  4. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  5. package/dist/cjs/loader.cjs.js +2 -2
  6. package/dist/cjs/{schema.constants-BNMNpzvA.js → schema.constants-CMFOYyBj.js} +26 -43
  7. package/dist/cjs/stencil.cjs.js +3 -3
  8. package/dist/collection/classes/core/viewport.class.js +16 -8
  9. package/dist/collection/classes/objects/shape.class.js +3 -2
  10. package/dist/collection/classes/tools/base-tool.class.js +2 -0
  11. package/dist/collection/classes/tools/brush-tool.class.js +1 -0
  12. package/dist/collection/classes/tools/eraser-tool.class.js +1 -0
  13. package/dist/collection/classes/tools/image-tool.class.js +1 -0
  14. package/dist/collection/classes/tools/line-tool.class.js +1 -0
  15. package/dist/collection/classes/tools/selection-tool.class.js +1 -0
  16. package/dist/collection/classes/tools/shape-tool.class.js +1 -0
  17. package/dist/collection/classes/tools/text-tool.class.js +1 -0
  18. package/dist/collection/collection-manifest.json +1 -1
  19. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +166 -22
  20. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +408 -37
  21. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +3 -3
  22. package/dist/collection/components/shared/kritzel-input/kritzel-input.css +1 -1
  23. package/dist/collection/components/shared/kritzel-numeric-input/kritzel-numeric-input.css +2 -2
  24. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +7 -0
  25. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +7 -1
  26. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +27 -6
  27. package/dist/collection/components/ui/kritzel-export/kritzel-export.css +1 -1
  28. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.js +2 -2
  29. package/dist/collection/configs/default-asset-storage.config.js +1 -2
  30. package/dist/collection/configs/default-brush-tool.config.js +1 -0
  31. package/dist/collection/configs/default-line-tool.config.js +1 -0
  32. package/dist/collection/configs/default-shape-tool.config.js +1 -0
  33. package/dist/collection/configs/default-sync.config.js +2 -5
  34. package/dist/collection/configs/default-text-tool.config.js +1 -0
  35. package/dist/collection/constants/version.js +1 -1
  36. package/dist/collection/helpers/tool-config.helper.js +58 -65
  37. package/dist/collection/interfaces/tool-type.interface.js +1 -0
  38. package/dist/collection/themes/dark-theme.js +5 -0
  39. package/dist/collection/themes/light-theme.js +5 -0
  40. package/dist/components/index.js +1 -1
  41. package/dist/components/kritzel-active-users.js +1 -1
  42. package/dist/components/kritzel-avatar.js +1 -1
  43. package/dist/components/kritzel-awareness-cursors.js +1 -1
  44. package/dist/components/kritzel-back-to-content.js +1 -1
  45. package/dist/components/kritzel-brush-style.js +1 -1
  46. package/dist/components/kritzel-button.js +1 -1
  47. package/dist/components/kritzel-color-palette.js +1 -1
  48. package/dist/components/kritzel-color.js +1 -1
  49. package/dist/components/kritzel-context-menu.js +1 -1
  50. package/dist/components/kritzel-controls.js +1 -1
  51. package/dist/components/kritzel-current-user-dialog.js +1 -1
  52. package/dist/components/kritzel-current-user.js +1 -1
  53. package/dist/components/kritzel-cursor-trail.js +1 -1
  54. package/dist/components/kritzel-dialog.js +1 -1
  55. package/dist/components/kritzel-dropdown.js +1 -1
  56. package/dist/components/kritzel-editor.js +1 -1
  57. package/dist/components/kritzel-engine.js +1 -1
  58. package/dist/components/kritzel-export.js +1 -1
  59. package/dist/components/kritzel-font-family.js +1 -1
  60. package/dist/components/kritzel-font-size.js +1 -1
  61. package/dist/components/kritzel-font.js +1 -1
  62. package/dist/components/kritzel-icon.js +1 -1
  63. package/dist/components/kritzel-input.js +1 -1
  64. package/dist/components/kritzel-line-endings.js +1 -1
  65. package/dist/components/kritzel-login-dialog.js +1 -1
  66. package/dist/components/kritzel-master-detail.js +1 -1
  67. package/dist/components/kritzel-menu-item.js +1 -1
  68. package/dist/components/kritzel-menu.js +1 -1
  69. package/dist/components/kritzel-more-menu.js +1 -1
  70. package/dist/components/kritzel-numeric-input.js +1 -1
  71. package/dist/components/kritzel-opacity-slider.js +1 -1
  72. package/dist/components/kritzel-pill-tabs.js +1 -1
  73. package/dist/components/kritzel-portal.js +1 -1
  74. package/dist/components/kritzel-settings.js +1 -1
  75. package/dist/components/kritzel-shape-fill.js +1 -1
  76. package/dist/components/kritzel-share-dialog.js +1 -1
  77. package/dist/components/kritzel-slide-toggle.js +1 -1
  78. package/dist/components/kritzel-split-button.js +1 -1
  79. package/dist/components/kritzel-stroke-size.js +1 -1
  80. package/dist/components/kritzel-tool-config.js +1 -1
  81. package/dist/components/kritzel-tooltip.js +1 -1
  82. package/dist/components/kritzel-utility-panel.js +1 -1
  83. package/dist/components/kritzel-workspace-manager.js +1 -1
  84. package/dist/components/p-2xYAGd0I.js +1 -0
  85. package/dist/components/{p-DdmJquQr.js → p-B2Os1ya_.js} +1 -1
  86. package/dist/components/p-B2w8X7vn.js +1 -0
  87. package/dist/components/{p-DRB3TZzI.js → p-B4b6TDxp.js} +1 -1
  88. package/dist/components/p-B5xxfwKF.js +1 -0
  89. package/dist/components/p-B9hLySCl.js +1 -0
  90. package/dist/components/{p-D0aom7Yu.js → p-BFYtCsZu.js} +1 -1
  91. package/dist/components/{p-CARNM9pf.js → p-BFoK4W--.js} +1 -1
  92. package/dist/components/{p-x38RbGJA.js → p-BYmp9Ovv.js} +1 -1
  93. package/dist/components/{p-KVG5rztB.js → p-BbactVA0.js} +1 -1
  94. package/dist/components/{p-B_JH91jB.js → p-BfNHpqQ8.js} +1 -1
  95. package/dist/components/{p-DXgUuzXW.js → p-BiG1dxPS.js} +1 -1
  96. package/dist/components/{p-Dov3qOAR.js → p-Bj2laX89.js} +1 -1
  97. package/dist/components/{p-Cr7xOsIZ.js → p-BqwqGFQY.js} +1 -1
  98. package/dist/components/{p-DmTG0Y5h.js → p-BzYU3-MJ.js} +1 -1
  99. package/dist/components/p-C-aFOO5p.js +1 -0
  100. package/dist/components/p-C0TN5IAi.js +1 -0
  101. package/dist/components/{p-RnuCSIt-.js → p-C2SX-XRr.js} +1 -1
  102. package/dist/components/{p-guqEWGgV.js → p-CFgkUYoO.js} +1 -1
  103. package/dist/components/{p-BTSOqHMI.js → p-CHrSFOSI.js} +1 -1
  104. package/dist/components/p-CJOhfMU5.js +1 -0
  105. package/dist/components/{p-DJLJfKY2.js → p-COLHjboZ.js} +1 -1
  106. package/dist/components/{p-CKY7AvGR.js → p-COgo9OWy.js} +1 -1
  107. package/dist/components/p-CVzH1Oil.js +1 -0
  108. package/dist/components/{p-DhAM4qeQ.js → p-CXpv9Rxe.js} +1 -1
  109. package/dist/components/{p-Bp3kdH4l.js → p-CcyIAi9S.js} +1 -1
  110. package/dist/components/{p-COIxq81R.js → p-CmuNn1Tc.js} +1 -1
  111. package/dist/components/{p-DfH7YY2C.js → p-D-sRVAbQ.js} +1 -1
  112. package/dist/components/{p-ZgZqbJ58.js → p-DDYoDSrm.js} +1 -1
  113. package/dist/components/{p-u0b2RJAn.js → p-DEy7zJCe.js} +1 -1
  114. package/dist/components/{p-BPEn0_hr.js → p-DM11KXUT.js} +1 -1
  115. package/dist/components/{p-CJERvHdy.js → p-DbB730vO.js} +1 -1
  116. package/dist/components/{p-C8ggg-5h.js → p-Df3BwVGy.js} +1 -1
  117. package/dist/components/{p-Dx_xz_El.js → p-DlwYHzSj.js} +1 -1
  118. package/dist/components/p-DplAQ6jk.js +9 -0
  119. package/dist/components/{p-CJ2V42sz.js → p-FK7b3BGt.js} +1 -1
  120. package/dist/components/{p-CxtTuKCy.js → p-JhOYwUOj.js} +1 -1
  121. package/dist/components/{p-Dw9sKOsb.js → p-SptaSMno.js} +1 -1
  122. package/dist/components/{p-KjtNlFTl.js → p-UoPj5QjH.js} +1 -1
  123. package/dist/components/{p-CYR9wbJg.js → p-dcAernE1.js} +1 -1
  124. package/dist/components/{p-B0VnbmWu.js → p-ijIqLY9g.js} +1 -1
  125. package/dist/components/{p-BI_UUiTr.js → p-skWUIStn.js} +1 -1
  126. package/dist/components/{p-DgtrNOWm.js → p-x6doYeiI.js} +1 -1
  127. package/dist/esm/{index-D9HaikfQ.js → index-Dhio9uis.js} +1 -1
  128. package/dist/esm/index.js +42 -4
  129. package/dist/esm/kritzel-active-users_42.entry.js +344 -138
  130. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  131. package/dist/esm/loader.js +3 -3
  132. package/dist/esm/{schema.constants-CqBoZbmA.js → schema.constants-NrtFvKER.js} +27 -43
  133. package/dist/esm/stencil.js +4 -4
  134. package/dist/stencil/index.esm.js +1 -1
  135. package/dist/stencil/p-9adee165.entry.js +9 -0
  136. package/dist/stencil/p-NrtFvKER.js +1 -0
  137. package/dist/stencil/{p-69298b5f.entry.js → p-fb32cd8f.entry.js} +1 -1
  138. package/dist/stencil/stencil.esm.js +1 -1
  139. package/dist/types/classes/core/viewport.class.d.ts +8 -0
  140. package/dist/types/classes/objects/base-object.class.d.ts +1 -1
  141. package/dist/types/classes/objects/shape.class.d.ts +1 -1
  142. package/dist/types/classes/tools/base-tool.class.d.ts +3 -0
  143. package/dist/types/classes/tools/brush-tool.class.d.ts +1 -0
  144. package/dist/types/classes/tools/eraser-tool.class.d.ts +1 -0
  145. package/dist/types/classes/tools/image-tool.class.d.ts +1 -0
  146. package/dist/types/classes/tools/line-tool.class.d.ts +1 -0
  147. package/dist/types/classes/tools/selection-tool.class.d.ts +1 -0
  148. package/dist/types/classes/tools/shape-tool.class.d.ts +1 -0
  149. package/dist/types/classes/tools/text-tool.class.d.ts +1 -0
  150. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +5 -0
  151. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +48 -0
  152. package/dist/types/components/ui/kritzel-context-menu/kritzel-context-menu.d.ts +1 -0
  153. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +1 -0
  154. package/dist/types/components.d.ts +69 -14
  155. package/dist/types/configs/default-asset-storage.config.d.ts +1 -1
  156. package/dist/types/configs/default-sync.config.d.ts +1 -1
  157. package/dist/types/constants/version.d.ts +1 -1
  158. package/dist/types/interfaces/object.interface.d.ts +1 -1
  159. package/dist/types/interfaces/theme.interface.d.ts +8 -3
  160. package/dist/types/interfaces/tool-config.interface.d.ts +3 -6
  161. package/dist/types/interfaces/tool-type.interface.d.ts +1 -0
  162. package/dist/types/interfaces/tool.interface.d.ts +1 -0
  163. package/dist/types/interfaces/toolbar-control.interface.d.ts +4 -0
  164. package/dist/types/stencil-public-runtime.d.ts +1 -0
  165. package/package.json +1 -1
  166. package/dist/components/p-BFgWBbpu.js +0 -1
  167. package/dist/components/p-C0wFAtT_.js +0 -1
  168. package/dist/components/p-CB7ynHtI.js +0 -1
  169. package/dist/components/p-CWgI1dA0.js +0 -1
  170. package/dist/components/p-D15NO5kE.js +0 -1
  171. package/dist/components/p-DH-H7om7.js +0 -1
  172. package/dist/components/p-DLlIaDNn.js +0 -9
  173. package/dist/components/p-IiG44Unz.js +0 -1
  174. package/dist/components/p-K7ySy791.js +0 -1
  175. package/dist/stencil/p-94992a11.entry.js +0 -9
  176. package/dist/stencil/p-CqBoZbmA.js +0 -1
  177. /package/dist/components/{p-BWj1eE2b.js → p-B43upypT.js} +0 -0
  178. /package/dist/stencil/{p-D9HaikfQ.js → p-Dhio9uis.js} +0 -0
@@ -9,7 +9,7 @@
9
9
  display: flex;
10
10
  align-items: center;
11
11
  border: 1px solid var(--kritzel-dropdown-border-color, #ebebeb);
12
- border-radius: 6px;
12
+ border-radius: var(--kritzel-dropdown-border-radius, 6px);
13
13
  overflow: visible;
14
14
  height: 38px;
15
15
  width: 100%;
@@ -35,7 +35,7 @@
35
35
  height: 100%;
36
36
  width: 100%;
37
37
  box-sizing: border-box;
38
- border-radius: 6px;
38
+ border-radius: var(--kritzel-dropdown-border-radius, 6px);
39
39
  border: none;
40
40
  background-color: var(--kritzel-dropdown-background, #ffffff);
41
41
  cursor: var(--kritzel-global-pointer-cursor, pointer);
@@ -103,7 +103,7 @@
103
103
  list-style: none;
104
104
  background-color: var(--kritzel-dropdown-background, #ffffff);
105
105
  border: 1px solid var(--kritzel-global-border-color, #ebebeb);
106
- border-radius: 6px;
106
+ border-radius: var(--kritzel-dropdown-menu-border-radius, var(--kritzel-dropdown-border-radius, 6px));
107
107
  box-shadow: var(--kritzel-controls-box-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
108
108
  z-index: 1000;
109
109
  max-height: 240px;
@@ -18,7 +18,7 @@
18
18
  display: flex;
19
19
  align-items: center;
20
20
  border: 1px solid var(--kritzel-text-input-border-color, #ebebeb);
21
- border-radius: 6px;
21
+ border-radius: var(--kritzel-text-input-border-radius, 6px);
22
22
  overflow: hidden;
23
23
  background: var(--kritzel-text-input-background, #ffffff);
24
24
  transition: border-color 150ms ease;
@@ -23,7 +23,7 @@
23
23
  flex: 1;
24
24
  padding: 8px 36px 8px 12px;
25
25
  border: 1px solid var(--kritzel-numeric-input-border-color, #ebebeb);
26
- border-radius: 6px;
26
+ border-radius: var(--kritzel-numeric-input-border-radius, 6px);
27
27
  font-size: 14px;
28
28
  color: var(--kritzel-numeric-input-text-color, #333333);
29
29
  background-color: var(--kritzel-numeric-input-input-background, #ffffff);
@@ -66,7 +66,7 @@
66
66
  display: flex;
67
67
  flex-direction: column;
68
68
  border-left: 1px solid var(--kritzel-numeric-input-border-color, #ebebeb);
69
- border-radius: 0 5px 5px 0;
69
+ border-radius: 0 var(--kritzel-numeric-input-spinner-border-radius, 5px) var(--kritzel-numeric-input-spinner-border-radius, 5px) 0;
70
70
  overflow: hidden;
71
71
  }
72
72
 
@@ -3,6 +3,8 @@
3
3
  }
4
4
 
5
5
  .menu-container {
6
+ position: relative;
7
+ z-index: 1;
6
8
  display: flex;
7
9
  flex-direction: column;
8
10
  gap: var(--kritzel-context-menu-item-spacing, 2px);
@@ -33,6 +35,7 @@
33
35
  white-space: nowrap;
34
36
  -webkit-tap-highlight-color: transparent;
35
37
  width: 100%;
38
+ min-width: 0;
36
39
  }
37
40
 
38
41
  .menu-item:not(.disabled):hover,
@@ -68,6 +71,9 @@
68
71
 
69
72
  .label {
70
73
  flex-grow: 1;
74
+ min-width: 0;
75
+ overflow: hidden;
76
+ text-overflow: ellipsis;
71
77
  }
72
78
 
73
79
  .submenu-arrow {
@@ -85,6 +91,7 @@
85
91
  position: absolute;
86
92
  top: 0;
87
93
  left: 100%;
94
+ z-index: 2;
88
95
  margin-left: 4px;
89
96
  display: flex;
90
97
  flex-direction: column;
@@ -113,6 +113,11 @@ export class KritzelContextMenu {
113
113
  const idx = path.lastIndexOf('.');
114
114
  return idx === -1 ? '' : path.substring(0, idx);
115
115
  }
116
+ getMenuDepth(path) {
117
+ if (!path)
118
+ return 0;
119
+ return path.split('.').length;
120
+ }
116
121
  pruneStaleRefs() {
117
122
  const openPaths = new Set(this.getOpenSubmenuPaths());
118
123
  for (const key of Array.from(this.submenuRefs.keys())) {
@@ -224,7 +229,8 @@ export class KritzelContextMenu {
224
229
  }
225
230
  renderSubmenu(processedChildren, path) {
226
231
  const position = this.submenuPositions[path] === 'left' ? 'left' : 'right';
227
- return (h("div", { class: { 'submenu-container': true, 'position-left': position === 'left' }, key: `submenu-${path}`, ref: el => el && this.submenuRefs.set(path, el), onMouseEnter: () => this.handleSubmenuMouseEnter(), onMouseLeave: () => this.handleSubmenuMouseLeave(path) }, this.renderItems(processedChildren, path)));
232
+ const zIndex = this.getMenuDepth(path) + 1;
233
+ return (h("div", { class: { 'submenu-container': true, 'position-left': position === 'left' }, key: `submenu-${path}`, style: { zIndex: String(zIndex) }, ref: el => el && this.submenuRefs.set(path, el), onMouseEnter: () => this.handleSubmenuMouseEnter(), onMouseLeave: () => this.handleSubmenuMouseLeave(path) }, this.renderItems(processedChildren, path)));
228
234
  }
229
235
  render() {
230
236
  if (!this.processedItems || this.processedItems.length === 0) {
@@ -6,6 +6,7 @@ import { KritzelToolConfigHelper } from "../../../helpers/tool-config.helper";
6
6
  import { KritzelColorHelper } from "../../../helpers/color.helper";
7
7
  export class KritzelControls {
8
8
  host;
9
+ visible = true;
9
10
  controls = [];
10
11
  activeControl = null;
11
12
  isUtilityPanelVisible = true;
@@ -230,13 +231,13 @@ export class KritzelControls {
230
231
  // Separate tool controls from config control
231
232
  const toolControls = this.internalControls.filter(c => c.type === 'tool' || c.type === 'separator');
232
233
  const configControl = this.internalControls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
233
- return (h(Host, { key: 'b567aac7bca12cc5ffb0ee1eb9e6978636aa3c31', class: {
234
+ return (h(Host, { key: '0f40a136a6a9556080d922d346318045794421a8', style: { display: this.visible ? '' : 'none' }, class: {
234
235
  mobile: this.isTouchDevice,
235
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '88e8ae9ae7429987724df70895b02a3f59216364', style: {
236
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: 'd543e7575cb30e54d9362eddf7c7221fb8cce5f5', style: {
236
237
  position: 'absolute',
237
238
  bottom: '56px',
238
239
  left: '12px',
239
- }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '658e3d7b94e49a002d5057c1fb4fc199a371c48d', class: "kritzel-controls" }, h("div", { key: 'b54bb52a43e4a94ae1148cd4e75528bcaad681ef', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: '36ce760357d3228141281a45c0ac7b0024b04795', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
240
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '1083380152e9d1b51c35da335533c20ca2ca8fcc', class: "kritzel-controls" }, h("div", { key: '11ef0fb76c30ffda0e30f01d43229ca2142a5854', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: '269924a8859aece37ff31202307d4feaecbbde86', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
240
241
  // Check if this control has sub-options (split-button)
241
242
  if (control.subOptions?.length) {
242
243
  const selectedSubOption = this.getSelectedSubOption(control);
@@ -266,10 +267,10 @@ export class KritzelControls {
266
267
  'kritzel-control': true,
267
268
  'selected': this.activeControl?.name === control?.name,
268
269
  }, key: control.name, "data-testid": `tool-${control.name}`, onClick: _event => this.handleControlClick?.(control), "aria-label": control.name.charAt(0).toUpperCase() + control.name.slice(1) }, h("kritzel-icon", { name: control.icon })));
269
- })), h("div", { key: 'f0b1e0f74fe197f4d39e307e7dd8dd4819c4b183', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
270
+ })), h("div", { key: '8b97a5bba3ac4992482e8f433d7ba6197918a914', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
270
271
  'kritzel-config-container': true,
271
272
  'visible': hasConfigUI,
272
- }, key: configControl.name }, h("div", { key: '51cc3ebf13092e710048441ff64856edd4f53dfc', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: 'dcace186ae3ece1d7e943f51b48ed5094d847284', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: '9b16ac90f335fec3c043545fa0c5b363ab99924e', tool: this.activeControl.tool, theme: this.theme, engine: this.kritzelEngine, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: '2425507968e27a01b66c1d7be79a40ebe77cd27d', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
273
+ }, key: configControl.name }, h("div", { key: 'd9adef8c2acc8d9b9d745174050ce78960b89b58', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '7605bbd2b6335c89c57aa68952293f26efad6b4b', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: '27b0f41442215e78b692fa44bb665444a4993b89', tool: this.activeControl.tool, theme: this.theme, engine: this.kritzelEngine, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: '1fb5979b1c531593acf5086861b22b7d78d03e8d', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
273
274
  if (el)
274
275
  this.configTriggerRef = el;
275
276
  }, onKeyDown: event => {
@@ -278,7 +279,7 @@ export class KritzelControls {
278
279
  }
279
280
  }, style: {
280
281
  cursor: 'pointer',
281
- } }, this.displayValues && (h("div", { key: 'd2499df3c0a90c101957f55664452739e0f1692b', class: "color-container" }, h("kritzel-color", { key: 'b7cfcd3a8579c63f508c2786eecace1223e88974', value: this.displayValues.color, theme: this.theme, size: 18, style: {
282
+ } }, this.displayValues && (h("div", { key: '3713ef344630f6b4d88df2e83992018859ddb18c', class: "color-container" }, h("kritzel-color", { key: 'c2679f68efae77c6daeb98be9e03d5320d51a73a', value: this.displayValues.color, theme: this.theme, size: 18, style: {
282
283
  borderRadius: '50%',
283
284
  border: 'none',
284
285
  } })))))))));
@@ -298,6 +299,26 @@ export class KritzelControls {
298
299
  static get assetsDirs() { return ["../assets"]; }
299
300
  static get properties() {
300
301
  return {
302
+ "visible": {
303
+ "type": "boolean",
304
+ "mutable": false,
305
+ "complexType": {
306
+ "original": "boolean",
307
+ "resolved": "boolean",
308
+ "references": {}
309
+ },
310
+ "required": false,
311
+ "optional": false,
312
+ "docs": {
313
+ "tags": [],
314
+ "text": ""
315
+ },
316
+ "getter": false,
317
+ "setter": false,
318
+ "reflect": false,
319
+ "attribute": "visible",
320
+ "defaultValue": "true"
321
+ },
301
322
  "controls": {
302
323
  "type": "unknown",
303
324
  "mutable": false,
@@ -41,7 +41,7 @@
41
41
  background-color: var(--kritzel-global-primary-color, #007AFF);
42
42
  color: var(--kritzel-global-primary-text-color, #fff);
43
43
  border: none;
44
- border-radius: 8px;
44
+ border-radius: var(--kritzel-button-border-radius, 8px);
45
45
  font-size: 14px;
46
46
  font-weight: 600;
47
47
  cursor: pointer;
@@ -237,7 +237,7 @@ export class KritzelToolConfig {
237
237
  "mutable": true,
238
238
  "complexType": {
239
239
  "original": "ConfigurableTool",
240
- "resolved": "KritzelBrushTool | KritzelLineTool | KritzelSelectionTool | KritzelShapeTool | KritzelTextTool",
240
+ "resolved": "KritzelBaseTool",
241
241
  "references": {
242
242
  "ConfigurableTool": {
243
243
  "location": "import",
@@ -348,7 +348,7 @@ export class KritzelToolConfig {
348
348
  },
349
349
  "complexType": {
350
350
  "original": "ConfigurableTool",
351
- "resolved": "KritzelBrushTool | KritzelLineTool | KritzelSelectionTool | KritzelShapeTool | KritzelTextTool",
351
+ "resolved": "KritzelBaseTool",
352
352
  "references": {
353
353
  "ConfigurableTool": {
354
354
  "location": "import",
@@ -1,4 +1,3 @@
1
- import { IndexedDBAssetProvider } from "../classes/providers/assets/indexeddb-asset-provider.class";
2
1
  /**
3
2
  * Default asset storage configuration. Stores bytes in IndexedDB only,
4
3
  * which provides offline-friendly behavior out of the box. Applications
@@ -6,5 +5,5 @@ import { IndexedDBAssetProvider } from "../classes/providers/assets/indexeddb-as
6
5
  * (e.g. HttpAssetProvider) so images are available across devices.
7
6
  */
8
7
  export const DEFAULT_ASSET_STORAGE_CONFIG = {
9
- providers: [IndexedDBAssetProvider],
8
+ providers: [],
10
9
  };
@@ -4,6 +4,7 @@ export const DEFAULT_BRUSH_CONFIG = {
4
4
  type: 'pen',
5
5
  color: DEFAULT_COLOR_PALETTE[0],
6
6
  size: 16,
7
+ opacity: 1,
7
8
  palettes: {
8
9
  pen: [...DEFAULT_COLOR_PALETTE],
9
10
  },
@@ -3,6 +3,7 @@ import { DEFAULT_STROKE_SIZES } from "../constants/stroke-size.constants";
3
3
  export const DEFAULT_LINE_TOOL_CONFIG = {
4
4
  color: DEFAULT_COLOR_PALETTE[0],
5
5
  size: 4,
6
+ opacity: 1,
6
7
  palette: [...DEFAULT_COLOR_PALETTE],
7
8
  sizes: [...DEFAULT_STROKE_SIZES],
8
9
  arrows: {
@@ -6,6 +6,7 @@ export const DEFAULT_SHAPE_CONFIG = {
6
6
  fillColor: { light: 'transparent', dark: 'transparent' },
7
7
  strokeColor: DEFAULT_COLOR_PALETTE[0],
8
8
  strokeWidth: 4,
9
+ opacity: 1,
9
10
  fontColor: DEFAULT_COLOR_PALETTE[0],
10
11
  fontSize: 16,
11
12
  fontFamily: 'Arial',
@@ -1,9 +1,6 @@
1
- import { IndexedDBSyncProvider } from "../classes/providers/sync/indexeddb-sync-provider.class";
2
1
  /**
3
- * Default sync configuration - IndexedDB
2
+ * Default sync configuration - None
4
3
  */
5
4
  export const DEFAULT_SYNC_CONFIG = {
6
- providers: [
7
- IndexedDBSyncProvider
8
- ],
5
+ providers: [],
9
6
  };
@@ -3,6 +3,7 @@ import { DEFAULT_FONT_SIZES } from "../constants/stroke-size.constants";
3
3
  export const DEFAULT_TEXT_CONFIG = {
4
4
  color: DEFAULT_COLOR_PALETTE[0],
5
5
  size: 8,
6
+ opacity: 1,
6
7
  fontFamily: 'Arial',
7
8
  palette: [...DEFAULT_COLOR_PALETTE],
8
9
  sizes: [...DEFAULT_FONT_SIZES],
@@ -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.3.11';
6
+ export const KRITZEL_VERSION = '0.3.13';
@@ -1,70 +1,63 @@
1
- import { KritzelBrushTool } from "../classes/tools/brush-tool.class";
2
- import { KritzelLineTool } from "../classes/tools/line-tool.class";
3
- import { KritzelShapeTool } from "../classes/tools/shape-tool.class";
4
- import { KritzelTextTool } from "../classes/tools/text-tool.class";
5
- import { KritzelSelectionTool } from "../classes/tools/selection-tool.class";
6
1
  export class KritzelToolConfigHelper {
7
2
  static getToolConfig(tool) {
8
- const toolConstructorName = tool?.constructor?.name;
9
- if (tool instanceof KritzelSelectionTool || toolConstructorName === 'KritzelSelectionTool') {
10
- return tool.getToolConfig();
3
+ switch (tool?.toolType) {
4
+ case 'selection':
5
+ return 'getToolConfig' in tool && typeof tool.getToolConfig === 'function'
6
+ ? tool.getToolConfig()
7
+ : null;
8
+ case 'brush':
9
+ return {
10
+ type: 'brush',
11
+ colorProperty: 'color',
12
+ sizeProperty: 'size',
13
+ opacityProperty: 'opacity',
14
+ paletteSource: 'palette',
15
+ sizesSource: 'sizes',
16
+ controls: [
17
+ { type: 'stroke-size', propertyName: 'size' },
18
+ ],
19
+ };
20
+ case 'line':
21
+ return {
22
+ type: 'line',
23
+ colorProperty: 'color',
24
+ sizeProperty: 'size',
25
+ opacityProperty: 'opacity',
26
+ paletteSource: 'palette',
27
+ sizesSource: 'sizes',
28
+ controls: [
29
+ { type: 'stroke-size', propertyName: 'size' },
30
+ { type: 'line-endings', propertyName: 'arrows', additionalProps: {} },
31
+ ],
32
+ };
33
+ case 'shape':
34
+ return {
35
+ type: 'shape',
36
+ colorProperty: 'strokeColor',
37
+ sizeProperty: 'strokeWidth',
38
+ opacityProperty: 'opacity',
39
+ paletteSource: 'palette',
40
+ sizesSource: 'sizes',
41
+ controls: [
42
+ { type: 'stroke-size', propertyName: 'strokeWidth' },
43
+ { type: 'shape-fill', propertyName: 'fillColor', additionalProps: {} },
44
+ ],
45
+ };
46
+ case 'text':
47
+ return {
48
+ type: 'text',
49
+ colorProperty: 'fontColor',
50
+ sizeProperty: 'fontSize',
51
+ opacityProperty: 'opacity',
52
+ paletteSource: 'palette',
53
+ sizesSource: 'sizes',
54
+ controls: [
55
+ { type: 'font-size', propertyName: 'fontSize', additionalProps: {} },
56
+ { type: 'font-family', propertyName: 'fontFamily' },
57
+ ],
58
+ };
59
+ default:
60
+ return null;
11
61
  }
12
- if (tool instanceof KritzelBrushTool || toolConstructorName === 'KritzelBrushTool') {
13
- return {
14
- type: 'brush',
15
- colorProperty: 'color',
16
- sizeProperty: 'size',
17
- opacityProperty: 'opacity',
18
- paletteSource: 'palette',
19
- sizesSource: 'sizes',
20
- controls: [
21
- { type: 'stroke-size', propertyName: 'size' },
22
- ],
23
- };
24
- }
25
- if (tool instanceof KritzelLineTool || toolConstructorName === 'KritzelLineTool') {
26
- return {
27
- type: 'line',
28
- colorProperty: 'color',
29
- sizeProperty: 'size',
30
- opacityProperty: 'opacity',
31
- paletteSource: 'palette',
32
- sizesSource: 'sizes',
33
- controls: [
34
- { type: 'stroke-size', propertyName: 'size' },
35
- { type: 'line-endings', propertyName: 'arrows', additionalProps: {} },
36
- ],
37
- };
38
- }
39
- if (tool instanceof KritzelShapeTool || toolConstructorName === 'KritzelShapeTool') {
40
- return {
41
- type: 'shape',
42
- colorProperty: 'strokeColor',
43
- sizeProperty: 'strokeWidth',
44
- opacityProperty: 'opacity',
45
- paletteSource: 'palette',
46
- sizesSource: 'sizes',
47
- controls: [
48
- { type: 'stroke-size', propertyName: 'strokeWidth' },
49
- { type: 'shape-fill', propertyName: 'fillColor', additionalProps: {} },
50
- ],
51
- };
52
- }
53
- if (tool instanceof KritzelTextTool || toolConstructorName === 'KritzelTextTool') {
54
- return {
55
- type: 'text',
56
- colorProperty: 'fontColor',
57
- sizeProperty: 'fontSize',
58
- opacityProperty: 'opacity',
59
- paletteSource: 'palette',
60
- sizesSource: 'sizes',
61
- controls: [
62
- { type: 'font-size', propertyName: 'fontSize', additionalProps: {} },
63
- { type: 'font-family', propertyName: 'fontFamily' },
64
- ],
65
- };
66
- }
67
- // Tool is not configurable (e.g., selection, eraser, image)
68
- return null;
69
62
  }
70
63
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -25,6 +25,7 @@ export const darkTheme = {
25
25
  textInput: {
26
26
  background: '#1a1a1a',
27
27
  borderColor: '#4a4a4a',
28
+ borderRadius: '6px',
28
29
  focusBorderColor: '#ffffff',
29
30
  hoverBorderColor: '#5a5a5a',
30
31
  labelColor: '#e0e0e0',
@@ -112,9 +113,11 @@ export const darkTheme = {
112
113
  dropdown: {
113
114
  accentColor: '#0A84FF',
114
115
  borderColor: '#4a4a4a',
116
+ borderRadius: '6px',
115
117
  hoverBorderColor: '#5a5a5a',
116
118
  background: '#1a1a1a',
117
119
  hoverBackgroundColor: '#3a3a3a',
120
+ menuBorderRadius: '6px',
118
121
  selectedBackgroundColor: 'rgba(10, 132, 255, 0.2)',
119
122
  textColor: '#e0e0e0',
120
123
  },
@@ -191,6 +194,7 @@ export const darkTheme = {
191
194
  },
192
195
  numericInput: {
193
196
  borderColor: '#4a4a4a',
197
+ borderRadius: '6px',
194
198
  focusBorderColor: '#ffffff',
195
199
  hoverBorderColor: '#5a5a5a',
196
200
  inputBackground: '#1a1a1a',
@@ -199,6 +203,7 @@ export const darkTheme = {
199
203
  selectionColor: '#ffffff',
200
204
  spinnerActiveBackground: 'hsl(0, 0%, 100%, 12%)',
201
205
  spinnerBackground: 'transparent',
206
+ spinnerBorderRadius: '5px',
202
207
  spinnerColor: '#e0e0e0',
203
208
  spinnerHoverBackground: 'hsl(0, 0%, 100%, 8%)',
204
209
  textColor: '#e0e0e0',
@@ -25,6 +25,7 @@ export const lightTheme = {
25
25
  textInput: {
26
26
  background: '#ffffff',
27
27
  borderColor: '#dbdbdb',
28
+ borderRadius: '6px',
28
29
  focusBorderColor: '#333333',
29
30
  hoverBorderColor: '#cccccc',
30
31
  labelColor: '#333333',
@@ -114,8 +115,10 @@ export const lightTheme = {
114
115
  accentColor: '#007bff',
115
116
  background: '#ffffff',
116
117
  borderColor: '#dbdbdb',
118
+ borderRadius: '6px',
117
119
  hoverBorderColor: '#cccccc',
118
120
  hoverBackgroundColor: '#f0f0f0',
121
+ menuBorderRadius: '6px',
119
122
  selectedBackgroundColor: '#007bff1a',
120
123
  textColor: '#333333',
121
124
  },
@@ -193,6 +196,7 @@ export const lightTheme = {
193
196
  numericInput: {
194
197
  focusBorderColor: '#333333',
195
198
  borderColor: '#dbdbdb',
199
+ borderRadius: '6px',
196
200
  hoverBorderColor: '#cccccc',
197
201
  inputBackground: '#ffffff',
198
202
  labelColor: '#666666',
@@ -200,6 +204,7 @@ export const lightTheme = {
200
204
  selectionColor: '#ffffff',
201
205
  spinnerActiveBackground: 'hsl(0, 0%, 0%, 8.6%)',
202
206
  spinnerBackground: 'transparent',
207
+ spinnerBorderRadius: '5px',
203
208
  spinnerColor: '#333333',
204
209
  spinnerHoverBackground: 'hsl(0, 0%, 0%, 4.3%)',
205
210
  textColor: '#333333',
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-BWj1eE2b.js";export{K as KritzelBaseObject,b as KritzelLine,a as KritzelPath}from"./p-guqEWGgV.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,i as KritzelAssetResolver,d as KritzelBrushTool,b as KritzelGroup,a as KritzelImage,e as KritzelLineTool,h as KritzelSelectionTool,c as KritzelShape,g as KritzelShapeTool,K as KritzelText,f as KritzelTextTool,S as ShapeType}from"./p-BFgWBbpu.js";export{A as APP_STATE_MIGRATIONS,I as IndexedDBSyncProvider,d as KritzelAlignment,c as KritzelAnchorManager,b as KritzelCursorHelper,K as KritzelEraserTool,a as KritzelImageTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-DLlIaDNn.js";import*as t from"yjs";import{WebsocketProvider as n}from"y-websocket";import{H as o,a as m}from"./kritzel-editor.js";export{d as DEFAULT_ASSET_STORAGE_CONFIG,D as DEFAULT_BRUSH_CONFIG,c as DEFAULT_LINE_TOOL_CONFIG,b as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelWorkspace,W as WORKSPACE_EXPORT_VERSION}from"./p-DhMlShij.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-DH-H7om7.js";export{C as CURRENT_APP_STATE_SCHEMA_VERSION,a as CURRENT_WORKSPACE_SCHEMA_VERSION}from"./p-CW-VyJgK.js";export{KritzelActiveUsers,defineCustomElement as defineCustomElementKritzelActiveUsers}from"./kritzel-active-users.js";export{KritzelAvatar,defineCustomElement as defineCustomElementKritzelAvatar}from"./kritzel-avatar.js";export{KritzelAwarenessCursors,defineCustomElement as defineCustomElementKritzelAwarenessCursors}from"./kritzel-awareness-cursors.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelButton,defineCustomElement as defineCustomElementKritzelButton}from"./kritzel-button.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCurrentUser,defineCustomElement as defineCustomElementKritzelCurrentUser}from"./kritzel-current-user.js";export{KritzelCurrentUserDialog,defineCustomElement as defineCustomElementKritzelCurrentUserDialog}from"./kritzel-current-user-dialog.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelInput,defineCustomElement as defineCustomElementKritzelInput}from"./kritzel-input.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelLoginDialog,defineCustomElement as defineCustomElementKritzelLoginDialog}from"./kritzel-login-dialog.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPillTabs,defineCustomElement as defineCustomElementKritzelPillTabs}from"./kritzel-pill-tabs.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelShareDialog,defineCustomElement as defineCustomElementKritzelShareDialog}from"./kritzel-share-dialog.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";const u=Math.floor,z=127,p=Number.MAX_SAFE_INTEGER;class E{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const y=()=>new E,w=e=>{const t=new Uint8Array((e=>{let t=e.cpos;for(let s=0;s<e.bufs.length;s++)t+=e.bufs[s].length;return t})(e));let s=0;for(let i=0;i<e.bufs.length;i++){const n=e.bufs[i];t.set(n,s),s+=n.length}return t.set(new Uint8Array(e.cbuf.buffer,0,e.cpos),s),t},k=(e,t)=>{const s=e.cbuf.length;e.cpos===s&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(2*s),e.cpos=0),e.cbuf[e.cpos++]=t},x=(e,t)=>{for(;t>z;)k(e,128|z&t),t=u(t/128);k(e,z&t)},T=(e,t)=>{x(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,n=((e,t)=>e<t?e:t)(s-i,t.length),o=t.length-n;e.cbuf.set(t.subarray(0,n),i),e.cpos+=n,o>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,o)),e.cbuf.set(t.subarray(n)),e.cpos=o)})(e,t)},j=e=>Error(e),P=j("Unexpected end of array"),v=j("Integer out of Range");class U{constructor(e){this.arr=e,this.pos=0}}const M=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,F(e)),F=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&z)*s,s*=128,i<128)return t;if(t>p)throw v}throw P};class _{type="local";doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),s?.quiet||console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,t)=>{if(t!==this){const t=y();x(t,0),T(t,e),this.channel.postMessage(w(t))}};handleMessage(e){const s=(e=>new U(e))(new Uint8Array(e));switch(F(s)){case 0:const e=M(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=M(s),n=t.encodeStateAsUpdate(this.doc,i);if(n.length>0){const e=y();x(e,0),T(e,n),this.channel.postMessage(w(e))}}}broadcastSync(){const e=y();x(e,2),T(e,t.encodeStateVector(this.doc)),this.channel.postMessage(w(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const O=new Map;class ${type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,s)=>{s!==this&&O.set(this.cacheKey,t.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=O.get(this.cacheKey);e&&t.applyUpdate(this.doc,e,this),this.doc.on("update",this.handleUpdate),this.isConnected=!0}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleUpdate),this.isConnected=!1}static clear(e){void 0!==e?O.delete(e):O.clear()}}class H{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new n(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new H(t,s,n)}}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class B{type="network";provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;isDestroyed=!1;connectTimeout=null;pendingConnectReject=null;connectionTimeoutMs;_connectionStatus="disconnected";visibilityHandler=null;onlineHandler=null;get awareness(){return this.provider.awareness}get connectionStatus(){return this._connectionStatus}static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,n=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||B.sharedWebSocketProvider,l={};void 0!==s?.delay&&(l.delay=s.delay),void 0!==s?.factor&&(l.factor=s.factor),void 0!==s?.maxAttempts&&(l.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(l.minDelay=s.minDelay),void 0!==s?.maxDelay&&(l.maxDelay=s.maxDelay);const a=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},c=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},m=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},d=e=>{this.isDestroyed||("connecting"===e.status&&(this._connectionStatus="connecting"),s?.onStatus&&s.onStatus(e))};if(r){this.usesSharedSocket=!0;const e={websocketProvider:r,name:i,document:t,token:s?.token||null,onStatus:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new o(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:n,name:i,document:t,token:s?.token||null,autoConnect:!1,onStatus:d,onConnect:a,onDisconnect:c,onSynced:m,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new o(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${n}/${i}`)}this.setupBrowserEventListeners()}setupBrowserEventListeners(){"undefined"!=typeof document&&(this.visibilityHandler=()=>{"visible"!==document.visibilityState||this.isConnected||this.isDestroyed||this.provider.connect()},document.addEventListener("visibilitychange",this.visibilityHandler)),"undefined"!=typeof window&&(this.onlineHandler=()=>{this.isConnected||this.isDestroyed||this.provider.connect()},window.addEventListener("online",this.onlineHandler))}removeBrowserEventListeners(){this.visibilityHandler&&"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&"undefined"!=typeof window&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null)}static createSharedWebSocket(e){if(B.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),B.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),B.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),B.sharedWebSocketProvider}static destroySharedWebSocket(){B.sharedWebSocketProvider&&(B.sharedWebSocketProvider.destroy(),B.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return B.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new B(t,s,n)}}}async connect(){if(!this.isSynced&&!this.isDestroyed)return this._connectionStatus="connecting",new Promise(((e,t)=>{this.pendingConnectReject=t,this.connectTimeout=setTimeout((()=>{this.pendingConnectReject=null,this.connectTimeout=null,t(Error("Hocuspocus connection timeout"))}),this.connectionTimeoutMs);const s=()=>{this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),this.isDestroyed||e()};if(this.provider.on("synced",s),this.provider.isSynced)return this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}async reconnect(){return this.disconnect(),this.connect()}disconnect(){this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}destroy(){this.isDestroyed=!0,this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.removeBrowserEventListeners(),this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}}class R{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new R(e)}}async init(){this._options.quiet||console.info("HttpAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=t.id??this.generateUuid(),i={...t,id:s},n=await(this._options.headers?.())??{},o=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(o,e,i,n)).id??s,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.resolveUrl(e)}async fetch(e){const t=await this._options.resolveUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to fetch asset ${e}: ${i.status} ${i.statusText}`);return i.blob()}async delete(e){if(!this._options.deleteUrl)return;const t=await this._options.deleteUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{method:"DELETE",headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to delete asset ${e}: ${i.status} ${i.statusText}`);this._options.quiet||console.info("HttpAssetProvider: deleted asset "+e)}defaultUpload=async(e,t,s,i)=>{const n=new FormData;n.append("metadata",JSON.stringify(s)),n.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const o=await fetch(e,{method:"POST",headers:i,body:n});if(!o.ok)throw Error(`[HttpAssetProvider] Upload failed: ${o.status} ${o.statusText}`);return(o.headers.get("content-type")||"").includes("application/json")?await o.json():{}};extensionFromMime(e){const t=e.indexOf("/");return t>=0?e.slice(t+1):"bin"}generateUuid(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();const e=crypto.getRandomValues(new Uint8Array(16));e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e,(e=>e.toString(16).padStart(2,"0"))).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}}class N{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new N(e)}}async init(){this._options.quiet||console.info("PresignedAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=await this._options.getUploadDescriptor(t),i=s.method??"PUT",n={...s.headers??{}};let o;if(n["Content-Type"]||n["content-type"]||(n["Content-Type"]=t.mimeType),"POST"===i&&s.fields){const t=new FormData;for(const[e,i]of Object.entries(s.fields))t.append(e,i);t.append("file",e),o=t,delete n["Content-Type"],delete n["content-type"]}else o=e;const r=await fetch(s.url,{method:i,headers:n,body:o});if(!r.ok)throw Error(`[PresignedAssetProvider] Upload failed: ${r.status} ${r.statusText}`);return{id:s.id,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.getDownloadUrl(e)}async fetch(e){const t=await this._options.getDownloadUrl(e),s=await fetch(t);if(!s.ok)throw Error(`[PresignedAssetProvider] Failed to fetch asset ${e}: ${s.status} ${s.statusText}`);return s.blob()}async delete(e){this._options.deleteAsset&&(await this._options.deleteAsset(e),this._options.quiet||console.info("PresignedAssetProvider: deleted asset "+e))}}export{_ as BroadcastSyncProvider,B as HocuspocusSyncProvider,R as HttpAssetProvider,$ as InMemorySyncProvider,N as PresignedAssetProvider,H as WebSocketSyncProvider}
1
+ export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-B43upypT.js";export{K as KritzelBaseObject,b as KritzelLine,a as KritzelPath}from"./p-CFgkUYoO.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,f as KritzelAssetResolver,b as KritzelGroup,a as KritzelImage,e as KritzelSelectionTool,c as KritzelShape,K as KritzelText,d as KritzelTextTool,S as ShapeType}from"./p-B9hLySCl.js";export{A as APP_STATE_MIGRATIONS,g as KritzelAlignment,f as KritzelAnchorManager,K as KritzelBrushTool,e as KritzelCursorHelper,b as KritzelEraserTool,c as KritzelImageTool,a as KritzelLineTool,d as KritzelShapeTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-DplAQ6jk.js";import*as t from"yjs";import{IndexeddbPersistence as i}from"y-indexeddb";import{WebsocketProvider as n}from"y-websocket";import{H as o,a as m}from"./kritzel-editor.js";export{d as DEFAULT_ASSET_STORAGE_CONFIG,D as DEFAULT_BRUSH_CONFIG,c as DEFAULT_LINE_TOOL_CONFIG,b as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{K as KritzelWorkspace,W as WORKSPACE_EXPORT_VERSION}from"./p-DhMlShij.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-2xYAGd0I.js";export{C as CURRENT_APP_STATE_SCHEMA_VERSION,a as CURRENT_WORKSPACE_SCHEMA_VERSION}from"./p-CW-VyJgK.js";export{KritzelActiveUsers,defineCustomElement as defineCustomElementKritzelActiveUsers}from"./kritzel-active-users.js";export{KritzelAvatar,defineCustomElement as defineCustomElementKritzelAvatar}from"./kritzel-avatar.js";export{KritzelAwarenessCursors,defineCustomElement as defineCustomElementKritzelAwarenessCursors}from"./kritzel-awareness-cursors.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelButton,defineCustomElement as defineCustomElementKritzelButton}from"./kritzel-button.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCurrentUser,defineCustomElement as defineCustomElementKritzelCurrentUser}from"./kritzel-current-user.js";export{KritzelCurrentUserDialog,defineCustomElement as defineCustomElementKritzelCurrentUserDialog}from"./kritzel-current-user-dialog.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelInput,defineCustomElement as defineCustomElementKritzelInput}from"./kritzel-input.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelLoginDialog,defineCustomElement as defineCustomElementKritzelLoginDialog}from"./kritzel-login-dialog.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPillTabs,defineCustomElement as defineCustomElementKritzelPillTabs}from"./kritzel-pill-tabs.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelShareDialog,defineCustomElement as defineCustomElementKritzelShareDialog}from"./kritzel-share-dialog.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";const u=Math.floor,h=127,p=Number.MAX_SAFE_INTEGER;class z{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const E=()=>new z,y=e=>{const t=new Uint8Array((e=>{let t=e.cpos;for(let s=0;s<e.bufs.length;s++)t+=e.bufs[s].length;return t})(e));let s=0;for(let i=0;i<e.bufs.length;i++){const n=e.bufs[i];t.set(n,s),s+=n.length}return t.set(new Uint8Array(e.cbuf.buffer,0,e.cpos),s),t},w=(e,t)=>{const s=e.cbuf.length;e.cpos===s&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(2*s),e.cpos=0),e.cbuf[e.cpos++]=t},k=(e,t)=>{for(;t>h;)w(e,128|h&t),t=u(t/128);w(e,h&t)},x=(e,t)=>{k(e,t.byteLength),((e,t)=>{const s=e.cbuf.length,i=e.cpos,n=((e,t)=>e<t?e:t)(s-i,t.length),o=t.length-n;e.cbuf.set(t.subarray(0,n),i),e.cpos+=n,o>0&&(e.bufs.push(e.cbuf),e.cbuf=new Uint8Array(((e,t)=>e>t?e:t)(2*s,o)),e.cbuf.set(t.subarray(n)),e.cpos=o)})(e,t)},T=e=>Error(e),j=T("Unexpected end of array"),P=T("Integer out of Range");class v{constructor(e){this.arr=e,this.pos=0}}const U=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,M(e)),M=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&h)*s,s*=128,i<128)return t;if(t>p)throw P}throw j};class F{type="local";doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),s?.quiet||console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,t)=>{if(t!==this){const t=E();k(t,0),x(t,e),this.channel.postMessage(y(t))}};handleMessage(e){const s=(e=>new v(e))(new Uint8Array(e));switch(M(s)){case 0:const e=U(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=U(s),n=t.encodeStateAsUpdate(this.doc,i);if(n.length>0){const e=E();k(e,0),x(e,n),this.channel.postMessage(y(e))}}}broadcastSync(){const e=E();k(e,2),x(e,t.encodeStateVector(this.doc)),this.channel.postMessage(y(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const _=new Map;class O{type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,s)=>{s!==this&&_.set(this.cacheKey,t.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=_.get(this.cacheKey);e&&t.applyUpdate(this.doc,e,this),this.doc.on("update",this.handleUpdate),this.isConnected=!0}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleUpdate),this.isConnected=!1}static clear(e){void 0!==e?_.delete(e):_.clear()}}class ${type="local";provider;isConnected=!1;constructor(e,t,s){this.provider=new i(s?.name||e,t)}async connect(){if(!this.isConnected)return new Promise((e=>{this.provider.on("synced",(()=>{this.isConnected=!0,e()}))}))}disconnect(){this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class H{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new n(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new H(t,s,n)}}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class R{type="network";provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;isDestroyed=!1;connectTimeout=null;pendingConnectReject=null;connectionTimeoutMs;_connectionStatus="disconnected";visibilityHandler=null;onlineHandler=null;get awareness(){return this.provider.awareness}get connectionStatus(){return this._connectionStatus}static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,n=s?.url||"ws://localhost:1234";this.connectionTimeoutMs=s?.connectionTimeout??1e4;const r=s?.websocketProvider||R.sharedWebSocketProvider,l={};void 0!==s?.delay&&(l.delay=s.delay),void 0!==s?.factor&&(l.factor=s.factor),void 0!==s?.maxAttempts&&(l.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(l.minDelay=s.minDelay),void 0!==s?.maxDelay&&(l.maxDelay=s.maxDelay);const a=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},c=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},d=()=>{this.isDestroyed||(this.isSynced=!0,this._connectionStatus="synced",s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced())},m=e=>{this.isDestroyed||("connecting"===e.status&&(this._connectionStatus="connecting"),s?.onStatus&&s.onStatus(e))};if(r){this.usesSharedSocket=!0;const e={websocketProvider:r,name:i,document:t,token:s?.token||null,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new o(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:n,name:i,document:t,token:s?.token||null,autoConnect:!1,onStatus:m,onConnect:a,onDisconnect:c,onSynced:d,...l};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new o(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${n}/${i}`)}this.setupBrowserEventListeners()}setupBrowserEventListeners(){"undefined"!=typeof document&&(this.visibilityHandler=()=>{"visible"!==document.visibilityState||this.isConnected||this.isDestroyed||this.provider.connect()},document.addEventListener("visibilitychange",this.visibilityHandler)),"undefined"!=typeof window&&(this.onlineHandler=()=>{this.isConnected||this.isDestroyed||this.provider.connect()},window.addEventListener("online",this.onlineHandler))}removeBrowserEventListeners(){this.visibilityHandler&&"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.onlineHandler&&"undefined"!=typeof window&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null)}static createSharedWebSocket(e){if(R.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),R.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),R.sharedWebSocketProvider=new m(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),R.sharedWebSocketProvider}static destroySharedWebSocket(){R.sharedWebSocketProvider&&(R.sharedWebSocketProvider.destroy(),R.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return R.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new R(t,s,n)}}}async connect(){if(!this.isSynced&&!this.isDestroyed)return this._connectionStatus="connecting",new Promise(((e,t)=>{this.pendingConnectReject=t,this.connectTimeout=setTimeout((()=>{this.pendingConnectReject=null,this.connectTimeout=null,t(Error("Hocuspocus connection timeout"))}),this.connectionTimeoutMs);const s=()=>{this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),this.isDestroyed||e()};if(this.provider.on("synced",s),this.provider.isSynced)return this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject=null,this.provider.off("synced",s),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}async reconnect(){return this.disconnect(),this.connect()}disconnect(){this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}destroy(){this.isDestroyed=!0,this.connectTimeout&&(clearTimeout(this.connectTimeout),this.connectTimeout=null),this.pendingConnectReject&&(this.pendingConnectReject=null),this.removeBrowserEventListeners(),this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected"}}class B{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new B(e)}}async init(){this._options.quiet||console.info("HttpAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=t.id??this.generateUuid(),i={...t,id:s},n=await(this._options.headers?.())??{},o=await this._options.uploadUrl(i),r=this._options.upload??this.defaultUpload;return{id:(await r(o,e,i,n)).id??s,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.resolveUrl(e)}async fetch(e){const t=await this._options.resolveUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to fetch asset ${e}: ${i.status} ${i.statusText}`);return i.blob()}async delete(e){if(!this._options.deleteUrl)return;const t=await this._options.deleteUrl(e),s=await(this._options.headers?.())??{},i=await fetch(t,{method:"DELETE",headers:s});if(!i.ok)throw Error(`[HttpAssetProvider] Failed to delete asset ${e}: ${i.status} ${i.statusText}`);this._options.quiet||console.info("HttpAssetProvider: deleted asset "+e)}defaultUpload=async(e,t,s,i)=>{const n=new FormData;n.append("metadata",JSON.stringify(s)),n.append("file",t,s.originalFilename||`${s.id}.${this.extensionFromMime(s.mimeType)}`);const o=await fetch(e,{method:"POST",headers:i,body:n});if(!o.ok)throw Error(`[HttpAssetProvider] Upload failed: ${o.status} ${o.statusText}`);return(o.headers.get("content-type")||"").includes("application/json")?await o.json():{}};extensionFromMime(e){const t=e.indexOf("/");return t>=0?e.slice(t+1):"bin"}generateUuid(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();const e=crypto.getRandomValues(new Uint8Array(16));e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e,(e=>e.toString(16).padStart(2,"0"))).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}}class N{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new N(e)}}async init(){this._options.quiet||console.info("PresignedAssetProvider initialized")}destroy(){}canResolve(e){return!0}async put(e,t){const s=await this._options.getUploadDescriptor(t),i=s.method??"PUT",n={...s.headers??{}};let o;if(n["Content-Type"]||n["content-type"]||(n["Content-Type"]=t.mimeType),"POST"===i&&s.fields){const t=new FormData;for(const[e,i]of Object.entries(s.fields))t.append(e,i);t.append("file",e),o=t,delete n["Content-Type"],delete n["content-type"]}else o=e;const r=await fetch(s.url,{method:i,headers:n,body:o});if(!r.ok)throw Error(`[PresignedAssetProvider] Upload failed: ${r.status} ${r.statusText}`);return{id:s.id,kind:t.kind??"file",mimeType:t.mimeType,size:e.size,createdAt:Date.now(),width:t.width,height:t.height,durationMs:t.durationMs,originalFilename:t.originalFilename}}async resolve(e){return this._options.getDownloadUrl(e)}async fetch(e){const t=await this._options.getDownloadUrl(e),s=await fetch(t);if(!s.ok)throw Error(`[PresignedAssetProvider] Failed to fetch asset ${e}: ${s.status} ${s.statusText}`);return s.blob()}async delete(e){this._options.deleteAsset&&(await this._options.deleteAsset(e),this._options.quiet||console.info("PresignedAssetProvider: deleted asset "+e))}}export{F as BroadcastSyncProvider,R as HocuspocusSyncProvider,B as HttpAssetProvider,O as InMemorySyncProvider,$ as IndexedDBSyncProvider,N as PresignedAssetProvider,H as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-DXgUuzXW.js";const p=o,r=s;export{p as KritzelActiveUsers,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-BiG1dxPS.js";const p=o,r=s;export{p as KritzelActiveUsers,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-B_JH91jB.js";const p=o,r=s;export{p as KritzelAvatar,r as defineCustomElement}
1
+ import{K as o,d as p}from"./p-BfNHpqQ8.js";const s=o,r=p;export{s as KritzelAvatar,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as r}from"./p-BPEn0_hr.js";const s=o,p=r;export{s as KritzelAwarenessCursors,p as defineCustomElement}
1
+ import{K as o,d as s}from"./p-DM11KXUT.js";const p=o,r=s;export{p as KritzelAwarenessCursors,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-Dov3qOAR.js";const p=o,r=s;export{p as KritzelBackToContent,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-Bj2laX89.js";const a=o,p=s;export{a as KritzelBackToContent,p as defineCustomElement}
@@ -1 +1 @@
1
- import{p as e,H as t,c as o,h as s,d as r,t as n}from"./p-BWj1eE2b.js";import{d as l}from"./p-C8ggg-5h.js";import{d as a}from"./p-CJERvHdy.js";const i=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.typeChange=o(this,"typeChange")}type="pen";brushOptions=[{value:"pen",label:"Pen"},{value:"highlighter",label:"Highlighter"}];typeChange;handleDropdownValueChange(e){this.typeChange.emit(e.detail)}render(){const e=this.brushOptions.map((e=>({value:e.value,label:e.label})));return s(r,{key:"7b05e93ce8d28c23503e4ca358a487165169f1ad"},s("kritzel-dropdown",{key:"a8f2f30762b339411cd3995482c3bc658855f749",options:e,value:this.type,onValueChanged:e=>this.handleDropdownValueChange(e)},s("button",{key:"ac06462897a0fbd5011533095fafb7491a75508a",class:"brush-style-button",slot:"prefix"},s("kritzel-icon",{key:"caee4c657c7fee478b1038ebd2ef3b502cf73e5e",name:this.type,size:16}))))}static get style(){return":host{display:flex;align-items:flex-start;gap:8px;padding:8px;box-sizing:border-box;width:100%}.brush-style-button{display:flex;justify-content:center;align-items:center;width:42px;height:32px;padding:0;border:none;outline:none;background:none;border-radius:0;color:var(--control-text-color);font-weight:bold;-webkit-tap-highlight-color:transparent}.font-style-button:not(:last-child){border-right:1px solid #333333}.font-style-button:hover{background-color:var(--control-hover-bg)}.font-style-button:active{background-color:var(--control-active-bg)}.font-style-button.selected,.font-style-button.selected:hover,.font-style-button.selected:active{background-color:var(--control-selected-bg);color:var(--control-selected-color)}"}},[513,"kritzel-brush-style",{type:[1],brushOptions:[16]}]),c=i,d=function(){"undefined"!=typeof customElements&&["kritzel-brush-style","kritzel-dropdown","kritzel-icon"].forEach((e=>{switch(e){case"kritzel-brush-style":customElements.get(n(e))||customElements.define(n(e),i);break;case"kritzel-dropdown":customElements.get(n(e))||l();break;case"kritzel-icon":customElements.get(n(e))||a()}}))};export{c as KritzelBrushStyle,d as defineCustomElement}
1
+ import{p as e,H as t,c as o,h as s,d as r,t as n}from"./p-B43upypT.js";import{d as l}from"./p-Df3BwVGy.js";import{d as a}from"./p-DbB730vO.js";const i=e(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.typeChange=o(this,"typeChange")}type="pen";brushOptions=[{value:"pen",label:"Pen"},{value:"highlighter",label:"Highlighter"}];typeChange;handleDropdownValueChange(e){this.typeChange.emit(e.detail)}render(){const e=this.brushOptions.map((e=>({value:e.value,label:e.label})));return s(r,{key:"7b05e93ce8d28c23503e4ca358a487165169f1ad"},s("kritzel-dropdown",{key:"a8f2f30762b339411cd3995482c3bc658855f749",options:e,value:this.type,onValueChanged:e=>this.handleDropdownValueChange(e)},s("button",{key:"ac06462897a0fbd5011533095fafb7491a75508a",class:"brush-style-button",slot:"prefix"},s("kritzel-icon",{key:"caee4c657c7fee478b1038ebd2ef3b502cf73e5e",name:this.type,size:16}))))}static get style(){return":host{display:flex;align-items:flex-start;gap:8px;padding:8px;box-sizing:border-box;width:100%}.brush-style-button{display:flex;justify-content:center;align-items:center;width:42px;height:32px;padding:0;border:none;outline:none;background:none;border-radius:0;color:var(--control-text-color);font-weight:bold;-webkit-tap-highlight-color:transparent}.font-style-button:not(:last-child){border-right:1px solid #333333}.font-style-button:hover{background-color:var(--control-hover-bg)}.font-style-button:active{background-color:var(--control-active-bg)}.font-style-button.selected,.font-style-button.selected:hover,.font-style-button.selected:active{background-color:var(--control-selected-bg);color:var(--control-selected-color)}"}},[513,"kritzel-brush-style",{type:[1],brushOptions:[16]}]),c=i,d=function(){"undefined"!=typeof customElements&&["kritzel-brush-style","kritzel-dropdown","kritzel-icon"].forEach((e=>{switch(e){case"kritzel-brush-style":customElements.get(n(e))||customElements.define(n(e),i);break;case"kritzel-dropdown":customElements.get(n(e))||l();break;case"kritzel-icon":customElements.get(n(e))||a()}}))};export{c as KritzelBrushStyle,d as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-KjtNlFTl.js";const t=o,p=s;export{t as KritzelButton,p as defineCustomElement}
1
+ import{K as o,d as s}from"./p-UoPj5QjH.js";const j=o,p=s;export{j as KritzelButton,p as defineCustomElement}