kritzel-stencil 0.4.0 → 0.4.2

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 (86) hide show
  1. package/dist/cjs/index.cjs.js +2 -1
  2. package/dist/cjs/kritzel-active-users_47.cjs.entry.js +365 -80
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/{schema.constants-fuAsi56H.js → schema.constants-C8hqt--r.js} +274 -33
  5. package/dist/cjs/stencil.cjs.js +1 -1
  6. package/dist/collection/classes/core/workspace.class.js +1 -1
  7. package/dist/collection/classes/handlers/context-menu.handler.js +2 -3
  8. package/dist/collection/classes/managers/clipboard.manager.js +9 -3
  9. package/dist/collection/classes/objects/base-object.class.js +0 -1
  10. package/dist/collection/classes/objects/text.class.js +2 -1
  11. package/dist/collection/classes/registries/font-registry.class.js +161 -0
  12. package/dist/collection/classes/structures/object-map.structure.js +9 -0
  13. package/dist/collection/classes/tools/image-tool.class.js +19 -3
  14. package/dist/collection/classes/tools/text-tool.class.js +2 -0
  15. package/dist/collection/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.js +22 -7
  16. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +138 -9
  17. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +186 -25
  18. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +31 -22
  19. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +10 -11
  20. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.js +40 -5
  21. package/dist/collection/configs/default-text-tool.config.js +2 -0
  22. package/dist/collection/constants/text-tool-fonts.constants.js +18 -0
  23. package/dist/collection/constants/version.js +1 -1
  24. package/dist/collection/helpers/image-file.helper.js +6 -0
  25. package/dist/collection/index.js +2 -0
  26. package/dist/collection/interfaces/font.interface.js +1 -0
  27. package/dist/components/index.js +1 -1
  28. package/dist/components/kritzel-awareness-cursors.js +1 -1
  29. package/dist/components/kritzel-controls.js +1 -1
  30. package/dist/components/kritzel-cursor-trail.js +1 -1
  31. package/dist/components/kritzel-editor.js +1 -1
  32. package/dist/components/kritzel-engine.js +1 -1
  33. package/dist/components/kritzel-font-family.js +1 -1
  34. package/dist/components/kritzel-settings.js +1 -1
  35. package/dist/components/kritzel-tool-config.js +1 -1
  36. package/dist/components/kritzel-workspace-manager.js +1 -1
  37. package/dist/components/p--Oazz-BP.js +9 -0
  38. package/dist/components/p-C38P-Vd0.js +1 -0
  39. package/dist/components/{p-zhjb97WN.js → p-C3UQ-Zrg.js} +1 -1
  40. package/dist/components/{p-9692OaI_.js → p-ClFprFvz.js} +1 -1
  41. package/dist/components/p-Cm33td2O.js +1 -0
  42. package/dist/components/{p-DhMlShij.js → p-DAwPPDMS.js} +1 -1
  43. package/dist/components/p-DJkKlUyZ.js +1 -0
  44. package/dist/components/p-JYj3Facr.js +1 -0
  45. package/dist/components/p-Ka7OWbnk.js +1 -0
  46. package/dist/components/p-djJSnjAX.js +1 -0
  47. package/dist/esm/index.js +2 -2
  48. package/dist/esm/kritzel-active-users_47.entry.js +365 -80
  49. package/dist/esm/loader.js +1 -1
  50. package/dist/esm/{schema.constants-Cv5-yM39.js → schema.constants-uC7_X6yr.js} +272 -34
  51. package/dist/esm/stencil.js +1 -1
  52. package/dist/stencil/index.esm.js +1 -1
  53. package/dist/stencil/p-b64c3584.entry.js +9 -0
  54. package/dist/stencil/p-uC7_X6yr.js +1 -0
  55. package/dist/stencil/stencil.esm.js +1 -1
  56. package/dist/types/classes/core/workspace.class.d.ts +1 -1
  57. package/dist/types/classes/managers/clipboard.manager.d.ts +1 -0
  58. package/dist/types/classes/objects/base-object.class.d.ts +0 -1
  59. package/dist/types/classes/registries/font-registry.class.d.ts +19 -0
  60. package/dist/types/classes/structures/object-map.structure.d.ts +2 -2
  61. package/dist/types/classes/tools/image-tool.class.d.ts +9 -2
  62. package/dist/types/classes/tools/text-tool.class.d.ts +3 -0
  63. package/dist/types/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.d.ts +2 -0
  64. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +22 -0
  65. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +17 -0
  66. package/dist/types/components/shared/kritzel-font-family/kritzel-font-family.d.ts +4 -0
  67. package/dist/types/components/ui/kritzel-tool-config/kritzel-tool-config.d.ts +1 -0
  68. package/dist/types/components.d.ts +20 -2
  69. package/dist/types/constants/text-tool-fonts.constants.d.ts +3 -0
  70. package/dist/types/constants/version.d.ts +1 -1
  71. package/dist/types/helpers/image-file.helper.d.ts +3 -0
  72. package/dist/types/index.d.ts +2 -0
  73. package/dist/types/interfaces/font.interface.d.ts +15 -0
  74. package/dist/types/interfaces/toolbar-control.interface.d.ts +2 -0
  75. package/package.json +1 -1
  76. package/dist/components/p-B4b6TDxp.js +0 -1
  77. package/dist/components/p-C2ocjA6D.js +0 -1
  78. package/dist/components/p-CwbZCXKh.js +0 -1
  79. package/dist/components/p-D2q_wTyG.js +0 -1
  80. package/dist/components/p-D8NvNMcU.js +0 -1
  81. package/dist/components/p-D8W6LE-c.js +0 -1
  82. package/dist/components/p-G9G9y5VE.js +0 -9
  83. package/dist/components/p-JhOYwUOj.js +0 -1
  84. package/dist/components/p-UEf2EN23.js +0 -1
  85. package/dist/stencil/p-2c489187.entry.js +0 -9
  86. package/dist/stencil/p-Cv5-yM39.js +0 -1
