kritzel-stencil 0.0.160 → 0.0.162

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 (220) hide show
  1. package/dist/cjs/{default-text-tool.config-D10FksvZ.js → default-line-tool.config-D1Ns0NmM.js} +3156 -929
  2. package/dist/cjs/default-line-tool.config-D1Ns0NmM.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +131 -126
  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 +538 -198
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/stencil.cjs.js +1 -1
  10. package/dist/collection/classes/core/core.class.js +140 -3
  11. package/dist/collection/classes/core/core.class.js.map +1 -1
  12. package/dist/collection/classes/core/reviver.class.js +8 -0
  13. package/dist/collection/classes/core/reviver.class.js.map +1 -1
  14. package/dist/collection/classes/core/store.class.js +8 -0
  15. package/dist/collection/classes/core/store.class.js.map +1 -1
  16. package/dist/collection/classes/handlers/line-handle.handler.js +383 -0
  17. package/dist/collection/classes/handlers/line-handle.handler.js.map +1 -0
  18. package/dist/collection/classes/handlers/move.handler.js +2 -2
  19. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  20. package/dist/collection/classes/handlers/resize.handler.js +42 -34
  21. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  22. package/dist/collection/classes/handlers/rotation.handler.js +12 -8
  23. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  24. package/dist/collection/classes/managers/anchor.manager.js +874 -0
  25. package/dist/collection/classes/managers/anchor.manager.js.map +1 -0
  26. package/dist/collection/classes/managers/cursor.manager.js +117 -0
  27. package/dist/collection/classes/managers/cursor.manager.js.map +1 -0
  28. package/dist/collection/classes/objects/base-object.class.js +4 -2
  29. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  30. package/dist/collection/classes/objects/line.class.js +564 -0
  31. package/dist/collection/classes/objects/line.class.js.map +1 -0
  32. package/dist/collection/classes/objects/selection-group.class.js +4 -0
  33. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  34. package/dist/collection/classes/registries/icon-registry.class.js +7 -1
  35. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  36. package/dist/collection/classes/tools/line-tool.class.js +172 -0
  37. package/dist/collection/classes/tools/line-tool.class.js.map +1 -0
  38. package/dist/collection/classes/tools/selection-tool.class.js +41 -8
  39. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  40. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  41. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +11 -2
  42. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  43. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +0 -14
  44. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +163 -21
  45. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  46. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +0 -1
  47. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  48. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
  49. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  50. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +1 -1
  51. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  52. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +1 -1
  53. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  54. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
  55. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  56. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  57. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +1 -2
  58. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  59. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  60. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +1 -1
  61. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  62. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
  63. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  64. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  65. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +1 -2
  66. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  67. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +1 -1
  68. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  69. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +1 -1
  70. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  71. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +4 -4
  72. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  73. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +1 -1
  74. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  75. package/dist/collection/configs/default-engine-config.js +10 -0
  76. package/dist/collection/configs/default-engine-config.js.map +1 -1
  77. package/dist/collection/configs/default-line-tool.config.js +34 -0
  78. package/dist/collection/configs/default-line-tool.config.js.map +1 -0
  79. package/dist/collection/helpers/cursor.helper.js +58 -0
  80. package/dist/collection/helpers/cursor.helper.js.map +1 -0
  81. package/dist/collection/helpers/geometry.helper.js +42 -0
  82. package/dist/collection/helpers/geometry.helper.js.map +1 -1
  83. package/dist/collection/index.js +6 -0
  84. package/dist/collection/index.js.map +1 -1
  85. package/dist/collection/interfaces/anchor.interface.js +2 -0
  86. package/dist/collection/interfaces/anchor.interface.js.map +1 -0
  87. package/dist/collection/interfaces/arrow-head.interface.js +2 -0
  88. package/dist/collection/interfaces/arrow-head.interface.js.map +1 -0
  89. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  90. package/dist/collection/interfaces/line-options.interface.js +2 -0
  91. package/dist/collection/interfaces/line-options.interface.js.map +1 -0
  92. package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -1
  93. package/dist/components/index.js +4 -4
  94. package/dist/components/kritzel-brush-style.js +3 -3
  95. package/dist/components/kritzel-brush-style.js.map +1 -1
  96. package/dist/components/kritzel-color-palette.js +1 -1
  97. package/dist/components/kritzel-color.js +1 -1
  98. package/dist/components/kritzel-context-menu.js +1 -1
  99. package/dist/components/kritzel-control-brush-config.js +1 -1
  100. package/dist/components/kritzel-control-text-config.js +1 -1
  101. package/dist/components/kritzel-controls.js +1 -1
  102. package/dist/components/kritzel-cursor-trail.js +1 -1
  103. package/dist/components/kritzel-dropdown.js +1 -1
  104. package/dist/components/kritzel-editor.js +64 -23
  105. package/dist/components/kritzel-editor.js.map +1 -1
  106. package/dist/components/kritzel-engine.js +1 -1
  107. package/dist/components/kritzel-font-family.js +1 -1
  108. package/dist/components/kritzel-font-size.js +1 -1
  109. package/dist/components/kritzel-font.js +1 -1
  110. package/dist/components/kritzel-icon.js +1 -1
  111. package/dist/components/kritzel-menu-item.js +1 -1
  112. package/dist/components/kritzel-menu.js +1 -1
  113. package/dist/components/kritzel-portal.js +1 -1
  114. package/dist/components/kritzel-split-button.js +1 -1
  115. package/dist/components/kritzel-stroke-size.js +1 -1
  116. package/dist/components/kritzel-tooltip.js +1 -1
  117. package/dist/components/kritzel-utility-panel.js +1 -1
  118. package/dist/components/kritzel-workspace-manager.js +1 -1
  119. package/dist/components/{p-TdCTkEu0.js → p-7_lwv0zQ.js} +7 -7
  120. package/dist/components/p-7_lwv0zQ.js.map +1 -0
  121. package/dist/components/{p-CTP479Lf.js → p-9Fzdviju.js} +6 -6
  122. package/dist/components/{p-CTP479Lf.js.map → p-9Fzdviju.js.map} +1 -1
  123. package/dist/components/{p-DDmSxM5f.js → p-B6r22FSC.js} +5 -5
  124. package/dist/components/p-B6r22FSC.js.map +1 -0
  125. package/dist/components/{p-CLt3HMl6.js → p-B_3OZeom.js} +3 -3
  126. package/dist/components/{p-CLt3HMl6.js.map → p-B_3OZeom.js.map} +1 -1
  127. package/dist/components/{p-CIXPLjCu.js → p-BdwB-S9G.js} +3 -3
  128. package/dist/components/p-BdwB-S9G.js.map +1 -0
  129. package/dist/components/p-BixlbUD7.js +104 -0
  130. package/dist/components/p-BixlbUD7.js.map +1 -0
  131. package/dist/components/{p-D1uj4A4F.js → p-Brd9SxWS.js} +5 -5
  132. package/dist/components/p-Brd9SxWS.js.map +1 -0
  133. package/dist/components/{p-Ddh40W3x.js → p-CDteBYm9.js} +9 -9
  134. package/dist/components/p-CDteBYm9.js.map +1 -0
  135. package/dist/components/{p-BgznZoBH.js → p-CFH6XRL5.js} +5 -5
  136. package/dist/components/p-CFH6XRL5.js.map +1 -0
  137. package/dist/components/{p-B4kxkVe-.js → p-CRGwaUcp.js} +5 -5
  138. package/dist/components/p-CRGwaUcp.js.map +1 -0
  139. package/dist/components/{p-uuRJU2R1.js → p-Ck4lGnmt.js} +3 -3
  140. package/dist/components/{p-uuRJU2R1.js.map → p-Ck4lGnmt.js.map} +1 -1
  141. package/dist/components/{p-CK6no3mi.js → p-CkD1PQQX.js} +6 -6
  142. package/dist/components/{p-CK6no3mi.js.map → p-CkD1PQQX.js.map} +1 -1
  143. package/dist/components/{p-BQg4YML7.js → p-Cqr0Bah5.js} +12 -12
  144. package/dist/components/p-Cqr0Bah5.js.map +1 -0
  145. package/dist/components/{p-DTHqEUDc.js → p-CuhOrcET.js} +2861 -390
  146. package/dist/components/p-CuhOrcET.js.map +1 -0
  147. package/dist/components/{p-DAfkuR8U.js → p-CvLFRlQU.js} +5 -5
  148. package/dist/components/p-CvLFRlQU.js.map +1 -0
  149. package/dist/components/{p-1lIHoOlH.js → p-DKwJJuFb.js} +19 -19
  150. package/dist/components/p-DKwJJuFb.js.map +1 -0
  151. package/dist/components/{p-CsA9M6me.js → p-DZ7kxJUx.js} +8 -8
  152. package/dist/components/p-DZ7kxJUx.js.map +1 -0
  153. package/dist/components/{p-D4yvhd1d.js → p-LAsVgL2e.js} +4 -4
  154. package/dist/components/{p-D4yvhd1d.js.map → p-LAsVgL2e.js.map} +1 -1
  155. package/dist/components/{p-D5Wq4x4r.js → p-OFrACpZf.js} +3 -3
  156. package/dist/components/{p-D5Wq4x4r.js.map → p-OFrACpZf.js.map} +1 -1
  157. package/dist/components/{p-C2sWlNsJ.js → p-dMCB4tJA.js} +5 -5
  158. package/dist/components/p-dMCB4tJA.js.map +1 -0
  159. package/dist/components/{p-CBYBurdY.js → p-sokRZ7Vn.js} +49 -5
  160. package/dist/components/p-sokRZ7Vn.js.map +1 -0
  161. package/dist/esm/{default-text-tool.config-DzqpOikl.js → default-line-tool.config-C35m-d1Y.js} +3150 -930
  162. package/dist/esm/default-line-tool.config-C35m-d1Y.js.map +1 -0
  163. package/dist/esm/index.js +2 -2
  164. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  165. package/dist/esm/kritzel-brush-style.entry.js.map +1 -1
  166. package/dist/esm/kritzel-color_22.entry.js +457 -117
  167. package/dist/esm/loader.js +1 -1
  168. package/dist/esm/stencil.js +1 -1
  169. package/dist/stencil/index.esm.js +1 -1
  170. package/dist/stencil/kritzel-brush-style.entry.esm.js.map +1 -1
  171. package/dist/stencil/p-385bab97.entry.js +2 -0
  172. package/dist/stencil/{p-d702c5af.entry.js.map → p-385bab97.entry.js.map} +1 -1
  173. package/dist/stencil/p-C35m-d1Y.js +2 -0
  174. package/dist/stencil/p-C35m-d1Y.js.map +1 -0
  175. package/dist/stencil/p-d142ef46.entry.js +10 -0
  176. package/dist/stencil/p-d142ef46.entry.js.map +1 -0
  177. package/dist/stencil/stencil.esm.js +1 -1
  178. package/dist/types/classes/core/core.class.d.ts +18 -0
  179. package/dist/types/classes/core/store.class.d.ts +3 -0
  180. package/dist/types/classes/handlers/line-handle.handler.d.ts +34 -0
  181. package/dist/types/classes/managers/anchor.manager.d.ts +160 -0
  182. package/dist/types/classes/managers/cursor.manager.d.ts +43 -0
  183. package/dist/types/classes/objects/line.class.d.ts +98 -0
  184. package/dist/types/classes/tools/line-tool.class.d.ts +17 -0
  185. package/dist/types/classes/tools/selection-tool.class.d.ts +4 -0
  186. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -2
  187. package/dist/types/components.d.ts +7 -5
  188. package/dist/types/configs/default-line-tool.config.d.ts +2 -0
  189. package/dist/types/helpers/cursor.helper.d.ts +22 -0
  190. package/dist/types/helpers/geometry.helper.d.ts +10 -0
  191. package/dist/types/index.d.ts +6 -0
  192. package/dist/types/interfaces/anchor.interface.d.ts +137 -0
  193. package/dist/types/interfaces/arrow-head.interface.d.ts +26 -0
  194. package/dist/types/interfaces/engine-state.interface.d.ts +15 -0
  195. package/dist/types/interfaces/line-options.interface.d.ts +21 -0
  196. package/dist/types/interfaces/toolbar-control.interface.d.ts +17 -1
  197. package/package.json +1 -1
  198. package/dist/cjs/default-text-tool.config-D10FksvZ.js.map +0 -1
  199. package/dist/components/p-1lIHoOlH.js.map +0 -1
  200. package/dist/components/p-B4kxkVe-.js.map +0 -1
  201. package/dist/components/p-BQg4YML7.js.map +0 -1
  202. package/dist/components/p-BgznZoBH.js.map +0 -1
  203. package/dist/components/p-Bhtn9qay.js +0 -98
  204. package/dist/components/p-Bhtn9qay.js.map +0 -1
  205. package/dist/components/p-C2sWlNsJ.js.map +0 -1
  206. package/dist/components/p-CBYBurdY.js.map +0 -1
  207. package/dist/components/p-CIXPLjCu.js.map +0 -1
  208. package/dist/components/p-CsA9M6me.js.map +0 -1
  209. package/dist/components/p-D1uj4A4F.js.map +0 -1
  210. package/dist/components/p-DAfkuR8U.js.map +0 -1
  211. package/dist/components/p-DDmSxM5f.js.map +0 -1
  212. package/dist/components/p-DTHqEUDc.js.map +0 -1
  213. package/dist/components/p-Ddh40W3x.js.map +0 -1
  214. package/dist/components/p-TdCTkEu0.js.map +0 -1
  215. package/dist/esm/default-text-tool.config-DzqpOikl.js.map +0 -1
  216. package/dist/stencil/p-5475442e.entry.js +0 -10
  217. package/dist/stencil/p-5475442e.entry.js.map +0 -1
  218. package/dist/stencil/p-DzqpOikl.js +0 -2
  219. package/dist/stencil/p-DzqpOikl.js.map +0 -1
  220. package/dist/stencil/p-d702c5af.entry.js +0 -2
