@mint-ui/map 1.2.0-test.6 → 1.2.0-test.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,7 +24,6 @@ export declare abstract class MintMapController {
24
24
  abstract updateMarker(marker: Marker, options: MarkerOptions): void;
25
25
  abstract clearDrawable(drawable: Drawable): boolean;
26
26
  abstract markerToTheTop(marker: Marker): void;
27
- abstract restoreMarkerZIndex(marker: Marker): void;
28
27
  abstract isMapDragged(): boolean;
29
28
  abstract setMapDragged(value: boolean): void;
30
29
  abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
@@ -45,6 +45,7 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
45
45
  * 비교 전략:
46
46
  * 1. markers 배열 비교
47
47
  * 2. selectedItems 배열 비교 (외부 제어)
48
+ * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
48
49
  *
49
50
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
50
51
  */
@@ -131,6 +131,12 @@ var WoongKonvaMarkerComponent = function (_a) {
131
131
  x: 0,
132
132
  y: 0
133
133
  }); // --------------------------------------------------------------------------
134
+ // Event Handler Refs (클로저 문제 방지)
135
+ // --------------------------------------------------------------------------
136
+
137
+ var onClickRef = React.useRef(onClick);
138
+ var onMouseOverRef = React.useRef(onMouseOver);
139
+ var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
134
140
  // Performance Refs (캐싱 & 최적화)
135
141
  // --------------------------------------------------------------------------
136
142
 