@@ -1,37 +1,40 @@
1
1
  import { Host, h } from "@stencil/core";
2
2
  export class KritzelFontFamily {
3
- fontOptions = [
4
- { value: 'arial', label: 'Arial' },
5
- { value: 'verdana', label: 'Verdana' },
6
- { value: 'helvetica', label: 'Helvetica' },
7
- { value: 'tahoma', label: 'Tahoma' },
8
- { value: 'trebuchet ms', label: 'Trebuchet MS' },
9
- { value: 'times new roman', label: 'Times New Roman' },
10
- { value: 'georgia', label: 'Georgia' },
11
- { value: 'garamond', label: 'Garamond' },
12
- { value: 'courier new', label: 'Courier New' },
13
- { value: 'brush script mt', label: 'Brush Script MT' },
14
- ];
3
+ fontOptions = [];
15
4
  selectedFontFamily;
16
5
  fontFamilyChange;
6
+ handleFontOptionsChange() {
7
+ this.ensureValidSelectedFont(this.resolveFontOptions());
8
+ }
17
9
  componentWillLoad() {
18
- if (this.fontOptions && this.fontOptions.length > 0) {
19
- const isValidCurrentFont = this.fontOptions.some(opt => opt.value === this.selectedFontFamily);
20
- if (!this.selectedFontFamily || !isValidCurrentFont) {
21
- this.selectedFontFamily = this.fontOptions[0].value;
22
- }
23
- }
10
+ this.ensureValidSelectedFont(this.resolveFontOptions());
24
11
  }
25
12
  handleDropdownValueChange = (event) => {
26
13
  this.fontFamilyChange.emit(event.detail);
27
14
  };
15
+ ensureValidSelectedFont(options) {
16
+ if (options.length === 0) {
17
+ return;
18
+ }
19
+ const normalizedSelected = this.selectedFontFamily?.trim().toLocaleLowerCase();
20
+ const isValidCurrentFont = options.some(opt => opt.value.trim().toLocaleLowerCase() === normalizedSelected);
21
+ if (!normalizedSelected || !isValidCurrentFont) {
22
+ this.selectedFontFamily = options[0].value;
23
+ }
24
+ }
25
+ resolveFontOptions() {
26
+ return this.fontOptions;
27
+ }
28
28
  render() {
29
- const dropdownOptions = this.fontOptions.map(option => ({
29
+ const fontOptions = this.resolveFontOptions();
30
+ const selectedOption = fontOptions.find(option => option.value === this.selectedFontFamily);
31
+ const selectedFontFamily = selectedOption?.cssFontFamily ?? this.selectedFontFamily;
32
+ const dropdownOptions = fontOptions.map(option => ({
30
33
  value: option.value,
31
34
  label: option.label,
32
- style: { fontFamily: option.value },
35
+ style: { fontFamily: option.cssFontFamily ?? option.value },
33
36
  }));
34
- return (h(Host, { key: '0123dbdff9b7051d2ebc9dcf8d1f9c7c4c161dc4' }, h("kritzel-dropdown", { key: '5d4e289161502ecc60cef3d0c6d546a64817a12a', options: dropdownOptions, value: this.selectedFontFamily, onValueChanged: this.handleDropdownValueChange, selectStyles: { fontFamily: this.selectedFontFamily } })));
37
+ return (h(Host, { key: '059350f34370f7a291f47a42721ca5d9bb82df49' }, h("kritzel-dropdown", { key: 'fbd8cf1ae463c7e9b76d0ac754a41de54397058e', options: dropdownOptions, value: this.selectedFontFamily, onValueChanged: this.handleDropdownValueChange, selectStyles: { fontFamily: selectedFontFamily } })));
35
38
  }
36
39
  static get is() { return "kritzel-font-family"; }
37
40
  static get encapsulation() { return "shadow"; }
@@ -69,7 +72,7 @@ export class KritzelFontFamily {
69
72
  },
70
73
  "getter": false,
71
74
  "setter": false,
72
- "defaultValue": "[\n { value: 'arial', label: 'Arial' },\n { value: 'verdana', label: 'Verdana' },\n { value: 'helvetica', label: 'Helvetica' },\n { value: 'tahoma', label: 'Tahoma' },\n { value: 'trebuchet ms', label: 'Trebuchet MS' },\n { value: 'times new roman', label: 'Times New Roman' },\n { value: 'georgia', label: 'Georgia' },\n { value: 'garamond', label: 'Garamond' },\n { value: 'courier new', label: 'Courier New' },\n { value: 'brush script mt', label: 'Brush Script MT' },\n ]"
75
+ "defaultValue": "[]"
73
76
  },
74
77
  "selectedFontFamily": {
75
78
  "type": "string",
@@ -110,4 +113,10 @@ export class KritzelFontFamily {
110
113
  }
111
114
  }];
112
115
  }
116
+ static get watchers() {
117
+ return [{
118
+ "propName": "fontOptions",
119
+ "methodName": "handleFontOptionsChange"
120
+ }];
121
+ }
113
122
  }
