kritzel-stencil 0.4.6 → 0.4.8

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 (150) hide show
  1. package/dist/cjs/index.cjs.js +1 -1
  2. package/dist/cjs/kritzel-active-users_47.cjs.entry.js +140 -101
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/{schema.constants-C8hqt--r.js → schema.constants-gDeS7USU.js} +75 -7
  5. package/dist/cjs/stencil.cjs.js +1 -1
  6. package/dist/collection/classes/core/core.class.js +4 -5
  7. package/dist/collection/classes/handlers/line-handle.handler.js +1 -1
  8. package/dist/collection/classes/managers/license.manager.js +56 -0
  9. package/dist/collection/classes/objects/line.class.js +1 -1
  10. package/dist/collection/classes/objects/shape.class.js +3 -3
  11. package/dist/collection/classes/objects/text.class.js +1 -1
  12. package/dist/collection/collection-manifest.json +1 -1
  13. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +31 -8
  14. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +59 -18
  15. package/dist/collection/components/core/kritzel-watermark/kritzel-watermark.js +1 -1
  16. package/dist/collection/components/shared/kritzel-avatar/kritzel-avatar.js +3 -3
  17. package/dist/collection/components/shared/kritzel-button/kritzel-button.js +2 -2
  18. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  19. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  20. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  21. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  22. package/dist/collection/components/shared/kritzel-input/kritzel-input.js +1 -1
  23. package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.js +3 -3
  24. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  25. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  26. package/dist/collection/components/shared/kritzel-numeric-input/kritzel-numeric-input.js +1 -1
  27. package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.js +1 -1
  28. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  29. package/dist/collection/components/shared/kritzel-slide-toggle/kritzel-slide-toggle.js +1 -1
  30. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  31. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  32. package/dist/collection/components/shared/kritzel-sync-indicator/kritzel-sync-indicator.js +1 -1
  33. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +2 -2
  34. package/dist/collection/components/ui/kritzel-back-to-content/kritzel-back-to-content.js +1 -1
  35. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +6 -6
  36. package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.js +1 -1
  37. package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.js +1 -1
  38. package/dist/collection/components/ui/kritzel-export/kritzel-export.js +1 -1
  39. package/dist/collection/components/ui/kritzel-loading-overlay/kritzel-loading-overlay.js +1 -1
  40. package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.js +1 -1
  41. package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.js +1 -1
  42. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.css +8 -0
  43. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +2 -15
  44. package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.js +2 -2
  45. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  46. package/dist/collection/components/ui/kritzel-zoom-panel/kritzel-zoom-panel.js +1 -1
  47. package/dist/collection/constants/license.constants.js +1 -1
  48. package/dist/collection/constants/version.js +1 -1
  49. package/dist/collection/helpers/svg-export.helper.js +19 -9
  50. package/dist/collection/helpers/theme.helper.js +8 -0
  51. package/dist/collection/index.js +1 -0
  52. package/dist/collection/interfaces/context-menu-state.interface.js +1 -0
  53. package/dist/collection/themes/dark-theme.js +2 -0
  54. package/dist/collection/themes/light-theme.js +2 -0
  55. package/dist/components/index.js +3 -3
  56. package/dist/components/kritzel-active-users.js +1 -1
  57. package/dist/components/kritzel-avatar.js +1 -1
  58. package/dist/components/kritzel-awareness-cursors.js +1 -1
  59. package/dist/components/kritzel-back-to-content.js +1 -1
  60. package/dist/components/kritzel-button.js +1 -1
  61. package/dist/components/kritzel-color-palette.js +1 -1
  62. package/dist/components/kritzel-color.js +1 -1
  63. package/dist/components/kritzel-controls.js +1 -1
  64. package/dist/components/kritzel-current-user-dialog.js +1 -1
  65. package/dist/components/kritzel-current-user.js +1 -1
  66. package/dist/components/kritzel-editor.js +67 -44
  67. package/dist/components/kritzel-engine.js +1 -1
  68. package/dist/components/kritzel-export.js +1 -1
  69. package/dist/components/kritzel-font-size.js +1 -1
  70. package/dist/components/kritzel-font.js +1 -1
  71. package/dist/components/kritzel-input.js +1 -1
  72. package/dist/components/kritzel-loading-overlay.js +1 -1
  73. package/dist/components/kritzel-login-dialog.js +1 -1
  74. package/dist/components/kritzel-master-detail.js +1 -1
  75. package/dist/components/kritzel-menu-item.js +1 -1
  76. package/dist/components/kritzel-menu.js +1 -1
  77. package/dist/components/kritzel-more-menu.js +1 -1
  78. package/dist/components/kritzel-numeric-input.js +1 -1
  79. package/dist/components/kritzel-opacity-slider.js +1 -1
  80. package/dist/components/kritzel-portal.js +1 -1
  81. package/dist/components/kritzel-settings.js +1 -1
  82. package/dist/components/kritzel-share-dialog.js +1 -1
  83. package/dist/components/kritzel-slide-toggle.js +1 -1
  84. package/dist/components/kritzel-split-button.js +1 -1
  85. package/dist/components/kritzel-stroke-size.js +1 -1
  86. package/dist/components/kritzel-sync-indicator.js +1 -1
  87. package/dist/components/kritzel-tool-config.js +1 -1
  88. package/dist/components/kritzel-tooltip.js +1 -1
  89. package/dist/components/kritzel-utility-panel.js +1 -1
  90. package/dist/components/kritzel-watermark.js +1 -1
  91. package/dist/components/kritzel-workspace-manager.js +1 -1
  92. package/dist/components/kritzel-zoom-panel.js +1 -1
  93. package/dist/components/{p-Ka7OWbnk.js → p-0H4HOJjy.js} +2 -2
  94. package/dist/components/{p-B5oHmPJb.js → p-7Rt7ml3v.js} +1 -1
  95. package/dist/components/{p-BI2ng9I_.js → p-8xkoVMfO.js} +2 -2
  96. package/dist/components/{p-Cymum41a.js → p-9m1cAVwG.js} +3 -3
  97. package/dist/components/{p-CwJwsRR3.js → p-BKOsmXB5.js} +4 -4
  98. package/dist/components/{p-Ca-igU1f.js → p-BLOPBDUF.js} +1 -1
  99. package/dist/components/{p-DUYmwrWV.js → p-BMRln59F.js} +3 -3
  100. package/dist/components/{p-DIazmg6w.js → p-BO9BvTtK.js} +2 -2
  101. package/dist/components/{p-D3y_Hauo.js → p-BU-FZuj0.js} +3 -3
  102. package/dist/components/{p-DgJ0ufzr.js → p-BVEGQLBD.js} +1 -1
  103. package/dist/components/{p-Dlp84thc.js → p-BYO6pz8T.js} +1 -1
  104. package/dist/components/{p-JYj3Facr.js → p-BknTMcbz.js} +16 -16
  105. package/dist/components/{p-CWRSGYOE.js → p-BzJEwFtn.js} +1 -1
  106. package/dist/components/{p-B6t5q-V4.js → p-BzrxIesp.js} +1 -1
  107. package/dist/components/{p-894OnDQV.js → p-CM1duewg.js} +1 -1
  108. package/dist/components/{p-CqLgB8JK.js → p-CMZ09rB1.js} +3 -3
  109. package/dist/components/{p-e6Zpc9Vp.js → p-COjsYPir.js} +2 -2
  110. package/dist/components/{p-BmyTdQGy.js → p-CURiiQfq.js} +12 -0
  111. package/dist/components/{p-BsANVili.js → p-CVhcOiEA.js} +3 -3
  112. package/dist/components/{p-D82VaHce.js → p-Ckm1Aq0V.js} +2 -2
  113. package/dist/components/{p-C38P-Vd0.js → p-Cr2z2UBL.js} +7 -7
  114. package/dist/components/{p-PSFAfAyd.js → p-CwuGA058.js} +1 -1
  115. package/dist/components/{p-Cr682JI_.js → p-D8TOEhPY.js} +3 -3
  116. package/dist/components/{p-BBmP8lVY.js → p-D8bHNNEm.js} +129 -49
  117. package/dist/components/{p-ClFprFvz.js → p-DDbO5q-e.js} +3 -3
  118. package/dist/components/{p-BDzlx2hB.js → p-DIMNEOTW.js} +1 -1
  119. package/dist/components/{p-C4NrrUfN.js → p-DSOc0eIT.js} +1 -1
  120. package/dist/components/{p-D5jf8wAu.js → p-DXcjIb_a.js} +3 -3
  121. package/dist/components/{p-Ch42cOeY.js → p-DgA865Tp.js} +8 -21
  122. package/dist/components/{p-B8Xi4Clg.js → p-DgnK50xO.js} +1 -1
  123. package/dist/components/{p-D30zs0kA.js → p-DkY7pIg5.js} +3 -3
  124. package/dist/components/{p-BTzlrIxe.js → p-DrQRChp3.js} +2 -2
  125. package/dist/components/{p-CsvMgk_f.js → p-DwY5pghH.js} +1 -1
  126. package/dist/components/{p-DkUb2czk.js → p-OLfoATNk.js} +1 -1
  127. package/dist/components/{p-DEBwmRTC.js → p-oGAPPwAL.js} +2 -2
  128. package/dist/components/{p-DJ88BrIW.js → p-yD_3Z3K1.js} +1 -1
  129. package/dist/esm/index.js +2 -2
  130. package/dist/esm/kritzel-active-users_47.entry.js +140 -101
  131. package/dist/esm/loader.js +1 -1
  132. package/dist/esm/{schema.constants-uC7_X6yr.js → schema.constants-Rpm1NA9u.js} +75 -7
  133. package/dist/esm/stencil.js +1 -1
  134. package/dist/stencil/index.esm.js +2 -2
  135. package/dist/stencil/{p-5b969a42.entry.js → p-8c1b7b08.entry.js} +140 -101
  136. package/dist/stencil/{p-uC7_X6yr.js → p-Rpm1NA9u.js} +75 -7
  137. package/dist/stencil/stencil.esm.js +1 -1
  138. package/dist/types/classes/core/core.class.d.ts +2 -2
  139. package/dist/types/classes/managers/license.manager.d.ts +6 -0
  140. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +4 -0
  141. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -1
  142. package/dist/types/components.d.ts +7 -0
  143. package/dist/types/constants/license.constants.d.ts +1 -1
  144. package/dist/types/constants/version.d.ts +1 -1
  145. package/dist/types/helpers/theme.helper.d.ts +1 -0
  146. package/dist/types/index.d.ts +1 -0
  147. package/dist/types/interfaces/context-menu-state.interface.d.ts +16 -0
  148. package/dist/types/interfaces/theme.interface.d.ts +2 -0
  149. package/package.json +1 -1
  150. package/readme.md +3 -3
