kritzel-stencil 0.0.122 → 0.0.124

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 (128) hide show
  1. package/dist/cjs/{index-BcrLbdO1.js → index-C05uAr89.js} +10 -4
  2. package/dist/cjs/index-C05uAr89.js.map +1 -0
  3. package/dist/cjs/{index-CFCyVs0_.js → index-UcX3pzju.js} +189 -98
  4. package/dist/cjs/index-UcX3pzju.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +1 -1
  6. package/dist/cjs/kritzel-brush-style_18.cjs.entry.js +15 -15
  7. package/dist/cjs/kritzel-brush-style_18.cjs.entry.js.map +1 -1
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/stencil.cjs.js +2 -2
  10. package/dist/cjs/stencil.cjs.js.map +1 -1
  11. package/dist/collection/classes/handlers/hover.handler.js +22 -0
  12. package/dist/collection/classes/handlers/hover.handler.js.map +1 -0
  13. package/dist/collection/classes/handlers/selection.handler.js +13 -17
  14. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  15. package/dist/collection/classes/objects/base-object.class.js +6 -0
  16. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  17. package/dist/collection/classes/objects/path.class.js +92 -23
  18. package/dist/collection/classes/objects/path.class.js.map +1 -1
  19. package/dist/collection/classes/objects/selection-box.class.js +2 -2
  20. package/dist/collection/classes/objects/selection-box.class.js.map +1 -1
  21. package/dist/collection/classes/objects/selection-group.class.js +2 -1
  22. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  23. package/dist/collection/classes/tools/eraser-tool.class.js +0 -1
  24. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  25. package/dist/collection/classes/tools/selection-tool.class.js +3 -0
  26. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  27. package/dist/collection/collection-manifest.json +1 -1
  28. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +9 -9
  29. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  30. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
  31. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
  32. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
  33. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +1 -1
  34. package/dist/collection/interfaces/object.interface.js.map +1 -1
  35. package/dist/components/index.js +3 -3
  36. package/dist/components/kritzel-brush-style.js +1 -1
  37. package/dist/components/kritzel-color-palette.js +1 -1
  38. package/dist/components/kritzel-color.js +1 -1
  39. package/dist/components/kritzel-context-menu.js +1 -1
  40. package/dist/components/kritzel-control-brush-config.js +1 -1
  41. package/dist/components/kritzel-control-text-config.js +1 -1
  42. package/dist/components/kritzel-controls.js +1 -1
  43. package/dist/components/kritzel-cursor-trail.js +1 -1
  44. package/dist/components/kritzel-dropdown.js +1 -1
  45. package/dist/components/kritzel-editor.js +19 -19
  46. package/dist/components/kritzel-engine.js +1 -1
  47. package/dist/components/kritzel-font-family.js +1 -1
  48. package/dist/components/kritzel-font-size.js +1 -1
  49. package/dist/components/kritzel-font.js +1 -1
  50. package/dist/components/kritzel-icon.js +1 -1
  51. package/dist/components/kritzel-stroke-size.js +1 -1
  52. package/dist/components/kritzel-tooltip.js +1 -1
  53. package/dist/components/kritzel-utility-panel.js +1 -1
  54. package/dist/components/{p-CqPrOhzi.js → p-BOj_wqdw.js} +4 -4
  55. package/dist/components/{p-CqPrOhzi.js.map → p-BOj_wqdw.js.map} +1 -1
  56. package/dist/components/{p-CEYRFk55.js → p-BY8BWGge.js} +4 -4
  57. package/dist/components/{p-CEYRFk55.js.map → p-BY8BWGge.js.map} +1 -1
  58. package/dist/components/{p-D-Rf05Ov.js → p-Bn5P7YQn.js} +5 -5
  59. package/dist/components/{p-D-Rf05Ov.js.map → p-Bn5P7YQn.js.map} +1 -1
  60. package/dist/components/{p-CIb4IA9u.js → p-C9usqwb5.js} +5 -5
  61. package/dist/components/{p-CIb4IA9u.js.map → p-C9usqwb5.js.map} +1 -1
  62. package/dist/components/{p-gDLg_PJJ.js → p-CF8ziFc4.js} +4 -4
  63. package/dist/components/{p-gDLg_PJJ.js.map → p-CF8ziFc4.js.map} +1 -1
  64. package/dist/components/{p-CDpq9L_H.js → p-CiT5gBDh.js} +3 -3
  65. package/dist/components/{p-CDpq9L_H.js.map → p-CiT5gBDh.js.map} +1 -1
  66. package/dist/components/{p-D1oFXBAp.js → p-Cn_kantt.js} +5 -5
  67. package/dist/components/{p-D1oFXBAp.js.map → p-Cn_kantt.js.map} +1 -1
  68. package/dist/components/{p-Ch8eM2R8.js → p-Cnc43o9b.js} +151 -25
  69. package/dist/components/p-Cnc43o9b.js.map +1 -0
  70. package/dist/components/{p-DIu9OTyP.js → p-CneTqrgt.js} +18 -18
  71. package/dist/components/{p-DIu9OTyP.js.map → p-CneTqrgt.js.map} +1 -1
  72. package/dist/components/{p-B2wWYPH8.js → p-CtiROna-.js} +3 -3
  73. package/dist/components/{p-B2wWYPH8.js.map → p-CtiROna-.js.map} +1 -1
  74. package/dist/components/{p-D0L3GqSK.js → p-Cw2ATHMj.js} +3 -3
  75. package/dist/components/{p-D0L3GqSK.js.map → p-Cw2ATHMj.js.map} +1 -1
  76. package/dist/components/{p-CxmkJbeV.js → p-D0sLslUq.js} +3 -3
  77. package/dist/components/{p-CxmkJbeV.js.map → p-D0sLslUq.js.map} +1 -1
  78. package/dist/components/{p-dCaxwGmu.js → p-DJN0U8pI.js} +10 -4
  79. package/dist/components/p-DJN0U8pI.js.map +1 -0
  80. package/dist/components/{p-COPOzWCn.js → p-DJaVT2yR.js} +54 -89
  81. package/dist/components/p-DJaVT2yR.js.map +1 -0
  82. package/dist/components/{p-C3E9PtD3.js → p-DMAzUKo6.js} +10 -10
  83. package/dist/components/{p-C3E9PtD3.js.map → p-DMAzUKo6.js.map} +1 -1
  84. package/dist/components/{p-DbPbyRLO.js → p-DSLY0tr5.js} +5 -5
  85. package/dist/components/{p-DbPbyRLO.js.map → p-DSLY0tr5.js.map} +1 -1
  86. package/dist/components/{p--2FkikYE.js → p-DpiklJU9.js} +3 -3
  87. package/dist/components/{p--2FkikYE.js.map → p-DpiklJU9.js.map} +1 -1
  88. package/dist/components/{p--tElassI.js → p-NZJPrwJV.js} +3 -3
  89. package/dist/components/{p--tElassI.js.map → p-NZJPrwJV.js.map} +1 -1
  90. package/dist/components/{p-BSS4UREq.js → p-ubNAWsY_.js} +9 -9
  91. package/dist/components/{p-BSS4UREq.js.map → p-ubNAWsY_.js.map} +1 -1
  92. package/dist/esm/{index-BPFXWTBp.js → index-BGl8znzE.js} +10 -4
  93. package/dist/esm/index-BGl8znzE.js.map +1 -0
  94. package/dist/esm/{index-DYLW4hYm.js → index-DO2IiM_o.js} +189 -98
  95. package/dist/esm/index-DO2IiM_o.js.map +1 -0
  96. package/dist/esm/index.js +1 -1
  97. package/dist/esm/kritzel-brush-style_18.entry.js +15 -15
  98. package/dist/esm/kritzel-brush-style_18.entry.js.map +1 -1
  99. package/dist/esm/loader.js +2 -2
  100. package/dist/esm/stencil.js +3 -3
  101. package/dist/esm/stencil.js.map +1 -1
  102. package/dist/stencil/index.esm.js +1 -1
  103. package/dist/stencil/p-BGl8znzE.js +3 -0
  104. package/dist/stencil/p-BGl8znzE.js.map +1 -0
  105. package/dist/stencil/p-DO2IiM_o.js +2 -0
  106. package/dist/stencil/p-DO2IiM_o.js.map +1 -0
  107. package/dist/stencil/{p-fa584641.entry.js → p-c64f6589.entry.js} +2 -2
  108. package/dist/stencil/{p-fa584641.entry.js.map → p-c64f6589.entry.js.map} +1 -1
  109. package/dist/stencil/stencil.esm.js +1 -1
  110. package/dist/stencil/stencil.esm.js.map +1 -1
  111. package/dist/types/classes/handlers/hover.handler.d.ts +6 -0
  112. package/dist/types/classes/handlers/selection.handler.d.ts +1 -1
  113. package/dist/types/classes/objects/base-object.class.d.ts +2 -0
  114. package/dist/types/classes/objects/path.class.d.ts +5 -1
  115. package/dist/types/classes/tools/selection-tool.class.d.ts +2 -0
  116. package/dist/types/interfaces/object.interface.d.ts +3 -0
  117. package/package.json +5 -5
  118. package/dist/cjs/index-BcrLbdO1.js.map +0 -1
  119. package/dist/cjs/index-CFCyVs0_.js.map +0 -1
  120. package/dist/components/p-COPOzWCn.js.map +0 -1
  121. package/dist/components/p-Ch8eM2R8.js.map +0 -1
  122. package/dist/components/p-dCaxwGmu.js.map +0 -1
  123. package/dist/esm/index-BPFXWTBp.js.map +0 -1
  124. package/dist/esm/index-DYLW4hYm.js.map +0 -1
  125. package/dist/stencil/p-BPFXWTBp.js +0 -3
  126. package/dist/stencil/p-BPFXWTBp.js.map +0 -1
  127. package/dist/stencil/p-DYLW4hYm.js +0 -2
  128. package/dist/stencil/p-DYLW4hYm.js.map +0 -1