@@ -80,7 +80,7 @@ export class KritzelSplitButton {
80
80
  this.menuScrollTop = event.target.scrollTop;
81
81
  };
82
82
  render() {
83
- return (h(Host, { key: '4ff7809dd62c1dd60600fda592aeac43cd9bc74c', class: { mobile: this.isTouchDevice } }, h("button", { key: 'db6485fabcffdd75a25d178aca7b653af499a90c', class: "split-main-button", tabIndex: 0, onClick: this.handleButtonClick, disabled: this.mainButtonDisabled }, this.buttonIcon && h("kritzel-icon", { key: '4001a4e23ef53bec2a578310de8c8b593d7b266c', name: this.buttonIcon })), h("div", { key: '8ff86d3c01a48b06afca77dd066518efa3589cb1', class: "split-divider" }), h("button", { key: 'f1c40edbec3756a7f3681de4e8d0f1981dd312a4', ref: el => (this.splitMenuButtonRef = el), class: "split-menu-button", tabIndex: 0, onClick: this.toggleMenu, disabled: this.menuButtonDisabled }, h("kritzel-icon", { key: '0ddb89976632ae7454e66504f8bab3fd5072c252', name: this.dropdownIcon })), h("kritzel-portal", { key: '64531ffd6ac847fd1a99e32aceefea9f18088992', anchor: this.anchorElement, offsetY: 4, onClose: this.closeMenu }, h("kritzel-menu", { key: 'f3b86cb71e5ba39e8f98e26b3669416e2cdb4802', ref: el => (this.menuRef = el), items: this.items, onItemSelect: this.handleItemSelect, onItemSave: this.handleItemSave, onItemCancel: this.handleItemCancel, onItemToggleChildMenu: this.handleItemToggleChildMenu, onItemCloseChildMenu: this.handleItemCloseChildMenu, onClose: this.closeMenu, onScroll: this.handleScroll }))));
83
+ return (h(Host, { key: '3603874994e8a9d666448460d7e403252d38f799', class: { mobile: this.isTouchDevice } }, h("button", { key: 'a6a2f8cd22118f7be668f3fd1fc52e38c44b22b3', class: "split-main-button", tabIndex: 0, onClick: this.handleButtonClick, disabled: this.mainButtonDisabled }, this.buttonIcon && h("kritzel-icon", { key: 'e61abf53a2890b6587746eb2aef5a813e81ff1b9', name: this.buttonIcon })), h("div", { key: '17f78d85b2fbd0fe6e7925e10c2531c51bcfdf41', class: "split-divider" }), h("button", { key: 'ac507c76479d66e3483ee898e144a6bea4e8cf6a', ref: el => (this.splitMenuButtonRef = el), class: "split-menu-button", tabIndex: 0, onClick: this.toggleMenu, disabled: this.menuButtonDisabled }, h("kritzel-icon", { key: '8274be53e327d537c2987bc9a3761bc768bdd41f', name: this.dropdownIcon })), h("kritzel-portal", { key: '71136ef798f3c77cff30426a0fcd4ff91bf312b8', anchor: this.anchorElement, offsetY: 4, onClose: this.closeMenu }, h("kritzel-menu", { key: 'd1363d2029d7b4aafbd6cba9a4ca6cdf617064e9', ref: el => (this.menuRef = el), items: this.items, onItemSelect: this.handleItemSelect, onItemSave: this.handleItemSave, onItemCancel: this.handleItemCancel, onItemToggleChildMenu: this.handleItemToggleChildMenu, onItemCloseChildMenu: this.handleItemCloseChildMenu, onClose: this.closeMenu, onScroll: this.handleScroll }))));
84
84
  }
85
85
  static get is() { return "kritzel-split-button"; }
86
86
  static get encapsulation() { return "shadow"; }
@@ -13,7 +13,7 @@
13
13
  width: 32px;
14
14
  height: 32px;
15
15
  border-radius: 50%;
16
- cursor: pointer;
16
+ cursor: var(--kritzel-pointer-cursor, pointer);
17
17
  border: 2px solid transparent;
18
18
  box-sizing: border-box;
19
19
  }
@@ -8,7 +8,7 @@ export class KritzelStrokeSize {
8
8
  this.sizeChange.emit(size);
9
9
  }