@@ -14557,7 +14557,9 @@ const lightTheme = {
14557
14557
  },
14558
14558
  snap: {
14559
14559
  indicatorFill: 'rgba(59, 130, 246, 0.3)',
14560
+ indicatorFillInactive: 'rgba(59, 130, 246, 0.18)',
14560
14561
  indicatorStroke: '#007bff',
14562
+ indicatorStrokeInactive: 'rgba(59, 130, 246, 0.5)',
14561
14563
  lineStroke: 'rgba(0, 0, 0, 0.2)',
14562
14564
  },
14563
14565
  fontSize: {
@@ -14894,7 +14896,9 @@ const darkTheme = {
14894
14896
  },
14895
14897
  snap: {
14896
14898
  indicatorFill: 'rgba(10, 132, 255, 0.35)',
14899
+ indicatorFillInactive: 'rgba(10, 132, 255, 0.2)',
14897
14900
  indicatorStroke: '#0A84FF',
14901
+ indicatorStrokeInactive: 'rgba(255, 255, 255, 0.45)',
14898
14902
  lineStroke: 'rgba(255, 255, 255, 0.35)',
14899
14903
  },
14900
14904
  fontSize: {
@@ -15094,6 +15098,7 @@ const darkTheme = {
15094
15098
  };
15095
15099
 
15096
15100
  class ThemeHelper {
15101
+ static appliedVariableNames = new WeakMap();
15097
15102
  /**
15098
15103
  * Converts a camelCase string to kebab-case.
15099
15104
  * @example ThemeHelper.camelToKebab('controlHoverBackgroundColor') → 'control-hover-background-color'
@@ -15159,7 +15164,14 @@ class ThemeHelper {
15159
15164
  */
15160
15165
  static applyThemeToElement(element, theme) {
15161
15166
  const variables = ThemeHelper.flattenThemeToVariables(theme);
15167
+ const previousVariableNames = ThemeHelper.appliedVariableNames.get(element);
15168
+ for (const name of previousVariableNames ?? []) {
15169
+ if (!variables.has(name)) {
15170
+ element.style.removeProperty(name);
15171
+ }
15172
+ }
15162
15173
  ThemeHelper.applyVariablesToElement(element, variables);
15174
+ ThemeHelper.appliedVariableNames.set(element, new Set(variables.keys()));
15163
15175
  }
15164
15176
  }
15165
15177
 
@@ -15780,7 +15792,7 @@ class KritzelText extends KritzelBaseObject {
15780
15792
  }
15781
15793
  element.style.fontFamily = KritzelFontRegistry.resolveCssFontFamily(this.fontFamily);
15782
15794
  element.style.fontSize = `${this.fontSize}pt`;
15783
- element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
15795
+ element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor, this._core?.themeManager?.currentTheme);
15784
15796
  if (this.isMounted && this.elementRef === element && this.editor.dom.parentElement === element) {
15785
15797
  if (!this._core.store.state.isScaling && !this._core.store.state.isPanning) {
15786
15798
  requestAnimationFrame(() => this.adjustSizeOnInput());
@@ -18687,7 +18699,7 @@ class KritzelLine extends KritzelBaseObject {
18687
18699
  getArrowFill(end) {
18688
18700
  const config = end === 'start' ? this.arrows?.start : this.arrows?.end;
18689
18701
  const color = config?.fill ?? this.stroke;
18690
- return KritzelColorHelper.resolveThemeColor(color);
18702
+ return KritzelColorHelper.resolveThemeColor(color, this._core?.themeManager?.currentTheme);
18691
18703
  }
18692
18704
  /**
18693
18705
  * Generates SVG path data for an arrow head based on the given style.
@@ -19490,7 +19502,7 @@ class KritzelShape extends KritzelBaseObject {
19490
19502
  }
19491
19503
  element.style.fontFamily = this.fontFamily;
19492
19504
  element.style.fontSize = `${this.fontSize}pt`;
19493
- element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
19505
+ element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor, this._core?.themeManager?.currentTheme);
19494
19506
  element.style.whiteSpace = 'pre-wrap';
19495
19507
  element.style.wordWrap = 'break-word';
19496
19508
  if (this.editor.dom.parentElement === element) {
@@ -19806,13 +19818,13 @@ class KritzelShape extends KritzelBaseObject {
19806
19818
  this.fontColor = KritzelColorHelper.determineTextColor(this.fillColor);
19807
19819
  // Update the editor's text color immediately
19808
19820
  if (this.editor?.dom?.parentElement) {
19809
- this.editor.dom.parentElement.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
19821
+ this.editor.dom.parentElement.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor, this._core?.themeManager?.currentTheme);
19810
19822
  }
19811
19823
  }
19812
19824
  else if (changedProperties.includes('fontColor')) {
19813
19825
  // Also update editor when fontColor changes directly
19814
19826
  if (this.editor?.dom?.parentElement) {
19815
- this.editor.dom.parentElement.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
19827
+ this.editor.dom.parentElement.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor, this._core?.themeManager?.currentTheme);
19816
19828
  }
19817
19829
  }
19818
19830
  }
@@ -24676,7 +24688,7 @@ class KritzelLineHandleHandler extends KritzelBaseHandler {
24676
24688
  t: clipInfo?.t,
24677
24689
  edgeX: clipInfo?.edgeX,
24678
24690
  edgeY: clipInfo?.edgeY,
24679
- lineStroke: KritzelColorHelper.resolveThemeColor(line.stroke),
24691
+ lineStroke: KritzelColorHelper.resolveThemeColor(line.stroke, this._core.themeManager.currentTheme),
24680
24692
  lineStrokeWidth: line.strokeWidth / line.scale,
24681
24693
  arrowOffset: endpoint === 'start'
24682
24694
  ? (line.hasStartArrow ? line.getArrowSize('start') / line.scale : undefined)
@@ -30255,7 +30267,7 @@ const KRITZEL_LICENSE_TOKEN_PREFIX = 'KRTZL1.';
30255
30267
  * printed public key here. Replacing this value invalidates every license
30256
30268
  * signed with the previous key.
30257
30269
  */
30258
- const KRITZEL_LICENSE_PUBLIC_KEY = 'I-pYJlxDEjT94rwSaqhXW5Sv__fMKS-JKKnV3pg0PaM';
30270
+ const KRITZEL_LICENSE_PUBLIC_KEY = '2IwZDin-qV3kOt8SEQCqdaJsGT9S7tAGapUYJVnVGQo';
30259
30271
 
30260
30272
  /** Minimum delay (ms) between periodic license re-validations. */
30261
30273
  const MIN_REVALIDATION_DELAY_MS = 30_000;
@@ -30488,8 +30500,64 @@ class KritzelLicenseManager {
30488
30500
  if (typeof claims.exp === 'number' && claims.exp * 1000 <= Date.now()) {
30489
30501
  return { status: 'rejected' }; // Cleanly expired.
30490
30502
  }
30503
+ const allowedDomains = this.normalizeAllowedDomains(claims.allowedDomains);
30504
+ if (allowedDomains === null || allowedDomains.length === 0) {
30505
+ return { status: 'rejected' };
30506
+ }
30507
+ const currentHostname = this.getCurrentHostname();
30508
+ if (!currentHostname || !allowedDomains.includes(currentHostname)) {
30509
+ return { status: 'rejected' };
30510
+ }
30491
30511
  return { status: 'pass', payloadSegment, signatureSegment, claims };
30492
30512
  }
30513
+ /** Returns the normalized current hostname, or null when unavailable/invalid. */
30514
+ getCurrentHostname() {
30515
+ const hostname = globalThis.location?.hostname;
30516
+ if (typeof hostname !== 'string') {
30517
+ return null;
30518
+ }
30519
+ return this.normalizeDomain(hostname);
30520
+ }
30521
+ /** Normalizes and validates the allowed domains claim. */
30522
+ normalizeAllowedDomains(domains) {
30523
+ if (!Array.isArray(domains)) {
30524
+ return null;
30525
+ }
30526
+ const normalized = new Set();
30527
+ for (const entry of domains) {
30528
+ if (typeof entry !== 'string') {
30529
+ return null;
30530
+ }
30531
+ const domain = this.normalizeDomain(entry);
30532
+ if (!domain) {
30533
+ return null;
30534
+ }
30535
+ normalized.add(domain);
30536
+ }
30537
+ return Array.from(normalized);
30538
+ }
30539
+ /** Normalizes a domain and rejects malformed hostnames. */
30540
+ normalizeDomain(value) {
30541
+ const trimmed = value.trim().toLowerCase();
30542
+ if (trimmed.length === 0) {
30543
+ return null;
30544
+ }
30545
+ const withoutTrailingDot = trimmed.endsWith('.') ? trimmed.slice(0, -1) : trimmed;
30546
+ if (withoutTrailingDot.length === 0) {
30547
+ return null;
30548
+ }
30549
+ try {
30550
+ const parsed = new URL(`https://${withoutTrailingDot}`);
30551
+ const normalizedHostname = parsed.hostname.toLowerCase();
30552
+ if (normalizedHostname !== withoutTrailingDot) {
30553
+ return null;
30554
+ }
30555
+ return normalizedHostname;
30556
+ }
30557
+ catch {
30558
+ return null;
30559
+ }
30560
+ }
30493
30561
  /**
30494
30562
  * Verifies the Ed25519 signature of the token against the embedded public
30495
30563
  * key. Resolves true/false for a definitive valid/invalid signature.
@@ -17,5 +17,5 @@ var patchBrowser = () => {
17
17
 
18
18
  patchBrowser().then(async (options) => {
19
19
  await globalScripts();
20
- return bootstrapLazy(JSON.parse("[[\"p-5b969a42\",[[512,\"kritzel-editor\",{\"scaleMax\":[1026,\"scale-max\"],\"scaleMin\":[1026,\"scale-min\"],\"lockDrawingScale\":[1028,\"lock-drawing-scale\"],\"viewportBoundaryLeft\":[1026,\"viewport-boundary-left\"],\"viewportBoundaryRight\":[1026,\"viewport-boundary-right\"],\"viewportBoundaryTop\":[1026,\"viewport-boundary-top\"],\"viewportBoundaryBottom\":[1026,\"viewport-boundary-bottom\"],\"debugInfo\":[1040],\"user\":[16],\"activeUsers\":[16],\"controls\":[16],\"globalContextMenuItems\":[16],\"objectContextMenuItems\":[16],\"themes\":[16],\"theme\":[1025],\"licenseKey\":[1,\"license-key\"],\"locale\":[1025],\"locales\":[16],\"fallbackLocale\":[1,\"fallback-locale\"],\"customSvgIcons\":[16],\"customFonts\":[16],\"isPanningEnabled\":[1028,\"is-panning-enabled\"],\"isZoomingEnabled\":[1028,\"is-zooming-enabled\"],\"isControlsVisible\":[4,\"is-controls-visible\"],\"isUtilityPanelVisible\":[4,\"is-utility-panel-visible\"],\"isWorkspaceManagerVisible\":[4,\"is-workspace-manager-visible\"],\"isMoreMenuVisible\":[4,\"is-more-menu-visible\"],\"isZoomPanelVisible\":[4,\"is-zoom-panel-visible\"],\"isObjectDistanceFadingActive\":[4,\"is-object-distance-fading-active\"],\"syncConfig\":[16],\"assetStorageConfig\":[16],\"cursorTarget\":[16],\"loginConfig\":[16],\"isLoading\":[4,\"is-loading\"],\"editorId\":[1,\"editor-id\"],\"activeWorkspaceId\":[1,\"active-workspace-id\"],\"isEngineReady\":[32],\"isControlsReady\":[32],\"isWorkspaceManagerReady\":[32],\"workspaces\":[32],\"activeWorkspace\":[32],\"isVirtualKeyboardOpen\":[32],\"undoState\":[32],\"isBackToContentButtonVisible\":[32],\"resolvedTerms\":[32],\"availableLocaleOptions\":[32],\"currentZoomPercent\":[32],\"shortcuts\":[32],\"currentIsPublic\":[32],\"isEditorVisible\":[32],\"activeNotification\":[32],\"isNotificationDismissing\":[32],\"normalizedControls\":[32],\"getObjectById\":[64],\"addObject\":[64],\"addObjects\":[64],\"updateObject\":[64],\"removeObject\":[64],\"removeObjects\":[64],\"getSelectedObjects\":[64],\"selectObjects\":[64],\"selectAllObjectsInViewport\":[64],\"clearSelection\":[64],\"centerObjectInViewport\":[64],\"panToObject\":[64],\"backToContent\":[64],\"centerAllObjects\":[64],\"centerObjects\":[64],\"setViewport\":[64],\"panTo\":[64],\"zoomTo\":[64],\"zoomIn\":[64],\"zoomOut\":[64],\"getViewport\":[64],\"screenToWorld\":[64],\"worldToScreen\":[64],\"createWorkspace\":[64],\"updateWorkspace\":[64],\"deleteWorkspace\":[64],\"getWorkspaces\":[64],\"getActiveWorkspace\":[64],\"loadSharedWorkspace\":[64],\"reinitSync\":[64],\"registerTool\":[64],\"changeActiveTool\":[64],\"changeActiveToolByName\":[64],\"disable\":[64],\"enable\":[64],\"copy\":[64],\"cut\":[64],\"paste\":[64],\"delete\":[64],\"bringForward\":[64],\"sendBackward\":[64],\"bringToFront\":[64],\"sendToBack\":[64],\"alignObjects\":[64],\"group\":[64],\"ungroup\":[64],\"undo\":[64],\"redo\":[64],\"getScreenshot\":[64],\"exportViewportAsPng\":[64],\"exportViewportAsSvg\":[64],\"exportSelectedObjectsAsPng\":[64],\"exportSelectedObjectsAsSvg\":[64],\"downloadAsJson\":[64],\"importFromFile\":[64],\"loadObjectsFromJson\":[64],\"getObjectsTotalCount\":[64],\"getAllObjects\":[64],\"findObjects\":[64],\"getObjectsInViewport\":[64],\"hideContextMenu\":[64],\"openContextMenu\":[64],\"triggerSelectionChange\":[64],\"beginSceneBootstrap\":[64],\"endSceneBootstrap\":[64],\"getDisplayableShortcuts\":[64],\"triggerNotification\":[64],\"openLoginDialog\":[64],\"setLoginLoading\":[64],\"setLocale\":[64],\"getLocale\":[64],\"getAvailableLocales\":[64],\"registerLocales\":[64],\"registerFonts\":[64],\"t\":[64]},[[0,\"dblclick\",\"onTouchStart\"]],{\"isEngineReady\":[{\"onIsEngineReady\":0}],\"isControlsReady\":[{\"onIsControlsReady\":0}],\"workspaces\":[{\"onWorkspacesChange\":0}],\"activeWorkspace\":[{\"onActiveWorkspaceChange\":0}],\"customFonts\":[{\"onCustomFontsChange\":0}],\"controls\":[{\"onControlsChange\":0}],\"activeWorkspaceId\":[{\"onActiveWorkspaceIdChange\":0}],\"theme\":[{\"onCurrentThemeChange\":0}],\"themes\":[{\"onThemesChange\":0}],\"locale\":[{\"onLocaleChange\":0}]}],[513,\"kritzel-controls\",{\"visible\":[4],\"controls\":[16],\"activeControl\":[1040],\"isUtilityPanelVisible\":[4,\"is-utility-panel-visible\"],\"undoState\":[16],\"theme\":[1],\"terms\":[16],\"firstConfig\":[32],\"isTouchDevice\":[32],\"selectedSubOptions\":[32],\"canScrollLeft\":[32],\"canScrollRight\":[32],\"needsScrolling\":[32],\"displayValues\":[32],\"internalControls\":[32],\"closeTooltip\":[64]},[[8,\"keydown\",\"handleKeyDown\"]],{\"controls\":[{\"onControlsChange\":0}],\"theme\":[{\"onThemeChange\":0}]}],[513,\"kritzel-engine\",{\"workspace\":[16],\"editorId\":[1,\"editor-id\"],\"activeWorkspaceId\":[1,\"active-workspace-id\"],\"syncConfig\":[16],\"assetStorageConfig\":[16],\"user\":[16],\"globalContextMenuItems\":[16],\"objectContextMenuItems\":[16],\"scaleMax\":[1026,\"scale-max\"],\"scaleMin\":[1026,\"scale-min\"],\"cursorTarget\":[16],\"lockDrawingScale\":[4,\"lock-drawing-scale\"],\"isObjectDistanceFadingActive\":[4,\"is-object-distance-fading-active\"],\"theme\":[1],\"licenseKey\":[1,\"license-key\"],\"themes\":[16],\"locale\":[1],\"locales\":[16],\"fallbackLocale\":[1,\"fallback-locale\"],\"viewportBoundaryLeft\":[2,\"viewport-boundary-left\"],\"viewportBoundaryRight\":[2,\"viewport-boundary-right\"],\"viewportBoundaryTop\":[2,\"viewport-boundary-top\"],\"viewportBoundaryBottom\":[2,\"viewport-boundary-bottom\"],\"debugInfo\":[16],\"isPanningEnabled\":[4,\"is-panning-enabled\"],\"isZoomingEnabled\":[4,\"is-zooming-enabled\"],\"isLoading\":[4,\"is-loading\"],\"forceUpdate\":[32],\"isSyncing\":[32],\"triggerSelectionChange\":[64],\"beginSceneBootstrap\":[64],\"endSceneBootstrap\":[64],\"registerTool\":[64],\"changeActiveTool\":[64],\"changeActiveToolByName\":[64],\"disable\":[64],\"enable\":[64],\"delete\":[64],\"copy\":[64],\"cut\":[64],\"paste\":[64],\"bringForward\":[64],\"sendBackward\":[64],\"bringToFront\":[64],\"sendToBack\":[64],\"alignObjects\":[64],\"group\":[64],\"ungroup\":[64],\"undo\":[64],\"redo\":[64],\"hideContextMenu\":[64],\"openContextMenu\":[64],\"getObjectById\":[64],\"getAllObjects\":[64],\"findObjects\":[64],\"getObjectsTotalCount\":[64],\"addObject\":[64],\"addObjects\":[64],\"updateObject\":[64],\"removeObject\":[64],\"removeObjects\":[64],\"getSelectedObjects\":[64],\"getDisplayableShortcuts\":[64],\"selectObjects\":[64],\"selectAllObjectsInViewport\":[64],\"clearSelection\":[64],\"centerObjectInViewport\":[64],\"panToObject\":[64],\"backToContent\":[64],\"centerAllObjects\":[64],\"centerObjects\":[64],\"setViewport\":[64],\"panTo\":[64],\"zoomTo\":[64],\"zoomIn\":[64],\"zoomOut\":[64],\"getViewport\":[64],\"screenToWorld\":[64],\"worldToScreen\":[64],\"getObjectsInViewport\":[64],\"getScreenshot\":[64],\"exportViewportAsPng\":[64],\"exportViewportAsSvg\":[64],\"getSelectedObjectsAsSvgString\":[64],\"exportSelectedObjectsAsSvg\":[64],\"getSelectedObjectsAsPngDataUrl\":[64],\"exportSelectedObjectsAsPng\":[64],\"exportAsJson\":[64],\"importFromJson\":[64],\"loadObjectsFromJson\":[64],\"downloadAsJson\":[64],\"importFromFile\":[64],\"createWorkspace\":[64],\"updateWorkspace\":[64],\"deleteWorkspace\":[64],\"getWorkspaces\":[64],\"getActiveWorkspace\":[64],\"getIsPublic\":[64],\"loadSharedWorkspace\":[64],\"reinitSync\":[64],\"saveSettings\":[64],\"loadSettings\":[64],\"registerLocales\":[64],\"setLocale\":[64],\"getLocale\":[64],\"getAvailableLocales\":[64],\"getAvailableLocaleOptions\":[64],\"t\":[64],\"getResolvedTerms\":[64]},[[1,\"wheel\",\"handleWheel\"],[0,\"pointerdown\",\"handlePointerDown\"],[0,\"pointermove\",\"handlePointerMove\"],[0,\"pointerup\",\"handlePointerUp\"],[0,\"pointercancel\",\"handlePointerCancel\"],[1,\"pointerleave\",\"handlePointerLeave\"],[1,\"longpress\",\"handleLongPress\"],[0,\"contextmenu\",\"handleContextMenu\"],[9,\"resize\",\"handleResize\"],[8,\"keydown\",\"handleKeyDown\"],[8,\"keyup\",\"handleKeyUp\"],[8,\"copy\",\"handleCopy\"],[8,\"cut\",\"handleCut\"],[8,\"paste\",\"handlePaste\"],[4,\"dblclick\",\"preventDoubleTapZoomOnTouchDevices\"]],{\"workspace\":[{\"onWorkspaceChange\":0}],\"activeWorkspaceId\":[{\"onActiveWorkspaceIdChange\":0}],\"syncConfig\":[{\"onSyncConfigChange\":0}],\"assetStorageConfig\":[{\"onAssetStorageConfigChange\":0}],\"user\":[{\"onUserChange\":0}],\"globalContextMenuItems\":[{\"onGlobalContextMenuItemsChange\":0}],\"objectContextMenuItems\":[{\"onObjectContextMenuItemsChange\":0}],\"scaleMax\":[{\"validateScaleMax\":0}],\"scaleMin\":[{\"validateScaleMin\":0}],\"cursorTarget\":[{\"onCursorTargetChange\":0}],\"lockDrawingScale\":[{\"onLockDrawingScaleChange\":0}],\"isObjectDistanceFadingActive\":[{\"onIsObjectDistanceFadingActiveChange\":0}],\"theme\":[{\"onThemeChange\":0}],\"licenseKey\":[{\"onLicenseKeyChange\":0}],\"themes\":[{\"onThemesChange\":0}],\"locale\":[{\"onLocaleChange\":0}],\"locales\":[{\"onLocalesChange\":0}],\"fallbackLocale\":[{\"onFallbackLocaleChange\":0}],\"viewportBoundaryLeft\":[{\"onViewportBoundaryLeftChange\":0}],\"viewportBoundaryRight\":[{\"onViewportBoundaryRightChange\":0}],\"viewportBoundaryTop\":[{\"onViewportBoundaryTopChange\":0}],\"viewportBoundaryBottom\":[{\"onViewportBoundaryBottomChange\":0}],\"debugInfo\":[{\"onDebugInfoChange\":0}],\"isLoading\":[{\"onIsLoadingChange\":0}]}],[513,\"kritzel-settings\",{\"availableThemes\":[16],\"availableLocales\":[16],\"shortcuts\":[16],\"terms\":[16],\"settings\":[16],\"isDialogOpen\":[32],\"selectedCategoryId\":[32],\"scaleMin\":[32],\"scaleMax\":[32],\"lockDrawingScale\":[32],\"theme\":[32],\"locale\":[32],\"viewportBoundaryLeft\":[32],\"viewportBoundaryRight\":[32],\"viewportBoundaryTop\":[32],\"viewportBoundaryBottom\":[32],\"debugInfo\":[32],\"open\":[64]},null,{\"settings\":[{\"onSettingsPropChange\":0}]}],[513,\"kritzel-export\",{\"workspaceName\":[1,\"workspace-name\"],\"terms\":[16],\"isDialogOpen\":[32],\"previewUrl\":[32],\"isLoading\":[32],\"activeTab\":[32],\"exportFilename\":[32],\"viewportExportFormat\":[32],\"open\":[64]}],[513,\"kritzel-workspace-manager\",{\"visible\":[4],\"activeWorkspace\":[1040],\"workspaces\":[16],\"terms\":[16],\"childMenuAnchor\":[32],\"openChildMenuItem\":[32],\"newWorkspace\":[32],\"editingItemId\":[32]},[[8,\"wheel\",\"handleWheel\"]]],[513,\"kritzel-more-menu\",{\"visible\":[4],\"items\":[16],\"icon\":[1],\"iconSize\":[2,\"icon-size\"],\"offsetY\":[2,\"offset-y\"],\"terms\":[16],\"menuAnchor\":[32],\"isTouchDevice\":[32]}],[513,\"kritzel-current-user-dialog\",{\"user\":[16],\"terms\":[16],\"isDialogOpen\":[32],\"open\":[64],\"close\":[64]}],[513,\"kritzel-share-dialog\",{\"isPublic\":[4,\"is-public\"],\"workspaceId\":[1,\"workspace-id\"],\"terms\":[16],\"isDialogOpen\":[32],\"internalIsPublic\":[32],\"copySuccess\":[32],\"qrCodeDataUrl\":[32],\"open\":[64],\"close\":[64]},null,{\"isPublic\":[{\"onIsPublicChange\":0}],\"workspaceId\":[{\"onWorkspaceIdChange\":0}]}],[513,\"kritzel-login-dialog\",{\"providers\":[16],\"dialogTitle\":[1,\"dialog-title\"],\"subtitle\":[1],\"isDialogOpen\":[32],\"loadingProvider\":[32],\"open\":[64],\"close\":[64],\"setLoading\":[64]}],[513,\"kritzel-active-users\",{\"users\":[16],\"avatarSize\":[2,\"avatar-size\"],\"maxVisible\":[2,\"max-visible\"],\"overlap\":[2]}],[513,\"kritzel-back-to-content\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-current-user\",{\"user\":[16],\"avatarSize\":[2,\"avatar-size\"],\"terms\":[16]}],[513,\"kritzel-notification-card\",{\"notification\":[16],\"showTimestamp\":[4,\"show-timestamp\"],\"locale\":[1]}],[513,\"kritzel-zoom-panel\",{\"visible\":[4],\"disabled\":[4],\"zoomPercent\":[2,\"zoom-percent\"],\"terms\":[16]}],[513,\"kritzel-tool-config\",{\"tool\":[1040],\"isExpanded\":[1028,\"is-expanded\"],\"theme\":[1],\"engine\":[16],\"terms\":[16],\"config\":[32],\"palette\":[32],\"sizes\":[32],\"currentOpacity\":[32],\"updateTrigger\":[32]},null,{\"tool\":[{\"handleToolChange\":0}],\"theme\":[{\"onThemeChange\":0}],\"engine\":[{\"handleEngineChange\":0}]}],[513,\"kritzel-split-button\",{\"buttonIcon\":[1,\"button-icon\"],\"dropdownIcon\":[1,\"dropdown-icon\"],\"items\":[16],\"mainButtonDisabled\":[4,\"main-button-disabled\"],\"menuButtonDisabled\":[4,\"menu-button-disabled\"],\"isMenuOpen\":[32],\"isTouchDevice\":[32],\"anchorElement\":[32],\"menuScrollTop\":[32],\"open\":[64],\"focusMenu\":[64]}],[513,\"kritzel-context-menu\",{\"items\":[16],\"objects\":[16],\"processedItems\":[32],\"openSubmenuPath\":[32],\"submenuPositions\":[32]},[[9,\"pointerdown\",\"handleOutsideClick\"]],{\"items\":[{\"onItemsChanged\":0}]}],[769,\"kritzel-master-detail\",{\"items\":[16],\"selectedItemId\":[1,\"selected-item-id\"],\"focusedIndex\":[32],\"showMobileDetail\":[32]},null,{\"selectedItemId\":[{\"watchSelectedItemId\":0}]}],[513,\"kritzel-pill-tabs\",{\"tabs\":[16],\"value\":[1025]}],[513,\"kritzel-utility-panel\",{\"undoState\":[16],\"terms\":[16]}],[513,\"kritzel-awareness-cursors\",{\"core\":[16],\"showEdgeIndicators\":[4,\"show-edge-indicators\"],\"edgeIndicatorPadding\":[2,\"edge-indicator-padding\"],\"remoteCursors\":[32],\"objectVersion\":[32]}],[769,\"kritzel-button\",{\"variant\":[1],\"disabled\":[4],\"type\":[1]}],[513,\"kritzel-cursor-trail\",{\"core\":[16],\"cursorTrailPoints\":[32],\"isLeftButtonDown\":[32]},[[9,\"pointerdown\",\"handleMouseDown\"],[9,\"pointermove\",\"handlePointerMove\"],[9,\"pointerup\",\"handlePointerUp\"]]],[513,\"kritzel-input\",{\"value\":[1025],\"label\":[1],\"placeholder\":[1],\"suffix\":[1],\"type\":[1],\"disabled\":[4],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-loading-overlay\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-numeric-input\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"label\":[1],\"placeholder\":[1],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-sync-indicator\",{\"visible\":[4],\"text\":[1]}],[769,\"kritzel-tooltip\",{\"isVisible\":[1028,\"is-visible\"],\"anchorElement\":[16],\"triggerElement\":[16],\"offsetY\":[2,\"offset-y\"],\"positionX\":[32],\"positionY\":[32],\"open\":[64],\"close\":[64],\"toggle\":[64],\"focusContent\":[64]},[[4,\"click\",\"handleOutsideClick\"],[6,\"pointerdown\",\"handleOutsidePointerDown\"],[4,\"kritzelTooltipCloseAll\",\"handleCloseAll\"],[9,\"resize\",\"handleWindowResize\"]],{\"triggerElement\":[{\"handleTriggerElementChange\":0}],\"isVisible\":[{\"handleVisibilityChange\":0}]}],[513,\"kritzel-watermark\",{\"core\":[16],\"label\":[1]}],[513,\"kritzel-color-palette\",{\"colors\":[16],\"selectedColor\":[1040],\"isExpanded\":[4,\"is-expanded\"],\"isOpaque\":[4,\"is-opaque\"],\"opacity\":[2],\"theme\":[1]}],[513,\"kritzel-font-family\",{\"fontOptions\":[16],\"selectedFontFamily\":[1025,\"selected-font-family\"]},null,{\"fontOptions\":[{\"handleFontOptionsChange\":0}]}],[513,\"kritzel-font-size\",{\"sizes\":[16],\"selectedSize\":[1026,\"selected-size\"],\"fontFamily\":[1,\"font-family\"]}],[513,\"kritzel-stroke-size\",{\"sizes\":[16],\"selectedSize\":[1026,\"selected-size\"]}],[513,\"kritzel-line-endings\",{\"styles\":[16],\"value\":[1040]}],[513,\"kritzel-opacity-slider\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"previewColor\":[1,\"preview-color\"]}],[513,\"kritzel-shape-fill\",{\"value\":[1025]}],[513,\"kritzel-slide-toggle\",{\"checked\":[1028],\"disabled\":[4],\"label\":[1]}],[513,\"kritzel-avatar\",{\"user\":[16],\"name\":[1],\"size\":[2],\"color\":[1],\"imageError\":[32]},null,{\"user\":[{\"userChanged\":0}],\"profileImageUrl\":[{\"profileImageUrlChanged\":0}]}],[513,\"kritzel-font\",{\"fontFamily\":[1,\"font-family\"],\"size\":[2],\"color\":[1]}],[513,\"kritzel-color\",{\"value\":[1],\"theme\":[1],\"size\":[2]}],[513,\"kritzel-menu\",{\"items\":[16],\"parent\":[16],\"selectedIndex\":[32],\"setScrollTop\":[64],\"setFocus\":[64]}],[513,\"kritzel-menu-item\",{\"item\":[16],\"parent\":[16],\"isDirty\":[32]},null,{\"item\":[{\"onItemChange\":0}]}],[769,\"kritzel-dialog\",{\"isOpen\":[516,\"is-open\"],\"dialogTitle\":[1,\"dialog-title\"],\"closable\":[4],\"closeOnBackdrop\":[4,\"close-on-backdrop\"],\"closeOnEscape\":[4,\"close-on-escape\"],\"autoFocus\":[4,\"auto-focus\"],\"trapFocus\":[4,\"trap-focus\"],\"size\":[1],\"fullscreenOnMobile\":[4,\"fullscreen-on-mobile\"],\"contained\":[516],\"isAnimating\":[32],\"mobileLockedHeight\":[32],\"containerRect\":[32],\"containerBorderRadius\":[32],\"open\":[64],\"close\":[64],\"focusFirstElement\":[64]},[[8,\"keydown\",\"handleKeyDown\"],[9,\"resize\",\"handleWindowResize\"],[8,\"orientationchange\",\"handleOrientationChange\"]],{\"isOpen\":[{\"handleIsOpenChange\":0}]}],[769,\"kritzel-portal\",{\"anchor\":[16],\"offsetX\":[2,\"offset-x\"],\"offsetY\":[2,\"offset-y\"],\"autoFocus\":[4,\"auto-focus\"]},[[8,\"kritzel-dismiss-menus\",\"handleDismissMenus\"],[8,\"click\",\"handleOutsideClick\"],[6,\"pointerdown\",\"handleOutsidePointerDown\"],[8,\"keydown\",\"handleKeyDown\"],[11,\"resize\",\"handleResize\"],[11,\"scroll\",\"handleWindowScroll\"]],{\"anchor\":[{\"anchorChanged\":0}]}],[769,\"kritzel-dropdown\",{\"options\":[16],\"value\":[1],\"width\":[1],\"selectStyles\":[16],\"forceOpenDirection\":[1,\"force-open-direction\"],\"internalValue\":[32],\"hasSuffixContent\":[32],\"hasPrefixContent\":[32],\"isOpen\":[32],\"focusedIndex\":[32],\"openDirection\":[32]},[[4,\"click\",\"handleDocumentClick\"],[4,\"keydown\",\"handleDocumentKeydown\"]],{\"options\":[{\"optionsChanged\":0}],\"value\":[{\"externalValueChanged\":0}]}],[513,\"kritzel-icon\",{\"name\":[1],\"label\":[1],\"size\":[2]}]]],[\"p-fb32cd8f\",[[513,\"kritzel-brush-style\",{\"type\":[1],\"brushOptions\":[16]}]]]]"), options);
20
+ return bootstrapLazy(JSON.parse("[[\"p-8c1b7b08\",[[512,\"kritzel-editor\",{\"scaleMax\":[1026,\"scale-max\"],\"scaleMin\":[1026,\"scale-min\"],\"lockDrawingScale\":[1028,\"lock-drawing-scale\"],\"viewportBoundaryLeft\":[1026,\"viewport-boundary-left\"],\"viewportBoundaryRight\":[1026,\"viewport-boundary-right\"],\"viewportBoundaryTop\":[1026,\"viewport-boundary-top\"],\"viewportBoundaryBottom\":[1026,\"viewport-boundary-bottom\"],\"debugInfo\":[1040],\"user\":[16],\"activeUsers\":[16],\"controls\":[16],\"globalContextMenuItems\":[16],\"objectContextMenuItems\":[16],\"themes\":[16],\"theme\":[1025],\"licenseKey\":[1,\"license-key\"],\"locale\":[1025],\"locales\":[16],\"fallbackLocale\":[1,\"fallback-locale\"],\"customSvgIcons\":[16],\"customFonts\":[16],\"isPanningEnabled\":[1028,\"is-panning-enabled\"],\"isZoomingEnabled\":[1028,\"is-zooming-enabled\"],\"isControlsVisible\":[4,\"is-controls-visible\"],\"isUtilityPanelVisible\":[4,\"is-utility-panel-visible\"],\"isWorkspaceManagerVisible\":[4,\"is-workspace-manager-visible\"],\"isMoreMenuVisible\":[4,\"is-more-menu-visible\"],\"isZoomPanelVisible\":[4,\"is-zoom-panel-visible\"],\"isObjectDistanceFadingActive\":[4,\"is-object-distance-fading-active\"],\"syncConfig\":[16],\"assetStorageConfig\":[16],\"cursorTarget\":[16],\"loginConfig\":[16],\"isLoading\":[4,\"is-loading\"],\"editorId\":[1,\"editor-id\"],\"activeWorkspaceId\":[1,\"active-workspace-id\"],\"isEngineReady\":[32],\"isControlsReady\":[32],\"isWorkspaceManagerReady\":[32],\"workspaces\":[32],\"activeWorkspace\":[32],\"isVirtualKeyboardOpen\":[32],\"undoState\":[32],\"isBackToContentButtonVisible\":[32],\"resolvedTerms\":[32],\"availableLocaleOptions\":[32],\"currentZoomPercent\":[32],\"shortcuts\":[32],\"currentIsPublic\":[32],\"isEditorVisible\":[32],\"activeNotification\":[32],\"isNotificationDismissing\":[32],\"contextMenuState\":[32],\"normalizedControls\":[32],\"getObjectById\":[64],\"addObject\":[64],\"addObjects\":[64],\"updateObject\":[64],\"removeObject\":[64],\"removeObjects\":[64],\"getSelectedObjects\":[64],\"selectObjects\":[64],\"selectAllObjectsInViewport\":[64],\"clearSelection\":[64],\"centerObjectInViewport\":[64],\"panToObject\":[64],\"backToContent\":[64],\"centerAllObjects\":[64],\"centerObjects\":[64],\"setViewport\":[64],\"panTo\":[64],\"zoomTo\":[64],\"zoomIn\":[64],\"zoomOut\":[64],\"getViewport\":[64],\"screenToWorld\":[64],\"worldToScreen\":[64],\"createWorkspace\":[64],\"updateWorkspace\":[64],\"deleteWorkspace\":[64],\"getWorkspaces\":[64],\"getActiveWorkspace\":[64],\"loadSharedWorkspace\":[64],\"reinitSync\":[64],\"registerTool\":[64],\"changeActiveTool\":[64],\"changeActiveToolByName\":[64],\"disable\":[64],\"enable\":[64],\"copy\":[64],\"cut\":[64],\"paste\":[64],\"delete\":[64],\"bringForward\":[64],\"sendBackward\":[64],\"bringToFront\":[64],\"sendToBack\":[64],\"alignObjects\":[64],\"group\":[64],\"ungroup\":[64],\"undo\":[64],\"redo\":[64],\"getScreenshot\":[64],\"exportViewportAsPng\":[64],\"exportViewportAsSvg\":[64],\"exportSelectedObjectsAsPng\":[64],\"exportSelectedObjectsAsSvg\":[64],\"downloadAsJson\":[64],\"importFromFile\":[64],\"loadObjectsFromJson\":[64],\"getObjectsTotalCount\":[64],\"getAllObjects\":[64],\"findObjects\":[64],\"getObjectsInViewport\":[64],\"hideContextMenu\":[64],\"openContextMenu\":[64],\"triggerSelectionChange\":[64],\"beginSceneBootstrap\":[64],\"endSceneBootstrap\":[64],\"getDisplayableShortcuts\":[64],\"triggerNotification\":[64],\"openLoginDialog\":[64],\"setLoginLoading\":[64],\"setLocale\":[64],\"getLocale\":[64],\"getAvailableLocales\":[64],\"registerLocales\":[64],\"registerFonts\":[64],\"t\":[64]},[[0,\"dblclick\",\"onTouchStart\"]],{\"isEngineReady\":[{\"onIsEngineReady\":0}],\"isControlsReady\":[{\"onIsControlsReady\":0}],\"workspaces\":[{\"onWorkspacesChange\":0}],\"activeWorkspace\":[{\"onActiveWorkspaceChange\":0}],\"customFonts\":[{\"onCustomFontsChange\":0}],\"controls\":[{\"onControlsChange\":0}],\"activeWorkspaceId\":[{\"onActiveWorkspaceIdChange\":0}],\"theme\":[{\"onCurrentThemeChange\":0}],\"themes\":[{\"onThemesChange\":0}],\"locale\":[{\"onLocaleChange\":0}]}],[513,\"kritzel-controls\",{\"visible\":[4],\"controls\":[16],\"activeControl\":[1040],\"isUtilityPanelVisible\":[4,\"is-utility-panel-visible\"],\"undoState\":[16],\"theme\":[1],\"terms\":[16],\"firstConfig\":[32],\"isTouchDevice\":[32],\"selectedSubOptions\":[32],\"canScrollLeft\":[32],\"canScrollRight\":[32],\"needsScrolling\":[32],\"displayValues\":[32],\"internalControls\":[32],\"closeTooltip\":[64]},[[8,\"keydown\",\"handleKeyDown\"]],{\"controls\":[{\"onControlsChange\":0}],\"theme\":[{\"onThemeChange\":0}]}],[513,\"kritzel-engine\",{\"workspace\":[16],\"editorId\":[1,\"editor-id\"],\"activeWorkspaceId\":[1,\"active-workspace-id\"],\"syncConfig\":[16],\"assetStorageConfig\":[16],\"user\":[16],\"globalContextMenuItems\":[16],\"objectContextMenuItems\":[16],\"scaleMax\":[1026,\"scale-max\"],\"scaleMin\":[1026,\"scale-min\"],\"cursorTarget\":[16],\"lockDrawingScale\":[4,\"lock-drawing-scale\"],\"isObjectDistanceFadingActive\":[4,\"is-object-distance-fading-active\"],\"theme\":[1],\"licenseKey\":[1,\"license-key\"],\"themes\":[16],\"locale\":[1],\"locales\":[16],\"fallbackLocale\":[1,\"fallback-locale\"],\"viewportBoundaryLeft\":[2,\"viewport-boundary-left\"],\"viewportBoundaryRight\":[2,\"viewport-boundary-right\"],\"viewportBoundaryTop\":[2,\"viewport-boundary-top\"],\"viewportBoundaryBottom\":[2,\"viewport-boundary-bottom\"],\"debugInfo\":[16],\"isPanningEnabled\":[4,\"is-panning-enabled\"],\"isZoomingEnabled\":[4,\"is-zooming-enabled\"],\"isLoading\":[4,\"is-loading\"],\"forceUpdate\":[32],\"isSyncing\":[32],\"triggerSelectionChange\":[64],\"beginSceneBootstrap\":[64],\"endSceneBootstrap\":[64],\"registerTool\":[64],\"changeActiveTool\":[64],\"changeActiveToolByName\":[64],\"disable\":[64],\"enable\":[64],\"delete\":[64],\"copy\":[64],\"cut\":[64],\"paste\":[64],\"bringForward\":[64],\"sendBackward\":[64],\"bringToFront\":[64],\"sendToBack\":[64],\"alignObjects\":[64],\"group\":[64],\"ungroup\":[64],\"undo\":[64],\"redo\":[64],\"hideContextMenu\":[64],\"openContextMenu\":[64],\"getObjectById\":[64],\"getAllObjects\":[64],\"findObjects\":[64],\"getObjectsTotalCount\":[64],\"addObject\":[64],\"addObjects\":[64],\"updateObject\":[64],\"removeObject\":[64],\"removeObjects\":[64],\"getSelectedObjects\":[64],\"getDisplayableShortcuts\":[64],\"selectObjects\":[64],\"selectAllObjectsInViewport\":[64],\"clearSelection\":[64],\"centerObjectInViewport\":[64],\"panToObject\":[64],\"backToContent\":[64],\"centerAllObjects\":[64],\"centerObjects\":[64],\"setViewport\":[64],\"panTo\":[64],\"zoomTo\":[64],\"zoomIn\":[64],\"zoomOut\":[64],\"getViewport\":[64],\"screenToWorld\":[64],\"worldToScreen\":[64],\"getObjectsInViewport\":[64],\"getScreenshot\":[64],\"exportViewportAsPng\":[64],\"exportViewportAsSvg\":[64],\"getSelectedObjectsAsSvgString\":[64],\"exportSelectedObjectsAsSvg\":[64],\"getSelectedObjectsAsPngDataUrl\":[64],\"exportSelectedObjectsAsPng\":[64],\"exportAsJson\":[64],\"importFromJson\":[64],\"loadObjectsFromJson\":[64],\"downloadAsJson\":[64],\"importFromFile\":[64],\"createWorkspace\":[64],\"updateWorkspace\":[64],\"deleteWorkspace\":[64],\"getWorkspaces\":[64],\"getActiveWorkspace\":[64],\"getIsPublic\":[64],\"loadSharedWorkspace\":[64],\"reinitSync\":[64],\"saveSettings\":[64],\"loadSettings\":[64],\"registerLocales\":[64],\"setLocale\":[64],\"getLocale\":[64],\"getAvailableLocales\":[64],\"getAvailableLocaleOptions\":[64],\"t\":[64],\"getResolvedTerms\":[64]},[[1,\"wheel\",\"handleWheel\"],[0,\"pointerdown\",\"handlePointerDown\"],[0,\"pointermove\",\"handlePointerMove\"],[0,\"pointerup\",\"handlePointerUp\"],[0,\"pointercancel\",\"handlePointerCancel\"],[1,\"pointerleave\",\"handlePointerLeave\"],[1,\"longpress\",\"handleLongPress\"],[0,\"contextmenu\",\"handleContextMenu\"],[9,\"resize\",\"handleResize\"],[8,\"keydown\",\"handleKeyDown\"],[8,\"keyup\",\"handleKeyUp\"],[8,\"copy\",\"handleCopy\"],[8,\"cut\",\"handleCut\"],[8,\"paste\",\"handlePaste\"],[4,\"dblclick\",\"preventDoubleTapZoomOnTouchDevices\"]],{\"workspace\":[{\"onWorkspaceChange\":0}],\"activeWorkspaceId\":[{\"onActiveWorkspaceIdChange\":0}],\"syncConfig\":[{\"onSyncConfigChange\":0}],\"assetStorageConfig\":[{\"onAssetStorageConfigChange\":0}],\"user\":[{\"onUserChange\":0}],\"globalContextMenuItems\":[{\"onGlobalContextMenuItemsChange\":0}],\"objectContextMenuItems\":[{\"onObjectContextMenuItemsChange\":0}],\"scaleMax\":[{\"validateScaleMax\":0}],\"scaleMin\":[{\"validateScaleMin\":0}],\"cursorTarget\":[{\"onCursorTargetChange\":0}],\"lockDrawingScale\":[{\"onLockDrawingScaleChange\":0}],\"isObjectDistanceFadingActive\":[{\"onIsObjectDistanceFadingActiveChange\":0}],\"theme\":[{\"onThemeChange\":0}],\"licenseKey\":[{\"onLicenseKeyChange\":0}],\"themes\":[{\"onThemesChange\":0}],\"locale\":[{\"onLocaleChange\":0}],\"locales\":[{\"onLocalesChange\":0}],\"fallbackLocale\":[{\"onFallbackLocaleChange\":0}],\"viewportBoundaryLeft\":[{\"onViewportBoundaryLeftChange\":0}],\"viewportBoundaryRight\":[{\"onViewportBoundaryRightChange\":0}],\"viewportBoundaryTop\":[{\"onViewportBoundaryTopChange\":0}],\"viewportBoundaryBottom\":[{\"onViewportBoundaryBottomChange\":0}],\"debugInfo\":[{\"onDebugInfoChange\":0}],\"isLoading\":[{\"onIsLoadingChange\":0}]}],[513,\"kritzel-settings\",{\"availableThemes\":[16],\"availableLocales\":[16],\"shortcuts\":[16],\"terms\":[16],\"settings\":[16],\"isDialogOpen\":[32],\"selectedCategoryId\":[32],\"scaleMin\":[32],\"scaleMax\":[32],\"lockDrawingScale\":[32],\"theme\":[32],\"locale\":[32],\"viewportBoundaryLeft\":[32],\"viewportBoundaryRight\":[32],\"viewportBoundaryTop\":[32],\"viewportBoundaryBottom\":[32],\"debugInfo\":[32],\"open\":[64]},null,{\"settings\":[{\"onSettingsPropChange\":0}]}],[513,\"kritzel-export\",{\"workspaceName\":[1,\"workspace-name\"],\"terms\":[16],\"isDialogOpen\":[32],\"previewUrl\":[32],\"isLoading\":[32],\"activeTab\":[32],\"exportFilename\":[32],\"viewportExportFormat\":[32],\"open\":[64]}],[513,\"kritzel-workspace-manager\",{\"visible\":[4],\"activeWorkspace\":[1040],\"workspaces\":[16],\"terms\":[16],\"childMenuAnchor\":[32],\"openChildMenuItem\":[32],\"newWorkspace\":[32],\"editingItemId\":[32]},[[8,\"wheel\",\"handleWheel\"]]],[513,\"kritzel-more-menu\",{\"visible\":[4],\"items\":[16],\"icon\":[1],\"iconSize\":[2,\"icon-size\"],\"offsetY\":[2,\"offset-y\"],\"terms\":[16],\"menuAnchor\":[32],\"isTouchDevice\":[32]}],[513,\"kritzel-current-user-dialog\",{\"user\":[16],\"terms\":[16],\"isDialogOpen\":[32],\"open\":[64],\"close\":[64]}],[513,\"kritzel-share-dialog\",{\"isPublic\":[4,\"is-public\"],\"workspaceId\":[1,\"workspace-id\"],\"terms\":[16],\"isDialogOpen\":[32],\"internalIsPublic\":[32],\"copySuccess\":[32],\"qrCodeDataUrl\":[32],\"open\":[64],\"close\":[64]},null,{\"isPublic\":[{\"onIsPublicChange\":0}],\"workspaceId\":[{\"onWorkspaceIdChange\":0}]}],[513,\"kritzel-login-dialog\",{\"providers\":[16],\"dialogTitle\":[1,\"dialog-title\"],\"subtitle\":[1],\"isDialogOpen\":[32],\"loadingProvider\":[32],\"open\":[64],\"close\":[64],\"setLoading\":[64]}],[513,\"kritzel-active-users\",{\"users\":[16],\"avatarSize\":[2,\"avatar-size\"],\"maxVisible\":[2,\"max-visible\"],\"overlap\":[2]}],[513,\"kritzel-back-to-content\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-context-menu\",{\"items\":[16],\"objects\":[16],\"processedItems\":[32],\"openSubmenuPath\":[32],\"submenuPositions\":[32]},[[9,\"pointerdown\",\"handleOutsideClick\"]],{\"items\":[{\"onItemsChanged\":0}]}],[513,\"kritzel-current-user\",{\"user\":[16],\"avatarSize\":[2,\"avatar-size\"],\"terms\":[16]}],[513,\"kritzel-notification-card\",{\"notification\":[16],\"showTimestamp\":[4,\"show-timestamp\"],\"locale\":[1]}],[513,\"kritzel-zoom-panel\",{\"visible\":[4],\"disabled\":[4],\"zoomPercent\":[2,\"zoom-percent\"],\"terms\":[16]}],[513,\"kritzel-tool-config\",{\"tool\":[1040],\"isExpanded\":[1028,\"is-expanded\"],\"theme\":[1],\"engine\":[16],\"terms\":[16],\"config\":[32],\"palette\":[32],\"sizes\":[32],\"currentOpacity\":[32],\"updateTrigger\":[32]},null,{\"tool\":[{\"handleToolChange\":0}],\"theme\":[{\"onThemeChange\":0}],\"engine\":[{\"handleEngineChange\":0}]}],[513,\"kritzel-split-button\",{\"buttonIcon\":[1,\"button-icon\"],\"dropdownIcon\":[1,\"dropdown-icon\"],\"items\":[16],\"mainButtonDisabled\":[4,\"main-button-disabled\"],\"menuButtonDisabled\":[4,\"menu-button-disabled\"],\"isMenuOpen\":[32],\"isTouchDevice\":[32],\"anchorElement\":[32],\"menuScrollTop\":[32],\"open\":[64],\"focusMenu\":[64]}],[769,\"kritzel-master-detail\",{\"items\":[16],\"selectedItemId\":[1,\"selected-item-id\"],\"focusedIndex\":[32],\"showMobileDetail\":[32]},null,{\"selectedItemId\":[{\"watchSelectedItemId\":0}]}],[513,\"kritzel-pill-tabs\",{\"tabs\":[16],\"value\":[1025]}],[513,\"kritzel-utility-panel\",{\"undoState\":[16],\"terms\":[16]}],[513,\"kritzel-awareness-cursors\",{\"core\":[16],\"showEdgeIndicators\":[4,\"show-edge-indicators\"],\"edgeIndicatorPadding\":[2,\"edge-indicator-padding\"],\"remoteCursors\":[32],\"objectVersion\":[32]}],[769,\"kritzel-button\",{\"variant\":[1],\"disabled\":[4],\"type\":[1]}],[513,\"kritzel-cursor-trail\",{\"core\":[16],\"cursorTrailPoints\":[32],\"isLeftButtonDown\":[32]},[[9,\"pointerdown\",\"handleMouseDown\"],[9,\"pointermove\",\"handlePointerMove\"],[9,\"pointerup\",\"handlePointerUp\"]]],[513,\"kritzel-input\",{\"value\":[1025],\"label\":[1],\"placeholder\":[1],\"suffix\":[1],\"type\":[1],\"disabled\":[4],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-loading-overlay\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-numeric-input\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"label\":[1],\"placeholder\":[1],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-sync-indicator\",{\"visible\":[4],\"text\":[1]}],[769,\"kritzel-tooltip\",{\"isVisible\":[1028,\"is-visible\"],\"anchorElement\":[16],\"triggerElement\":[16],\"offsetY\":[2,\"offset-y\"],\"positionX\":[32],\"positionY\":[32],\"open\":[64],\"close\":[64],\"toggle\":[64],\"focusContent\":[64]},[[4,\"click\",\"handleOutsideClick\"],[6,\"pointerdown\",\"handleOutsidePointerDown\"],[4,\"kritzelTooltipCloseAll\",\"handleCloseAll\"],[9,\"resize\",\"handleWindowResize\"]],{\"triggerElement\":[{\"handleTriggerElementChange\":0}],\"isVisible\":[{\"handleVisibilityChange\":0}]}],[513,\"kritzel-watermark\",{\"core\":[16],\"label\":[1]}],[513,\"kritzel-color-palette\",{\"colors\":[16],\"selectedColor\":[1040],\"isExpanded\":[4,\"is-expanded\"],\"isOpaque\":[4,\"is-opaque\"],\"opacity\":[2],\"theme\":[1]}],[513,\"kritzel-font-family\",{\"fontOptions\":[16],\"selectedFontFamily\":[1025,\"selected-font-family\"]},null,{\"fontOptions\":[{\"handleFontOptionsChange\":0}]}],[513,\"kritzel-font-size\",{\"sizes\":[16],\"selectedSize\":[1026,\"selected-size\"],\"fontFamily\":[1,\"font-family\"]}],[513,\"kritzel-stroke-size\",{\"sizes\":[16],\"selectedSize\":[1026,\"selected-size\"]}],[513,\"kritzel-line-endings\",{\"styles\":[16],\"value\":[1040]}],[513,\"kritzel-opacity-slider\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"previewColor\":[1,\"preview-color\"]}],[513,\"kritzel-shape-fill\",{\"value\":[1025]}],[513,\"kritzel-slide-toggle\",{\"checked\":[1028],\"disabled\":[4],\"label\":[1]}],[513,\"kritzel-avatar\",{\"user\":[16],\"name\":[1],\"size\":[2],\"color\":[1],\"imageError\":[32]},null,{\"user\":[{\"userChanged\":0}],\"profileImageUrl\":[{\"profileImageUrlChanged\":0}]}],[513,\"kritzel-font\",{\"fontFamily\":[1,\"font-family\"],\"size\":[2],\"color\":[1]}],[513,\"kritzel-color\",{\"value\":[1],\"theme\":[1],\"size\":[2]}],[513,\"kritzel-menu\",{\"items\":[16],\"parent\":[16],\"selectedIndex\":[32],\"setScrollTop\":[64],\"setFocus\":[64]}],[513,\"kritzel-menu-item\",{\"item\":[16],\"parent\":[16],\"isDirty\":[32]},null,{\"item\":[{\"onItemChange\":0}]}],[769,\"kritzel-dialog\",{\"isOpen\":[516,\"is-open\"],\"dialogTitle\":[1,\"dialog-title\"],\"closable\":[4],\"closeOnBackdrop\":[4,\"close-on-backdrop\"],\"closeOnEscape\":[4,\"close-on-escape\"],\"autoFocus\":[4,\"auto-focus\"],\"trapFocus\":[4,\"trap-focus\"],\"size\":[1],\"fullscreenOnMobile\":[4,\"fullscreen-on-mobile\"],\"contained\":[516],\"isAnimating\":[32],\"mobileLockedHeight\":[32],\"containerRect\":[32],\"containerBorderRadius\":[32],\"open\":[64],\"close\":[64],\"focusFirstElement\":[64]},[[8,\"keydown\",\"handleKeyDown\"],[9,\"resize\",\"handleWindowResize\"],[8,\"orientationchange\",\"handleOrientationChange\"]],{\"isOpen\":[{\"handleIsOpenChange\":0}]}],[769,\"kritzel-portal\",{\"anchor\":[16],\"offsetX\":[2,\"offset-x\"],\"offsetY\":[2,\"offset-y\"],\"autoFocus\":[4,\"auto-focus\"]},[[8,\"kritzel-dismiss-menus\",\"handleDismissMenus\"],[8,\"click\",\"handleOutsideClick\"],[6,\"pointerdown\",\"handleOutsidePointerDown\"],[8,\"keydown\",\"handleKeyDown\"],[11,\"resize\",\"handleResize\"],[11,\"scroll\",\"handleWindowScroll\"]],{\"anchor\":[{\"anchorChanged\":0}]}],[769,\"kritzel-dropdown\",{\"options\":[16],\"value\":[1],\"width\":[1],\"selectStyles\":[16],\"forceOpenDirection\":[1,\"force-open-direction\"],\"internalValue\":[32],\"hasSuffixContent\":[32],\"hasPrefixContent\":[32],\"isOpen\":[32],\"focusedIndex\":[32],\"openDirection\":[32]},[[4,\"click\",\"handleDocumentClick\"],[4,\"keydown\",\"handleDocumentKeydown\"]],{\"options\":[{\"optionsChanged\":0}],\"value\":[{\"externalValueChanged\":0}]}],[513,\"kritzel-icon\",{\"name\":[1],\"label\":[1],\"size\":[2]}]]],[\"p-fb32cd8f\",[[513,\"kritzel-brush-style\",{\"type\":[1],\"brushOptions\":[16]}]]]]"), options);
21
21
  });
@@ -395,13 +395,13 @@ export declare class KritzelCore {
395
395
  selectObjects(objects: KritzelBaseObject<any>[]): void;
396
396
  /**
397
397
  * Selects all objects in the workspace.
398
- * Excludes selection-related and context menu objects.
398
+ * Excludes selection-related objects.
399
399
  * Switches to selection tool.
400
400
  */
401
401
  selectAllObjects(): void;
402
402
  /**
403
403
  * Selects all objects currently visible in the viewport.
404
- * Excludes selection-related and context menu objects.
404
+ * Excludes selection-related objects.
405
405
  * Switches to selection tool.
406
406
  */
407
407
  selectAllObjectsInViewport(): void;
@@ -120,6 +120,12 @@ export declare class KritzelLicenseManager {
120
120
  * parsed segments and claims for a structurally valid, unexpired token.
121
121
  */
122
122
  private preCheck;
123
+ /** Returns the normalized current hostname, or null when unavailable/invalid. */
124
+ private getCurrentHostname;
125
+ /** Normalizes and validates the allowed domains claim. */
126
+ private normalizeAllowedDomains;
127
+ /** Normalizes a domain and rejects malformed hostnames. */
128
+ private normalizeDomain;
123
129
  /**
124
130
  * Verifies the Ed25519 signature of the token against the embedded public
125
131
  * key. Resolves true/false for a definitive valid/invalid signature.
@@ -23,6 +23,7 @@ import { KritzelLoginConfig as KritzelLoginConfig } from '../../../interfaces/lo
23
23
  import { LoginEvent } from '../../../events/login.event';
24
24
  import { KritzelNotification } from '../../../interfaces/notification.interface';
25
25
  import { KritzelFontMap } from '../../../interfaces/font.interface';
26
+ import { KritzelContextMenuState } from '../../../interfaces/context-menu-state.interface';
26
27
  export declare class KritzelEditor {
27
28
  host: HTMLElement;
28
29
  scaleMax: number;
@@ -109,6 +110,7 @@ export declare class KritzelEditor {
109
110
  isEditorVisible: boolean;
110
111
  activeNotification?: KritzelNotification;
111
112
  isNotificationDismissing: boolean;
113
+ contextMenuState?: KritzelContextMenuState;
112
114
  normalizedControls: KritzelToolbarControl[];
113
115
  private notificationDismissTimeout?;
114
116
  private notificationDismissAnimationTimeout?;
@@ -250,6 +252,8 @@ export declare class KritzelEditor {
250
252
  private getZoomPercentFromScale;
251
253
  handleAwarenessChange(event: CustomEvent<Map<number, Record<string, any>>>): void;
252
254
  handleNotificationsChange(event: CustomEvent<KritzelNotification>): void;
255
+ handleContextMenuStateChange(event: CustomEvent<KritzelContextMenuState>): void;
256
+ private handleContextMenuActionSelected;
253
257
  handleNotificationHoverChange(event: CustomEvent<boolean>): void;
254
258
  private scheduleNotificationDismiss;
255
259
  private clearNotificationDismissTimer;
@@ -22,6 +22,7 @@ import { KritzelViewportState } from '../../../interfaces/viewport-state.interfa
22
22
  import { ObjectsAddedEvent, ObjectsRemovedEvent, ObjectsUpdatedEvent, ObjectsInViewportChangeEvent } from '../../../interfaces/object-change-event.interface';
23
23
  import { IKritzelUser } from '../../../interfaces/user.interface';
24
24
  import { KritzelNotification } from '../../../interfaces/notification.interface';
25
+ import { KritzelContextMenuState } from '../../../interfaces/context-menu-state.interface';
25
26
  export declare class KritzelEngine {
26
27
  host: HTMLElement;
27
28
  /** The workspace to load and display. Changing this prop switches the active workspace. */
@@ -140,6 +141,8 @@ export declare class KritzelEngine {
140
141
  awarenessChange: EventEmitter<Map<number, Record<string, any>>>;
141
142
  /** Emitted when notifications change. */
142
143
  notificationsChange: EventEmitter<KritzelNotification>;
144
+ /** Emitted when context-menu visibility, items, or position changes. */
145
+ contextMenuStateChange: EventEmitter<KritzelContextMenuState>;
143
146
  /** Emitted when the combined loading state (external `isLoading` prop or internal workspace loading) changes. */
144
147
  loadingChange: EventEmitter<boolean>;
145
148
  /** Emitted when remote workspace synchronization is in progress. */
@@ -631,7 +634,6 @@ export declare class KritzelEngine {
631
634
  viewport: KritzelViewport;
632
635
  contextMenuHandler: KritzelContextMenuHandler;
633
636
  keyHandler: KritzelKeyHandler;
634
- contextMenuElement: HTMLKritzelContextMenuElement | null;
635
637
  private _lastHadSelectionGroup;
636
638
  private _isViewportReady;
637
639
  private _isYjsInitialized;
@@ -659,6 +661,7 @@ export declare class KritzelEngine {
659
661
  private readonly _objectDistanceFadeCloseMinOpacity;
660
662
  private syncLoadingState;
661
663
  private syncSyncingState;
664
+ private emitContextMenuStateChange;
662
665
  private applyToolConfig;
663
666
  private normalizeToolConfig;
664
667
  private isTextToolConfig;
@@ -34,6 +34,7 @@ import { Element, Event } from "./stencil-public-runtime";
34
34
  import { KritzelShortcut } from "./interfaces/shortcut.interface";
35
35
  import { KritzelNotification } from "./interfaces/notification.interface";
36
36
  import { KritzelEngineState } from "./interfaces/engine-state.interface";
37
+ import { KritzelContextMenuState } from "./interfaces/context-menu-state.interface";
37
38
  import { KritzelImage } from "./classes/objects/image.class";
38
39
  import { KritzelText } from "./classes/objects/text.class";
39
40
  import { KritzelGroup } from "./classes/objects/group.class";
@@ -76,6 +77,7 @@ export { Element, Event } from "./stencil-public-runtime";
76
77
  export { KritzelShortcut } from "./interfaces/shortcut.interface";
77
78
  export { KritzelNotification } from "./interfaces/notification.interface";
78
79
  export { KritzelEngineState } from "./interfaces/engine-state.interface";
80
+ export { KritzelContextMenuState } from "./interfaces/context-menu-state.interface";
79
81
  export { KritzelImage } from "./classes/objects/image.class";
80
82
  export { KritzelText } from "./classes/objects/text.class";
81
83
  export { KritzelGroup } from "./classes/objects/group.class";
@@ -2035,6 +2037,7 @@ declare global {
2035
2037
  "viewportChange": KritzelViewportState;
2036
2038
  "awarenessChange": Map<number, Record<string, any>>;
2037
2039
  "notificationsChange": KritzelNotification;
2040
+ "contextMenuStateChange": KritzelContextMenuState;
2038
2041
  "loadingChange": boolean;
2039
2042
  "syncingChange": boolean;
2040
2043
  }
@@ -3136,6 +3139,10 @@ declare namespace LocalJSX {
3136
3139
  * Emitted when the awareness state changes (remote user cursors, presence).
3137
3140
  */
3138
3141
  "onAwarenessChange"?: (event: KritzelEngineCustomEvent<Map<number, Record<string, any>>>) => void;
3142
+ /**
3143
+ * Emitted when context-menu visibility, items, or position changes.
3144
+ */
3145
+ "onContextMenuStateChange"?: (event: KritzelEngineCustomEvent<KritzelContextMenuState>) => void;
3139
3146
  /**
3140
3147
  * Emitted when the engine has fully initialized and is ready for interaction.
3141
3148
  */
@@ -22,4 +22,4 @@ export declare const KRITZEL_LICENSE_TOKEN_PREFIX = "KRTZL1.";
22
22
  * printed public key here. Replacing this value invalidates every license
23
23
  * signed with the previous key.
24
24
  */
25
- export declare const KRITZEL_LICENSE_PUBLIC_KEY = "I-pYJlxDEjT94rwSaqhXW5Sv__fMKS-JKKnV3pg0PaM";
25
+ export declare const KRITZEL_LICENSE_PUBLIC_KEY = "2IwZDin-qV3kOt8SEQCqdaJsGT9S7tAGapUYJVnVGQo";
@@ -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 declare const KRITZEL_VERSION = "0.4.6";
6
+ export declare const KRITZEL_VERSION = "0.4.8";
@@ -1,5 +1,6 @@
1
1
  import { KritzelTheme } from '../interfaces/theme.interface';
2
2
  export declare class ThemeHelper {
3
+ private static readonly appliedVariableNames;
3
4
  /**
4
5
  * Converts a camelCase string to kebab-case.
5
6
  * @example ThemeHelper.camelToKebab('controlHoverBackgroundColor') → 'control-hover-background-color'
@@ -56,6 +56,7 @@ export * from './interfaces/login-config.interface';
56
56
  export * from './interfaces/document-metadata.interface';
57
57
  export * from './interfaces/anchor.interface';
58
58
  export * from './interfaces/viewport-state.interface';
59
+ export * from './interfaces/context-menu-state.interface';
59
60
  export * from './interfaces/user.interface';
60
61
  export * from './interfaces/theme.interface';
61
62
  export * from './interfaces/localization.interface';
@@ -0,0 +1,16 @@
1
+ import { KritzelBaseObject } from '../classes/objects/base-object.class';
2
+ import { ContextMenuItem } from './context-menu-item.interface';
3
+ export interface KritzelContextMenuState {
4
+ isVisible: boolean;
5
+ isObjectMenu: boolean;
6
+ items: ContextMenuItem[];
7
+ objects: KritzelBaseObject[];
8
+ position: {
9
+ x: number;
10
+ y: number;
11
+ };
12
+ worldPosition: {
13
+ x: number;
14
+ y: number;
15
+ };
16
+ }
@@ -459,7 +459,9 @@ export interface KritzelTheme {
459
459
  /** Snap variables */
460
460
  snap?: {
461
461
  indicatorFill?: string;
462
+ indicatorFillInactive?: string;
462
463
  indicatorStroke?: string;
464
+ indicatorStrokeInactive?: string;
463
465
  lineStroke?: string;
464
466
  };
465
467
  /** Split button variables */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kritzel-stencil",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "homepage": "https://kritzel.io/",
5
5
  "description": "Kritzel helps you build infinite whiteboard experiences.",
6
6
  "keywords": [
package/readme.md CHANGED
@@ -4,8 +4,8 @@ This package contains the shared Stencil-based core that powers Kritzel's framew
4
4
 
5
5
  It is not intended as the primary entry point for application integration. Instead, use the framework wrapper that matches your stack:
6
6
 
7
- - [Kritzel for Angular](https://kritzel.io/docs/angular/overview)
8
- - [Kritzel for React](https://kritzel.io/docs/react/overview)
9
- - [Kritzel for Vue](https://kritzel.io/docs/vue/overview)
7
+ - [Kritzel for Angular](https://kritzel.io/docs/angular/quick-start)
8
+ - [Kritzel for React](https://kritzel.io/docs/react/quick-start)
9
+ - [Kritzel for Vue](https://kritzel.io/docs/vue/quick-start)
10
10
 
11
11
  For licensing details, see the [Kritzel License](https://kritzel.io/license).