kritzel-stencil 0.0.159 → 0.0.161

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 (171) hide show
  1. package/dist/cjs/{default-text-tool.config-BySzvIox.js → default-text-tool.config-zB3FPuXq.js} +270 -58
  2. package/dist/cjs/default-text-tool.config-zB3FPuXq.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +2 -1
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  6. package/dist/cjs/kritzel-brush-style.entry.cjs.js.map +1 -1
  7. package/dist/cjs/kritzel-color_22.cjs.entry.js +108 -101
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/stencil.cjs.js +1 -1
  10. package/dist/collection/classes/core/store.class.js +3 -0
  11. package/dist/collection/classes/core/store.class.js.map +1 -1
  12. package/dist/collection/classes/handlers/resize.handler.js +54 -32
  13. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  14. package/dist/collection/classes/handlers/rotation.handler.js +12 -8
  15. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  16. package/dist/collection/classes/objects/selection-group.class.js +91 -16
  17. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  18. package/dist/collection/classes/registries/icon-registry.class.js +6 -1
  19. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  20. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  21. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +1 -1
  22. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +0 -14
  23. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +80 -10
  24. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  25. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +0 -1
  26. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  27. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
  28. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  29. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +1 -1
  30. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  31. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +1 -1
  32. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  33. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
  34. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  35. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  36. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +1 -2
  37. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  38. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  39. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +1 -1
  40. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  41. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
  42. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  43. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  44. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +1 -2
  45. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  46. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +1 -1
  47. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  48. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +1 -1
  49. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  50. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +4 -4
  51. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  52. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +1 -1
  53. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  54. package/dist/collection/configs/default-engine-config.js +6 -0
  55. package/dist/collection/configs/default-engine-config.js.map +1 -1
  56. package/dist/collection/helpers/cursor.helper.js +58 -0
  57. package/dist/collection/helpers/cursor.helper.js.map +1 -0
  58. package/dist/collection/index.js +1 -0
  59. package/dist/collection/index.js.map +1 -1
  60. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  61. package/dist/components/index.js +2 -2
  62. package/dist/components/kritzel-brush-style.js +3 -3
  63. package/dist/components/kritzel-brush-style.js.map +1 -1
  64. package/dist/components/kritzel-color-palette.js +1 -1
  65. package/dist/components/kritzel-color.js +1 -1
  66. package/dist/components/kritzel-context-menu.js +1 -1
  67. package/dist/components/kritzel-control-brush-config.js +1 -1
  68. package/dist/components/kritzel-control-text-config.js +1 -1
  69. package/dist/components/kritzel-controls.js +1 -1
  70. package/dist/components/kritzel-cursor-trail.js +1 -1
  71. package/dist/components/kritzel-dropdown.js +1 -1
  72. package/dist/components/kritzel-editor.js +21 -21
  73. package/dist/components/kritzel-engine.js +1 -1
  74. package/dist/components/kritzel-font-family.js +1 -1
  75. package/dist/components/kritzel-font-size.js +1 -1
  76. package/dist/components/kritzel-font.js +1 -1
  77. package/dist/components/kritzel-icon.js +1 -1
  78. package/dist/components/kritzel-menu-item.js +1 -1
  79. package/dist/components/kritzel-menu.js +1 -1
  80. package/dist/components/kritzel-portal.js +1 -1
  81. package/dist/components/kritzel-split-button.js +1 -1
  82. package/dist/components/kritzel-stroke-size.js +1 -1
  83. package/dist/components/kritzel-tooltip.js +1 -1
  84. package/dist/components/kritzel-utility-panel.js +1 -1
  85. package/dist/components/kritzel-workspace-manager.js +1 -1
  86. package/dist/components/{p-CK6no3mi.js → p-58y59Acb.js} +6 -6
  87. package/dist/components/{p-CK6no3mi.js.map → p-58y59Acb.js.map} +1 -1
  88. package/dist/components/{p-CTP479Lf.js → p-9Fzdviju.js} +6 -6
  89. package/dist/components/{p-CTP479Lf.js.map → p-9Fzdviju.js.map} +1 -1
  90. package/dist/components/{p-DDmSxM5f.js → p-B6r22FSC.js} +5 -5
  91. package/dist/components/p-B6r22FSC.js.map +1 -0
  92. package/dist/components/{p-CLt3HMl6.js → p-B_3OZeom.js} +3 -3
  93. package/dist/components/{p-CLt3HMl6.js.map → p-B_3OZeom.js.map} +1 -1
  94. package/dist/components/{p-TdCTkEu0.js → p-BdZKPKnx.js} +7 -7
  95. package/dist/components/p-BdZKPKnx.js.map +1 -0
  96. package/dist/components/{p-CIXPLjCu.js → p-BdwB-S9G.js} +3 -3
  97. package/dist/components/p-BdwB-S9G.js.map +1 -0
  98. package/dist/components/{p-1lIHoOlH.js → p-BpXgwgnV.js} +18 -18
  99. package/dist/components/p-BpXgwgnV.js.map +1 -0
  100. package/dist/components/{p-D1uj4A4F.js → p-Brd9SxWS.js} +5 -5
  101. package/dist/components/p-Brd9SxWS.js.map +1 -0
  102. package/dist/components/{p-CsA9M6me.js → p-CC8KFHSe.js} +8 -8
  103. package/dist/components/p-CC8KFHSe.js.map +1 -0
  104. package/dist/components/{p-BgznZoBH.js → p-CFH6XRL5.js} +5 -5
  105. package/dist/components/p-CFH6XRL5.js.map +1 -0
  106. package/dist/components/{p-B4kxkVe-.js → p-CRGwaUcp.js} +5 -5
  107. package/dist/components/p-CRGwaUcp.js.map +1 -0
  108. package/dist/components/{p-uuRJU2R1.js → p-Ck4lGnmt.js} +3 -3
  109. package/dist/components/{p-uuRJU2R1.js.map → p-Ck4lGnmt.js.map} +1 -1
  110. package/dist/components/{p-BAplhrRJ.js → p-D7BLVRXX.js} +289 -75
  111. package/dist/components/p-D7BLVRXX.js.map +1 -0
  112. package/dist/components/{p-C2sWlNsJ.js → p-D_ygcWSz.js} +5 -5
  113. package/dist/components/p-D_ygcWSz.js.map +1 -0
  114. package/dist/components/p-DbKKCHKd.js +103 -0
  115. package/dist/components/p-DbKKCHKd.js.map +1 -0
  116. package/dist/components/{p-Ddh40W3x.js → p-Doixm8-N.js} +9 -9
  117. package/dist/components/p-Doixm8-N.js.map +1 -0
  118. package/dist/components/{p-BQg4YML7.js → p-DxNbcUzt.js} +12 -12
  119. package/dist/components/p-DxNbcUzt.js.map +1 -0
  120. package/dist/components/{p-D4yvhd1d.js → p-LAsVgL2e.js} +4 -4
  121. package/dist/components/{p-D4yvhd1d.js.map → p-LAsVgL2e.js.map} +1 -1
  122. package/dist/components/{p-D5Wq4x4r.js → p-OFrACpZf.js} +3 -3
  123. package/dist/components/{p-D5Wq4x4r.js.map → p-OFrACpZf.js.map} +1 -1
  124. package/dist/components/{p-DAfkuR8U.js → p-i0IlGLv2.js} +5 -5
  125. package/dist/components/p-i0IlGLv2.js.map +1 -0
  126. package/dist/esm/{default-text-tool.config-2YFQA3SF.js → default-text-tool.config-BvCgOiKA.js} +269 -59
  127. package/dist/esm/default-text-tool.config-BvCgOiKA.js.map +1 -0
  128. package/dist/esm/index.js +2 -2
  129. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  130. package/dist/esm/kritzel-brush-style.entry.js.map +1 -1
  131. package/dist/esm/kritzel-color_22.entry.js +106 -99
  132. package/dist/esm/loader.js +1 -1
  133. package/dist/esm/stencil.js +1 -1
  134. package/dist/stencil/index.esm.js +1 -1
  135. package/dist/stencil/kritzel-brush-style.entry.esm.js.map +1 -1
  136. package/dist/stencil/p-385bab97.entry.js +2 -0
  137. package/dist/stencil/{p-d702c5af.entry.js.map → p-385bab97.entry.js.map} +1 -1
  138. package/dist/stencil/p-6d9756d9.entry.js +10 -0
  139. package/dist/stencil/p-6d9756d9.entry.js.map +1 -0
  140. package/dist/stencil/{p-2YFQA3SF.js → p-BvCgOiKA.js} +2 -2
  141. package/dist/stencil/p-BvCgOiKA.js.map +1 -0
  142. package/dist/stencil/stencil.esm.js +1 -1
  143. package/dist/types/classes/core/store.class.d.ts +1 -0
  144. package/dist/types/classes/objects/selection-group.class.d.ts +1 -0
  145. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -0
  146. package/dist/types/components.d.ts +2 -0
  147. package/dist/types/helpers/cursor.helper.d.ts +22 -0
  148. package/dist/types/index.d.ts +1 -0
  149. package/dist/types/interfaces/engine-state.interface.d.ts +7 -0
  150. package/package.json +1 -1
  151. package/dist/cjs/default-text-tool.config-BySzvIox.js.map +0 -1
  152. package/dist/components/p-1lIHoOlH.js.map +0 -1
  153. package/dist/components/p-B4kxkVe-.js.map +0 -1
  154. package/dist/components/p-BAplhrRJ.js.map +0 -1
  155. package/dist/components/p-BQg4YML7.js.map +0 -1
  156. package/dist/components/p-BgznZoBH.js.map +0 -1
  157. package/dist/components/p-Bhtn9qay.js +0 -98
  158. package/dist/components/p-Bhtn9qay.js.map +0 -1
  159. package/dist/components/p-C2sWlNsJ.js.map +0 -1
  160. package/dist/components/p-CIXPLjCu.js.map +0 -1
  161. package/dist/components/p-CsA9M6me.js.map +0 -1
  162. package/dist/components/p-D1uj4A4F.js.map +0 -1
  163. package/dist/components/p-DAfkuR8U.js.map +0 -1
  164. package/dist/components/p-DDmSxM5f.js.map +0 -1
  165. package/dist/components/p-Ddh40W3x.js.map +0 -1
  166. package/dist/components/p-TdCTkEu0.js.map +0 -1
  167. package/dist/esm/default-text-tool.config-2YFQA3SF.js.map +0 -1
  168. package/dist/stencil/p-2YFQA3SF.js.map +0 -1
  169. package/dist/stencil/p-2e85a4af.entry.js +0 -10
  170. package/dist/stencil/p-2e85a4af.entry.js.map +0 -1
  171. package/dist/stencil/p-d702c5af.entry.js +0 -2