10
10
  render() {
11
- return (h(Host, { key: '74579e34c23725e22927afe371c1f7925903720a' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
11
+ return (h(Host, { key: '7c9041e061a946f20210cff2330cb736c2703ac7' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
12
12
  'size-container': true,
13
13
  'selected': this.selectedSize === size,
14
14
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-color", { value: '#000000', size: size }))))));
@@ -63,23 +63,23 @@ export class KritzelTooltip {
63
63
  }
64
64
  }
65
65
  render() {
66
- return (h(Host, { key: '72a6356a43a15a7abc9a46b0d22c3c62217791e8', style: {
66
+ return (h(Host, { key: '8f78668b3d266d7a0eb140d01626998534acc252', style: {
67
67
  position: 'fixed',
68
68
  zIndex: '9999',
69
69
  transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
70
70
  visibility: this.isVisible ? 'visible' : 'hidden',
71
71
  left: !this.isMobileView ? `${this.positionX}px` : '50%',
72
72
  marginBottom: `${this.offsetY + this.arrowSize}px`,
73
- } }, h("div", { key: '75f5350f23ada0eee009279eddd7d25273ad3740', class: "tooltip-content", onClick: event => event.stopPropagation() }, h("slot", { key: 'ad999154289e933cac1fdc13392de2aec78811a8' }), h("div", { key: '6be3f5c24d42898920c339be2cd2f3dd8a82fa80', class: "tooltip-arrow-wrapper", style: {
73
+ } }, h("div", { key: '77b526b1687d41654b32b6f14d3e0400908b0a79', class: "tooltip-content", onClick: event => event.stopPropagation() }, h("slot", { key: 'fcd088608c091ff877b1e58425a0905c84c9999a' }), h("div", { key: '002913b582b5c034e7af722c433fbe79d0c32150', class: "tooltip-arrow-wrapper", style: {
74
74
  position: 'fixed',
75
75
  left: this.arrowOffset,
76
76
  bottom: `-${this.arrowSize * 2}px`,
77
- } }, h("div", { key: '37397c6245dd6b0def23e2611d118e0c4f5860ef', class: "tooltip-arrow", style: {
77
+ } }, h("div", { key: 'fc834bf34b464ac039ffb58e47485b76f8ced03e', class: "tooltip-arrow", style: {
78
78
  borderLeft: `${this.arrowSize}px solid transparent`,
79
79
  borderRight: `${this.arrowSize}px solid transparent`,
80
80
  borderTop: `${this.arrowSize}px solid var(--kritzel-controls-tooltip-background-color, #ffffff)`,
81
81
  filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2))',
82
- } }), h("div", { key: 'dbf009c371d46ef0a36e27771758c66e817d9b22', class: "tooltip-arrow-rect", style: {
82
+ } }), h("div", { key: '65939011ae607a144f8217cf3aa5bdd2ff0f88fc', class: "tooltip-arrow-rect", style: {
83
83
  position: 'relative',
84
84
  width: `${this.arrowSize * 2}px`,
85
85
  height: `${this.arrowSize}px`,
@@ -21,7 +21,7 @@
21
21
  text-align: left;
22
22
  padding: var(--kritzel-context-menu-item-padding, 8px);
23
23
  border-radius: var(--kritzel-context-menu-item-border-radius, 12px);
24
- cursor: pointer;
24
+ cursor: var(--kritzel-pointer-cursor, pointer);
25
25
  font-size: var(--kritzel-context-menu-item-font-size, 14px);
26
26
  color: var(--kritzel-context-menu-item-color, #333333);
27
27
  white-space: nowrap;
@@ -38,7 +38,6 @@
38
38
 
39
39
  .menu-item.disabled {
40
40
  color: var(--kritzel-context-menu-item-disabled-color, #aaaaaa);
41
- cursor: default;
42
41
  }
43
42
 
44
43
  .menu-item kritzel-icon {
@@ -44,7 +44,7 @@ export class KritzelContextMenu {
44
44
  return defaultValue;
45
45
  }
46
46
  render() {
47
- return (h(Host, { key: '45b9652285f9c3fe7568cbe222667d23c151622f' }, h("div", { key: '9aecc01027f297fa4d991780efaaf51b8d4542dc', class: "menu-container" }, this.processedItems.map(({ item, isDisabled }, index) => (h("button", { key: `${item.label}-${index}`, class: { 'menu-item': true, 'disabled': isDisabled }, onClick: () => this.handleItemClick(item, isDisabled), disabled: isDisabled }, item.icon && h("kritzel-icon", { name: item.icon, size: 16 }), h("span", { class: "label" }, item.label)))))));
47
+ return (h(Host, { key: '102f1fd72d991e6d5c0fa6025ed75d860e8e9852' }, h("div", { key: '510ea27fdcddc78a51220f68a8d8ba82fd2bd108', class: "menu-container" }, this.processedItems.map(({ item, isDisabled }, index) => (h("button", { key: `${item.label}-${index}`, class: { 'menu-item': true, 'disabled': isDisabled }, onClick: () => this.handleItemClick(item, isDisabled), disabled: isDisabled }, item.icon && h("kritzel-icon", { name: item.icon, size: 16 }), h("span", { class: "label" }, item.label)))))));
48
48
  }
49
49
  static get is() { return "kritzel-context-menu"; }
50
50
  static get encapsulation() { return "shadow"; }
@@ -7,7 +7,7 @@
7
7
  .expand-toggle {
8
8
  background: none;
9
9
  border: none;
10
- cursor: pointer;
10
+ cursor: var(--kritzel-pointer-cursor, pointer);
11
11
  font-size: 14px;
12
12
  line-height: 1;
13
13
  padding: 8px;
@@ -28,14 +28,14 @@ export class KritzelControlBrushConfig {
28
28
  this.toolChange.emit(this.tool);
29
29
  }
30
30
  render() {
31
- return (h(Host, { key: '4b060826312e6d5a2117f5ba9522553af9b02d6f' }, h("div", { key: '0975a250184d5bb2d38cc60263bd718157230d8c', style: {
31
+ return (h(Host, { key: '3111b2870e4a02da26bac5450424cadeef8c8d39' }, h("div", { key: '4bbf6bede0822c35e206566dd176e6b150b54098', style: {
32
32
  display: 'flex',
33
33
  flexDirection: 'row',
34
34
  alignItems: this.isExpanded ? 'flex-start' : 'center',
35
35
  justifyContent: 'flex-start',
36
36
  width: '100%',
37
37
  gap: '8px',
38
- } }, h("kritzel-color-palette", { key: 'df84a6fdda01bc7bf3aff42e3b88c4bd9dca500f', colors: this.palette, selectedColor: this.tool.color, isExpanded: this.isExpanded, isOpaque: true, onColorChange: color => this.handleColorChange(color) }), h("button", { key: 'e43c19612807fc4f9cd1bf04f4fb79a048cfd62b', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand', style: this.palette.length > 6 ? { visibillity: 'visible' } : { visibility: 'hidden' } }, h("kritzel-icon", { key: '915cce6c4744ad175f3836c946330882de840880', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-stroke-size", { key: 'c07eebae3ba1785e2644c6b5a22d23f76be950fb', selectedSize: this.tool.size, onSizeChange: event => this.handleSizeChange(event) })));
38
+ } }, h("kritzel-color-palette", { key: 'eb9c5690f823ca278d60629b9ac0595411771d05', colors: this.palette, selectedColor: this.tool.color, isExpanded: this.isExpanded, isOpaque: true, onColorChange: color => this.handleColorChange(color) }), h("button", { key: 'd5b0d12188babdd26bbf97344cec60760b7c4f87', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand', style: this.palette.length > 6 ? { visibillity: 'visible' } : { visibility: 'hidden' } }, h("kritzel-icon", { key: 'e1beea772a60dda335a56815fa39609c37849769', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-stroke-size", { key: '8b31bac4e67752f55d2c2281b37a38e6fd801a57', selectedSize: this.tool.size, onSizeChange: event => this.handleSizeChange(event) })));
39
39
  }
40
40
  static get is() { return "kritzel-control-brush-config"; }
41
41
  static get encapsulation() { return "shadow"; }
@@ -7,7 +7,7 @@
7
7
  .expand-toggle {
8
8
  background: none;
9
9
  border: none;
10
- cursor: pointer;
10
+ cursor: var(--kritzel-pointer-cursor, pointer);
11
11
  font-size: 14px;
12
12
  line-height: 1;
13
13
  padding: 8px;
@@ -19,14 +19,14 @@ export class KritzelControlTextConfig {
19
19
  this.toolChange.emit(this.tool);
20
20
  }
21
21
  render() {
22
- return (h(Host, { key: '82e611092700f057bd36823e7f7503fe7a0423ed' }, h("div", { key: '37ed39adeeeb58981a917918cd185e96d589e973', style: {
22
+ return (h(Host, { key: '172bfe742f7fcb7db080729ac9b07cfd7a2f3f86' }, h("div", { key: 'de4000668ebc8a0fb27d9ae9b817b68a5d3e69b0', style: {
23
23
  display: 'flex',
24
24
  flexDirection: 'row',
25
25
  alignItems: 'center',
26
26
  justifyContent: 'flex-start',
27
27
  width: '100%',
28
28
  gap: '8px',
29
- } }, h("kritzel-font-family", { key: 'cd8afc5c4a1eee087610cd3d5a6c05210cfda6b3', selectedFontFamily: this.tool.fontFamily, onFontFamilyChange: event => this.handleFamilyChange(event) }), h("button", { key: '085f1bba060bde27a7b64dc5477bb51305b76235', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand' }, h("kritzel-icon", { key: '3ff8fec207120e67f43315c6dace72fc2f6bd0f1', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-color-palette", { key: '2e29d01a6b5c0e4a8ec347e63b6a2698c282db40', colors: this.tool.palette, selectedColor: this.tool.fontColor, isExpanded: this.isExpanded, onColorChange: event => this.handleColorChange(event) }), h("kritzel-font-size", { key: 'c972068f1251d66e756b8de72fbdd1b6002d1daa', selectedSize: this.tool.fontSize, fontFamily: this.tool.fontFamily, onSizeChange: event => this.handleSizeChange(event) })));
29
+ } }, h("kritzel-font-family", { key: '4940703e315d0991d4eb2000f4e1a1da6e113cb2', selectedFontFamily: this.tool.fontFamily, onFontFamilyChange: event => this.handleFamilyChange(event) }), h("button", { key: '5a32fe373c1ce5cd312fa67e2b345fcc9eda81e5', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand' }, h("kritzel-icon", { key: '2dc5d0ed3d4bfe02e560e0d9b7fc487e343f56d9', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-color-palette", { key: 'c3cba9ef7408aa726954b649d76bd1ae40f0aec6', colors: this.tool.palette, selectedColor: this.tool.fontColor, isExpanded: this.isExpanded, onColorChange: event => this.handleColorChange(event) }), h("kritzel-font-size", { key: 'b9f879d5f2bcc4b92519235e6fc0a22195a30a8f', selectedSize: this.tool.fontSize, fontFamily: this.tool.fontFamily, onSizeChange: event => this.handleSizeChange(event) })));
30
30
  }
31
31
  static get is() { return "kritzel-control-text-config"; }
32
32
  static get encapsulation() { return "shadow"; }
@@ -34,7 +34,7 @@
34
34
  padding: var(--kritzel-controls-control-padding, 8px);
35
35
  border: none;
36
36
  background: none;
37
- cursor: pointer;
37
+ cursor: var(--kritzel-pointer-cursor, pointer);
38
38
  -webkit-tap-highlight-color: transparent;
39
39
  font-weight: bold;
40
40
  }
@@ -81,7 +81,7 @@
81
81
  display: flex;
82
82
  justify-content: center;
83
83
  align-items: center;
84
- cursor: pointer;
84
+ cursor: var(--kritzel-pointer-cursor, pointer);
85
85
  border-radius: 50%;
86
86
  }
87
87
 
@@ -92,7 +92,7 @@
92
92
  width: 32px;
93
93
  height: 32px;
94
94
  border-radius: 50%;
95
- cursor: pointer;
95
+ cursor: var(--kritzel-pointer-cursor, pointer);
96
96
  border: 2px solid transparent;
97
97
  box-sizing: border-box;
98
98
  background-color: var(--kritzel-color-palette-hover-background-color, #ebebeb);
@@ -105,7 +105,7 @@
105
105
  width: 32px;
106
106
  height: 32px;
107
107
  border-radius: 50%;
108
- cursor: pointer;
108
+ cursor: var(--kritzel-pointer-cursor, pointer);
109
109
  border: 2px solid transparent;
110
110
  box-sizing: border-box;
111
111
  background-color: var(--kritzel-color-palette-hover-background-color, #ebebeb);
@@ -100,13 +100,13 @@ export class KritzelControls {
100
100
  }
101
101
  render() {
102
102
  const hasNoConfig = this.activeControl?.config === undefined || this.activeControl?.config === null;
103
- return (h(Host, { key: '6ea9de8d541e3fc02c5ceeebf4c2c5fb4d8ad926', class: {
103
+ return (h(Host, { key: 'c01351cbf438f2e36249b2ef3ef8725edcabd57b', class: {
104
104
  mobile: this.isTouchDevice,
105
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '7506b42f05c3f49aa5c936d267c5de44b3ebb9cd', style: {
105
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '3c14cf25dd51f123dc8d33be92992e2f2c18ac40', style: {
106
106
  position: 'absolute',
107
107
  bottom: '56px',
108
108
  left: '12px',
109
- }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '1299fce4adea3f9a529bbaf73d35e2676b6850e4', class: "kritzel-controls" }, this.controls.map(control => {
109
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '05719acfe12d1770bf49fb7d9989619f2e27ee0f', class: "kritzel-controls" }, this.controls.map(control => {
110
110
  if (control.type === 'tool') {
111
111
  return (h("button", { class: {
112
112
  'kritzel-control': true,
@@ -20,7 +20,7 @@
20
20
  padding: 8px 4px;
21
21
  border: none;
22
22
  background: none;
23
- cursor: pointer;
23
+ cursor: var(--kritzel-pointer-cursor, pointer);
24
24
  color: #333333;
25
25
  -webkit-tap-highlight-color: transparent;
26
26
  border-radius: var(--kritzel-utility-panel-button-border-radius, 8px);
@@ -17,7 +17,7 @@ export class KritzelUtilityPanel {
17
17
  this.redo.emit();
18
18
  }
19
19
  render() {
20
- return (h(Host, { key: '47e35a4c61d2807d220888eb90e325e24b9baf90' }, h("button", { key: '4e6ec69fc83242a9c1340a31351da1cccd90b1ba', class: "utility-button", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '57bf4920ff9f0b2de8b0c1625dd844bba0c7f66d', name: "undo" })), h("button", { key: '759b9d13a679455fccd00e3d8c84e51b184659df', class: "utility-button", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'f3650d9dcf0c09086ec707443deb6055f7a709ec', name: "redo" })), h("div", { key: 'f414bc1d4be24a1f48d77911db4b9064c898ed8d', class: "utility-separator" }), h("button", { key: 'f542539422b6040bc7b90ceccad075e8f7150a4e', class: "utility-button" }, h("kritzel-icon", { key: 'da8e3cfe848384c3bb984b34d7ad9a6c9c1feba8', name: "delete", onClick: () => this.delete.emit() }))));
20
+ return (h(Host, { key: '6e33687f7c71ec342d47f1ae4a507de1f08fad6f' }, h("button", { key: 'd0cf45d78743a954764d03abdb49a725c0979cf8', class: "utility-button", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '6303892952ef0426023dde47b909fe90abfbd4c6', name: "undo" })), h("button", { key: '0542b66850c61e001d7461ddcbceb7999f98dc6a', class: "utility-button", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'faf61b34c8d5abe3ba0bdb1787a08418874532a4', name: "redo" })), h("div", { key: 'a8482d17b7e9b68204d81097ced692daa1fb11cc', class: "utility-separator" }), h("button", { key: 'd733f273095a96c914285908088d9c1536dddaf0', class: "utility-button" }, h("kritzel-icon", { key: 'd5322357c8ffc646c77acb02c5c5ce9131ba66cd', name: "delete", onClick: () => this.delete.emit() }))));
21
21
  }
22
22
  static get is() { return "kritzel-utility-panel"; }
23
23
  static get encapsulation() { return "shadow"; }
@@ -3,7 +3,9 @@ export const DEFAULT_ENGINE_CONFIG = {
3
3
  activeTool: null,
4
4
  copiedObjects: null,
5
5
  objects: null,
6
+ snapCandidate: null,
6
7
  resizeHandleType: null,
8
+ lineHandleType: null,
7
9
  hasViewportChanged: false,
8
10
  hasObjectsChanged: false,
9
11
  isReady: false,
@@ -12,9 +14,13 @@ export const DEFAULT_ENGINE_CONFIG = {
12
14
  isPanning: false,
13
15
  isSelecting: false,
14
16
  isResizing: false,
17
+ isResizeHandleHovered: false,
15
18
  isResizeHandleSelected: false,
16
19
  isRotating: false,
20
+ isRotationHandleHovered: false,
17
21
  isRotationHandleSelected: false,
22
+ isLineHandleSelected: false,
23
+ isLineHandleDragging: false,
18
24
  isDragging: false,
19
25
  isDrawing: false,
20
26
  isErasing: false,
@@ -49,5 +55,9 @@ export const DEFAULT_ENGINE_CONFIG = {
49
55
  longTouchDelay: 300,
50
56
  pointers: new Map(),
51
57
  workspaces: [],
58
+ cursor: {
59
+ icon: 'default',
60
+ iconActive: 'default'
61
+ }
52
62
  };
53
63
  //# sourceMappingURL=default-engine-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-engine-config.js","sourceRoot":"","sources":["../../src/configs/default-engine-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAuB;IACvD,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,KAAK;IACzB,iBAAiB,EAAE,KAAK;IACxB,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,sBAAsB,EAAE,KAAK;IAC7B,UAAU,EAAE,KAAK;IACjB,wBAAwB,EAAE,KAAK;IAC/B,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,KAAK;IACvB,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,KAAK;IACtB,SAAS,EAAE;QACT,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;KACxB;IACD,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;IACjB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,GAAG;IACnB,QAAQ,EAAE,IAAI,GAAG,EAAwB;IACzC,UAAU,EAAE,EAAE;CACf,CAAC","sourcesContent":["import { KritzelEngineState } from \"../interfaces/engine-state.interface\";\r\n\r\nexport const DEFAULT_ENGINE_CONFIG: KritzelEngineState = {\r\n activeWorkspace: null,\r\n activeTool: null,\r\n copiedObjects: null,\r\n objects: null,\r\n resizeHandleType: null,\r\n hasViewportChanged: false,\r\n hasObjectsChanged: false,\r\n isReady: false,\r\n isEnabled: true,\r\n isScaling: false,\r\n isPanning: false,\r\n isSelecting: false,\r\n isResizing: false,\r\n isResizeHandleSelected: false,\r\n isRotating: false,\r\n isRotationHandleSelected: false,\r\n isDragging: false,\r\n isDrawing: false,\r\n isErasing: false,\r\n isWriting: false,\r\n isCtrlKeyPressed: false,\r\n isContextMenuVisible: false,\r\n contextMenuItems: [],\r\n contextMenuX: 0,\r\n contextMenuY: 0,\r\n skipContextMenu: false,\r\n debugInfo: {\r\n showObjectInfo: false,\r\n showViewportInfo: false\r\n },\r\n host: null,\r\n pointerX: 0,\r\n pointerY: 0,\r\n scale: 1,\r\n scaleMax: 1,\r\n scaleMin: 1,\r\n startX: 0,\r\n startY: 0,\r\n translateX: 0,\r\n translateXMax: 400,\r\n translateXMin: 0,\r\n translateY: 0,\r\n translateYMax: 400,\r\n translateYMin: 0,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n longTouchTimeout: null,\r\n longTouchDelay: 300,\r\n pointers: new Map<number, PointerEvent>(),\r\n workspaces: [],\r\n};"]}
1
+ {"version":3,"file":"default-engine-config.js","sourceRoot":"","sources":["../../src/configs/default-engine-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAuB;IACvD,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,KAAK;IACzB,iBAAiB,EAAE,KAAK;IACxB,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,qBAAqB,EAAE,KAAK;IAC5B,sBAAsB,EAAE,KAAK;IAC7B,UAAU,EAAE,KAAK;IACjB,uBAAuB,EAAE,KAAK;IAC9B,wBAAwB,EAAE,KAAK;IAC/B,oBAAoB,EAAE,KAAK;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,KAAK;IACvB,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,KAAK;IACtB,SAAS,EAAE;QACT,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;KACxB;IACD,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;IACjB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,GAAG;IACnB,QAAQ,EAAE,IAAI,GAAG,EAAwB;IACzC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE;QACN,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,SAAS;KACtB;CACF,CAAC","sourcesContent":["import { KritzelEngineState } from \"../interfaces/engine-state.interface\";\r\n\r\nexport const DEFAULT_ENGINE_CONFIG: KritzelEngineState = {\r\n activeWorkspace: null,\r\n activeTool: null,\r\n copiedObjects: null,\r\n objects: null,\r\n snapCandidate: null,\r\n resizeHandleType: null,\r\n lineHandleType: null,\r\n hasViewportChanged: false,\r\n hasObjectsChanged: false,\r\n isReady: false,\r\n isEnabled: true,\r\n isScaling: false,\r\n isPanning: false,\r\n isSelecting: false,\r\n isResizing: false,\r\n isResizeHandleHovered: false,\r\n isResizeHandleSelected: false,\r\n isRotating: false,\r\n isRotationHandleHovered: false,\r\n isRotationHandleSelected: false,\r\n isLineHandleSelected: false,\r\n isLineHandleDragging: false,\r\n isDragging: false,\r\n isDrawing: false,\r\n isErasing: false,\r\n isWriting: false,\r\n isCtrlKeyPressed: false,\r\n isContextMenuVisible: false,\r\n contextMenuItems: [],\r\n contextMenuX: 0,\r\n contextMenuY: 0,\r\n skipContextMenu: false,\r\n debugInfo: {\r\n showObjectInfo: false,\r\n showViewportInfo: false\r\n },\r\n host: null,\r\n pointerX: 0,\r\n pointerY: 0,\r\n scale: 1,\r\n scaleMax: 1,\r\n scaleMin: 1,\r\n startX: 0,\r\n startY: 0,\r\n translateX: 0,\r\n translateXMax: 400,\r\n translateXMin: 0,\r\n translateY: 0,\r\n translateYMax: 400,\r\n translateYMin: 0,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n longTouchTimeout: null,\r\n longTouchDelay: 300,\r\n pointers: new Map<number, PointerEvent>(),\r\n workspaces: [],\r\n cursor: {\r\n icon: 'default',\r\n iconActive: 'default'\r\n }\r\n};"]}
@@ -0,0 +1,34 @@
1
+ export const DEFAULT_LINE_TOOL_CONFIG = {
2
+ color: '#000000',
3
+ size: 4,
4
+ palette: [
5
+ '#000000',
6
+ '#ff5252',
7
+ '#ffbc00',
8
+ '#00c853',
9
+ '#0000FF',
10
+ '#d500f9',
11
+ '#fafafa',
12
+ '#a52714',
13
+ '#ee8100',
14
+ '#558b2f',
15
+ '#01579b',
16
+ '#8e24aa',
17
+ '#90a4ae',
18
+ '#ff4081',
19
+ '#ff6e40',
20
+ '#aeea00',
21
+ '#304ffe',
22
+ '#7c4dff',
23
+ '#cfd8dc',
24
+ '#f8bbd0',
25
+ '#ffccbc',
26
+ '#f0f4c3',
27
+ '#b3e5fc',
28
+ '#e1bee7',
29
+ ],
30
+ arrows: {
31
+ end: { enabled: true, style: 'triangle' },
32
+ },
33
+ };
34
+ //# sourceMappingURL=default-line-tool.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-line-tool.config.js","sourceRoot":"","sources":["../../src/configs/default-line-tool.config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAA0B;IAC7D,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,CAAC;IACP,OAAO,EAAE;QACP,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;KACV;IACD,MAAM,EAAE;QACN,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;KAC1C;CACF,CAAC","sourcesContent":["import { KritzelLineToolConfig } from '../interfaces/toolbar-control.interface';\r\n\r\nexport const DEFAULT_LINE_TOOL_CONFIG: KritzelLineToolConfig = {\r\n color: '#000000',\r\n size: 4,\r\n palette: [\r\n '#000000',\r\n '#ff5252',\r\n '#ffbc00',\r\n '#00c853',\r\n '#0000FF',\r\n '#d500f9',\r\n '#fafafa',\r\n '#a52714',\r\n '#ee8100',\r\n '#558b2f',\r\n '#01579b',\r\n '#8e24aa',\r\n '#90a4ae',\r\n '#ff4081',\r\n '#ff6e40',\r\n '#aeea00',\r\n '#304ffe',\r\n '#7c4dff',\r\n '#cfd8dc',\r\n '#f8bbd0',\r\n '#ffccbc',\r\n '#f0f4c3',\r\n '#b3e5fc',\r\n '#e1bee7',\r\n ],\r\n arrows: {\r\n end: { enabled: true, style: 'triangle' },\r\n },\r\n};\r\n"]}
@@ -0,0 +1,58 @@
1
+ import { KritzelIconRegistry } from "../classes/registries/icon-registry.class";
2
+ export class KritzelCursorHelper {
3
+ static _pointerCursor = null;
4
+ /**
5
+ * Returns the custom pointer cursor CSS value.
6
+ * This can be used instead of `cursor: pointer` for consistent styling.
7
+ */
8
+ static getPointerCursor() {
9
+ if (!this._pointerCursor) {
10
+ this._pointerCursor = this.getCursor({ iconName: 'pointer' });
11
+ }
12
+ return this._pointerCursor;
13
+ }
14
+ /**
15
+ * Returns a custom cursor CSS value with support for rotation.
16
+ * The icon is retrieved from the KritzelIconRegistry.
17
+ */
18
+ static getCursor(options) {
19
+ const iconName = options.iconName === 'default' ? 'mouse-pointer' : options.iconName;
20
+ const iconSvg = KritzelIconRegistry.get(iconName);
21
+ if (!iconSvg) {
22
+ console.warn(`Icon "${iconName}" not found in registry.`);
23
+ return 'auto';
24
+ }
25
+ const size = options.size || 24;
26
+ const rotation = options.rotation || 0;
27
+ const color = options.color || 'black';
28
+ // Default cursor (mouse-pointer) has hotspot at (4, 4), others at center
29
+ const hotspot = options.hotspot || (options.iconName === 'default' ? { x: 4, y: 4 } : { x: size / 2, y: size / 2 });
30
+ // Modify the SVG string to set size and color
31
+ // We replace width and height to match the requested size
32
+ // We replace currentColor with the requested color
33
+ let content = iconSvg
34
+ .replace(/width="\d+"/, `width="${size}"`)
35
+ .replace(/height="\d+"/, `height="${size}"`)
36
+ .replace(/currentColor/g, color);
37
+ // Create the SVG string
38
+ // We rotate around the center of the SVG canvas
39
+ const center = size / 2;
40
+ // We use a group to apply the rotation
41
+ const svg = `
42
+ <svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}">
43
+ <g transform="rotate(${rotation} ${center} ${center})">
44
+ ${content}
45
+ </g>
46
+ </svg>
47
+ `;
48
+ // Encode the SVG for use in a data URI
49
+ // We need to be careful with encoding to ensure it works across browsers
50
+ const encodedSvg = encodeURIComponent(svg.replace(/\s+/g, ' ').trim())
51
+ .replace(/'/g, '%27')
52
+ .replace(/"/g, '%22');
53
+ const dataUri = `data:image/svg+xml;charset=utf-8,${encodedSvg}`;
54
+ // Return the cursor style string
55
+ return `url('${dataUri}') ${hotspot.x} ${hotspot.y}, auto`;
56
+ }
57
+ }
58
+ //# sourceMappingURL=cursor.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.helper.js","sourceRoot":"","sources":["../../src/helpers/cursor.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAC,cAAc,GAAkB,IAAI,CAAC;IAEpD;;;OAGG;IACH,MAAM,CAAC,gBAAgB;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,SAAS,CACd,OAMC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrF,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,SAAS,QAAQ,0BAA0B,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;QACvC,yEAAyE;QACzE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAEpH,8CAA8C;QAC9C,0DAA0D;QAC1D,mDAAmD;QACnD,IAAI,OAAO,GAAG,OAAO;aAChB,OAAO,CAAC,aAAa,EAAE,UAAU,IAAI,GAAG,CAAC;aACzC,OAAO,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG,CAAC;aAC3C,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAErC,wBAAwB;QACxB,gDAAgD;QAChD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;QAExB,uCAAuC;QACvC,MAAM,GAAG,GAAG;uDACuC,IAAI,aAAa,IAAI,kBAAkB,IAAI,IAAI,IAAI;+BAC3E,QAAQ,IAAI,MAAM,IAAI,MAAM;YAC/C,OAAO;;;KAGd,CAAC;QAEF,uCAAuC;QACvC,yEAAyE;QACzE,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACjE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE1B,MAAM,OAAO,GAAG,oCAAoC,UAAU,EAAE,CAAC;QAEjE,iCAAiC;QACjC,OAAO,QAAQ,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC;IAC7D,CAAC","sourcesContent":["import { KritzelIconRegistry } from '../classes/registries/icon-registry.class';\r\n\r\nexport class KritzelCursorHelper {\r\n private static _pointerCursor: string | null = null;\r\n\r\n /**\r\n * Returns the custom pointer cursor CSS value.\r\n * This can be used instead of `cursor: pointer` for consistent styling.\r\n */\r\n static getPointerCursor(): string {\r\n if (!this._pointerCursor) {\r\n this._pointerCursor = this.getCursor({ iconName: 'pointer' });\r\n }\r\n return this._pointerCursor;\r\n }\r\n\r\n /**\r\n * Returns a custom cursor CSS value with support for rotation.\r\n * The icon is retrieved from the KritzelIconRegistry.\r\n */\r\n static getCursor(\r\n options: {\r\n iconName: string;\r\n rotation?: number;\r\n color?: string;\r\n size?: number;\r\n hotspot?: { x: number; y: number };\r\n }\r\n ): string {\r\n const iconName = options.iconName === 'default' ? 'mouse-pointer' : options.iconName;\r\n const iconSvg = KritzelIconRegistry.get(iconName);\r\n if (!iconSvg) {\r\n console.warn(`Icon \"${iconName}\" not found in registry.`);\r\n return 'auto';\r\n }\r\n\r\n const size = options.size || 24;\r\n const rotation = options.rotation || 0;\r\n const color = options.color || 'black';\r\n // Default cursor (mouse-pointer) has hotspot at (4, 4), others at center\r\n const hotspot = options.hotspot || (options.iconName === 'default' ? { x: 4, y: 4 } : { x: size / 2, y: size / 2 });\r\n\r\n // Modify the SVG string to set size and color\r\n // We replace width and height to match the requested size\r\n // We replace currentColor with the requested color\r\n let content = iconSvg\r\n .replace(/width=\"\\d+\"/, `width=\"${size}\"`)\r\n .replace(/height=\"\\d+\"/, `height=\"${size}\"`)\r\n .replace(/currentColor/g, color);\r\n\r\n // Create the SVG string\r\n // We rotate around the center of the SVG canvas\r\n const center = size / 2;\r\n \r\n // We use a group to apply the rotation\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <g transform=\"rotate(${rotation} ${center} ${center})\">\r\n ${content}\r\n </g>\r\n </svg>\r\n `;\r\n\r\n // Encode the SVG for use in a data URI\r\n // We need to be careful with encoding to ensure it works across browsers\r\n const encodedSvg = encodeURIComponent(svg.replace(/\\s+/g, ' ').trim())\r\n .replace(/'/g, '%27')\r\n .replace(/\"/g, '%22');\r\n\r\n const dataUri = `data:image/svg+xml;charset=utf-8,${encodedSvg}`;\r\n\r\n // Return the cursor style string\r\n return `url('${dataUri}') ${hotspot.x} ${hotspot.y}, auto`;\r\n }\r\n}\r\n"]}
@@ -49,5 +49,47 @@ export class KritzelGeometryHelper {
49
49
  const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
50
50
  return t >= 0 && t <= 1 && u >= 0 && u <= 1;
51
51
  }
52
+ /**
53
+ * Finds the intersection point between a line segment and a line segment.
54
+ * Returns the intersection point or null if no intersection.
55
+ */
56
+ static getLineIntersectionPoint(p1a, p1b, p2a, p2b) {
57
+ const det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);
58
+ if (det === 0) {
59
+ return null; // Lines are parallel
60
+ }
61
+ const t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;
62
+ const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
63
+ if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {
64
+ return {
65
+ x: p1a.x + t * (p1b.x - p1a.x),
66
+ y: p1a.y + t * (p1b.y - p1a.y)
67
+ };
68
+ }
69
+ return null;
70
+ }
71
+ /**
72
+ * Finds the closest intersection point between a line segment (from lineStart to lineEnd)
73
+ * and a polygon. Returns the intersection point closest to lineStart, or null if no intersection.
74
+ */
75
+ static getLinePolygonIntersection(lineStart, lineEnd, polygon) {
76
+ const points = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
77
+ let closestIntersection = null;
78
+ let closestDistance = Infinity;
79
+ for (let i = 0; i < points.length; i++) {
80
+ const edgeStart = points[i];
81
+ const edgeEnd = points[(i + 1) % points.length];
82
+ const intersection = this.getLineIntersectionPoint(lineStart, lineEnd, edgeStart, edgeEnd);
83
+ if (intersection) {
84
+ const distance = Math.sqrt(Math.pow(intersection.x - lineStart.x, 2) +
85
+ Math.pow(intersection.y - lineStart.y, 2));
86
+ if (distance < closestDistance) {
87
+ closestDistance = distance;
88
+ closestIntersection = intersection;
89
+ }
90
+ }
91
+ }
92
+ return closestIntersection;
93
+ }
52
94
  }
53
95
  //# sourceMappingURL=geometry.helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.helper.js","sourceRoot":"","sources":["../../src/helpers/geometry.helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelPoint } from \"../interfaces/point.interface\";\r\nimport { KritzelPolygon } from \"../interfaces/polygon.interface\";\r\n\r\nexport class KritzelGeometryHelper {\r\n\t static doPolygonsIntersect(polygon1: KritzelPolygon, polygon2: KritzelPolygon): boolean {\r\n\t\t// 1. Convert polygons to array of points for easier processing\r\n\t\tconst points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];\r\n\t\tconst points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];\r\n\t\r\n\t\t// 2. Check if any point of polygon1 is inside polygon2\r\n\t\tfor (const point of points1) {\r\n\t\t if (this.isPointInPolygon(point, points2)) {\r\n\t\t\treturn true;\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\t// 3. Check if any point of polygon2 is inside polygon1\r\n\t\tfor (const point of points2) {\r\n\t\t if (this.isPointInPolygon(point, points1)) {\r\n\t\t\treturn true;\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\t// 4. Check for edge intersections (more complex)\r\n\t\tfor (let i = 0; i < points1.length; i++) {\r\n\t\t const p1a = points1[i];\r\n\t\t const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point\r\n\t\r\n\t\t for (let j = 0; j < points2.length; j++) {\r\n\t\t\tconst p2a = points2[j];\r\n\t\t\tconst p2b = points2[(j + 1) % points2.length];\r\n\t\r\n\t\t\tif (this.intersectLines(p1a, p1b, p2a, p2b)) {\r\n\t\t\t return true;\r\n\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\treturn false; // No intersection found\r\n\t }\r\n\t\r\n\t static isPointInPolygon(point: KritzelPoint, polygon: KritzelPoint[]): boolean {\r\n\t\tlet inside = false;\r\n\t\tfor (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n\t\t const xi = polygon[i].x,\r\n\t\t\tyi = polygon[i].y;\r\n\t\t const xj = polygon[j].x,\r\n\t\t\tyj = polygon[j].y;\r\n\t\r\n\t\t const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\t\t if (intersect) inside = !inside;\r\n\t\t}\r\n\t\treturn inside;\r\n\t }\r\n\t\r\n\t static intersectLines(p1a: KritzelPoint, p1b: KritzelPoint, p2a: KritzelPoint, p2b: KritzelPoint): boolean {\r\n\t\tconst det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);\r\n\t\tif (det === 0) {\r\n\t\t return false; // Lines are parallel\r\n\t\t}\r\n\t\r\n\t\tconst t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;\r\n\t\tconst u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;\r\n\t\r\n\t\treturn t >= 0 && t <= 1 && u >= 0 && u <= 1;\r\n\t }\r\n}\r\n"]}
1
+ {"version":3,"file":"geometry.helper.js","sourceRoot":"","sources":["../../src/helpers/geometry.helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelPoint } from \"../interfaces/point.interface\";\r\nimport { KritzelPolygon } from \"../interfaces/polygon.interface\";\r\n\r\nexport class KritzelGeometryHelper {\r\n\t static doPolygonsIntersect(polygon1: KritzelPolygon, polygon2: KritzelPolygon): boolean {\r\n\t\t// 1. Convert polygons to array of points for easier processing\r\n\t\tconst points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];\r\n\t\tconst points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];\r\n\t\r\n\t\t// 2. Check if any point of polygon1 is inside polygon2\r\n\t\tfor (const point of points1) {\r\n\t\t if (this.isPointInPolygon(point, points2)) {\r\n\t\t\treturn true;\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\t// 3. Check if any point of polygon2 is inside polygon1\r\n\t\tfor (const point of points2) {\r\n\t\t if (this.isPointInPolygon(point, points1)) {\r\n\t\t\treturn true;\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\t// 4. Check for edge intersections (more complex)\r\n\t\tfor (let i = 0; i < points1.length; i++) {\r\n\t\t const p1a = points1[i];\r\n\t\t const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point\r\n\t\r\n\t\t for (let j = 0; j < points2.length; j++) {\r\n\t\t\tconst p2a = points2[j];\r\n\t\t\tconst p2b = points2[(j + 1) % points2.length];\r\n\t\r\n\t\t\tif (this.intersectLines(p1a, p1b, p2a, p2b)) {\r\n\t\t\t return true;\r\n\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\r\n\t\treturn false; // No intersection found\r\n\t }\r\n\t\r\n\t static isPointInPolygon(point: KritzelPoint, polygon: KritzelPoint[]): boolean {\r\n\t\tlet inside = false;\r\n\t\tfor (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n\t\t const xi = polygon[i].x,\r\n\t\t\tyi = polygon[i].y;\r\n\t\t const xj = polygon[j].x,\r\n\t\t\tyj = polygon[j].y;\r\n\t\r\n\t\t const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\t\t if (intersect) inside = !inside;\r\n\t\t}\r\n\t\treturn inside;\r\n\t }\r\n\t\r\n\t static intersectLines(p1a: KritzelPoint, p1b: KritzelPoint, p2a: KritzelPoint, p2b: KritzelPoint): boolean {\r\n\t\tconst det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);\r\n\t\tif (det === 0) {\r\n\t\t return false; // Lines are parallel\r\n\t\t}\r\n\t\r\n\t\tconst t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;\r\n\t\tconst u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;\r\n\t\r\n\t\treturn t >= 0 && t <= 1 && u >= 0 && u <= 1;\r\n\t }\r\n\r\n\t /**\r\n\t * Finds the intersection point between a line segment and a line segment.\r\n\t * Returns the intersection point or null if no intersection.\r\n\t */\r\n\t static getLineIntersectionPoint(p1a: KritzelPoint, p1b: KritzelPoint, p2a: KritzelPoint, p2b: KritzelPoint): KritzelPoint | null {\r\n\t\tconst det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);\r\n\t\tif (det === 0) {\r\n\t\t return null; // Lines are parallel\r\n\t\t}\r\n\t\r\n\t\tconst t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;\r\n\t\tconst u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;\r\n\t\r\n\t\tif (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\r\n\t\t return {\r\n\t\t\tx: p1a.x + t * (p1b.x - p1a.x),\r\n\t\t\ty: p1a.y + t * (p1b.y - p1a.y)\r\n\t\t };\r\n\t\t}\r\n\t\treturn null;\r\n\t }\r\n\r\n\t /**\r\n\t * Finds the closest intersection point between a line segment (from lineStart to lineEnd)\r\n\t * and a polygon. Returns the intersection point closest to lineStart, or null if no intersection.\r\n\t */\r\n\t static getLinePolygonIntersection(lineStart: KritzelPoint, lineEnd: KritzelPoint, polygon: KritzelPolygon): KritzelPoint | null {\r\n\t\tconst points = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\t\tlet closestIntersection: KritzelPoint | null = null;\r\n\t\tlet closestDistance = Infinity;\r\n\r\n\t\tfor (let i = 0; i < points.length; i++) {\r\n\t\t const edgeStart = points[i];\r\n\t\t const edgeEnd = points[(i + 1) % points.length];\r\n\t\t \r\n\t\t const intersection = this.getLineIntersectionPoint(lineStart, lineEnd, edgeStart, edgeEnd);\r\n\t\t if (intersection) {\r\n\t\t\tconst distance = Math.sqrt(\r\n\t\t\t Math.pow(intersection.x - lineStart.x, 2) + \r\n\t\t\t Math.pow(intersection.y - lineStart.y, 2)\r\n\t\t\t);\r\n\t\t\tif (distance < closestDistance) {\r\n\t\t\t closestDistance = distance;\r\n\t\t\t closestIntersection = intersection;\r\n\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\r\n\t\treturn closestIntersection;\r\n\t }\r\n}\r\n"]}
@@ -10,10 +10,13 @@
10
10
  export * from './classes/objects/text.class';
11
11
  export * from './classes/objects/path.class';
12
12
  export * from './classes/objects/image.class';
13
+ export * from './classes/objects/line.class';
13
14
  export * from './classes/tools/brush-tool.class';
15
+ export * from './classes/tools/line-tool.class';
14
16
  export * from './classes/tools/eraser-tool.class';
15
17
  export * from './classes/tools/image-tool.class';
16
18
  export * from './classes/tools/text-tool.class';
19
+ export * from './helpers/cursor.helper';
17
20
  export * from './classes/tools/selection-tool.class';
18
21
  export * from './classes/providers/broadcast-sync-provider.class';
19
22
  export * from './classes/providers/indexeddb-sync-provider.class';
@@ -21,10 +24,13 @@ export * from './classes/providers/websocket-sync-provider.class';
21
24
  export * from './classes/providers/hocuspocus-sync-provider.class';
22
25
  export * from './classes/structures/app-state-map.structure';
23
26
  export * from './classes/core/workspace.class';
27
+ export * from './classes/managers/anchor.manager';
24
28
  export * from './interfaces/toolbar-control.interface';
25
29
  export * from './interfaces/menu-item.interface';
26
30
  export * from './interfaces/sync-provider.interface';
27
31
  export * from './interfaces/sync-config.interface';
32
+ export * from './interfaces/anchor.interface';
28
33
  export * from './configs/default-brush-tool.config';
29
34
  export * from './configs/default-text-tool.config';
35
+ export * from './configs/default-line-tool.config';
30
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAErD,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,8CAA8C,CAAC;AAE7D,cAAc,gCAAgC,CAAC;AAE/C,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC","sourcesContent":["/**\r\n * @fileoverview entry point for your component library\r\n *\r\n * This is the entry point for your component library. Use this file to export utilities,\r\n * constants or data structure that accompany your components.\r\n *\r\n * DO NOT use this file to export your components. Instead, use the recommended approaches\r\n * to consume components of this package as outlined in the `README.md`.\r\n */\r\n\r\nexport type * from './components';\r\n\r\nexport * from './classes/objects/text.class';\r\nexport * from './classes/objects/path.class';\r\nexport * from './classes/objects/image.class';\r\n\r\nexport * from './classes/tools/brush-tool.class';\r\nexport * from './classes/tools/eraser-tool.class';\r\nexport * from './classes/tools/image-tool.class';\r\nexport * from './classes/tools/text-tool.class';\r\nexport * from './classes/tools/selection-tool.class';\r\n\r\nexport * from './classes/providers/broadcast-sync-provider.class';\r\nexport * from './classes/providers/indexeddb-sync-provider.class';\r\nexport * from './classes/providers/websocket-sync-provider.class';\r\nexport * from './classes/providers/hocuspocus-sync-provider.class';\r\n\r\nexport * from './classes/structures/app-state-map.structure';\r\n\r\nexport * from './classes/core/workspace.class';\r\n\r\nexport * from './interfaces/toolbar-control.interface';\r\nexport * from './interfaces/menu-item.interface';\r\nexport * from './interfaces/sync-provider.interface';\r\nexport * from './interfaces/sync-config.interface';\r\n\r\nexport * from './configs/default-brush-tool.config';\r\nexport * from './configs/default-text-tool.config';\r\n\r\n\r\n\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AAErD,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,oDAAoD,CAAC;AAEnE,cAAc,8CAA8C,CAAC;AAE7D,cAAc,gCAAgC,CAAC;AAE/C,cAAc,mCAAmC,CAAC;AAElD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC","sourcesContent":["/**\r\n * @fileoverview entry point for your component library\r\n *\r\n * This is the entry point for your component library. Use this file to export utilities,\r\n * constants or data structure that accompany your components.\r\n *\r\n * DO NOT use this file to export your components. Instead, use the recommended approaches\r\n * to consume components of this package as outlined in the `README.md`.\r\n */\r\n\r\nexport type * from './components';\r\n\r\nexport * from './classes/objects/text.class';\r\nexport * from './classes/objects/path.class';\r\nexport * from './classes/objects/image.class';\r\nexport * from './classes/objects/line.class';\r\n\r\nexport * from './classes/tools/brush-tool.class';\r\nexport * from './classes/tools/line-tool.class';\r\nexport * from './classes/tools/eraser-tool.class';\r\nexport * from './classes/tools/image-tool.class';\r\nexport * from './classes/tools/text-tool.class';\r\n\r\nexport * from './helpers/cursor.helper';\r\nexport * from './classes/tools/selection-tool.class';\r\n\r\nexport * from './classes/providers/broadcast-sync-provider.class';\r\nexport * from './classes/providers/indexeddb-sync-provider.class';\r\nexport * from './classes/providers/websocket-sync-provider.class';\r\nexport * from './classes/providers/hocuspocus-sync-provider.class';\r\n\r\nexport * from './classes/structures/app-state-map.structure';\r\n\r\nexport * from './classes/core/workspace.class';\r\n\r\nexport * from './classes/managers/anchor.manager';\r\n\r\nexport * from './interfaces/toolbar-control.interface';\r\nexport * from './interfaces/menu-item.interface';\r\nexport * from './interfaces/sync-provider.interface';\r\nexport * from './interfaces/sync-config.interface';\r\nexport * from './interfaces/anchor.interface';\r\n\r\nexport * from './configs/default-brush-tool.config';\r\nexport * from './configs/default-text-tool.config';\r\nexport * from './configs/default-line-tool.config';\r\n\r\n\r\n\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=anchor.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.interface.js","sourceRoot":"","sources":["../../src/interfaces/anchor.interface.ts"],"names":[],"mappings":"","sourcesContent":["/**\r\n * Represents an anchor connection from a line endpoint to another object's center.\r\n */\r\nexport interface LineAnchor {\r\n /** The ID of the object that this line endpoint is anchored to */\r\n objectId: string;\r\n}\r\n\r\n/**\r\n * Entry in the anchor index that tracks which lines are anchored to an object.\r\n */\r\nexport interface AnchorIndexEntry {\r\n /** The ID of the line that has an anchor */\r\n lineId: string;\r\n /** Which endpoint of the line is anchored */\r\n endpoint: 'start' | 'end';\r\n}\r\n\r\n/**\r\n * Represents a potential snap target during line endpoint dragging.\r\n */\r\nexport interface SnapTarget {\r\n /** The ID of the object that can be snapped to */\r\n objectId: string;\r\n /** The center X coordinate of the snap target in world coordinates */\r\n centerX: number;\r\n /** The center Y coordinate of the snap target in world coordinates */\r\n centerY: number;\r\n}\r\n\r\n/**\r\n * Represents the current snap candidate state during dragging.\r\n */\r\nexport interface SnapCandidate {\r\n /** The ID of the object being snapped to */\r\n objectId: string;\r\n /** Which endpoint of the line is being snapped */\r\n endpoint: 'start' | 'end';\r\n /** The center X coordinate for the snap indicator */\r\n centerX: number;\r\n /** The center Y coordinate for the snap indicator */\r\n centerY: number;\r\n /** The X coordinate of the line endpoint (world coords) */\r\n lineEndpointX: number;\r\n /** The Y coordinate of the line endpoint (world coords) */\r\n lineEndpointY: number;\r\n /** The X coordinate where the line intersects the object's edge (world coords) */\r\n edgeX?: number;\r\n /** The Y coordinate where the line intersects the object's edge (world coords) */\r\n edgeY?: number;\r\n /** The stroke color of the line being snapped */\r\n lineStroke?: string;\r\n /** The stroke width of the line being snapped */\r\n lineStrokeWidth?: number;\r\n /** Arrow offset to apply to the edge point (in world coords) */\r\n arrowOffset?: number;\r\n /** Arrow style for the snapping endpoint */\r\n arrowStyle?: 'triangle' | 'open' | 'diamond' | 'circle';\r\n /** Arrow fill color */\r\n arrowFill?: string;\r\n /** The X coordinate of the control point (world coords), if any */\r\n controlX?: number;\r\n /** The Y coordinate of the control point (world coords), if any */\r\n controlY?: number;\r\n /** The t parameter on the curve where the edge intersection occurs (0-1) */\r\n t?: number;\r\n}\r\n\r\n/**\r\n * Visualization data for rendering anchor indicator lines.\r\n */\r\nexport interface AnchorVisualization {\r\n /** The X coordinate where the line intersects the object's edge */\r\n edgeX: number;\r\n /** The Y coordinate where the line intersects the object's edge */\r\n edgeY: number;\r\n /** The center X coordinate of the anchored object */\r\n centerX: number;\r\n /** The center Y coordinate of the anchored object */\r\n centerY: number;\r\n /** Optional SVG path describing the curved dashed segment */\r\n pathD?: string;\r\n}\r\n\r\n/**\r\n * Render data for anchor lines visualization (dashed lines from edge to center).\r\n */\r\nexport interface AnchorLinesRenderData {\r\n /** The stroke width of the line */\r\n lineStrokeWidth: number;\r\n /** The stroke width for the indicator circle */\r\n indicatorStrokeWidth: string;\r\n /** The dash array for the dashed line */\r\n dashArray: string;\r\n /** The radius of the indicator circle */\r\n indicatorRadius: number;\r\n /** Visualization data for the start anchor, if any */\r\n startAnchorViz: AnchorVisualization | null;\r\n /** Visualization data for the end anchor, if any */\r\n endAnchorViz: AnchorVisualization | null;\r\n}\r\n\r\n/**\r\n * Render data for snap indicator visualization.\r\n */\r\nexport interface SnapIndicatorRenderData {\r\n /** The radius of the indicator circle */\r\n indicatorRadius: number;\r\n /** The stroke width for the indicator circle */\r\n indicatorStrokeWidth: string;\r\n /** The stroke width for the line */\r\n lineStrokeWidth: string;\r\n /** The dash array for the dashed line */\r\n dashArray: string;\r\n /** The stroke color of the line */\r\n lineStroke: string;\r\n /** The center X coordinate */\r\n centerX: number;\r\n /** The center Y coordinate */\r\n centerY: number;\r\n /** The X coordinate of the line endpoint */\r\n lineEndpointX: number;\r\n /** The Y coordinate of the line endpoint */\r\n lineEndpointY: number;\r\n /** The X coordinate where the line intersects the object's edge */\r\n edgeX?: number;\r\n /** The Y coordinate where the line intersects the object's edge */\r\n edgeY?: number;\r\n /** Arrow offset to apply to the edge point */\r\n arrowOffset?: number;\r\n /** Arrow style for the snapping endpoint */\r\n arrowStyle?: 'triangle' | 'open' | 'diamond' | 'circle';\r\n /** Arrow fill color */\r\n arrowFill?: string;\r\n /** The X coordinate for the end of the solid line part (accounting for arrow offset) */\r\n solidLineEndX?: number;\r\n /** The Y coordinate for the end of the solid line part (accounting for arrow offset) */\r\n solidLineEndY?: number;\r\n /** SVG points string for the arrow head at the edge */\r\n arrowPoints?: string;\r\n /** SVG path d string for the dashed line part (if curved) */\r\n snapLinePath?: string;\r\n}\r\n\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=arrow-head.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-head.interface.js","sourceRoot":"","sources":["../../src/interfaces/arrow-head.interface.ts"],"names":[],"mappings":"","sourcesContent":["/**\r\n * Arrow head style types\r\n */\r\nexport type ArrowHeadStyle = 'triangle' | 'open' | 'diamond' | 'circle';\r\n\r\n/**\r\n * Configuration for a single arrow head\r\n */\r\nexport interface ArrowHeadConfig {\r\n /** Whether to display the arrow head */\r\n enabled: boolean;\r\n /** Arrow head style (defaults to 'triangle') */\r\n style?: ArrowHeadStyle;\r\n /** Size of the arrow head in pixels (defaults to strokeWidth * 3) */\r\n size?: number;\r\n /** Fill color (defaults to stroke color of the line) */\r\n fill?: string;\r\n}\r\n\r\n/**\r\n * Configuration for arrow heads at both ends of a line\r\n */\r\nexport interface LineArrowConfig {\r\n /** Arrow head at the start of the line */\r\n start?: ArrowHeadConfig;\r\n /** Arrow head at the end of the line */\r\n end?: ArrowHeadConfig;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"engine-state.interface.js","sourceRoot":"","sources":["../../src/interfaces/engine-state.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { KritzelBaseObject } from \"../classes/objects/base-object.class\";\r\nimport { KritzelObjectMap } from \"../classes/structures/object-map.structure\";\r\nimport { KritzelBaseTool } from \"../classes/tools/base-tool.class\";\r\nimport { KritzelWorkspace } from \"../classes/core/workspace.class\";\r\nimport { KritzelHandleType } from \"../enums/handle-type.enum\";\r\nimport { ContextMenuItem } from \"./context-menu-item.interface\";\r\nimport { KritzelDebugInfo } from \"./debug-info.interface\";\r\n\r\nexport interface KritzelEngineState {\r\n activeWorkspace: KritzelWorkspace;\r\n activeTool: KritzelBaseTool;\r\n copiedObjects?: KritzelBaseObject<any>[];\r\n objects: KritzelObjectMap<KritzelBaseObject<Element>>;\r\n resizeHandleType: KritzelHandleType;\r\n hasViewportChanged: boolean;\r\n hasObjectsChanged: boolean;\r\n isReady: boolean;\r\n isEnabled: boolean;\r\n isScaling: boolean;\r\n isPanning: boolean;\r\n isSelecting: boolean;\r\n isResizing: boolean;\r\n isResizeHandleSelected: boolean;\r\n isRotating: boolean;\r\n isRotationHandleSelected: boolean;\r\n isDragging: boolean;\r\n isDrawing: boolean;\r\n isErasing: boolean;\r\n isWriting: boolean;\r\n isCtrlKeyPressed: boolean;\r\n isContextMenuVisible: boolean;\r\n contextMenuItems: ContextMenuItem[];\r\n contextMenuX: number;\r\n contextMenuY: number;\r\n skipContextMenu: boolean;\r\n debugInfo: KritzelDebugInfo;\r\n host: HTMLElement;\r\n pointerX: number;\r\n pointerY: number;\r\n scale: number;\r\n scaleMax: number;\r\n scaleMin: number;\r\n startX: number;\r\n startY: number;\r\n translateX: number;\r\n translateXMax: number;\r\n translateXMin: number;\r\n translateY: number;\r\n translateYMax: number;\r\n translateYMin: number;\r\n viewportWidth: number;\r\n viewportHeight: number;\r\n longTouchTimeout: number;\r\n longTouchDelay: number;\r\n pointers: Map<number, PointerEvent>;\r\n workspaces: KritzelWorkspace[];\r\n}"]}
1
+ {"version":3,"file":"engine-state.interface.js","sourceRoot":"","sources":["../../src/interfaces/engine-state.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { KritzelBaseObject } from \"../classes/objects/base-object.class\";\r\nimport { KritzelObjectMap } from \"../classes/structures/object-map.structure\";\r\nimport { KritzelBaseTool } from \"../classes/tools/base-tool.class\";\r\nimport { KritzelWorkspace } from \"../classes/core/workspace.class\";\r\nimport { KritzelHandleType } from \"../enums/handle-type.enum\";\r\nimport { ContextMenuItem } from \"./context-menu-item.interface\";\r\nimport { KritzelDebugInfo } from \"./debug-info.interface\";\r\nimport { LineHandleType } from \"../classes/handlers/line-handle.handler\";\r\nimport { SnapCandidate } from \"./anchor.interface\";\r\n\r\nexport interface KritzelEngineState {\r\n activeWorkspace: KritzelWorkspace;\r\n activeTool: KritzelBaseTool;\r\n copiedObjects?: KritzelBaseObject<any>[];\r\n /** Maps copied object IDs to their original source object IDs (for anchor remapping during paste) */\r\n copiedObjectIdMapping?: Map<string, string>;\r\n objects: KritzelObjectMap<KritzelBaseObject<Element>>;\r\n snapCandidate?: SnapCandidate | null;\r\n resizeHandleType: KritzelHandleType;\r\n lineHandleType: LineHandleType;\r\n hasViewportChanged: boolean;\r\n hasObjectsChanged: boolean;\r\n isReady: boolean;\r\n isEnabled: boolean;\r\n isScaling: boolean;\r\n isPanning: boolean;\r\n isSelecting: boolean;\r\n isResizing: boolean;\r\n isResizeHandleHovered: boolean;\r\n isResizeHandleSelected: boolean;\r\n isRotating: boolean;\r\n isRotationHandleHovered: boolean;\r\n isRotationHandleSelected: boolean;\r\n isLineHandleSelected: boolean;\r\n isLineHandleDragging: boolean;\r\n isDragging: boolean;\r\n isDrawing: boolean;\r\n isErasing: boolean;\r\n isWriting: boolean;\r\n isCtrlKeyPressed: boolean;\r\n isContextMenuVisible: boolean;\r\n contextMenuItems: ContextMenuItem[];\r\n contextMenuX: number;\r\n contextMenuY: number;\r\n skipContextMenu: boolean;\r\n debugInfo: KritzelDebugInfo;\r\n host: HTMLElement;\r\n pointerX: number;\r\n pointerY: number;\r\n scale: number;\r\n scaleMax: number;\r\n scaleMin: number;\r\n startX: number;\r\n startY: number;\r\n translateX: number;\r\n translateXMax: number;\r\n translateXMin: number;\r\n translateY: number;\r\n translateYMax: number;\r\n translateYMin: number;\r\n viewportWidth: number;\r\n viewportHeight: number;\r\n longTouchTimeout: number;\r\n longTouchDelay: number;\r\n pointers: Map<number, PointerEvent>;\r\n workspaces: KritzelWorkspace[];\r\n cursor: {\r\n icon: string;\r\n iconActive?: string;\r\n rotation?: number;\r\n }\r\n}"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=line-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/line-options.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { LineAnchor } from './anchor.interface';\r\nimport { LineArrowConfig } from './arrow-head.interface';\r\n\r\nexport interface KritzelLineOptions {\r\n startX: number;\r\n startY: number;\r\n endX: number;\r\n endY: number;\r\n controlX?: number;\r\n controlY?: number;\r\n translateX?: number;\r\n translateY?: number;\r\n scale?: number;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n /** Anchor connection for the start point */\r\n startAnchor?: LineAnchor;\r\n /** Anchor connection for the end point */\r\n endAnchor?: LineAnchor;\r\n /** Arrow head configuration for start and end of line */\r\n arrows?: LineArrowConfig;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-control.interface.js","sourceRoot":"","sources":["../../src/interfaces/toolbar-control.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { KritzelBaseTool } from '../classes/tools/base-tool.class';\r\n\r\nexport interface KritzelToolbarControl {\r\n type: 'tool' | 'divider' | 'config';\r\n tool?: (new (...args: any[]) => KritzelBaseTool) | KritzelBaseTool;\r\n icon?: string;\r\n isDefault?: boolean;\r\n name: string;\r\n config?: KritzelTextToolConfig | KritzelBrushToolConfig;\r\n}\r\n\r\nexport interface KritzelTextToolConfig {\r\n color: string;\r\n size: number;\r\n fontFamily: string;\r\n palette: string[];\r\n}\r\n\r\nexport interface KritzelBrushToolConfig {\r\n type: 'pen' | 'highlighter';\r\n color: string;\r\n size: number;\r\n palettes: {\r\n [brushType: string]: string[]; \r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"toolbar-control.interface.js","sourceRoot":"","sources":["../../src/interfaces/toolbar-control.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { KritzelBaseTool } from '../classes/tools/base-tool.class';\r\n\r\nexport interface KritzelToolbarControl {\r\n type: 'tool' | 'divider' | 'config';\r\n tool?: (new (...args: any[]) => KritzelBaseTool) | KritzelBaseTool;\r\n icon?: string;\r\n isDefault?: boolean;\r\n name: string;\r\n config?: KritzelTextToolConfig | KritzelBrushToolConfig | KritzelLineToolConfig;\r\n}\r\n\r\nexport interface KritzelTextToolConfig {\r\n color: string;\r\n size: number;\r\n fontFamily: string;\r\n palette: string[];\r\n}\r\n\r\nexport interface KritzelBrushToolConfig {\r\n type: 'pen' | 'highlighter';\r\n color: string;\r\n size: number;\r\n palettes: {\r\n [brushType: string]: string[]; \r\n }\r\n}\r\n\r\nexport interface KritzelLineToolConfig {\r\n color: string;\r\n size: number;\r\n palette: string[];\r\n /** Arrow head configuration for lines created with this tool */\r\n arrows?: {\r\n start?: { enabled: boolean; style?: 'triangle' | 'open' | 'diamond' | 'circle' };\r\n end?: { enabled: boolean; style?: 'triangle' | 'open' | 'diamond' | 'circle' };\r\n };\r\n}\r\n"]}