@@ -316,6 +316,59 @@ class ObjectHelper {
316
316
  }
317
317
  }
318
318
 
319
+ class KritzelGeometryHelper {
320
+ static doPolygonsIntersect(polygon1, polygon2) {
321
+ // 1. Convert polygons to array of points for easier processing
322
+ const points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];
323
+ const points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];
324
+ // 2. Check if any point of polygon1 is inside polygon2
325
+ for (const point of points1) {
326
+ if (this.isPointInPolygon(point, points2)) {
327
+ return true;
328
+ }
329
+ }
330
+ // 3. Check if any point of polygon2 is inside polygon1
331
+ for (const point of points2) {
332
+ if (this.isPointInPolygon(point, points1)) {
333
+ return true;
334
+ }
335
+ }
336
+ // 4. Check for edge intersections (more complex)
337
+ for (let i = 0; i < points1.length; i++) {
338
+ const p1a = points1[i];
339
+ const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point
340
+ for (let j = 0; j < points2.length; j++) {
341
+ const p2a = points2[j];
342
+ const p2b = points2[(j + 1) % points2.length];
343
+ if (this.intersectLines(p1a, p1b, p2a, p2b)) {
344
+ return true;
345
+ }
346
+ }
347
+ }
348
+ return false; // No intersection found
349
+ }
350
+ static isPointInPolygon(point, polygon) {
351
+ let inside = false;
352
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
353
+ const xi = polygon[i].x, yi = polygon[i].y;
354
+ const xj = polygon[j].x, yj = polygon[j].y;
355
+ const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;
356
+ if (intersect)
357
+ inside = !inside;
358
+ }
359
+ return inside;
360
+ }
361
+ static intersectLines(p1a, p1b, p2a, p2b) {
362
+ const det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);
363
+ if (det === 0) {
364
+ return false; // Lines are parallel
365
+ }
366
+ const t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;
367
+ const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
368
+ return t >= 0 && t <= 1 && u >= 0 && u <= 1;
369
+ }
370
+ }
371
+
319
372
  class KritzelBaseObject {
320
373
  get totalWidth() {
321
374
  return this.width + this.padding * 2;
@@ -412,6 +465,7 @@ class KritzelBaseObject {
412
465
  this.zIndex = 0;
413
466
  this.isVisible = true;
414
467
  this.isSelected = false;
468
+ this.isHovered = false;
415
469
  this.isMounted = false;
416
470
  this.isEditable = false;
417
471
  this.isInteractive = false;
@@ -503,6 +557,10 @@ class KritzelBaseObject {
503
557
  hitTest(_x, _y) {
504
558
  return true; // Default implementation, can be overridden by subclasses
505
559
  }
560
+ hitTestPolygon(polygon) {
561
+ const objectPolygon = this.rotatedPolygon;
562
+ return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);
563
+ }
506
564
  }
507
565
 
508
566
  class KritzelText extends KritzelBaseObject {
@@ -681,12 +739,9 @@ class KritzelPath extends KritzelBaseObject {
681
739
  this.scale = 1;
682
740
  this.isVisible = true;
683
741
  this.isDebugInfoVisible = true;
742
+ this._adjustedPoints = null;
684
743
  this.options = config;
685
744
  this.points = (_a = config === null || config === void 0 ? void 0 : config.points) !== null && _a !== void 0 ? _a : [];
686
- this.adjustedPoints = this.points.map(([px, py]) => [
687
- (px + this.options.translateX) / this.scale,
688
- (py + this.options.translateY) / this.scale,
689
- ]);
690
745
  this.translateX = (_b = config === null || config === void 0 ? void 0 : config.translateX) !== null && _b !== void 0 ? _b : 0;
691
746
  this.translateY = (_c = config === null || config === void 0 ? void 0 : config.translateY) !== null && _c !== void 0 ? _c : 0;
692
747
  this.scale = (_d = config === null || config === void 0 ? void 0 : config.scale) !== null && _d !== void 0 ? _d : 1;
@@ -702,13 +757,6 @@ class KritzelPath extends KritzelBaseObject {
702
757
  object.id = object.generateId();
703
758
  object.options = options;
704
759
  object.points = (_a = options === null || options === void 0 ? void 0 : options.points) !== null && _a !== void 0 ? _a : [];
705
- object.adjustedPoints = object.points.map(([px, py]) => {
706
- var _a, _b;
707
- return [
708
- (px + (options === null || options === void 0 ? void 0 : options.translateX)) / ((_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1),
709
- (py + (options === null || options === void 0 ? void 0 : options.translateY)) / ((_b = options === null || options === void 0 ? void 0 : options.scale) !== null && _b !== void 0 ? _b : 1),
710
- ];
711
- });
712
760
  object.translateX = (_b = options === null || options === void 0 ? void 0 : options.translateX) !== null && _b !== void 0 ? _b : 0;
713
761
  object.translateY = (_c = options === null || options === void 0 ? void 0 : options.translateY) !== null && _c !== void 0 ? _c : 0;
714
762
  object.scale = (_d = options === null || options === void 0 ? void 0 : options.scale) !== null && _d !== void 0 ? _d : 1;
@@ -728,10 +776,6 @@ class KritzelPath extends KritzelBaseObject {
728
776
  this.width = width;
729
777
  this.height = height;
730
778
  this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);
731
- this.adjustedPoints = this.points.map(([px, py]) => [
732
- (px + this.options.translateX) / this.scale,
733
- (py + this.options.translateY) / this.scale,
734
- ]);
735
779
  this.d = this.generateSvgPath();
736
780
  this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;
737
781
  this.height = Math.max(...this.points.map(p => p[1])) - Math.min(...this.points.map(p => p[1])) + this.strokeWidth;
@@ -739,21 +783,28 @@ class KritzelPath extends KritzelBaseObject {
739
783
  this.y = Math.min(...this.points.map(p => p[1])) - this.strokeWidth / 2;
740
784
  this.translateX = x;
741
785
  this.translateY = y;
786
+ this._adjustedPoints = null;
742
787
  }
743
788
  rotate(value) {
744
- super.rotate(value);
745
- this.updateDimensions();
789
+ this.rotation = value;
790
+ this._adjustedPoints = null;
791
+ }
792
+ move(_startX, _startY, _endX, _endY) {
793
+ this._adjustedPoints = null;
746
794
  }
747
795
  hitTest(x, y) {
748
796
  const halfStroke = this.strokeWidth / this.scale / 2;
749
- if (this.adjustedPoints.length === 1) {
750
- const p1 = this.adjustedPoints[0];
797
+ if (this._adjustedPoints === null) {
798
+ this._adjustedPoints = this.computeAdjustedPoints();
799
+ }
800
+ if (this._adjustedPoints.length === 1) {
801
+ const p1 = this._adjustedPoints[0];
751
802
  const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p1[0], p1[1]);
752
803
  return distance <= halfStroke;
753
804
  }
754
- for (let i = 0; i < this.adjustedPoints.length - 1; i++) {
755
- const p1 = this.adjustedPoints[i];
756
- const p2 = this.adjustedPoints[i + 1];
805
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
806
+ const p1 = this._adjustedPoints[i];
807
+ const p2 = this._adjustedPoints[i + 1];
757
808
  const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);
758
809
  if (distance <= halfStroke) {
759
810
  return true;
@@ -761,6 +812,80 @@ class KritzelPath extends KritzelBaseObject {
761
812
  }
762
813
  return false;
763
814
  }
815
+ hitTestPolygon(polygon) {
816
+ const halfStroke = this.strokeWidth / this.scale / 2;
817
+ if (this._adjustedPoints === null) {
818
+ this._adjustedPoints = this.computeAdjustedPoints();
819
+ }
820
+ const polyPoints = [
821
+ { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },
822
+ { x: polygon.bottomRight.x, y: polygon.bottomRight.y },
823
+ { x: polygon.topRight.x, y: polygon.topRight.y },
824
+ { x: polygon.topLeft.x, y: polygon.topLeft.y },
825
+ ];
826
+ for (const [px, py] of this._adjustedPoints) {
827
+ if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {
828
+ return true;
829
+ }
830
+ }
831
+ for (const pt of polyPoints) {
832
+ if (this.hitTest(pt.x, pt.y)) {
833
+ return true;
834
+ }
835
+ }
836
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
837
+ const p1 = { x: this._adjustedPoints[i][0], y: this._adjustedPoints[i][1] };
838
+ const p2 = { x: this._adjustedPoints[i + 1][0], y: this._adjustedPoints[i + 1][1] };
839
+ for (let j = 0; j < polyPoints.length; j++) {
840
+ const q1 = polyPoints[j];
841
+ const q2 = polyPoints[(j + 1) % polyPoints.length];
842
+ if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {
843
+ return true;
844
+ }
845
+ }
846
+ }
847
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
848
+ const p1 = this._adjustedPoints[i];
849
+ const p2 = this._adjustedPoints[i + 1];
850
+ for (let j = 0; j < polyPoints.length; j++) {
851
+ const q1 = polyPoints[j];
852
+ const q2 = polyPoints[(j + 1) % polyPoints.length];
853
+ const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1[0], p1[1], p2[0], p2[1]);
854
+ const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1[0], p1[1], p2[0], p2[1]);
855
+ const d3 = this.pointToLineSegmentDistance(p1[0], p1[1], q1.x, q1.y, q2.x, q2.y);
856
+ const d4 = this.pointToLineSegmentDistance(p2[0], p2[1], q1.x, q1.y, q2.x, q2.y);
857
+ const minD = Math.min(d1, d2, d3, d4);
858
+ if (minD <= halfStroke) {
859
+ return true;
860
+ }
861
+ }
862
+ }
863
+ return false;
864
+ }
865
+ computeAdjustedPoints() {
866
+ var _a;
867
+ if (!((_a = this.points) === null || _a === void 0 ? void 0 : _a.length)) {
868
+ return [];
869
+ }
870
+ const angle = this.rotation;
871
+ const cos = Math.cos(angle);
872
+ const sin = Math.sin(angle);
873
+ const xs = this.points.map(p => p[0]);
874
+ const ys = this.points.map(p => p[1]);
875
+ const pivot = {
876
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
877
+ y: (Math.min(...ys) + Math.max(...ys)) / 2,
878
+ };
879
+ const { x: cx, y: cy } = pivot;
880
+ const rotatedPoints = this.points.map(([x, y]) => {
881
+ const dx = x - cx;
882
+ const dy = y - cy;
883
+ return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];
884
+ });
885
+ const deltaX = this.x - this.translateX;
886
+ const deltaY = this.y - this.translateY;
887
+ return rotatedPoints.map(([px, py]) => [(px + this.options.translateX - deltaX) / this.scale, (py + this.options.translateY - deltaY) / this.scale]);
888
+ }
764
889
  pointToLineSegmentDistance(x, y, x1, y1, x2, y2) {
765
890
  const A = x - x1;
766
891
  const B = y - y1;
@@ -769,7 +894,8 @@ class KritzelPath extends KritzelBaseObject {
769
894
  const dot = A * C + B * D;
770
895
  const len_sq = C * C + D * D;
771
896
  let param = -1;
772
- if (len_sq !== 0) { // in case of 0 length line
897
+ if (len_sq !== 0) {
898
+ // in case of 0 length line
773
899
  param = dot / len_sq;
774
900
  }
775
901
  let xx, yy;
@@ -1121,7 +1247,6 @@ class KritzelEraserTool extends KritzelBaseTool {
1121
1247
  const selectedObjects = this._store.getObjectsFromPointerEvent(event, '.object');
1122
1248
  if (selectedObjects.length === 0)
1123
1249
  return;
1124
- console.log('selectedObjects', selectedObjects);
1125
1250
  const x = this._store.state.pointerX;
1126
1251
  const y = this._store.state.pointerY;
1127
1252
  selectedObjects.forEach(selectedObject => {
@@ -1599,59 +1724,6 @@ class KritzelRotationHandler extends KritzelBaseHandler {
1599
1724
  }
1600
1725
  }
1601
1726
 
1602
- class KritzelGeometryHelper {
1603
- static doPolygonsIntersect(polygon1, polygon2) {
1604
- // 1. Convert polygons to array of points for easier processing
1605
- const points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];
1606
- const points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];
1607
- // 2. Check if any point of polygon1 is inside polygon2
1608
- for (const point of points1) {
1609
- if (this.isPointInPolygon(point, points2)) {
1610
- return true;
1611
- }
1612
- }
1613
- // 3. Check if any point of polygon2 is inside polygon1
1614
- for (const point of points2) {
1615
- if (this.isPointInPolygon(point, points1)) {
1616
- return true;
1617
- }
1618
- }
1619
- // 4. Check for edge intersections (more complex)
1620
- for (let i = 0; i < points1.length; i++) {
1621
- const p1a = points1[i];
1622
- const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point
1623
- for (let j = 0; j < points2.length; j++) {
1624
- const p2a = points2[j];
1625
- const p2b = points2[(j + 1) % points2.length];
1626
- if (this.intersectLines(p1a, p1b, p2a, p2b)) {
1627
- return true;
1628
- }
1629
- }
1630
- }
1631
- return false; // No intersection found
1632
- }
1633
- static isPointInPolygon(point, polygon) {
1634
- let inside = false;
1635
- for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
1636
- const xi = polygon[i].x, yi = polygon[i].y;
1637
- const xj = polygon[j].x, yj = polygon[j].y;
1638
- const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;
1639
- if (intersect)
1640
- inside = !inside;
1641
- }
1642
- return inside;
1643
- }
1644
- static intersectLines(p1a, p1b, p2a, p2b) {
1645
- const det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);
1646
- if (det === 0) {
1647
- return false; // Lines are parallel
1648
- }
1649
- const t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;
1650
- const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
1651
- return t >= 0 && t <= 1 && u >= 0 && u <= 1;
1652
- }
1653
- }
1654
-
1655
1727
  class KrtizelSelectionBox extends KritzelBaseObject {
1656
1728
  constructor() {
1657
1729
  super(...arguments);
@@ -1664,8 +1736,8 @@ class KrtizelSelectionBox extends KritzelBaseObject {
1664
1736
  object.id = object.generateId();
1665
1737
  object.scale = store.state.scale;
1666
1738
  object.zIndex = 99999;
1667
- object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(14, 17, 17, 0.2))';
1668
- object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(14, 17, 17, 0.5))';
1739
+ object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(0, 122, 255, 0.2))';
1740
+ object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(0, 122, 255, 0.5))';
1669
1741
  object.borderWidth = 2;
1670
1742
  object.height = 0;
1671
1743
  object.width = 0;
@@ -1742,8 +1814,10 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
1742
1814
  if (event.pointerType === 'mouse') {
1743
1815
  if (KritzelEventHelper.isLeftClick(event) && this._store.state.isSelecting) {
1744
1816
  if (this.isSelectionClick) {
1745
- this.updateMouseSelection(event);
1746
- this.addSelectedObjectAtIndexToSelectionGroup(0);
1817
+ const x = this._store.state.pointerX;
1818
+ const y = this._store.state.pointerY;
1819
+ const selectedObject = this._store.getObjectsFromPointerEvent(event, '.object').find(obj => obj.hitTest(x, y));
1820
+ this.addObjectToSelectionGroup(selectedObject);
1747
1821
  this.removeSelectionBox();
1748
1822
  }
1749
1823
  if (this.isSelectionDrag) {
@@ -1757,8 +1831,10 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
1757
1831
  clearTimeout(this.touchStartTimeout);
1758
1832
  if (this._store.state.isSelecting) {
1759
1833
  if (this.isSelectionClick) {
1760
- this.updateTouchSelection();
1761
- this.addSelectedObjectAtIndexToSelectionGroup(0);
1834
+ const x = this._store.state.pointerX;
1835
+ const y = this._store.state.pointerY;
1836
+ const selectedObject = this._store.getObjectsFromPointerEvent(event, '.object').find(obj => obj.hitTest(x, y));
1837
+ this.addObjectToSelectionGroup(selectedObject);
1762
1838
  this.removeSelectionBox();
1763
1839
  }
1764
1840
  if (this.isSelectionDrag) {
@@ -1852,23 +1928,16 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
1852
1928
  updateSelectedObjects() {
1853
1929
  this._store.allObjects
1854
1930
  .filter(o => !(o instanceof KrtizelSelectionBox))
1855
- .forEach(object => {
1856
- const objectPolygon = object.rotatedPolygon;
1857
- const selectionBoxPolygon = this._store.state.selectionBox.rotatedPolygon;
1858
- object.isSelected = KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, selectionBoxPolygon);
1859
- });
1931
+ .forEach(object => (object.isSelected = object.hitTestPolygon(this._store.state.selectionBox.rotatedPolygon)));
1860
1932
  }
1861
- addSelectedObjectAtIndexToSelectionGroup(index) {
1862
- const selectedObjects = this._store.selectedObjects.sort((a, b) => b.zIndex - a.zIndex);
1863
- const selectedObject = selectedObjects[index];
1864
- if (!selectedObject) {
1933
+ addObjectToSelectionGroup(object) {
1934
+ if (!object) {
1865
1935
  return;
1866
1936
  }
1867
- selectedObjects.forEach(o => (o.isSelected = false));
1868
1937
  this._store.state.selectionGroup = KritzelSelectionGroup.create(this._store);
1869
- this._store.state.selectionGroup.addOrRemove(selectedObject);
1938
+ this._store.state.selectionGroup.addOrRemove(object);
1870
1939
  this._store.state.selectionGroup.isSelected = true;
1871
- this._store.state.selectionGroup.rotation = this._store.state.selectionGroup.objects[0].rotation;
1940
+ this._store.state.selectionGroup.rotation = object.rotation;
1872
1941
  this._store.history.executeCommand(new AddSelectionGroupCommand(this._store, this, this._store.state.selectionGroup));
1873
1942
  }
1874
1943
  addSelectedObjectsToSelectionGroup() {
@@ -1889,11 +1958,31 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
1889
1958
  }
1890
1959
  }
1891
1960
 
1961
+ class KritzelHoverHandler extends KritzelBaseHandler {
1962
+ constructor(store) {
1963
+ super(store);
1964
+ }
1965
+ handlePointerMove(event) {
1966
+ if (event.pointerType === 'mouse') {
1967
+ const hoveredObject = this._store.getObjectFromPointerEvent(event, '.object');
1968
+ if (!hoveredObject)
1969
+ return;
1970
+ const x = this._store.state.pointerX;
1971
+ const y = this._store.state.pointerY;
1972
+ hoveredObject.isHovered = hoveredObject.hitTest(x, y);
1973
+ if (hoveredObject.isHovered) {
1974
+ console.log(hoveredObject.id);
1975
+ }
1976
+ }
1977
+ }
1978
+ }
1979
+
1892
1980
  class KritzelSelectionTool extends KritzelBaseTool {
1893
1981
  constructor(store) {
1894
1982
  super(store);
1895
1983
  this.selectionHandler = new KritzelSelectionHandler(this._store);
1896
1984
  this.moveHandler = new KritzelMoveHandler(this._store);
1985
+ this.hoverHandler = new KritzelHoverHandler(this._store);
1897
1986
  this.resizeHandler = new KritzelResizeHandler(this._store);
1898
1987
  this.rotationHandler = new KritzelRotationHandler(this._store);
1899
1988
  }
@@ -1956,6 +2045,7 @@ class KritzelSelectionTool extends KritzelBaseTool {
1956
2045
  }
1957
2046
  if (event.pointerType === 'mouse') {
1958
2047
  this.moveHandler.handlePointerMove(event);
2048
+ this.hoverHandler.handlePointerMove(event);
1959
2049
  this.selectionHandler.handlePointerMove(event);
1960
2050
  this.resizeHandler.handlePointerMove(event);
1961
2051
  this.rotationHandler.handlePointerMove(event);
@@ -2149,6 +2239,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
2149
2239
  this.objects.forEach(obj => {
2150
2240
  obj.translateX += deltaX;
2151
2241
  obj.translateY += deltaY;
2242
+ obj.move(startX, startY, endX, endY);
2152
2243
  this._store.state.objectsOctree.update(obj);
2153
2244
  });
2154
2245
  this.unchangedObjects.forEach(obj => {
@@ -2187,7 +2278,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
2187
2278
  const rotatedY = sin * offsetX + cos * offsetY;
2188
2279
  child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;
2189
2280
  child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;
2190
- child.rotation = this.objects.length === 1 ? value : value + unchangedChild.rotation;
2281
+ child.rotate(this.objects.length === 1 ? value : value + unchangedChild.rotation);
2191
2282
  this._store.state.objectsOctree.update(child);
2192
2283
  });
2193
2284
  }
@@ -2429,6 +2520,6 @@ const DEFAULT_TEXT_CONFIG = {
2429
2520
  };
2430
2521
 
2431
2522
  export { AddObjectCommand as A, BatchCommand as B, DEFAULT_BRUSH_CONFIG as D, KritzelBrushTool as K, RemoveSelectionGroupCommand as R, KritzelTextTool as a, KritzelMouseButton as b, KritzelSelectionTool as c, KritzelEraserTool as d, DEFAULT_TEXT_CONFIG as e, KritzelImageTool as f, KritzelEventHelper as g, KritzelBaseCommand as h, KritzelSelectionGroup as i, KrtizelSelectionBox as j, RemoveObjectCommand as k, AddSelectionGroupCommand as l, KritzelToolRegistry as m, KritzelBaseHandler as n, KritzelBaseTool as o, KritzelKeyboardHelper as p, KritzelText as q, KritzelPath as r, KritzelImage as s };
2432
- //# sourceMappingURL=index-DYLW4hYm.js.map
2523
+ //# sourceMappingURL=index-DO2IiM_o.js.map
2433
2524
 
2434
- //# sourceMappingURL=index-DYLW4hYm.js.map
2525
+ //# sourceMappingURL=index-DO2IiM_o.js.map