@@ -14953,6 +14953,115 @@ class KritzelTextTool extends KritzelBaseTool {
14953
14953
  }
14954
14954
  }
14955
14955
 
14956
+ class KritzelIconRegistry {
14957
+ static registry = new Map();
14958
+ static register(name, svgContent) {
14959
+ if (this.registry.has(name)) {
14960
+ console.warn(`[IconRegistry] Icon "${name}" is already registered. It will be overwritten.`);
14961
+ }
14962
+ this.registry.set(name, svgContent);
14963
+ }
14964
+ static get(name) {
14965
+ return this.registry.get(name);
14966
+ }
14967
+ static registerIcons(icons) {
14968
+ for (const name in icons) {
14969
+ if (Object.prototype.hasOwnProperty.call(icons, name)) {
14970
+ this.register(name, icons[name]);
14971
+ }
14972
+ }
14973
+ }
14974
+ static has(name) {
14975
+ return this.registry.has(name);
14976
+ }
14977
+ }
14978
+ KritzelIconRegistry.registerIcons({
14979
+ 'cursor': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z"/></svg>',
14980
+ 'pen': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/></svg>',
14981
+ 'highlighter': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-highlighter-icon lucide-highlighter"><path d="m9 11-6 6v3h9l3-3"/><path d="m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4"/></svg>',
14982
+ 'eraser': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21"/><path d="M22 21H7"/><path d="m5 11 9 9"/></svg>',
14983
+ 'type': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9" x2="15" y1="20" y2="20"/><line x1="12" x2="12" y1="4" y2="20"/></svg>',
14984
+ 'image': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>',
14985
+ 'chevron-down': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',
14986
+ 'chevron-up': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m18 15-6-6-6 6"/></svg>',
14987
+ 'copy': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy-icon lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>',
14988
+ 'paste': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clipboard-paste-icon lucide-clipboard-paste"><path d="M11 14h10"/><path d="M16 4h2a2 2 0 0 1 2 2v1.344"/><path d="m17 18 4-4-4-4"/><path d="M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113"/><rect x="8" y="2" width="8" height="4" rx="1"/></svg>',
14989
+ 'cut': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-scissors-icon lucide-scissors"><circle cx="6" cy="6" r="3"/><path d="M8.12 8.12 12 12"/><path d="M20 4 8.12 15.88"/><circle cx="6" cy="18" r="3"/><path d="M14.8 14.8 20 20"/></svg>',
14990
+ 'delete': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trash2-icon lucide-trash-2"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/><line x1="10" x2="10" y1="11" y2="17"/><line x1="14" x2="14" y1="11" y2="17"/></svg>',
14991
+ 'bring-to-front': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-to-line-icon lucide-arrow-up-to-line"><path d="M5 3h14"/><path d="m18 13-6-6-6 6"/><path d="M12 7v14"/></svg>',
14992
+ 'send-to-back': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-down-to-line-icon lucide-arrow-down-to-line"><path d="M12 17V3"/><path d="m6 11 6 6 6-6"/><path d="M19 21H5"/></svg>',
14993
+ 'select-all': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-mouse-pointer-icon lucide-square-mouse-pointer"><path d="M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z"/><path d="M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6"/></svg>',
14994
+ 'download': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-download-icon lucide-download"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/></svg>',
14995
+ 'undo': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-undo-icon lucide-undo"><path d="M3 7v6h6"/><path d="M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13"/></svg>',
14996
+ 'redo': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-redo-icon lucide-redo"><path d="M21 7v6h-6"/><path d="M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7"/></svg>',
14997
+ 'plus': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus-icon lucide-plus"><path d="M5 12h14"/><path d="M12 5v14"/></svg>',
14998
+ 'ellipsis-vertical': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-ellipsis-vertical-icon lucide-ellipsis-vertical"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>',
14999
+ 'x': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-icon lucide-x"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>',
15000
+ 'check': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check-icon lucide-check"><path d="M20 6 9 17l-5-5"/></svg>',
15001
+ 'move-vertical': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-move-vertical-icon lucide-move-vertical" version="1.1" id="svg3"> <defs id="defs3" /> <path d="M12 2v20" id="path1" /> <path style="fill:#ffffff;stroke-width:2.5;stroke-dasharray:none;stroke-linejoin:round;paint-order:stroke fill markers" d="m 11.735575,22.661865 c -0.09259,-0.02798 -0.204674,-0.07661 -0.249076,-0.108068 -0.04441,-0.03147 -1.167275,-0.979853 -2.4952713,-2.10755 -1.8557024,-1.57581 -2.4300904,-2.079639 -2.4817336,-2.17687 -0.086514,-0.162885 -0.089504,-0.422449 -0.00664,-0.576334 0.1483053,-0.275409 0.437667,-0.436207 0.7830634,-0.435147 0.3692925,0.0011 0.3517326,-0.01122 2.168748,1.525599 L 11.12348,20.194964 V 11.999996 3.8050256 L 9.4546663,5.2164943 C 7.6376509,6.7533118 7.6552109,6.7409594 7.2859184,6.7420935 6.6681409,6.7439906 6.253658,6.1955854 6.5159903,5.723396 6.5738626,5.6192278 7.1368766,5.1267427 9.0629381,3.4955044 11.738128,1.2298067 11.640395,1.3026868 12.00355,1.3026868 c 0.363154,0 0.265421,-0.07288 2.940611,2.1928176 1.926062,1.6312383 2.489076,2.1237234 2.546948,2.2278916 0.262332,0.4721894 -0.15215,1.0205946 -0.769928,1.0186975 -0.369293,-0.00114 -0.351733,0.011218 -2.168748,-1.5255992 L 12.88362,3.8050256 v 8.1949704 8.194968 l 1.668813,-1.411469 c 1.817015,-1.536817 1.799455,-1.524464 2.168748,-1.525599 0.617772,-0.0019 1.032269,0.546521 0.769928,1.018687 -0.103474,0.18623 -4.919006,4.273935 -5.130582,4.355136 -0.20796,0.07981 -0.425829,0.09033 -0.624952,0.03014 z" id="path4" /> </svg>',
15002
+ 'hand': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-icon lucide-hand" version="1.1" id="svg4"> <defs id="defs4" /> <path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2" id="path1" /> <path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2" id="path2" /> <path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8" id="path3" /> <path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15" id="path4" /> <path style="fill:#ffffff;stroke-width:0.0423032" d="M 11.478261,21.222477 C 9.6854059,21.139331 8.3341788,20.647346 7.1297169,19.639159 6.9698298,19.505327 5.949644,18.508708 4.8626374,17.42445 3.0780314,15.644357 2.8775851,15.435367 2.7968392,15.270602 2.5896561,14.847836 2.616354,14.436649 2.8771894,14.033085 c 0.136522,-0.211226 0.3837159,-0.398688 0.6367632,-0.482897 0.1529977,-0.05091 0.2326803,-0.05992 0.4470908,-0.05054 0.2250407,0.0098 0.2876577,0.02439 0.4554568,0.105827 0.1747854,0.08483 0.2933718,0.192702 1.1675186,1.062064 0.7182021,0.714271 1.0062041,0.982633 1.0998825,1.024878 0.1680197,0.07577 0.4756439,0.07817 0.6368269,0.005 0.1370772,-0.06226 0.2976691,-0.220818 0.3691296,-0.364463 0.072561,-0.145855 0.071573,-0.543545 -0.00169,-0.681911 -0.028747,-0.05429 -0.2476439,-0.296131 -0.4864385,-0.537426 l -0.4341716,-0.438718 0.00753,-3.989014 0.00753,-3.9890137 0.089246,-0.1883791 c 0.244787,-0.516692 0.7711718,-0.809716 1.3059705,-0.7269981 0.3973687,0.061462 0.7569953,0.3284904 0.9363122,0.6952277 l 0.093853,0.1919473 0.014101,2.4958872 0.014101,2.4958877 0.067385,0.149123 c 0.1186861,0.262654 0.4140438,0.457222 0.6940724,0.457222 0.2764172,0 0.5690532,-0.187563 0.6965992,-0.446482 l 0.06486,-0.131661 0.0141,-3.4970626 0.0141,-3.4970623 0.08982,-0.1896121 C 11.096301,3.0422103 11.506844,2.7755634 12,2.7755634 c 0.493156,0 0.903699,0.2666469 1.122868,0.7293016 l 0.08982,0.1896121 0.0141,3.2432432 c 0.01405,3.2315947 0.01432,3.2437077 0.07397,3.3726737 0.124721,0.269649 0.355908,0.424566 0.661411,0.443206 0.237954,0.01452 0.429018,-0.0627 0.591626,-0.239109 0.223655,-0.242637 0.208338,-0.06565 0.224113,-2.5896966 l 0.0141,-2.2561693 0.09385,-0.1919473 c 0.179317,-0.3667373 0.538944,-0.6337662 0.936313,-0.6952277 0.609359,-0.09425 1.208067,0.3054956 1.370981,0.9153772 0.03013,0.1127929 0.03773,0.6662436 0.038,2.7657391 3.74e-4,2.9328416 -0.008,2.8034316 0.197044,3.0364016 0.234927,0.266892 0.603828,0.337117 0.920407,0.175213 0.181933,-0.09304 0.329759,-0.261686 0.376309,-0.4293 0.01848,-0.06654 0.02929,-0.683932 0.0295,-1.684364 1.78e-4,-0.8783075 0.01239,-1.6530128 0.02751,-1.745346 0.08579,-0.5238478 0.505382,-0.9420803 1.039546,-1.0361716 0.607538,-0.1070155 1.25615,0.3485846 1.385876,0.973471 0.02211,0.1064847 0.02843,1.1397236 0.02169,3.5455556 -0.0093,3.324725 -0.01078,3.403075 -0.07062,3.770606 -0.126399,0.776213 -0.328814,1.41352 -0.669031,2.106456 -0.36657,0.746612 -0.72118,1.250303 -1.297841,1.843464 -1.185731,1.21966 -2.604527,1.933174 -4.300822,2.162889 -0.38234,0.05178 -2.604621,0.0785 -3.412456,0.04104 z" id="path16" /> </svg>',
15003
+ 'hand-grab': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-grab-icon lucide-hand-grab" version="1.1" id="svg5"> <defs id="defs5" /> <path d="M18 11.5V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1.4" id="path1" /> <path d="M14 10V8a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2" id="path2" /> <path d="M10 9.9V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v5" id="path3" /> <path d="M6 14a2 2 0 0 0-2-2a2 2 0 0 0-2 2" id="path4" /> <path d="M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-4a8 8 0 0 1-8-8 2 2 0 1 1 4 0" id="path5" /> <path style="fill:#ffffff;stroke-width:0.0423032" d="M 9.5887192,21.221364 C 8.0526856,21.128375 6.6533474,20.587008 5.4571093,19.622953 5.3019976,19.497947 5.0101058,19.225967 4.8084606,19.018552 4.2300382,18.423579 3.8474097,17.879011 3.4960953,17.150756 3.1017715,16.333345 2.9014937,15.633198 2.8052391,14.735605 c -0.097577,-0.909922 -0.019834,-1.263323 0.3569794,-1.622742 0.753018,-0.718257 1.9463784,-0.256949 2.0619296,0.797066 0.037839,0.345154 0.089701,0.477674 0.2472582,0.631806 0.2464521,0.241095 0.5958008,0.287445 0.9036474,0.119894 0.1478567,-0.08047 0.2303871,-0.16866 0.3266699,-0.349056 0.050118,-0.0939 0.05337,-0.2326 0.066784,-2.848413 L 6.7826087,8.7144536 6.8458627,8.559342 C 6.9736603,8.2459558 7.2463773,7.9734987 7.5581669,7.8477164 c 0.1253804,-0.050581 0.2118709,-0.062705 0.4512338,-0.063254 0.275392,-6.312e-4 0.3094658,0.00564 0.4867271,0.089609 0.264676,0.1253746 0.4771417,0.334346 0.6070085,0.5970252 l 0.1048543,0.212087 0.017338,0.7488899 c 0.019395,0.8377165 0.026343,0.8713745 0.2242006,1.0860245 0.1591067,0.172611 0.3522021,0.249908 0.5883018,0.235502 0.305503,-0.01864 0.53669,-0.173557 0.661411,-0.443206 0.05734,-0.123963 0.0605,-0.181852 0.07486,-1.3703236 0.01626,-1.3456629 0.0141,-1.3267758 0.182667,-1.5938092 0.257891,-0.4085268 0.77099,-0.6442307 1.228943,-0.5645435 0.471012,0.08196 0.850379,0.4102836 0.989676,0.8565175 0.04663,0.149383 0.0514,0.2860903 0.0514,1.4721724 0,0.8344844 0.01108,1.3591794 0.03064,1.4503554 0.04109,0.191585 0.179844,0.390224 0.342505,0.490321 0.27721,0.170587 0.693425,0.126085 0.92529,-0.09893 0.228986,-0.222224 0.234357,-0.25046 0.251582,-1.3227071 l 0.0152,-0.9463484 0.104855,-0.2120434 c 0.129872,-0.2626357 0.342372,-0.471626 0.607008,-0.5969817 0.177262,-0.083967 0.211335,-0.09024 0.486727,-0.089609 0.239363,5.486e-4 0.325854,0.012673 0.451234,0.063254 0.31179,0.1257823 0.584507,0.3982394 0.712304,0.7116256 0.0621,0.1522783 0.06351,0.1824139 0.07736,1.649824 0.01408,1.492435 0.0142,1.494914 0.07947,1.627432 0.0771,0.156535 0.2216,0.291061 0.395058,0.367789 0.09695,0.04289 0.169789,0.05275 0.325757,0.04411 0.230544,-0.01277 0.363779,-0.06826 0.506411,-0.21089 0.177062,-0.177061 0.198302,-0.25307 0.219359,-0.784959 0.02002,-0.505773 0.05012,-0.6549 0.175297,-0.868492 0.498409,-0.850471 1.728484,-0.8041941 2.173478,0.08177 0.131751,0.262312 0.134447,0.313526 0.122615,2.328965 -0.0104,1.771638 -0.01517,1.923481 -0.0714,2.273746 -0.123689,0.770512 -0.327108,1.411813 -0.668163,2.106456 -0.36657,0.746612 -0.72118,1.250303 -1.297841,1.843464 -1.180268,1.214041 -2.600612,1.930754 -4.287083,2.163284 -0.28697,0.03957 -0.685446,0.04782 -2.636536,0.05459 -1.26416,0.0044 -2.4698005,-0.0024 -2.6792012,-0.01507 z" id="path6" /> </svg>',
15004
+ 'mouse-pointer': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mouse-pointer2-icon lucide-mouse-pointer-2" version="1.1" id="svg1"> <defs id="defs1" /> <path d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z" id="path1" /> <path style="fill:#ffffff;stroke-width:0.0972651;stroke-linejoin:round;paint-order:stroke fill markers" d="M 7.8509196,12.314844 C 6.127071,8.1920568 4.7235325,4.8125504 4.7319449,4.8048299 c 0.01847,-0.016951 15.4787861,6.0801241 15.4610371,6.0973581 -0.0069,0.0067 -1.32633,0.341226 -2.93219,0.743509 -1.858829,0.465652 -3.011462,0.772855 -3.172161,0.845453 -0.688426,0.310999 -1.245788,0.879167 -1.498145,1.527185 -0.06251,0.160512 -0.440389,1.529576 -0.839733,3.042364 -0.399346,1.512788 -0.734966,2.750433 -0.745822,2.750322 -0.01086,-1.09e-4 -1.430163,-3.373391 -3.1540114,-7.496177 z" id="path2" /> <path style="fill:#ffffff;stroke-width:0.0705053;stroke-linejoin:round;paint-order:stroke fill markers" d="M 10.777831,19.240865 C 9.3899089,15.977493 4.7567738,4.8648478 4.7760705,4.8455511 c 0.013084,-0.013084 4.7618079,1.8507077 10.7773965,4.2299406 4.467495,1.7669453 4.558837,1.8037523 4.533848,1.8269883 -0.01183,0.011 -0.96064,0.257045 -2.108467,0.546768 -3.445281,0.869623 -3.777157,0.960825 -4.075205,1.119907 -0.597122,0.31871 -1.103666,0.864485 -1.309236,1.410635 -0.09642,0.256167 -0.312339,1.032806 -0.943226,3.392713 -0.641066,2.39798 -0.629171,2.354884 -0.649929,2.354849 -0.0091,-1.5e-5 -0.10963,-0.218934 -0.223421,-0.486487 z" id="path6" /> </svg>',
15005
+ 'pointer': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pointer-icon lucide-pointer" version="1.1" id="svg5"> <defs id="defs5" /> <path d="M22 14a8 8 0 0 1-8 8" id="path1" /> <path d="M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2" id="path2" /> <path d="M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1" id="path3" /> <path d="M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10" id="path4" /> <path d="M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15" id="path5" /> <path style="fill:#ffffff;stroke-width:0.0930233;stroke-linejoin:round;paint-order:stroke fill markers" d="M 11.2,21.203517 C 9.5092536,21.041493 8.4838422,20.667261 7.3116279,19.784423 7.1888372,19.691945 6.139155,18.670017 4.9790008,17.513473 2.5649891,15.106974 2.6562686,15.220427 2.6869266,14.664621 c 0.020277,-0.367608 0.1272548,-0.601802 0.3822766,-0.836873 0.2609241,-0.240511 0.4631523,-0.319555 0.8191689,-0.320185 0.509345,-9.02e-4 0.5815472,0.04845 1.7102825,1.168976 0.532833,0.528958 1.0223742,0.98871 1.0878697,1.021671 0.1699959,0.08555 0.4741793,0.07658 0.6733897,-0.01985 0.303161,-0.146758 0.4720469,-0.543298 0.3791811,-0.890307 -0.036373,-0.135913 -0.1250717,-0.246717 -0.506083,-0.632208 l -0.4619807,-0.467411 0.00983,-5.002356 0.00983,-5.0023561 0.080405,-0.1739784 C 6.9849846,3.2633288 7.2288893,3.0140593 7.4738043,2.8937849 7.6531903,2.8056908 7.7297209,2.7906977 8,2.7906977 c 0.2702791,0 0.3468097,0.014993 0.5261957,0.1030872 0.244915,0.1202744 0.4888197,0.3695439 0.6027014,0.6159576 0.079998,0.1730976 0.080499,0.1905559 0.09901,3.448397 0.020472,3.6031325 0.00418,3.3665775 0.2478407,3.5980265 0.2810043,0.266918 0.6822132,0.283308 1.0083162,0.04119 0.232339,-0.172501 0.25913,-0.280173 0.275933,-1.1089849 0.01456,-0.7180841 0.01869,-0.7520168 0.117805,-0.9674419 0.454637,-0.9881395 1.789759,-0.9881395 2.244396,0 0.09912,0.2154251 0.103248,0.2493578 0.117805,0.9674419 0.0168,0.8288119 0.04359,0.9364839 0.275933,1.1089849 0.326103,0.242117 0.727312,0.225727 1.008316,-0.04119 0.160426,-0.152384 0.218977,-0.294978 0.250819,-0.610832 C 14.845142,9.2502593 15.336916,8.7840275 16,8.7840275 c 0.478554,0 0.847992,0.2240614 1.082489,0.6565225 l 0.126813,0.2338686 0.01869,0.7813954 c 0.02069,0.865066 0.03258,0.913549 0.276595,1.127795 0.239244,0.210059 0.56665,0.239738 0.88018,0.07979 0.219744,-0.112104 0.324993,-0.301479 0.383515,-0.690054 0.06437,-0.427406 0.125794,-0.56694 0.357358,-0.811785 C 19.38604,9.8862229 19.614832,9.7882106 20,9.7869898 c 0.380153,-0.0012 0.636641,0.1145641 0.905451,0.4086842 0.318537,0.348531 0.317259,0.340596 0.332734,2.064791 0.02055,2.290001 -0.04576,2.983129 -0.383655,4.009983 -0.878739,2.670467 -3.284504,4.613238 -6.090273,4.918188 -0.322415,0.03504 -3.227312,0.04717 -3.564257,0.01488 z" id="path6" /> <path style="fill:#ffffff;stroke-width:0.0705053;stroke-linejoin:round;paint-order:stroke fill markers" d="m 11.942854,21.190957 c -1.015003,-0.01704 -1.131723,-0.02688 -1.806535,-0.1522 C 9.5352183,20.927122 8.8225664,20.681951 8.319624,20.413766 7.7570149,20.113766 7.3758537,19.827607 6.7836127,19.260598 5.774345,18.294328 3.1746828,15.68636 2.994305,15.459184 2.7288345,15.124838 2.6970674,15.049109 2.7026798,14.763988 c 0.00827,-0.420163 0.1162058,-0.679868 0.3844475,-0.925026 0.2382303,-0.217729 0.416008,-0.293073 0.7303102,-0.309513 0.5101451,-0.02668 0.6329728,0.04799 1.5378542,0.934977 0.8479274,0.831158 1.2429087,1.199656 1.342282,1.252283 0.11819,0.06259 0.4442817,0.06081 0.6122724,-0.0033 0.1482348,-0.05661 0.3410696,-0.248342 0.4107195,-0.408368 0.063024,-0.144802 0.06179,-0.498 -0.00216,-0.618376 C 7.6917315,14.63641 7.4736023,14.388937 7.2336742,14.136678 L 6.797441,13.678026 6.7970753,8.6903755 6.7967098,3.7027253 6.9021002,3.502167 C 7.0320375,3.2548956 7.2343175,3.0487286 7.4743519,2.9189189 c 0.1797064,-0.097185 0.1877434,-0.098707 0.5209477,-0.098707 0.3169743,0 0.349151,0.00524 0.5076381,0.082665 0.2190605,0.1070166 0.4871239,0.3748528 0.5931342,0.592632 l 0.081613,0.1676584 0.019992,1.3834579 c 0.010995,0.7609018 0.021403,2.0560783 0.023128,2.87817 0.00341,1.6233162 0.028863,2.2876938 0.093598,2.4426258 0.089047,0.213119 0.4255042,0.419889 0.683247,0.419889 0.1563141,0 0.3731941,-0.08265 0.5187231,-0.197689 0.205546,-0.162474 0.225694,-0.250142 0.256177,-1.1146856 C 10.79418,8.8613623 10.8052,8.7492253 10.85668,8.6186115 11.053264,8.1198873 11.50183,7.7978848 12,7.7978848 c 0.49817,0 0.946736,0.3220025 1.143315,0.8207259 0.05148,0.1306138 0.0625,0.2427508 0.08413,0.8563239 0.02897,0.8216044 0.05497,0.9507864 0.218548,1.0859664 0.341252,0.282005 0.756809,0.293493 1.057036,0.02922 0.169206,-0.148941 0.234219,-0.2921 0.288276,-0.6347773 0.103115,-0.6536616 0.472737,-1.0621772 1.030077,-1.1384664 0.547738,-0.074975 0.986339,0.1608863 1.276145,0.6862578 l 0.105758,0.1917223 7.68e-4,0.3699606 c 0.0011,0.553623 0.04553,1.179579 0.09141,1.289176 0.04428,0.105777 0.219161,0.276182 0.364423,0.355092 0.06913,0.03755 0.155512,0.05067 0.333059,0.05055 0.204058,-1.3e-4 0.260695,-0.01118 0.380729,-0.07426 0.239564,-0.12591 0.320531,-0.265583 0.407786,-0.703455 0.08382,-0.420648 0.125337,-0.527172 0.279883,-0.718174 0.321102,-0.3968443 0.77117,-0.5469022 1.259123,-0.4198065 0.21344,0.055594 0.39756,0.1739295 0.578279,0.3716645 0.286251,0.313205 0.299377,0.389392 0.324444,1.883099 0.02888,1.721047 -0.03379,2.808669 -0.20314,3.525265 -0.307591,1.301561 -0.970113,2.493177 -1.91312,3.440943 -1.060413,1.065767 -2.34115,1.742909 -3.849589,2.035329 -0.348478,0.06755 -0.462014,0.07524 -1.340342,0.09078 -0.527787,0.0093 -1.416154,0.0093 -1.974148,-6.4e-5 z" id="path7" /> </svg>'
15006
+ });
15007
+
15008
+ class KritzelCursorHelper {
15009
+ static _pointerCursor = null;
15010
+ /**
15011
+ * Returns the custom pointer cursor CSS value.
15012
+ * This can be used instead of `cursor: pointer` for consistent styling.
15013
+ */
15014
+ static getPointerCursor() {
15015
+ if (!this._pointerCursor) {
15016
+ this._pointerCursor = this.getCursor({ iconName: 'pointer' });
15017
+ }
15018
+ return this._pointerCursor;
15019
+ }
15020
+ /**
15021
+ * Returns a custom cursor CSS value with support for rotation.
15022
+ * The icon is retrieved from the KritzelIconRegistry.
15023
+ */
15024
+ static getCursor(options) {
15025
+ const iconName = options.iconName === 'default' ? 'mouse-pointer' : options.iconName;
15026
+ const iconSvg = KritzelIconRegistry.get(iconName);
15027
+ if (!iconSvg) {
15028
+ console.warn(`Icon "${iconName}" not found in registry.`);
15029
+ return 'auto';
15030
+ }
15031
+ const size = options.size || 24;
15032
+ const rotation = options.rotation || 0;
15033
+ const color = options.color || 'black';
15034
+ // Default cursor (mouse-pointer) has hotspot at (4, 4), others at center
15035
+ const hotspot = options.hotspot || (options.iconName === 'default' ? { x: 4, y: 4 } : { x: size / 2, y: size / 2 });
15036
+ // Modify the SVG string to set size and color
15037
+ // We replace width and height to match the requested size
15038
+ // We replace currentColor with the requested color
15039
+ let content = iconSvg
15040
+ .replace(/width="\d+"/, `width="${size}"`)
15041
+ .replace(/height="\d+"/, `height="${size}"`)
15042
+ .replace(/currentColor/g, color);
15043
+ // Create the SVG string
15044
+ // We rotate around the center of the SVG canvas
15045
+ const center = size / 2;
15046
+ // We use a group to apply the rotation
15047
+ const svg = `
15048
+ <svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}">
15049
+ <g transform="rotate(${rotation} ${center} ${center})">
15050
+ ${content}
15051
+ </g>
15052
+ </svg>
15053
+ `;
15054
+ // Encode the SVG for use in a data URI
15055
+ // We need to be careful with encoding to ensure it works across browsers
15056
+ const encodedSvg = encodeURIComponent(svg.replace(/\s+/g, ' ').trim())
15057
+ .replace(/'/g, '%27')
15058
+ .replace(/"/g, '%22');
15059
+ const dataUri = `data:image/svg+xml;charset=utf-8,${encodedSvg}`;
15060
+ // Return the cursor style string
15061
+ return `url('${dataUri}') ${hotspot.x} ${hotspot.y}, auto`;
15062
+ }
15063
+ }
15064
+
14956
15065
  class KritzelBaseHandler {
14957
15066
  _core;
14958
15067
  constructor(core) {
@@ -15188,32 +15297,43 @@ class KritzelResizeHandler extends KritzelBaseHandler {
15188
15297
  if (!this.hasResized) {
15189
15298
  return;
15190
15299
  }
15300
+ const rotation = selectionGroup.rotation;
15301
+ const sin = Math.sin(rotation);
15302
+ const cos = Math.cos(rotation);
15303
+ const objectScale = selectionGroup.scale || 1;
15304
+ const currentScale = this._core.store.state.scale;
15305
+ // Calculate delta in local unrotated space
15306
+ // We rotate the screen delta by -rotation to align with the object's axes
15307
+ const localDx = (dx * cos + dy * sin) / currentScale;
15308
+ const localDy = (-dx * sin + dy * cos) / currentScale;
15309
+ // Calculate the center of the selection group before resize
15310
+ const initialCenterX = this.initialSize.x + this.initialSize.width / objectScale / 2;
15311
+ const initialCenterY = this.initialSize.y + this.initialSize.height / objectScale / 2;
15312
+ // The center moves by half of the screen delta (scaled)
15313
+ // This is true regardless of rotation because the resize happens symmetrically around the center
15314
+ // relative to the fixed point logic
15315
+ const newCenterX = initialCenterX + dx / currentScale / 2;
15316
+ const newCenterY = initialCenterY + dy / currentScale / 2;
15191
15317
  switch (this._core.store.state.resizeHandleType) {
15192
15318
  case KritzelHandleType.TopLeft:
15193
- this.newSize.width = this.initialSize.width - dx;
15194
- this.newSize.height = this.initialSize.height - dy;
15195
- this.newSize.x = dx / this._core.store.state.scale + this.initialSize.x;
15196
- this.newSize.y = dy / this._core.store.state.scale + this.initialSize.y;
15319
+ this.newSize.width = this.initialSize.width - localDx * objectScale;
15320
+ this.newSize.height = this.initialSize.height - localDy * objectScale;
15197
15321
  break;
15198
15322
  case KritzelHandleType.TopRight:
15199
- this.newSize.width = this.initialSize.width + dx;
15200
- this.newSize.height = this.initialSize.height - dy;
15201
- this.newSize.x = this.initialSize.x;
15202
- this.newSize.y = dy / this._core.store.state.scale + this.initialSize.y;
15323
+ this.newSize.width = this.initialSize.width + localDx * objectScale;
15324
+ this.newSize.height = this.initialSize.height - localDy * objectScale;
15203
15325
  break;
15204
15326
  case KritzelHandleType.BottomLeft:
15205
- this.newSize.width = this.initialSize.width - dx;
15206
- this.newSize.height = this.initialSize.height + dy;
15207
- this.newSize.x = dx / this._core.store.state.scale + this.initialSize.x;
15208
- this.newSize.y = this.initialSize.y;
15327
+ this.newSize.width = this.initialSize.width - localDx * objectScale;
15328
+ this.newSize.height = this.initialSize.height + localDy * objectScale;
15209
15329
  break;
15210
15330
  case KritzelHandleType.BottomRight:
15211
- this.newSize.width = this.initialSize.width + dx;
15212
- this.newSize.height = this.initialSize.height + dy;
15213
- this.newSize.x = this.initialSize.x;
15214
- this.newSize.y = this.initialSize.y;
15331
+ this.newSize.width = this.initialSize.width + localDx * objectScale;
15332
+ this.newSize.height = this.initialSize.height + localDy * objectScale;
15215
15333
  break;
15216
15334
  }
15335
+ this.newSize.x = newCenterX - this.newSize.width / objectScale / 2;
15336
+ this.newSize.y = newCenterY - this.newSize.height / objectScale / 2;
15217
15337
  selectionGroup.resize(this.newSize.x, this.newSize.y, this.newSize.width, this.newSize.height);
15218
15338
  }
15219
15339
  }
@@ -15239,32 +15359,43 @@ class KritzelResizeHandler extends KritzelBaseHandler {
15239
15359
  if (!this.hasResized) {
15240
15360
  return;
15241
15361
  }
15362
+ const rotation = selectionGroup.rotation;
15363
+ const sin = Math.sin(rotation);
15364
+ const cos = Math.cos(rotation);
15365
+ const objectScale = selectionGroup.scale || 1;
15366
+ const currentScale = this._core.store.state.scale;
15367
+ // Calculate delta in local unrotated space
15368
+ // We rotate the screen delta by -rotation to align with the object's axes
15369
+ const localDx = (dx * cos + dy * sin) / currentScale;
15370
+ const localDy = (-dx * sin + dy * cos) / currentScale;
15371
+ // Calculate the center of the selection group before resize
15372
+ const initialCenterX = this.initialSize.x + this.initialSize.width / objectScale / 2;
15373
+ const initialCenterY = this.initialSize.y + this.initialSize.height / objectScale / 2;
15374
+ // The center moves by half of the screen delta (scaled)
15375
+ // This is true regardless of rotation because the resize happens symmetrically around the center
15376
+ // relative to the fixed point logic
15377
+ const newCenterX = initialCenterX + dx / currentScale / 2;
15378
+ const newCenterY = initialCenterY + dy / currentScale / 2;
15242
15379
  switch (this._core.store.state.resizeHandleType) {
15243
15380
  case KritzelHandleType.TopLeft:
15244
- this.newSize.width = this.initialSize.width - dx;
15245
- this.newSize.height = this.initialSize.height - dy;
15246
- this.newSize.x = dx / this._core.store.state.scale + this.initialSize.x;
15247
- this.newSize.y = dy / this._core.store.state.scale + this.initialSize.y;
15381
+ this.newSize.width = this.initialSize.width - localDx * objectScale;
15382
+ this.newSize.height = this.initialSize.height - localDy * objectScale;
15248
15383
  break;
15249
15384
  case KritzelHandleType.TopRight:
15250
- this.newSize.width = this.initialSize.width + dx;
15251
- this.newSize.height = this.initialSize.height - dy;
15252
- this.newSize.x = this.initialSize.x;
15253
- this.newSize.y = dy / this._core.store.state.scale + this.initialSize.y;
15385
+ this.newSize.width = this.initialSize.width + localDx * objectScale;
15386
+ this.newSize.height = this.initialSize.height - localDy * objectScale;
15254
15387
  break;
15255
15388
  case KritzelHandleType.BottomLeft:
15256
- this.newSize.width = this.initialSize.width - dx;
15257
- this.newSize.height = this.initialSize.height + dy;
15258
- this.newSize.x = dx / this._core.store.state.scale + this.initialSize.x;
15259
- this.newSize.y = this.initialSize.y;
15389
+ this.newSize.width = this.initialSize.width - localDx * objectScale;
15390
+ this.newSize.height = this.initialSize.height + localDy * objectScale;
15260
15391
  break;
15261
15392
  case KritzelHandleType.BottomRight:
15262
- this.newSize.width = this.initialSize.width + dx;
15263
- this.newSize.height = this.initialSize.height + dy;
15264
- this.newSize.x = this.initialSize.x;
15265
- this.newSize.y = this.initialSize.y;
15393
+ this.newSize.width = this.initialSize.width + localDx * objectScale;
15394
+ this.newSize.height = this.initialSize.height + localDy * objectScale;
15266
15395
  break;
15267
15396
  }
15397
+ this.newSize.x = newCenterX - this.newSize.width / objectScale / 2;
15398
+ this.newSize.y = newCenterY - this.newSize.height / objectScale / 2;
15268
15399
  selectionGroup.resize(this.newSize.x, this.newSize.y, this.newSize.width, this.newSize.height);
15269
15400
  }
15270
15401
  }
@@ -15317,8 +15448,9 @@ class KritzelRotationHandler extends KritzelBaseHandler {
15317
15448
  const clientX = event.clientX - this._core.store.offsetX;
15318
15449
  const clientY = event.clientY - this._core.store.offsetY;
15319
15450
  this._core.store.state.isRotating = true;
15320
- const centerX = selectionGroup.translateX + selectionGroup.width / 2 / this._core.store.state.scale;
15321
- const centerY = selectionGroup.translateY + selectionGroup.height / 2 / this._core.store.state.scale;
15451
+ const objectScale = selectionGroup.scale || 1;
15452
+ const centerX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;
15453
+ const centerY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;
15322
15454
  const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;
15323
15455
  const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
15324
15456
  this.initialSelectionGroupRotation = selectionGroup.rotation;
@@ -15339,8 +15471,9 @@ class KritzelRotationHandler extends KritzelBaseHandler {
15339
15471
  const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);
15340
15472
  const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);
15341
15473
  this._core.store.state.isRotating = true;
15342
- const centerX = selectionGroup.translateX + selectionGroup.width / 2 / this._core.store.state.scale;
15343
- const centerY = selectionGroup.translateY + selectionGroup.height / 2 / this._core.store.state.scale;
15474
+ const objectScale = selectionGroup.scale || 1;
15475
+ const centerX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;
15476
+ const centerY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;
15344
15477
  const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;
15345
15478
  const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
15346
15479
  this.initialSelectionGroupRotation = selectionGroup.rotation;
@@ -15357,8 +15490,9 @@ class KritzelRotationHandler extends KritzelBaseHandler {
15357
15490
  if (this._core.store.state.isRotating && selectionGroup) {
15358
15491
  const clientX = event.clientX - this._core.store.offsetX;
15359
15492
  const clientY = event.clientY - this._core.store.offsetY;
15360
- const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / this._core.store.state.scale;
15361
- const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / this._core.store.state.scale;
15493
+ const objectScale = selectionGroup.scale || 1;
15494
+ const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;
15495
+ const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;
15362
15496
  const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;
15363
15497
  const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
15364
15498
  const currentRotation = Math.atan2(groupCenterY - cursorY, groupCenterX - cursorX);
@@ -15376,8 +15510,9 @@ class KritzelRotationHandler extends KritzelBaseHandler {
15376
15510
  if (this._core.store.state.isRotating && selectionGroup) {
15377
15511
  const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);
15378
15512
  const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);
15379
- const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / this._core.store.state.scale;
15380
- const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / this._core.store.state.scale;
15513
+ const objectScale = selectionGroup.scale || 1;
15514
+ const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;
15515
+ const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;
15381
15516
  const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;
15382
15517
  const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;
15383
15518
  const currentRotation = Math.atan2(groupCenterY - cursorY, groupCenterX - cursorX);
@@ -15434,6 +15569,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15434
15569
  objectIds = [];
15435
15570
  // Store snapshots of object state for transformations (rotation, resize)
15436
15571
  unchangedObjectSnapshots = new Map();
15572
+ snapshotRotation = 0;
15437
15573
  minX;
15438
15574
  maxX;
15439
15575
  minY;
@@ -15504,6 +15640,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15504
15640
  */
15505
15641
  captureUnchangedSnapshots() {
15506
15642
  this.unchangedObjectSnapshots.clear();
15643
+ this.snapshotRotation = this.rotation;
15507
15644
  this.objects.forEach(obj => {
15508
15645
  this.unchangedObjectSnapshots.set(obj.id, {
15509
15646
  id: obj.id,
@@ -15563,14 +15700,56 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15563
15700
  resize(x, y, width, height) {
15564
15701
  const widthScaleFactor = width / this.width;
15565
15702
  const heightScaleFactor = height / this.height;
15566
- const deltaX = x - this.translateX;
15567
- const deltaY = y - this.translateY;
15703
+ // Calculate old center
15704
+ const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;
15705
+ const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;
15706
+ // Calculate new center
15707
+ const newTotalWidth = width + this.padding * 2;
15708
+ const newTotalHeight = height + this.padding * 2;
15709
+ const newCenterX = x + newTotalWidth / 2 / this.scale;
15710
+ const newCenterY = y + newTotalHeight / 2 / this.scale;
15711
+ const rotation = this.rotation;
15712
+ const cos = Math.cos(-rotation);
15713
+ const sin = Math.sin(-rotation);
15714
+ const cosR = Math.cos(rotation);
15715
+ const sinR = Math.sin(rotation);
15568
15716
  this._core.store.state.objects.transaction(() => {
15569
15717
  this.objects.forEach(child => {
15570
- const updatedWidth = child.width * widthScaleFactor;
15571
- const updatedHeight = child.height * heightScaleFactor;
15572
- const updatedX = child.translateX + deltaX + (child.translateX - this.translateX) * (widthScaleFactor - 1);
15573
- const updatedY = child.translateY + deltaY + (child.translateY - this.translateY) * (heightScaleFactor - 1);
15718
+ // Calculate child center
15719
+ const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;
15720
+ const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;
15721
+ // Vector from old group center to child center
15722
+ const dx = childCenterX - oldCenterX;
15723
+ const dy = childCenterY - oldCenterY;
15724
+ // Rotate to local space (align with group axes)
15725
+ const localX = dx * cos - dy * sin;
15726
+ const localY = dx * sin + dy * cos;
15727
+ // Scale in local space
15728
+ const scaledLocalX = localX * widthScaleFactor;
15729
+ const scaledLocalY = localY * heightScaleFactor;
15730
+ // Rotate back to world space
15731
+ const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;
15732
+ const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;
15733
+ // New child center
15734
+ const newChildCenterX = newCenterX + rotatedX;
15735
+ const newChildCenterY = newCenterY + rotatedY;
15736
+ // New child top-left
15737
+ // Calculate relative rotation
15738
+ const relativeRotation = child.rotation - rotation;
15739
+ const cosRel = Math.cos(relativeRotation);
15740
+ const sinRel = Math.sin(relativeRotation);
15741
+ // Project the group's scale factors onto the child's local axes
15742
+ // We use absolute values because scaling is magnitude-based
15743
+ // If the child is aligned (0 deg), cos=1, sin=0 -> scales match
15744
+ // If the child is 90 deg, cos=0, sin=1 -> scales swap
15745
+ const newChildWidthScale = Math.sqrt(Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2));
15746
+ const newChildHeightScale = Math.sqrt(Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2));
15747
+ const updatedWidth = child.width * newChildWidthScale;
15748
+ const updatedHeight = child.height * newChildHeightScale;
15749
+ const updatedTotalWidth = updatedWidth + child.padding * 2;
15750
+ const updatedTotalHeight = updatedHeight + child.padding * 2;
15751
+ const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;
15752
+ const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;
15574
15753
  child.resize(updatedX, updatedY, updatedWidth, updatedHeight);
15575
15754
  });
15576
15755
  // Refresh dimensions and update the SelectionGroup to propagate changes to other tabs
@@ -15583,7 +15762,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15583
15762
  this.rotation = value;
15584
15763
  const centerX = this.translateX + this.totalWidth / 2 / this.scale;
15585
15764
  const centerY = this.translateY + this.totalHeight / 2 / this.scale;
15586
- const angle = value;
15765
+ const angle = value - this.snapshotRotation;
15587
15766
  const cos = Math.cos(angle);
15588
15767
  const sin = Math.sin(angle);
15589
15768
  this._core.store.state.objects.transaction(() => {
@@ -15599,7 +15778,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15599
15778
  const rotatedY = sin * offsetX + cos * offsetY;
15600
15779
  child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;
15601
15780
  child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;
15602
- child.rotate(this.objects.length === 1 ? value : value + unchangedSnapshot.rotation);
15781
+ child.rotate(this.objects.length === 1 ? value : unchangedSnapshot.rotation + angle);
15603
15782
  });
15604
15783
  });
15605
15784
  }
@@ -15630,14 +15809,45 @@ class KritzelSelectionGroup extends KritzelBaseObject {
15630
15809
  this.height = (this.maxY - this.minY - this.padding) * this.scale;
15631
15810
  }
15632
15811
  else {
15633
- this.minX = Math.min(...this.objects.map(obj => obj.minXRotated));
15634
- this.maxX = Math.max(...this.objects.map(obj => obj.maxXRotated));
15635
- this.minY = Math.min(...this.objects.map(obj => obj.minYRotated));
15636
- this.maxY = Math.max(...this.objects.map(obj => obj.maxYRotated));
15637
- this.translateX = this.minX - this.padding;
15638
- this.translateY = this.minY - this.padding;
15639
- this.width = (this.maxX - this.minX - this.padding) * this.scale;
15640
- this.height = (this.maxY - this.minY - this.padding) * this.scale;
15812
+ const rotation = this.rotation;
15813
+ const cos = Math.cos(-rotation);
15814
+ const sin = Math.sin(-rotation);
15815
+ let minX = Infinity;
15816
+ let maxX = -Infinity;
15817
+ let minY = Infinity;
15818
+ let maxY = -Infinity;
15819
+ this.objects.forEach(obj => {
15820
+ const polygon = obj.rotatedPolygon;
15821
+ const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
15822
+ corners.forEach(corner => {
15823
+ // Rotate corner into local space (aligned with group rotation)
15824
+ const rx = corner.x * cos - corner.y * sin;
15825
+ const ry = corner.x * sin + corner.y * cos;
15826
+ if (rx < minX)
15827
+ minX = rx;
15828
+ if (rx > maxX)
15829
+ maxX = rx;
15830
+ if (ry < minY)
15831
+ minY = ry;
15832
+ if (ry > maxY)
15833
+ maxY = ry;
15834
+ });
15835
+ });
15836
+ // Dimensions in world units (unrotated)
15837
+ const worldWidth = maxX - minX;
15838
+ const worldHeight = maxY - minY;
15839
+ this.width = (worldWidth - this.padding) * this.scale;
15840
+ this.height = (worldHeight - this.padding) * this.scale;
15841
+ // Center of the box in rotated space
15842
+ const cRx = (minX + maxX) / 2;
15843
+ const cRy = (minY + maxY) / 2;
15844
+ // Rotate center back to world space
15845
+ const cosR = Math.cos(rotation);
15846
+ const sinR = Math.sin(rotation);
15847
+ const cx = cRx * cosR - cRy * sinR;
15848
+ const cy = cRx * sinR + cRy * cosR;
15849
+ this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;
15850
+ this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;
15641
15851
  }
15642
15852
  this._core.store.state.objects.update(this);
15643
15853
  }
@@ -31216,9 +31426,11 @@ exports.KritzelBaseHandler = KritzelBaseHandler;
31216
31426
  exports.KritzelBaseObject = KritzelBaseObject;
31217
31427
  exports.KritzelBaseTool = KritzelBaseTool;
31218
31428
  exports.KritzelBrushTool = KritzelBrushTool;
31429
+ exports.KritzelCursorHelper = KritzelCursorHelper;
31219
31430
  exports.KritzelDevicesHelper = KritzelDevicesHelper;
31220
31431
  exports.KritzelEraserTool = KritzelEraserTool;
31221
31432
  exports.KritzelEventHelper = KritzelEventHelper;
31433
+ exports.KritzelIconRegistry = KritzelIconRegistry;
31222
31434
  exports.KritzelImage = KritzelImage;
31223
31435
  exports.KritzelImageTool = KritzelImageTool;
31224
31436
  exports.KritzelKeyboardHelper = KritzelKeyboardHelper;
@@ -31262,6 +31474,6 @@ exports.varStorage = varStorage;
31262
31474
  exports.writeVarString = writeVarString$2;
31263
31475
  exports.writeVarUint = writeVarUint$2;
31264
31476
  exports.writeVarUint8Array = writeVarUint8Array$2;
31265
- //# sourceMappingURL=default-text-tool.config-BySzvIox.js.map
31477
+ //# sourceMappingURL=default-text-tool.config-zB3FPuXq.js.map
31266
31478
 
31267
- //# sourceMappingURL=default-text-tool.config-BySzvIox.js.map
31479
+ //# sourceMappingURL=default-text-tool.config-zB3FPuXq.js.map