@@ -420,9 +426,16 @@ var WoongKonvaMarkerComponent = function (_a) {
420
426
 
421
427
 
422
428
  var doRenderEvent = function () {
423
- if (!renderEvent) return;
424
429
  var layer = eventLayerRef.current;
425
- if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
430
+ if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
431
+
432
+ if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
433
+ layer.destroyChildren();
434
+ layer.batchDraw();
435
+ return;
436
+ }
437
+
438
+ if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
426
439
 
427
440
  var shape = layer.findOne('.event-render-shape');
428
441
 
@@ -620,6 +633,7 @@ var WoongKonvaMarkerComponent = function (_a) {
620
633
 
621
634
 
622
635
  var setHovered = function (data) {
636
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
623
637
  hoveredItemRef.current = data;
624
638
 
625
639
  if (draggingRef.current) {
@@ -644,7 +658,8 @@ var WoongKonvaMarkerComponent = function (_a) {
644
658
 
645
659
 
646
660
  var handleLocalClick = function (data) {
647
- // 1. 선택 상태 업데이트
661
+ if (!onClickRef.current) return; // 1. 선택 상태 업데이트
662
+
648
663
  if (enableMultiSelect) {
649
664
  // 다중 선택: Set과 Map 동시 업데이트
650
665
  var newSelected = new Set(selectedIdsRef.current);
@@ -694,6 +709,7 @@ var WoongKonvaMarkerComponent = function (_a) {
694
709
  var handleClick = function (event) {
695
710
  var _a;
696
711
 
712
+ if (!onClickRef.current) return;
697
713
  if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
698
714
 
699
715
  try {
@@ -702,7 +718,7 @@ var WoongKonvaMarkerComponent = function (_a) {
702
718
 
703
719
  if (data) {
704
720
  handleLocalClick(data);
705
- if (onClick) onClick(data, selectedIdsRef.current);
721
+ onClickRef.current(data, selectedIdsRef.current);
706
722
  }
707
723
  } catch (error) {
708
724
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -716,6 +732,7 @@ var WoongKonvaMarkerComponent = function (_a) {
716
732
  var handleMouseMove = function (event) {
717
733
  var _a;
718
734
 
735
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
719
736
  if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
720
737
 
721
738
  try {
@@ -725,8 +742,8 @@ var WoongKonvaMarkerComponent = function (_a) {
725
742
 
726
743
  if (prevHovered !== hoveredItem) {
727
744
  setHovered(hoveredItem);
728
- if (prevHovered && onMouseOut) onMouseOut(prevHovered);
729
- if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
745
+ if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
746
+ if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
730
747
  }
731
748
  } catch (error) {
732
749
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -756,6 +773,7 @@ var WoongKonvaMarkerComponent = function (_a) {
756
773
 
757
774
 
758
775
  var handleMouseLeave = function () {
776
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
759
777
  var prevHovered = hoveredItemRef.current;
760
778
 
761
779
  if (prevHovered) {
@@ -763,8 +781,8 @@ var WoongKonvaMarkerComponent = function (_a) {
763
781
  controller.setMapCursor('grab');
764
782
  doRenderEvent();
765
783
 
766
- if (onMouseOut) {
767
- onMouseOut(prevHovered);
784
+ if (onMouseOutRef.current) {
785
+ onMouseOutRef.current(prevHovered);
768
786
  }
769
787
  }
770
788
  }; // --------------------------------------------------------------------------
@@ -865,13 +883,20 @@ var WoongKonvaMarkerComponent = function (_a) {
865
883
  controller.addEventListener('IDLE', handleIdle);
866
884
  controller.addEventListener('ZOOMSTART', handleZoomStart);
867
885
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
868
- controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
869
- controller.addEventListener('CLICK', handleClick);
870
- controller.addEventListener('MOUSEMOVE', handleMouseMove);
871
- controller.addEventListener('DRAGSTART', handleDragStart);
872
- controller.addEventListener('DRAGEND', handleDragEnd); // 컨테이너에 mouseleave 이벤트 추가
886
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
887
+
888
+ if (onClick) {
889
+ controller.addEventListener('CLICK', handleClick);
890
+ } // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
891
+
892
+
893
+ if (onMouseOver || onMouseOut) {
894
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
895
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
896
+ }
873
897
 
874
- mapDiv.addEventListener('mouseleave', handleMouseLeave);
898
+ controller.addEventListener('DRAGSTART', handleDragStart);
899
+ controller.addEventListener('DRAGEND', handleDragEnd);
875
900
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
876
901
 
877
902
  var componentInstance = null;
@@ -909,11 +934,18 @@ var WoongKonvaMarkerComponent = function (_a) {
909
934
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
910
935
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
911
936
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
912
- controller.removeEventListener('CLICK', handleClick);
913
- controller.removeEventListener('MOUSEMOVE', handleMouseMove);
937
+
938
+ if (onClick) {
939
+ controller.removeEventListener('CLICK', handleClick);
940
+ }
941
+
942
+ if (onMouseOver || onMouseOut) {
943
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
944
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave);
945
+ }
946
+
914
947
  controller.removeEventListener('DRAGSTART', handleDragStart);
915
- controller.removeEventListener('DRAGEND', handleDragEnd);
916
- mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
948
+ controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
917
949
 
918
950
  if (context$1 && componentInstance) {
919
951
  context$1.unregisterComponent(componentInstance);
@@ -930,6 +962,18 @@ var WoongKonvaMarkerComponent = function (_a) {
930
962
  spatialIndexRef.current.clear();
931
963
  };
932
964
  }, []); // --------------------------------------------------------------------------
965
+ // Lifecycle: 이벤트 핸들러 ref 동기화
966
+ // --------------------------------------------------------------------------
967
+
968
+ React.useEffect(function () {
969
+ onClickRef.current = onClick;
970
+ onMouseOverRef.current = onMouseOver;
971
+ onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
972
+
973
+ if (stageRef.current) {
974
+ doRenderEvent();
975
+ }
976
+ }, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
933
977
  // Lifecycle: 외부 selectedItems 동기화
934
978
  // --------------------------------------------------------------------------
935
979
 
@@ -1020,14 +1064,23 @@ var WoongKonvaMarkerComponent = function (_a) {
1020
1064
 
1021
1065
  renderAllImmediate();
1022
1066
  }, [markers]);
1067
+ var hasAnyHandler = onClick || onMouseOver || onMouseOut;
1023
1068
  return reactDom.createPortal(React__default["default"].createElement("div", {
1069
+ style: {
1070
+ zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
1071
+ position: 'absolute',
1072
+ width: '100%',
1073
+ height: '100%',
1074
+ pointerEvents: hasAnyHandler ? 'none' : 'auto'
1075
+ }
1076
+ }, React__default["default"].createElement("div", {
1024
1077
  ref: containerRef,
1025
1078
  style: {
1026
1079
  position: 'absolute',
1027
1080
  width: '100%',
1028
1081
  height: '100%'
1029
1082
  }
1030
- }), divElement);
1083
+ })), divElement);
1031
1084
  };
1032
1085
  /**
1033
1086
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -1035,33 +1088,29 @@ var WoongKonvaMarkerComponent = function (_a) {
1035
1088
  * 비교 전략:
1036
1089
  * 1. markers 배열 비교
1037
1090
  * 2. selectedItems 배열 비교 (외부 제어)
1091
+ * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
1038
1092
  *
1039
1093
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
1040
1094
  */
1041
1095
 
1042
1096
 
1043
1097
  var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
1044
- // 1. markers 비교
1045
- var prevMarkers = prevProps.markers;
1046
- var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
1098
+ // markers 배열 비교 (참조 비교)
1099
+ if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
1047
1100
 
1048
- if (prevMarkers !== nextMarkers) {
1049
- // 길이가 다르면 변경됨
1050
- if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
1101
+ if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
1051
1102
 
1052
- for (var i = 0; i < prevMarkers.length; i++) {
1053
- if (prevMarkers[i].id !== nextMarkers[i].id) {
1054
- return false; // 변경됨 → 리렌더링
1055
- }
1056
- }
1057
- } // 2. selectedItems 비교 (참조만 비교)
1103
+ if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
1058
1104
 
1105
+ if (prevProps.onClick !== nextProps.onClick) return false;
1106
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
1107
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
1059
1108
 
1060
- if (prevProps.selectedItems !== nextProps.selectedItems) {
1061
- return false; // 변경됨 리렌더링
1062
- }
1109
+ if (prevProps.renderBase !== nextProps.renderBase) return false;
1110
+ if (prevProps.renderEvent !== nextProps.renderEvent) return false;
1111
+ if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
1063
1112
 
1064
- return true; // 같음 → 리렌더링 스킵
1113
+ return true;
1065
1114
  });
1066
1115
 
1067
1116
  Object.defineProperty(exports, 'CanvasDataType', {
@@ -172,7 +172,7 @@ function MapMarkerWrapper(_a) {
172
172
  var onMouseOverHandler = function (e) {
173
173
  var _a;
174
174
 
175
- var marker = markerRef.current;
175
+ var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
176
176
 
177
177
  if (marker) {
178
178
  var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
@@ -185,25 +185,6 @@ function MapMarkerWrapper(_a) {
185
185
 
186
186
  next && topOnHover && controller.markerToTheTop(marker);
187
187
  }
188
- }; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
189
-
190
-
191
- var onMouseLeaveHandler = function (e) {
192
- var _a;
193
-
194
- var marker = markerRef.current;
195
-
196
- if (marker) {
197
- var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
198
- var next = true;
199
-
200
- if (mouseOutHandler) {
201
- var hasNext = mouseOutHandler(e);
202
- hasNext !== undefined && (next = hasNext);
203
- }
204
-
205
- next && topOnHover && controller.restoreMarkerZIndex(marker);
206
- }
207
188
  }; //create object
208
189
 
209
190
 
@@ -221,12 +202,10 @@ function MapMarkerWrapper(_a) {
221
202
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
222
203
 
223
204
  divElement.addEventListener('mouseover', onMouseOverHandler);
224
- divElement.addEventListener('mouseleave', onMouseLeaveHandler);
225
205
  return function () {
226
206
  divElement.removeEventListener('click', onClickHandler);
227
207
  divElement.removeEventListener('mousedown', onMousedownHandler);
228
208
  divElement.removeEventListener('mouseover', onMouseOverHandler);
229
- divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
230
209
 
231
210
  if (markerRef.current) {
232
211
  controller.clearDrawable(markerRef.current);
@@ -28,7 +28,6 @@ export declare class GoogleMintMapController extends MintMapController {
28
28
  private getMaxZIndex;
29
29
  setMarkerZIndex(marker: Marker, zIndex: number): void;
30
30
  markerToTheTop(marker: Marker): void;
31
- restoreMarkerZIndex(marker: Marker): void;
32
31
  clearDrawable(drawable: Drawable): boolean;
33
32
  private dragged;
34
33
  isMapDragged(): boolean;
@@ -340,10 +340,6 @@ function (_super) {
340
340
  }
341
341
  };
342
342
 
343
- GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
344
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
345
- };
346
-
347
343
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
348
344
  if (drawable && drawable.native) {
349
345
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -31,7 +31,6 @@ export declare class KakaoMintMapController extends MintMapController {
31
31
  private getMaxZIndex;
32
32
  setMarkerZIndex(marker: Marker, zIndex: number): void;
33
33
  markerToTheTop(marker: Marker): void;
34
- restoreMarkerZIndex(marker: Marker): void;
35
34
  clearDrawable(drawable: Drawable): boolean;
36
35
  private dragged;
37
36
  isMapDragged(): boolean;
@@ -348,10 +348,6 @@ function (_super) {
348
348
  }
349
349
  };
350
350
 
351
- KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
352
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
353
- };
354
-
355
351
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
356
352
  var _this = this;
357
353
 
@@ -27,12 +27,9 @@ export declare class NaverMintMapController extends MintMapController {
27
27
  createMarker(marker: Marker): void;
28
28
  updateMarker(marker: Marker, options: MarkerOptions): void;
29
29
  private markerMaxZIndex;
30
- private markerOriginalZIndex;
31
30
  private getMaxZIndex;
32
- private getCurrentZIndex;
33
31
  setMarkerZIndex(marker: Marker, zIndex: number): void;
34
32
  markerToTheTop(marker: Marker): void;
35
- restoreMarkerZIndex(marker: Marker): void;
36
33
  clearDrawable(drawable: Drawable): boolean;
37
34
  private dragged;
38
35
  isMapDragged(): boolean;
@@ -340,54 +340,20 @@ function (_super) {
340
340
  }
341
341
  };
342
342
 
343
- NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
344
- if (this.map && marker.element && marker.element instanceof HTMLElement) {
345
- var parent_1 = marker.element.parentElement;
346
-
347
- if (parent_1 && parent_1.style.zIndex) {
348
- var zIndex = Number(parent_1.style.zIndex);
349
- return isNaN(zIndex) ? undefined : zIndex;
350
- }
351
- }
352
-
353
- return undefined;
354
- };
355
-
356
343
  NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
357
344
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
358
- var parent_2 = marker.element.parentElement;
345
+ var parent_1 = marker.element.parentElement;
359
346
 
360
- if (parent_2) {
361
- parent_2.style.zIndex = String(zIndex);
347
+ if (parent_1) {
348
+ parent_1.style.zIndex = String(zIndex);
362
349
  }
363
350
  }
364
351
  };
365
352
 
366
353
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
367
- // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
368
- if (this.markerOriginalZIndex !== undefined) {
369
- return;
370
- }
371
-
372
- var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
373
-
374
- this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
375
354
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
376
355
  };
377
356
 
378
- NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
379
- if (this.markerOriginalZIndex !== undefined) {
380
- if (this.markerOriginalZIndex === null) {
381
- // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
382
- this.setMarkerZIndex(marker, 0);
383
- } else {
384
- this.setMarkerZIndex(marker, this.markerOriginalZIndex);
385
- }
386
-
387
- this.markerOriginalZIndex = undefined;
388
- }
389
- };
390
-
391
357
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
392
358
  var _a;
393
359
 
package/dist/index.es.js CHANGED
@@ -2750,7 +2750,7 @@ function MapMarkerWrapper(_a) {
2750
2750
  var onMouseOverHandler = function (e) {
2751
2751
  var _a;
2752
2752
 
2753
- var marker = markerRef.current;
2753
+ var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
2754
2754
 
2755
2755
  if (marker) {
2756
2756
  var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
@@ -2763,25 +2763,6 @@ function MapMarkerWrapper(_a) {
2763
2763
 
2764
2764
  next && topOnHover && controller.markerToTheTop(marker);
2765
2765
  }
2766
- }; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
2767
-
2768
-
2769
- var onMouseLeaveHandler = function (e) {
2770
- var _a;
2771
-
2772
- var marker = markerRef.current;
2773
-
2774
- if (marker) {
2775
- var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
2776
- var next = true;
2777
-
2778
- if (mouseOutHandler) {
2779
- var hasNext = mouseOutHandler(e);
2780
- hasNext !== undefined && (next = hasNext);
2781
- }
2782
-
2783
- next && topOnHover && controller.restoreMarkerZIndex(marker);
2784
- }
2785
2766
  }; //create object
2786
2767
 
2787
2768
 
@@ -2799,12 +2780,10 @@ function MapMarkerWrapper(_a) {
2799
2780
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
2800
2781
 
2801
2782
  divElement.addEventListener('mouseover', onMouseOverHandler);
2802
- divElement.addEventListener('mouseleave', onMouseLeaveHandler);
2803
2783
  return function () {
2804
2784
  divElement.removeEventListener('click', onClickHandler);
2805
2785
  divElement.removeEventListener('mousedown', onMousedownHandler);
2806
2786
  divElement.removeEventListener('mouseover', onMouseOverHandler);
2807
- divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
2808
2787
 
2809
2788
  if (markerRef.current) {
2810
2789
  controller.clearDrawable(markerRef.current);
@@ -5481,6 +5460,12 @@ var WoongKonvaMarkerComponent = function (_a) {
5481
5460
  x: 0,
5482
5461
  y: 0
5483
5462
  }); // --------------------------------------------------------------------------
5463
+ // Event Handler Refs (클로저 문제 방지)
5464
+ // --------------------------------------------------------------------------
5465
+
5466
+ var onClickRef = useRef(onClick);
5467
+ var onMouseOverRef = useRef(onMouseOver);
5468
+ var onMouseOutRef = useRef(onMouseOut); // --------------------------------------------------------------------------
5484
5469
  // Performance Refs (캐싱 & 최적화)
5485
5470
  // --------------------------------------------------------------------------
5486
5471
 
@@ -5770,9 +5755,16 @@ var WoongKonvaMarkerComponent = function (_a) {
5770
5755
 
5771
5756
 
5772
5757
  var doRenderEvent = function () {
5773
- if (!renderEvent) return;
5774
5758
  var layer = eventLayerRef.current;
5775
- if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
5759
+ if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
5760
+
5761
+ if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
5762
+ layer.destroyChildren();
5763
+ layer.batchDraw();
5764
+ return;
5765
+ }
5766
+
5767
+ if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
5776
5768
 
5777
5769
  var shape = layer.findOne('.event-render-shape');
5778
5770
 
@@ -5970,6 +5962,7 @@ var WoongKonvaMarkerComponent = function (_a) {
5970
5962
 
5971
5963
 
5972
5964
  var setHovered = function (data) {
5965
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
5973
5966
  hoveredItemRef.current = data;
5974
5967
 
5975
5968
  if (draggingRef.current) {
@@ -5994,7 +5987,8 @@ var WoongKonvaMarkerComponent = function (_a) {
5994
5987
 
5995
5988
 
5996
5989
  var handleLocalClick = function (data) {
5997
- // 1. 선택 상태 업데이트
5990
+ if (!onClickRef.current) return; // 1. 선택 상태 업데이트
5991
+
5998
5992
  if (enableMultiSelect) {
5999
5993
  // 다중 선택: Set과 Map 동시 업데이트
6000
5994
  var newSelected = new Set(selectedIdsRef.current);
@@ -6044,6 +6038,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6044
6038
  var handleClick = function (event) {
6045
6039
  var _a;
6046
6040
 
6041
+ if (!onClickRef.current) return;
6047
6042
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6048
6043
 
6049
6044
  try {
@@ -6052,7 +6047,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6052
6047
 
6053
6048
  if (data) {
6054
6049
  handleLocalClick(data);
6055
- if (onClick) onClick(data, selectedIdsRef.current);
6050
+ onClickRef.current(data, selectedIdsRef.current);
6056
6051
  }
6057
6052
  } catch (error) {
6058
6053
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -6066,6 +6061,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6066
6061
  var handleMouseMove = function (event) {
6067
6062
  var _a;
6068
6063
 
6064
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6069
6065
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6070
6066
 
6071
6067
  try {
@@ -6075,8 +6071,8 @@ var WoongKonvaMarkerComponent = function (_a) {
6075
6071
 
6076
6072
  if (prevHovered !== hoveredItem) {
6077
6073
  setHovered(hoveredItem);
6078
- if (prevHovered && onMouseOut) onMouseOut(prevHovered);
6079
- if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
6074
+ if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
6075
+ if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
6080
6076
  }
6081
6077
  } catch (error) {
6082
6078
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -6106,6 +6102,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6106
6102
 
6107
6103
 
6108
6104
  var handleMouseLeave = function () {
6105
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6109
6106
  var prevHovered = hoveredItemRef.current;
6110
6107
 
6111
6108
  if (prevHovered) {
@@ -6113,8 +6110,8 @@ var WoongKonvaMarkerComponent = function (_a) {
6113
6110
  controller.setMapCursor('grab');
6114
6111
  doRenderEvent();
6115
6112
 
6116
- if (onMouseOut) {
6117
- onMouseOut(prevHovered);
6113
+ if (onMouseOutRef.current) {
6114
+ onMouseOutRef.current(prevHovered);
6118
6115
  }
6119
6116
  }
6120
6117
  }; // --------------------------------------------------------------------------
@@ -6215,13 +6212,20 @@ var WoongKonvaMarkerComponent = function (_a) {
6215
6212
  controller.addEventListener('IDLE', handleIdle);
6216
6213
  controller.addEventListener('ZOOMSTART', handleZoomStart);
6217
6214
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
6218
- controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
6219
- controller.addEventListener('CLICK', handleClick);
6220
- controller.addEventListener('MOUSEMOVE', handleMouseMove);
6221
- controller.addEventListener('DRAGSTART', handleDragStart);
6222
- controller.addEventListener('DRAGEND', handleDragEnd); // 컨테이너에 mouseleave 이벤트 추가
6215
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
6216
+
6217
+ if (onClick) {
6218
+ controller.addEventListener('CLICK', handleClick);
6219
+ } // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
6220
+
6223
6221
 
6224
- mapDiv.addEventListener('mouseleave', handleMouseLeave);
6222
+ if (onMouseOver || onMouseOut) {
6223
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
6224
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
6225
+ }
6226
+
6227
+ controller.addEventListener('DRAGSTART', handleDragStart);
6228
+ controller.addEventListener('DRAGEND', handleDragEnd);
6225
6229
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
6226
6230
 
6227
6231
  var componentInstance = null;
@@ -6259,11 +6263,18 @@ var WoongKonvaMarkerComponent = function (_a) {
6259
6263
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
6260
6264
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
6261
6265
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
6262
- controller.removeEventListener('CLICK', handleClick);
6263
- controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6266
+
6267
+ if (onClick) {
6268
+ controller.removeEventListener('CLICK', handleClick);
6269
+ }
6270
+
6271
+ if (onMouseOver || onMouseOut) {
6272
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6273
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave);
6274
+ }
6275
+
6264
6276
  controller.removeEventListener('DRAGSTART', handleDragStart);
6265
- controller.removeEventListener('DRAGEND', handleDragEnd);
6266
- mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
6277
+ controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
6267
6278
 
6268
6279
  if (context && componentInstance) {
6269
6280
  context.unregisterComponent(componentInstance);
@@ -6280,6 +6291,18 @@ var WoongKonvaMarkerComponent = function (_a) {
6280
6291
  spatialIndexRef.current.clear();
6281
6292
  };
6282
6293
  }, []); // --------------------------------------------------------------------------
6294
+ // Lifecycle: 이벤트 핸들러 ref 동기화
6295
+ // --------------------------------------------------------------------------
6296
+
6297
+ useEffect(function () {
6298
+ onClickRef.current = onClick;
6299
+ onMouseOverRef.current = onMouseOver;
6300
+ onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
6301
+
6302
+ if (stageRef.current) {
6303
+ doRenderEvent();
6304
+ }
6305
+ }, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
6283
6306
  // Lifecycle: 외부 selectedItems 동기화
6284
6307
  // --------------------------------------------------------------------------
6285
6308
 
@@ -6370,14 +6393,23 @@ var WoongKonvaMarkerComponent = function (_a) {
6370
6393
 
6371
6394
  renderAllImmediate();
6372
6395
  }, [markers]);
6396
+ var hasAnyHandler = onClick || onMouseOver || onMouseOut;
6373
6397
  return createPortal(React.createElement("div", {
6398
+ style: {
6399
+ zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
6400
+ position: 'absolute',
6401
+ width: '100%',
6402
+ height: '100%',
6403
+ pointerEvents: hasAnyHandler ? 'none' : 'auto'
6404
+ }
6405
+ }, React.createElement("div", {
6374
6406
  ref: containerRef,
6375
6407
  style: {
6376
6408
  position: 'absolute',
6377
6409
  width: '100%',
6378
6410
  height: '100%'
6379
6411
  }
6380
- }), divElement);
6412
+ })), divElement);
6381
6413
  };
6382
6414
  /**
6383
6415
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -6385,33 +6417,29 @@ var WoongKonvaMarkerComponent = function (_a) {
6385
6417
  * 비교 전략:
6386
6418
  * 1. markers 배열 비교
6387
6419
  * 2. selectedItems 배열 비교 (외부 제어)
6420
+ * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
6388
6421
  *
6389
6422
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
6390
6423
  */
6391
6424
 
6392
6425
 
6393
6426
  var WoongKonvaMarker = React.memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6394
- // 1. markers 비교
6395
- var prevMarkers = prevProps.markers;
6396
- var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
6427
+ // markers 배열 비교 (참조 비교)
6428
+ if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
6397
6429
 
6398
- if (prevMarkers !== nextMarkers) {
6399
- // 길이가 다르면 변경됨
6400
- if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
6430
+ if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
6401
6431
 
6402
- for (var i = 0; i < prevMarkers.length; i++) {
6403
- if (prevMarkers[i].id !== nextMarkers[i].id) {
6404
- return false; // 변경됨 → 리렌더링
6405
- }
6406
- }
6407
- } // 2. selectedItems 비교 (참조만 비교)
6432
+ if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
6408
6433
 
6434
+ if (prevProps.onClick !== nextProps.onClick) return false;
6435
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
6436
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
6409
6437
 
6410
- if (prevProps.selectedItems !== nextProps.selectedItems) {
6411
- return false; // 변경됨 리렌더링
6412
- }
6438
+ if (prevProps.renderBase !== nextProps.renderBase) return false;
6439
+ if (prevProps.renderEvent !== nextProps.renderEvent) return false;
6440
+ if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
6413
6441
 
6414
- return true; // 같음 → 리렌더링 스킵
6442
+ return true;
6415
6443
  });
6416
6444
 
6417
6445
  var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
@@ -7154,54 +7182,20 @@ function (_super) {
7154
7182
  }
7155
7183
  };
7156
7184
 
7157
- NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
7158
- if (this.map && marker.element && marker.element instanceof HTMLElement) {
7159
- var parent_1 = marker.element.parentElement;
7160
-
7161
- if (parent_1 && parent_1.style.zIndex) {
7162
- var zIndex = Number(parent_1.style.zIndex);
7163
- return isNaN(zIndex) ? undefined : zIndex;
7164
- }
7165
- }
7166
-
7167
- return undefined;
7168
- };
7169
-
7170
7185
  NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7171
7186
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
7172
- var parent_2 = marker.element.parentElement;
7187
+ var parent_1 = marker.element.parentElement;
7173
7188
 
7174
- if (parent_2) {
7175
- parent_2.style.zIndex = String(zIndex);
7189
+ if (parent_1) {
7190
+ parent_1.style.zIndex = String(zIndex);
7176
7191
  }
7177
7192
  }
7178
7193
  };
7179
7194
 
7180
7195
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
7181
- // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
7182
- if (this.markerOriginalZIndex !== undefined) {
7183
- return;
7184
- }
7185
-
7186
- var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
7187
-
7188
- this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
7189
7196
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
7190
7197
  };
7191
7198
 
7192
- NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
7193
- if (this.markerOriginalZIndex !== undefined) {
7194
- if (this.markerOriginalZIndex === null) {
7195
- // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
7196
- this.setMarkerZIndex(marker, 0);
7197
- } else {
7198
- this.setMarkerZIndex(marker, this.markerOriginalZIndex);
7199
- }
7200
-
7201
- this.markerOriginalZIndex = undefined;
7202
- }
7203
- };
7204
-
7205
7199
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
7206
7200
  var _a;
7207
7201
 
@@ -7956,10 +7950,6 @@ function (_super) {
7956
7950
  }
7957
7951
  };
7958
7952
 
7959
- GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
7960
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
7961
- };
7962
-
7963
7953
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
7964
7954
  if (drawable && drawable.native) {
7965
7955
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -8682,10 +8672,6 @@ function (_super) {
8682
8672
  }
8683
8673
  };
8684
8674
 
8685
- KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
8686
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
8687
- };
8688
-
8689
8675
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
8690
8676
  var _this = this;
8691
8677
 
package/dist/index.umd.js CHANGED
@@ -2754,7 +2754,7 @@
2754
2754
  var onMouseOverHandler = function (e) {
2755
2755
  var _a;
2756
2756
 
2757
- var marker = markerRef.current;
2757
+ var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
2758
2758
 
2759
2759
  if (marker) {
2760
2760
  var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
@@ -2767,25 +2767,6 @@
2767
2767
 
2768
2768
  next && topOnHover && controller.markerToTheTop(marker);
2769
2769
  }
2770
- }; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
2771
-
2772
-
2773
- var onMouseLeaveHandler = function (e) {
2774
- var _a;
2775
-
2776
- var marker = markerRef.current;
2777
-
2778
- if (marker) {
2779
- var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
2780
- var next = true;
2781
-
2782
- if (mouseOutHandler) {
2783
- var hasNext = mouseOutHandler(e);
2784
- hasNext !== undefined && (next = hasNext);
2785
- }
2786
-
2787
- next && topOnHover && controller.restoreMarkerZIndex(marker);
2788
- }
2789
2770
  }; //create object
2790
2771
 
2791
2772
 
@@ -2803,12 +2784,10 @@
2803
2784
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
2804
2785
 
2805
2786
  divElement.addEventListener('mouseover', onMouseOverHandler);
2806
- divElement.addEventListener('mouseleave', onMouseLeaveHandler);
2807
2787
  return function () {
2808
2788
  divElement.removeEventListener('click', onClickHandler);
2809
2789
  divElement.removeEventListener('mousedown', onMousedownHandler);
2810
2790
  divElement.removeEventListener('mouseover', onMouseOverHandler);
2811
- divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
2812
2791
 
2813
2792
  if (markerRef.current) {
2814
2793
  controller.clearDrawable(markerRef.current);
@@ -5485,6 +5464,12 @@
5485
5464
  x: 0,
5486
5465
  y: 0
5487
5466
  }); // --------------------------------------------------------------------------
5467
+ // Event Handler Refs (클로저 문제 방지)
5468
+ // --------------------------------------------------------------------------
5469
+
5470
+ var onClickRef = React.useRef(onClick);
5471
+ var onMouseOverRef = React.useRef(onMouseOver);
5472
+ var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
5488
5473
  // Performance Refs (캐싱 & 최적화)
5489
5474
  // --------------------------------------------------------------------------
5490
5475
 
@@ -5774,9 +5759,16 @@
5774
5759
 
5775
5760
 
5776
5761
  var doRenderEvent = function () {
5777
- if (!renderEvent) return;
5778
5762
  var layer = eventLayerRef.current;
5779
- if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
5763
+ if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
5764
+
5765
+ if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
5766
+ layer.destroyChildren();
5767
+ layer.batchDraw();
5768
+ return;
5769
+ }
5770
+
5771
+ if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
5780
5772
 
5781
5773
  var shape = layer.findOne('.event-render-shape');
5782
5774
 
@@ -5974,6 +5966,7 @@
5974
5966
 
5975
5967
 
5976
5968
  var setHovered = function (data) {
5969
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
5977
5970
  hoveredItemRef.current = data;
5978
5971
 
5979
5972
  if (draggingRef.current) {
@@ -5998,7 +5991,8 @@
5998
5991
 
5999
5992
 
6000
5993
  var handleLocalClick = function (data) {
6001
- // 1. 선택 상태 업데이트
5994
+ if (!onClickRef.current) return; // 1. 선택 상태 업데이트
5995
+
6002
5996
  if (enableMultiSelect) {
6003
5997
  // 다중 선택: Set과 Map 동시 업데이트
6004
5998
  var newSelected = new Set(selectedIdsRef.current);
@@ -6048,6 +6042,7 @@
6048
6042
  var handleClick = function (event) {
6049
6043
  var _a;
6050
6044
 
6045
+ if (!onClickRef.current) return;
6051
6046
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6052
6047
 
6053
6048
  try {
@@ -6056,7 +6051,7 @@
6056
6051
 
6057
6052
  if (data) {
6058
6053
  handleLocalClick(data);
6059
- if (onClick) onClick(data, selectedIdsRef.current);
6054
+ onClickRef.current(data, selectedIdsRef.current);
6060
6055
  }
6061
6056
  } catch (error) {
6062
6057
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -6070,6 +6065,7 @@
6070
6065
  var handleMouseMove = function (event) {
6071
6066
  var _a;
6072
6067
 
6068
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6073
6069
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6074
6070
 
6075
6071
  try {
@@ -6079,8 +6075,8 @@
6079
6075
 
6080
6076
  if (prevHovered !== hoveredItem) {
6081
6077
  setHovered(hoveredItem);
6082
- if (prevHovered && onMouseOut) onMouseOut(prevHovered);
6083
- if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
6078
+ if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
6079
+ if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
6084
6080
  }
6085
6081
  } catch (error) {
6086
6082
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -6110,6 +6106,7 @@
6110
6106
 
6111
6107
 
6112
6108
  var handleMouseLeave = function () {
6109
+ if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6113
6110
  var prevHovered = hoveredItemRef.current;
6114
6111
 
6115
6112
  if (prevHovered) {
@@ -6117,8 +6114,8 @@
6117
6114
  controller.setMapCursor('grab');
6118
6115
  doRenderEvent();
6119
6116
 
6120
- if (onMouseOut) {
6121
- onMouseOut(prevHovered);
6117
+ if (onMouseOutRef.current) {
6118
+ onMouseOutRef.current(prevHovered);
6122
6119
  }
6123
6120
  }
6124
6121
  }; // --------------------------------------------------------------------------
@@ -6219,13 +6216,20 @@
6219
6216
  controller.addEventListener('IDLE', handleIdle);
6220
6217
  controller.addEventListener('ZOOMSTART', handleZoomStart);
6221
6218
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
6222
- controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
6223
- controller.addEventListener('CLICK', handleClick);
6224
- controller.addEventListener('MOUSEMOVE', handleMouseMove);
6225
- controller.addEventListener('DRAGSTART', handleDragStart);
6226
- controller.addEventListener('DRAGEND', handleDragEnd); // 컨테이너에 mouseleave 이벤트 추가
6219
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
6220
+
6221
+ if (onClick) {
6222
+ controller.addEventListener('CLICK', handleClick);
6223
+ } // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
6224
+
6227
6225
 
6228
- mapDiv.addEventListener('mouseleave', handleMouseLeave);
6226
+ if (onMouseOver || onMouseOut) {
6227
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
6228
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
6229
+ }
6230
+
6231
+ controller.addEventListener('DRAGSTART', handleDragStart);
6232
+ controller.addEventListener('DRAGEND', handleDragEnd);
6229
6233
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
6230
6234
 
6231
6235
  var componentInstance = null;
@@ -6263,11 +6267,18 @@
6263
6267
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
6264
6268
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
6265
6269
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
6266
- controller.removeEventListener('CLICK', handleClick);
6267
- controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6270
+
6271
+ if (onClick) {
6272
+ controller.removeEventListener('CLICK', handleClick);
6273
+ }
6274
+
6275
+ if (onMouseOver || onMouseOut) {
6276
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6277
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave);
6278
+ }
6279
+
6268
6280
  controller.removeEventListener('DRAGSTART', handleDragStart);
6269
- controller.removeEventListener('DRAGEND', handleDragEnd);
6270
- mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
6281
+ controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
6271
6282
 
6272
6283
  if (context && componentInstance) {
6273
6284
  context.unregisterComponent(componentInstance);
@@ -6284,6 +6295,18 @@
6284
6295
  spatialIndexRef.current.clear();
6285
6296
  };
6286
6297
  }, []); // --------------------------------------------------------------------------
6298
+ // Lifecycle: 이벤트 핸들러 ref 동기화
6299
+ // --------------------------------------------------------------------------
6300
+
6301
+ React.useEffect(function () {
6302
+ onClickRef.current = onClick;
6303
+ onMouseOverRef.current = onMouseOver;
6304
+ onMouseOutRef.current = onMouseOut; // Event Layer 다시 렌더링 (이벤트 핸들러 변경 반영)
6305
+
6306
+ if (stageRef.current) {
6307
+ doRenderEvent();
6308
+ }
6309
+ }, [onClick, onMouseOver, onMouseOut]); // --------------------------------------------------------------------------
6287
6310
  // Lifecycle: 외부 selectedItems 동기화
6288
6311
  // --------------------------------------------------------------------------
6289
6312
 
@@ -6374,14 +6397,23 @@
6374
6397
 
6375
6398
  renderAllImmediate();
6376
6399
  }, [markers]);
6400
+ var hasAnyHandler = onClick || onMouseOver || onMouseOut;
6377
6401
  return reactDom.createPortal(React__default["default"].createElement("div", {
6402
+ style: {
6403
+ zIndex: options.zIndex !== undefined ? options.zIndex + 1 : 9999,
6404
+ position: 'absolute',
6405
+ width: '100%',
6406
+ height: '100%',
6407
+ pointerEvents: hasAnyHandler ? 'none' : 'auto'
6408
+ }
6409
+ }, React__default["default"].createElement("div", {
6378
6410
  ref: containerRef,
6379
6411
  style: {
6380
6412
  position: 'absolute',
6381
6413
  width: '100%',
6382
6414
  height: '100%'
6383
6415
  }
6384
- }), divElement);
6416
+ })), divElement);
6385
6417
  };
6386
6418
  /**
6387
6419
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -6389,33 +6421,29 @@
6389
6421
  * 비교 전략:
6390
6422
  * 1. markers 배열 비교
6391
6423
  * 2. selectedItems 배열 비교 (외부 제어)
6424
+ * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
6392
6425
  *
6393
6426
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
6394
6427
  */
6395
6428
 
6396
6429
 
6397
6430
  var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6398
- // 1. markers 비교
6399
- var prevMarkers = prevProps.markers;
6400
- var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
6431
+ // markers 배열 비교 (참조 비교)
6432
+ if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
6401
6433
 
6402
- if (prevMarkers !== nextMarkers) {
6403
- // 길이가 다르면 변경됨
6404
- if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
6434
+ if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
6405
6435
 
6406
- for (var i = 0; i < prevMarkers.length; i++) {
6407
- if (prevMarkers[i].id !== nextMarkers[i].id) {
6408
- return false; // 변경됨 → 리렌더링
6409
- }
6410
- }
6411
- } // 2. selectedItems 비교 (참조만 비교)
6436
+ if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
6412
6437
 
6438
+ if (prevProps.onClick !== nextProps.onClick) return false;
6439
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) return false;
6440
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) return false; // renderBase, renderEvent 등 함수 비교
6413
6441
 
6414
- if (prevProps.selectedItems !== nextProps.selectedItems) {
6415
- return false; // 변경됨 리렌더링
6416
- }
6442
+ if (prevProps.renderBase !== nextProps.renderBase) return false;
6443
+ if (prevProps.renderEvent !== nextProps.renderEvent) return false;
6444
+ if (prevProps.renderAnimation !== nextProps.renderAnimation) return false; // 나머지 props는 변경되지 않는다고 가정
6417
6445
 
6418
- return true; // 같음 → 리렌더링 스킵
6446
+ return true;
6419
6447
  });
6420
6448
 
6421
6449
  var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
@@ -7158,54 +7186,20 @@
7158
7186
  }
7159
7187
  };
7160
7188
 
7161
- NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
7162
- if (this.map && marker.element && marker.element instanceof HTMLElement) {
7163
- var parent_1 = marker.element.parentElement;
7164
-
7165
- if (parent_1 && parent_1.style.zIndex) {
7166
- var zIndex = Number(parent_1.style.zIndex);
7167
- return isNaN(zIndex) ? undefined : zIndex;
7168
- }
7169
- }
7170
-
7171
- return undefined;
7172
- };
7173
-
7174
7189
  NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7175
7190
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
7176
- var parent_2 = marker.element.parentElement;
7191
+ var parent_1 = marker.element.parentElement;
7177
7192
 
7178
- if (parent_2) {
7179
- parent_2.style.zIndex = String(zIndex);
7193
+ if (parent_1) {
7194
+ parent_1.style.zIndex = String(zIndex);
7180
7195
  }
7181
7196
  }
7182
7197
  };
7183
7198
 
7184
7199
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
7185
- // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
7186
- if (this.markerOriginalZIndex !== undefined) {
7187
- return;
7188
- }
7189
-
7190
- var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
7191
-
7192
- this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
7193
7200
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
7194
7201
  };
7195
7202
 
7196
- NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
7197
- if (this.markerOriginalZIndex !== undefined) {
7198
- if (this.markerOriginalZIndex === null) {
7199
- // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
7200
- this.setMarkerZIndex(marker, 0);
7201
- } else {
7202
- this.setMarkerZIndex(marker, this.markerOriginalZIndex);
7203
- }
7204
-
7205
- this.markerOriginalZIndex = undefined;
7206
- }
7207
- };
7208
-
7209
7203
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
7210
7204
  var _a;
7211
7205
 
@@ -7960,10 +7954,6 @@
7960
7954
  }
7961
7955
  };
7962
7956
 
7963
- GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
7964
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
7965
- };
7966
-
7967
7957
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
7968
7958
  if (drawable && drawable.native) {
7969
7959
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -8686,10 +8676,6 @@
8686
8676
  }
8687
8677
  };
8688
8678
 
8689
- KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
8690
- // 이 기능은 Naver Maps에서만 사용 가능합니다.
8691
- };
8692
-
8693
8679
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
8694
8680
  var _this = this;
8695
8681
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.6",
3
+ "version": "1.2.0-test.8",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",