@@ -1,6 +1,4 @@
1
1
  import { h, Host } from "@stencil/core";
2
- import { KritzelTextTool } from "../../../classes/tools/text-tool.class";
3
- import { KritzelSelectionTool } from "../../../classes/tools/selection-tool.class";
4
2
  import { KritzelDevicesHelper } from "../../../helpers/devices.helper";
5
3
  import { KritzelToolConfigHelper } from "../../../helpers/tool-config.helper";
6
4
  import { KritzelColorHelper } from "../../../helpers/color.helper";
@@ -40,8 +38,9 @@ export class KritzelControls {
40
38
  this.closeTooltip();
41
39
  }
42
40
  handleSelectionChange() {
43
- if (this.activeControl?.tool instanceof KritzelSelectionTool) {
44
- this.updateDisplayValues(this.activeControl.tool);
41
+ const tool = this.activeControl?.tool;
42
+ if (tool && typeof tool !== 'function' && tool.toolType === 'selection') {
43
+ this.updateDisplayValues(tool);
45
44
  }
46
45
  }
47
46
  async onControlsChange() {
@@ -92,7 +91,7 @@ export class KritzelControls {
92
91
  color: KritzelColorHelper.applyOpacity(color, opacity, this.theme),
93
92
  size,
94
93
  };
95
- if (tool instanceof KritzelTextTool) {
94
+ if (tool.toolType === 'text') {
96
95
  displayValues.fontFamily = tool.fontFamily;
97
96
  }
98
97
  // Check for equality implementation to prevent unnecessary re-renders
@@ -233,13 +232,13 @@ export class KritzelControls {
233
232
  // Separate tool controls from config control
234
233
  const toolControls = this.internalControls.filter(c => c.type === 'tool' || c.type === 'separator');
235
234
  const configControl = this.internalControls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
236
- return (h(Host, { key: '5a23a0a1baa407097b18b9bc43f41186c0c333b2', style: { display: this.visible ? '' : 'none' }, class: {
235
+ return (h(Host, { key: 'a526bd337a6b75933ec4be89c3edded0a9c39e7c', style: { display: this.visible ? '' : 'none' }, class: {
237
236
  mobile: this.isTouchDevice,
238
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '6d3878904bd13266be79cef0e0d1ee55d760b3da', style: {
237
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '5314f067c5a22425690e3b6f26c836962ac528a2', style: {
239
238
  position: 'absolute',
240
239
  bottom: '56px',
241
240
  left: '12px',
242
- }, undoState: this.undoState, terms: this.terms, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '5e066964eba04ad9b0d1abf36f61b93464254f48', class: "kritzel-controls" }, h("div", { key: '76e49fd459e0a312837ec0b5e552355395b8814e', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'd4cffe56418dae5c569a47fe2ffc3f810f221455', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
241
+ }, undoState: this.undoState, terms: this.terms, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '7cf0cd164d723b5901f54a6671395f63dd8bad29', class: "kritzel-controls" }, h("div", { key: 'b7169122686a0a67c37d96751291fc43f4c45e4a', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: '6e3c4f30900e4722abdfaf3cfdc68cf1a07b9292', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
243
242
  // Check if this control has sub-options (split-button)
244
243
  if (control.subOptions?.length) {
245
244
  const selectedSubOption = this.getSelectedSubOption(control);
@@ -269,10 +268,10 @@ export class KritzelControls {
269
268
  'kritzel-control': true,
270
269
  'selected': this.activeControl?.name === control?.name,
271
270
  }, 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 })));
272
- })), h("div", { key: '49806e8e06b8756a097eeec53203a55586214a4a', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
271
+ })), h("div", { key: 'bc8d79e0512f30fe150c6d2ac7f81206fc47c1a5', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
273
272
  'kritzel-config-container': true,
274
273
  'visible': hasConfigUI,
275
- }, key: configControl.name }, h("div", { key: 'da0ec9cf776dee0872bbb7f0369a6a5a56ebb955', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: 'c848a63392d4ed9a30f467512421fbea3096d876', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: 'c7ed50fbdfbdab1847fb8c5c6e73d0e743b45706', tool: this.activeControl.tool, theme: this.theme, engine: this.kritzelEngine, terms: this.terms, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: 'de6c9801d3e9e89674b60b1c4e270b8520014aae', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
274
+ }, key: configControl.name }, h("div", { key: '671431a9c388080fb917d4e8c596d17e92eaba08', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '394e8e2c07b191b3fb93645d68d7eae67761167a', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: 'b8479fba2afdb51fe0ef965e18b1ae45ba8a7da6', tool: this.activeControl.tool, theme: this.theme, engine: this.kritzelEngine, terms: this.terms, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: '8fac81d682dbdec6b5247154fd20d553dfe6f1a7', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
276
275
  if (el)
277
276
  this.configTriggerRef = el;
278
277
  }, onKeyDown: event => {
@@ -281,7 +280,7 @@ export class KritzelControls {
281
280
  }
282
281
  }, style: {
283
282
  cursor: 'pointer',
284
- } }, this.displayValues && (h("div", { key: '140bbf567b0bbd2a2fe878536e93d8646a58b209', class: "color-container" }, h("kritzel-color", { key: 'eeb1d94fa41bbc177d39b4158ae3c4c1d692c0ec', value: this.displayValues.color, theme: this.theme, size: 18, style: {
283
+ } }, this.displayValues && (h("div", { key: '6aa1daed9425d069c7d0405a04e65b4c4e88291f', class: "color-container" }, h("kritzel-color", { key: '7b54461769bf4aec3e39d1fbe21c015b7d7a85bb', value: this.displayValues.color, theme: this.theme, size: 18, style: {
285
284
  borderRadius: '50%',
286
285
  border: 'none',
287
286
  } })))))))));
@@ -1,8 +1,8 @@
1
1
  import { Host, h } from "@stencil/core";
2
2
  import { KritzelToolConfigHelper } from "../../../helpers/tool-config.helper";
3
- import { KritzelTextTool } from "../../../classes/tools/text-tool.class";
4
- import { KritzelSelectionTool } from "../../../classes/tools/selection-tool.class";
5
3
  import { KritzelColorHelper } from "../../../helpers/color.helper";
4
+ import { resolveTextToolAvailableFonts } from "../../../constants/text-tool-fonts.constants";
5
+ import { KritzelFontRegistry } from "../../../classes/registries/font-registry.class";
6
6
  export class KritzelToolConfig {
7
7
  tool;
8
8
  handleToolChange(newTool, oldTool) {
@@ -58,8 +58,43 @@ export class KritzelToolConfig {
58
58
  sizes = [];
59
59
  currentOpacity = 1;
60
60
  updateTrigger = 0;
61
+ getFontOptionsFromTool() {
62
+ const configuredFonts = resolveTextToolAvailableFonts(this.tool.availableFonts).map(font => {
63
+ const registeredFont = typeof font === 'string'
64
+ ? {
65
+ family: font,
66
+ label: font,
67
+ cssFontFamily: font,
68
+ }
69
+ : {
70
+ family: font.family,
71
+ label: font.label ?? font.family,
72
+ cssFontFamily: font.cssFontFamily ?? font.family,
73
+ };
74
+ return {
75
+ value: registeredFont.family,
76
+ label: registeredFont.label,
77
+ cssFontFamily: registeredFont.cssFontFamily,
78
+ };
79
+ });
80
+ const mergedFonts = [...configuredFonts];
81
+ const seenFonts = new Set(mergedFonts.map(font => font.value.trim().toLocaleLowerCase()));
82
+ for (const font of KritzelFontRegistry.list()) {
83
+ const normalizedValue = font.family.trim().toLocaleLowerCase();
84
+ if (seenFonts.has(normalizedValue)) {
85
+ continue;
86
+ }
87
+ seenFonts.add(normalizedValue);
88
+ mergedFonts.push({
89
+ value: font.family,
90
+ label: font.label,
91
+ cssFontFamily: font.cssFontFamily,
92
+ });
93
+ }
94
+ return mergedFonts;
95
+ }
61
96
  handleSelectionChange() {
62
- if (this.tool instanceof KritzelSelectionTool) {
97
+ if (this.tool?.toolType === 'selection') {
63
98
  this.config = KritzelToolConfigHelper.getToolConfig(this.tool);
64
99
  if (this.config) {
65
100
  this.updatePalette();
@@ -96,7 +131,7 @@ export class KritzelToolConfig {
96
131
  color: KritzelColorHelper.applyOpacity(color, opacity, this.theme),
97
132
  size,
98
133
  };
99
- if (this.tool instanceof KritzelTextTool) {
134
+ if (this.tool.toolType === 'text') {
100
135
  displayValues.fontFamily = this.tool.fontFamily;
101
136
  }
102
137
  this.displayValuesChange.emit(displayValues);
@@ -189,7 +224,7 @@ export class KritzelToolConfig {
189
224
  case 'shape-fill':
190
225
  return (h("kritzel-shape-fill", { key: control.type, value: this.getShapeFillValue(), onValueChange: (event) => this.handlePropertyChange(control.propertyName, event.detail) }));
191
226
  case 'font-family':
192
- return (h("kritzel-font-family", { key: control.type, selectedFontFamily: value, onFontFamilyChange: (event) => this.handlePropertyChange(control.propertyName, event.detail) }));
227
+ return (h("kritzel-font-family", { key: control.type, fontOptions: this.getFontOptionsFromTool(), selectedFontFamily: value, onFontFamilyChange: (event) => this.handlePropertyChange(control.propertyName, event.detail) }));
193
228
  default:
194
229
  return null;
195
230
  }
@@ -1,10 +1,12 @@
1
1
  import { DEFAULT_COLOR_PALETTE } from "../constants/color-palette.constants";
2
2
  import { DEFAULT_FONT_SIZES } from "../constants/stroke-size.constants";
3
+ import { DEFAULT_TEXT_TOOL_AVAILABLE_FONTS } from "../constants/text-tool-fonts.constants";
3
4
  export const DEFAULT_TEXT_CONFIG = {
4
5
  color: DEFAULT_COLOR_PALETTE[0],
5
6
  size: 8,
6
7
  opacity: 1,
7
8
  fontFamily: 'Arial',
9
+ availableFonts: [...DEFAULT_TEXT_TOOL_AVAILABLE_FONTS],
8
10
  palette: [...DEFAULT_COLOR_PALETTE],
9
11
  sizes: [...DEFAULT_FONT_SIZES],
10
12
  };
@@ -0,0 +1,18 @@
1
+ export const DEFAULT_TEXT_TOOL_AVAILABLE_FONTS = [
2
+ 'Arial',
3
+ 'Verdana',
4
+ 'Helvetica',
5
+ 'Tahoma',
6
+ 'Trebuchet MS',
7
+ 'Times New Roman',
8
+ 'Georgia',
9
+ 'Garamond',
10
+ 'Courier New',
11
+ 'Brush Script MT',
12
+ ];
13
+ export const resolveTextToolAvailableFonts = (availableFonts) => {
14
+ if (!availableFonts || availableFonts.length === 0) {
15
+ return [...DEFAULT_TEXT_TOOL_AVAILABLE_FONTS];
16
+ }
17
+ return [...availableFonts];
18
+ };
@@ -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.4.0';
6
+ export const KRITZEL_VERSION = '0.4.2';
@@ -0,0 +1,6 @@
1
+ export class KritzelImageFileHelper {
2
+ static isGifFile(file) {
3
+ const mimeType = file.type.trim().toLowerCase();
4
+ return mimeType === 'image/gif' || (mimeType === '' && file.name.toLowerCase().endsWith('.gif'));
5
+ }
6
+ }
@@ -39,6 +39,7 @@ export * from './classes/managers/theme.manager';
39
39
  export * from './classes/managers/localization.manager';
40
40
  export * from './classes/managers/license.manager';
41
41
  export * from './classes/registries/custom-element-renderer.registry';
42
+ export * from './classes/registries/font-registry.class';
42
43
  export * from './interfaces/toolbar-control.interface';
43
44
  export * from './interfaces/menu-item.interface';
44
45
  export * from './interfaces/object-change-event.interface';
@@ -62,6 +63,7 @@ export * from './interfaces/engine-state.interface';
62
63
  export * from './interfaces/debug-info.interface';
63
64
  export * from './interfaces/bounding-box.interface';
64
65
  export * from './interfaces/polygon.interface';
66
+ export * from './interfaces/font.interface';
65
67
  export * from './configs/default-brush-tool.config';
66
68
  export * from './configs/default-text-tool.config';
67
69
  export * from './configs/default-line-tool.config';
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-B43upypT.js";export{K as KritzelBaseObject,b as KritzelLine,a as KritzelPath}from"./p-UEf2EN23.js";export{A as AssetNotFoundError,I as IndexedDBAssetProvider,g as KritzelAssetResolver,d as KritzelBaseTool,b as KritzelGroup,a as KritzelImage,f as KritzelSelectionTool,c as KritzelShape,K as KritzelText,e as KritzelTextTool,S as ShapeType}from"./p-D8NvNMcU.js";export{A as APP_STATE_MIGRATIONS,D as DE_LOCALE,E as EN_LOCALE,F as FR_LOCALE,k as KritzelAlignment,g as KritzelAnchorManager,a as KritzelBrushTool,f as KritzelCursorHelper,K as KritzelCustomElement,j as KritzelCustomElementRendererRegistry,c as KritzelEraserTool,d as KritzelImageTool,i as KritzelLicenseManager,b as KritzelLineTool,h as KritzelLocalizationManager,e as KritzelShapeTool,W as WORKSPACE_MIGRATIONS,r as runMigrations}from"./p-G9G9y5VE.js";import*as t from"yjs";import{IndexeddbPersistence as n}from"y-indexeddb";import{WebsocketProvider as o}from"y-websocket";import{H as m,a as u}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-BmyTdQGy.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{KritzelLoadingOverlay,defineCustomElement as defineCustomElementKritzelLoadingOverlay}from"./kritzel-loading-overlay.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{KritzelNotificationCard,defineCustomElement as defineCustomElementKritzelNotificationCard}from"./kritzel-notification-card.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{KritzelSyncIndicator,defineCustomElement as defineCustomElementKritzelSyncIndicator}from"./kritzel-sync-indicator.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{KritzelWatermark,defineCustomElement as defineCustomElementKritzelWatermark}from"./kritzel-watermark.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";export{KritzelZoomPanel,defineCustomElement as defineCustomElementKritzelZoomPanel}from"./kritzel-zoom-panel.js";const z=Math.floor,p=127,y=Number.MAX_SAFE_INTEGER;class w{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const x=()=>new w,T=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},v=(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},P=(e,t)=>{for(;t>p;)v(e,128|p&t),t=z(t/128);v(e,p&t)},U=(e,t)=>{P(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)},M=e=>Error(e),_=M("Unexpected end of array"),O=M("Integer out of Range");class L{constructor(e){this.arr=e,this.pos=0}}const N=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,R(e)),R=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&p)*s,s*=128,i<128)return t;if(t>y)throw O}throw _};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=x();P(t,0),U(t,e),this.channel.postMessage(T(t))}};handleMessage(e){const s=(e=>new L(e))(new Uint8Array(e));switch(R(s)){case 0:const e=N(s);t.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const i=N(s),n=t.encodeStateAsUpdate(this.doc,i);if(n.length>0){const e=x();P(e,0),U(e,n),this.channel.postMessage(T(e))}}}broadcastSync(){const e=x();P(e,2),U(e,t.encodeStateVector(this.doc)),this.channel.postMessage(T(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 B=new Map;class H{type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,s)=>{s!==this&&B.set(this.cacheKey,t.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=B.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?B.delete(e):B.clear()}}class G{type="local";provider;isConnected=!1;constructor(e,t,s){this.provider=new n(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 V{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",n=s?.roomName||e;this.provider=new o(i,n,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${n}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new V(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 J{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 o=s?.websocketProvider||J.sharedWebSocketProvider,r={};void 0!==s?.delay&&(r.delay=s.delay),void 0!==s?.factor&&(r.factor=s.factor),void 0!==s?.maxAttempts&&(r.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(r.minDelay=s.minDelay),void 0!==s?.maxDelay&&(r.maxDelay=s.maxDelay);const l=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},a=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},c=()=>{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(o){this.usesSharedSocket=!0;const e={websocketProvider:o,name:i,document:t,token:s?.token||null,onStatus:d,onConnect:l,onDisconnect:a,onSynced:c,...r};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new m(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:l,onDisconnect:a,onSynced:c,...r};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new m(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(J.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),J.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),J.sharedWebSocketProvider=new u(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),J.sharedWebSocketProvider}static destroySharedWebSocket(){J.sharedWebSocketProvider&&(J.sharedWebSocketProvider.destroy(),J.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return J.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new J(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 X{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new X(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 Z{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new Z(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,J as HocuspocusSyncProvider,X as HttpAssetProvider,H as InMemorySyncProvider,G as IndexedDBSyncProvider,Z as PresignedAssetProvider,V 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-Ka7OWbnk.js";export{u as APP_STATE_MIGRATIONS,A as AssetNotFoundError,D as DE_LOCALE,E as EN_LOCALE,F as FR_LOCALE,I as IndexedDBAssetProvider,s as KritzelAlignment,o as KritzelAnchorManager,n as KritzelAssetResolver,e as KritzelBaseTool,f as KritzelBrushTool,l as KritzelCursorHelper,d as KritzelCustomElement,r as KritzelCustomElementRendererRegistry,h as KritzelEraserTool,b as KritzelGroup,a as KritzelImage,i as KritzelImageTool,q as KritzelLicenseManager,g as KritzelLineTool,p as KritzelLocalizationManager,m as KritzelSelectionTool,c as KritzelShape,k as KritzelShapeTool,K as KritzelText,j as KritzelTextTool,S as ShapeType,W as WORKSPACE_MIGRATIONS,t as runMigrations}from"./p--Oazz-BP.js";import*as z from"yjs";import{IndexeddbPersistence as y}from"y-indexeddb";import{WebsocketProvider as w}from"y-websocket";import{H as x,a as T}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-DAwPPDMS.js";export{K as KritzelThemeManager,d as darkTheme,l as lightTheme}from"./p-BmyTdQGy.js";export{K as KritzelFontRegistry}from"./p-DJkKlUyZ.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{KritzelLoadingOverlay,defineCustomElement as defineCustomElementKritzelLoadingOverlay}from"./kritzel-loading-overlay.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{KritzelNotificationCard,defineCustomElement as defineCustomElementKritzelNotificationCard}from"./kritzel-notification-card.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{KritzelSyncIndicator,defineCustomElement as defineCustomElementKritzelSyncIndicator}from"./kritzel-sync-indicator.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{KritzelWatermark,defineCustomElement as defineCustomElementKritzelWatermark}from"./kritzel-watermark.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";export{KritzelZoomPanel,defineCustomElement as defineCustomElementKritzelZoomPanel}from"./kritzel-zoom-panel.js";const P=Math.floor,v=127,U=Number.MAX_SAFE_INTEGER;class M{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const O=()=>new M,_=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},L=(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},R=(e,t)=>{for(;t>v;)L(e,128|v&t),t=P(t/128);L(e,v&t)},$=(e,t)=>{R(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)},B=e=>Error(e),H=B("Unexpected end of array"),N=B("Integer out of Range");class G{constructor(e){this.arr=e,this.pos=0}}const V=e=>((e,t)=>{const s=new Uint8Array(e.arr.buffer,e.pos+e.arr.byteOffset,t);return e.pos+=t,s})(e,J(e)),J=e=>{let t=0,s=1;const i=e.arr.length;for(;e.pos<i;){const i=e.arr[e.pos++];if(t+=(i&v)*s,s*=128,i<128)return t;if(t>U)throw N}throw H};class Z{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=O();R(t,0),$(t,e),this.channel.postMessage(_(t))}};handleMessage(e){const t=(e=>new G(e))(new Uint8Array(e));switch(J(t)){case 0:const e=V(t);z.applyUpdate(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const s=V(t),i=z.encodeStateAsUpdate(this.doc,s);if(i.length>0){const e=O();R(e,0),$(e,i),this.channel.postMessage(_(e))}}}broadcastSync(){const e=O();R(e,2),$(e,z.encodeStateVector(this.doc)),this.channel.postMessage(_(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 X=new Map;class Q{type="local";doc;cacheKey;isConnected=!1;constructor(e,t,s){this.doc=t,this.cacheKey=s?.name??e}handleUpdate=(e,t)=>{t!==this&&X.set(this.cacheKey,z.encodeStateAsUpdate(this.doc))};async connect(){if(this.isConnected)return;const e=X.get(this.cacheKey);e&&z.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?X.delete(e):X.clear()}}class Y{type="local";provider;isConnected=!1;constructor(e,t,s){this.provider=new y(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 ee{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(e,t,s){const i=s?.url||"ws://localhost:1234",n=s?.roomName||e;this.provider=new w(i,n,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this._quiet=s?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${n}`)}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new ee(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 te{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 o=s?.websocketProvider||te.sharedWebSocketProvider,r={};void 0!==s?.delay&&(r.delay=s.delay),void 0!==s?.factor&&(r.factor=s.factor),void 0!==s?.maxAttempts&&(r.maxAttempts=s.maxAttempts),void 0!==s?.minDelay&&(r.minDelay=s.minDelay),void 0!==s?.maxDelay&&(r.maxDelay=s.maxDelay);const l=()=>{this.isDestroyed||(this.isConnected=!0,this._connectionStatus="connected",s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect())},a=()=>{this.isDestroyed||(this.isConnected=!1,this.isSynced=!1,this._connectionStatus="disconnected",s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect())},c=()=>{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(o){this.usesSharedSocket=!0;const e={websocketProvider:o,name:i,document:t,token:s?.token||null,onStatus:m,onConnect:l,onDisconnect:a,onSynced:c,...r};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),this.provider=new x(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:l,onDisconnect:a,onSynced:c,...r};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new x(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(te.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),te.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),te.sharedWebSocketProvider=new T(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),te.sharedWebSocketProvider}static destroySharedWebSocket(){te.sharedWebSocketProvider&&(te.sharedWebSocketProvider.destroy(),te.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return te.sharedWebSocketProvider}static with(e){return{create:(t,s,i)=>{const n=i?{...e,...i}:e;return new te(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 se{type="remote";name="HttpAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new se(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 ie{type="remote";name="PresignedAssetProvider";_options;constructor(e){this._options=e}static with(e){return{create:()=>new ie(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{Z as BroadcastSyncProvider,te as HocuspocusSyncProvider,se as HttpAssetProvider,Q as InMemorySyncProvider,Y as IndexedDBSyncProvider,ie as PresignedAssetProvider,ee as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-CwbZCXKh.js";const p=o,r=s;export{p as KritzelAwarenessCursors,r as defineCustomElement}
1
+ import{c as o,d as s}from"./p-Ka7OWbnk.js";const a=o,p=s;export{a as KritzelAwarenessCursors,p as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-C2ocjA6D.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
1
+ import{K as o,d as r}from"./p-JYj3Facr.js";const s=o,a=r;export{s as KritzelControls,a as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as p}from"./p-B4b6TDxp.js";const s=o,r=p;export{s as KritzelCursorTrail,r as defineCustomElement}
1
+ import{K as o,d as s}from"./p-Cm33td2O.js";const t=o,m=s;export{t as KritzelCursorTrail,m as defineCustomElement}