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

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,6 +24,7 @@ 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;
27
28
  abstract isMapDragged(): boolean;
28
29
  abstract setMapDragged(value: boolean): void;
29
30
  abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
@@ -38,6 +38,7 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
38
38
  selectedItems?: KonvaCanvasMarkerData<T>[];
39
39
  /** 외부에서 전달된 단일 선택 아이템 (특별한 효과용) */
40
40
  selectedItem?: KonvaCanvasMarkerData<T> | null;
41
+ disablePointerEvents?: boolean;
41
42
  }
42
43
  /**
43
44
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -45,9 +46,8 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
45
46
  * 비교 전략:
46
47
  * 1. markers 배열 비교
47
48
  * 2. selectedItems 배열 비교 (외부 제어)
48
- * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
49
49
  *
50
50
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
51
51
  */
52
- declare const WoongKonvaMarker: <T>({ markers, dataType, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, selectedItem: externalSelectedItem, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
52
+ declare const WoongKonvaMarker: <T>({ markers, dataType, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, selectedItem: externalSelectedItem, disablePointerEvents, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
53
53
  export default WoongKonvaMarker;
@@ -56,7 +56,9 @@ var WoongKonvaMarkerComponent = function (_a) {
56
56
  maxCacheSize = _f === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _f,
57
57
  externalSelectedItems = _a.selectedItems,
58
58
  externalSelectedItem = _a.selectedItem,
59
- options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem"]); // --------------------------------------------------------------------------
59
+ _g = _a.disablePointerEvents,
60
+ disablePointerEvents = _g === void 0 ? false : _g,
61
+ options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disablePointerEvents"]); // --------------------------------------------------------------------------
60
62
  // Hooks & Context
61
63
  // --------------------------------------------------------------------------
62
64
 
@@ -131,12 +133,6 @@ var WoongKonvaMarkerComponent = function (_a) {
131
133
  x: 0,
132
134
  y: 0
133
135
  }); // --------------------------------------------------------------------------
134
- // Event Handler Refs (클로저 문제 방지)
135
- // --------------------------------------------------------------------------
136
-
137
- var onClickRef = React.useRef(onClick);
138
- var onMouseOverRef = React.useRef(onMouseOver);
139
- var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
140
136
  // Performance Refs (캐싱 & 최적화)
141
137
  // --------------------------------------------------------------------------
142
138
 
@@ -427,9 +423,9 @@ var WoongKonvaMarkerComponent = function (_a) {
427
423
 
428
424
  var doRenderEvent = function () {
429
425
  var layer = eventLayerRef.current;
430
- if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
426
+ if (!layer) return;
431
427
 
432
- if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
428
+ if (!onClick && !onMouseOver && !onMouseOut) {
433
429
  layer.destroyChildren();
434
430
  layer.batchDraw();
435
431
  return;
@@ -633,7 +629,7 @@ var WoongKonvaMarkerComponent = function (_a) {
633
629
 
634
630
 
635
631
  var setHovered = function (data) {
636
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
632
+ if (!onMouseOver && !onMouseOut) return;
637
633
  hoveredItemRef.current = data;
638
634
 
639
635
  if (draggingRef.current) {
@@ -658,7 +654,7 @@ var WoongKonvaMarkerComponent = function (_a) {
658
654
 
659
655
 
660
656
  var handleLocalClick = function (data) {
661
- if (!onClickRef.current) return; // 1. 선택 상태 업데이트
657
+ if (!onClick) return; // 1. 선택 상태 업데이트
662
658
 
663
659
  if (enableMultiSelect) {
664
660
  // 다중 선택: Set과 Map 동시 업데이트
@@ -709,7 +705,7 @@ var WoongKonvaMarkerComponent = function (_a) {
709
705
  var handleClick = function (event) {
710
706
  var _a;
711
707
 
712
- if (!onClickRef.current) return;
708
+ if (!onClick) return;
713
709
  if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
714
710
 
715
711
  try {
@@ -718,7 +714,7 @@ var WoongKonvaMarkerComponent = function (_a) {
718
714
 
719
715
  if (data) {
720
716
  handleLocalClick(data);
721
- onClickRef.current(data, selectedIdsRef.current);
717
+ onClick(data, selectedIdsRef.current);
722
718
  }
723
719
  } catch (error) {
724
720
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -732,7 +728,7 @@ var WoongKonvaMarkerComponent = function (_a) {
732
728
  var handleMouseMove = function (event) {
733
729
  var _a;
734
730
 
735
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
731
+ if (!onMouseOver && !onMouseOut) return;
736
732
  if (context$1 || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
737
733
 
738
734
  try {
@@ -742,8 +738,8 @@ var WoongKonvaMarkerComponent = function (_a) {
742
738
 
743
739
  if (prevHovered !== hoveredItem) {
744
740
  setHovered(hoveredItem);
745
- if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
746
- if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
741
+ if (prevHovered && onMouseOut) onMouseOut(prevHovered);
742
+ if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
747
743
  }
748
744
  } catch (error) {
749
745
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -773,7 +769,7 @@ var WoongKonvaMarkerComponent = function (_a) {
773
769
 
774
770
 
775
771
  var handleMouseLeave = function () {
776
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
772
+ if (!onMouseOver && !onMouseOut) return;
777
773
  var prevHovered = hoveredItemRef.current;
778
774
 
779
775
  if (prevHovered) {
@@ -781,8 +777,8 @@ var WoongKonvaMarkerComponent = function (_a) {
781
777
  controller.setMapCursor('grab');
782
778
  doRenderEvent();
783
779
 
784
- if (onMouseOutRef.current) {
785
- onMouseOutRef.current(prevHovered);
780
+ if (onMouseOut) {
781
+ onMouseOut(prevHovered);
786
782
  }
787
783
  }
788
784
  }; // --------------------------------------------------------------------------
@@ -883,20 +879,13 @@ var WoongKonvaMarkerComponent = function (_a) {
883
879
  controller.addEventListener('IDLE', handleIdle);
884
880
  controller.addEventListener('ZOOMSTART', handleZoomStart);
885
881
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
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
- }
897
-
882
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
883
+ controller.addEventListener('CLICK', handleClick);
884
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
898
885
  controller.addEventListener('DRAGSTART', handleDragStart);
899
- controller.addEventListener('DRAGEND', handleDragEnd);
886
+ controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
887
+
888
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
900
889
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
901
890
 
902
891
  var componentInstance = null;
@@ -934,18 +923,11 @@ var WoongKonvaMarkerComponent = function (_a) {
934
923
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
935
924
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
936
925
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
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
-
926
+ controller.removeEventListener('CLICK', handleClick);
927
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
947
928
  controller.removeEventListener('DRAGSTART', handleDragStart);
948
- controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
929
+ controller.removeEventListener('DRAGEND', handleDragEnd);
930
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
949
931
 
950
932
  if (context$1 && componentInstance) {
951
933
  context$1.unregisterComponent(componentInstance);
@@ -962,18 +944,6 @@ var WoongKonvaMarkerComponent = function (_a) {
962
944
  spatialIndexRef.current.clear();
963
945
  };
964
946
  }, []); // --------------------------------------------------------------------------
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]); // --------------------------------------------------------------------------
977
947
  // Lifecycle: 외부 selectedItems 동기화
978
948
  // --------------------------------------------------------------------------
979
949
 
@@ -1064,23 +1034,15 @@ var WoongKonvaMarkerComponent = function (_a) {
1064
1034
 
1065
1035
  renderAllImmediate();
1066
1036
  }, [markers]);
1067
- var hasAnyHandler = onClick || onMouseOver || onMouseOut;
1068
1037
  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", {
1077
1038
  ref: containerRef,
1078
1039
  style: {
1079
1040
  position: 'absolute',
1080
1041
  width: '100%',
1081
- height: '100%'
1042
+ height: '100%',
1043
+ pointerEvents: disablePointerEvents ? 'none' : 'auto'
1082
1044
  }
1083
- })), divElement);
1045
+ }), divElement);
1084
1046
  };
1085
1047
  /**
1086
1048
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -1088,29 +1050,53 @@ var WoongKonvaMarkerComponent = function (_a) {
1088
1050
  * 비교 전략:
1089
1051
  * 1. markers 배열 비교
1090
1052
  * 2. selectedItems 배열 비교 (외부 제어)
1091
- * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
1092
1053
  *
1093
1054
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
1094
1055
  */
1095
1056
 
1096
1057
 
1097
1058
  var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
1098
- // markers 배열 비교 (참조 비교)
1099
- if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
1059
+ // 1. markers 비교
1060
+ var prevMarkers = prevProps.markers;
1061
+ var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
1062
+
1063
+ if (prevMarkers !== nextMarkers) {
1064
+ // 길이가 다르면 변경됨
1065
+ if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
1066
+
1067
+ for (var i = 0; i < prevMarkers.length; i++) {
1068
+ if (prevMarkers[i].id !== nextMarkers[i].id) {
1069
+ return false; // 변경됨 → 리렌더링
1070
+ }
1071
+ }
1072
+ } // 2. selectedItems 비교 (참조만 비교)
1073
+
1074
+
1075
+ if (prevProps.selectedItems !== nextProps.selectedItems) {
1076
+ return false; // 변경됨 → 리렌더링
1077
+ }
1078
+
1079
+ if (prevProps.selectedItem !== nextProps.selectedItem) {
1080
+ return false; // 변경됨 → 리렌더링
1081
+ }
1100
1082
 
1101
- if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
1083
+ if (prevProps.onClick !== nextProps.onClick) {
1084
+ return false; // 변경됨 → 리렌더링
1085
+ }
1102
1086
 
1103
- if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
1087
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) {
1088
+ return false; // 변경됨 → 리렌더링
1089
+ }
1104
1090
 
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 등 함수 비교
1091
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) {
1092
+ return false; // 변경됨 리렌더링
1093
+ }
1108
1094
 
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는 변경되지 않는다고 가정
1095
+ if (prevProps.disablePointerEvents !== nextProps.disablePointerEvents) {
1096
+ return false; // 변경됨 리렌더링
1097
+ }
1112
1098
 
1113
- return true;
1099
+ return true; // 같음 → 리렌더링 스킵
1114
1100
  });
1115
1101
 
1116
1102
  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; //console.log('onMouseOverHandler', marker);
175
+ var marker = markerRef.current;
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,6 +185,25 @@ 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
+ }
188
207
  }; //create object
189
208
 
190
209
 
@@ -202,10 +221,12 @@ function MapMarkerWrapper(_a) {
202
221
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
203
222
 
204
223
  divElement.addEventListener('mouseover', onMouseOverHandler);
224
+ divElement.addEventListener('mouseleave', onMouseLeaveHandler);
205
225
  return function () {
206
226
  divElement.removeEventListener('click', onClickHandler);
207
227
  divElement.removeEventListener('mousedown', onMousedownHandler);
208
228
  divElement.removeEventListener('mouseover', onMouseOverHandler);
229
+ divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
209
230
 
210
231
  if (markerRef.current) {
211
232
  controller.clearDrawable(markerRef.current);
@@ -28,6 +28,7 @@ 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;
31
32
  clearDrawable(drawable: Drawable): boolean;
32
33
  private dragged;
33
34
  isMapDragged(): boolean;
@@ -340,6 +340,10 @@ function (_super) {
340
340
  }
341
341
  };
342
342
 
343
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
344
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
345
+ };
346
+
343
347
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
344
348
  if (drawable && drawable.native) {
345
349
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -31,6 +31,7 @@ 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;
34
35
  clearDrawable(drawable: Drawable): boolean;
35
36
  private dragged;
36
37
  isMapDragged(): boolean;
@@ -348,6 +348,10 @@ function (_super) {
348
348
  }
349
349
  };
350
350
 
351
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
352
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
353
+ };
354
+
351
355
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
352
356
  var _this = this;
353
357
 
@@ -27,9 +27,12 @@ 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;
30
31
  private getMaxZIndex;
32
+ private getCurrentZIndex;
31
33
  setMarkerZIndex(marker: Marker, zIndex: number): void;
32
34
  markerToTheTop(marker: Marker): void;
35
+ restoreMarkerZIndex(marker: Marker): void;
33
36
  clearDrawable(drawable: Drawable): boolean;
34
37
  private dragged;
35
38
  isMapDragged(): boolean;
@@ -340,20 +340,54 @@ function (_super) {
340
340
  }
341
341
  };
342
342
 
343
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
343
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
344
344
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
345
345
  var parent_1 = marker.element.parentElement;
346
346
 
347
- if (parent_1) {
348
- parent_1.style.zIndex = String(zIndex);
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
+ NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
357
+ if (this.map && marker.element && marker.element instanceof HTMLElement) {
358
+ var parent_2 = marker.element.parentElement;
359
+
360
+ if (parent_2) {
361
+ parent_2.style.zIndex = String(zIndex);
349
362
  }
350
363
  }
351
364
  };
352
365
 
353
366
  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;
354
375
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
355
376
  };
356
377
 
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
+
357
391
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
358
392
  var _a;
359
393
 
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; //console.log('onMouseOverHandler', marker);
2753
+ var marker = markerRef.current;
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,6 +2763,25 @@ 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
+ }
2766
2785
  }; //create object
2767
2786
 
2768
2787
 
@@ -2780,10 +2799,12 @@ function MapMarkerWrapper(_a) {
2780
2799
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
2781
2800
 
2782
2801
  divElement.addEventListener('mouseover', onMouseOverHandler);
2802
+ divElement.addEventListener('mouseleave', onMouseLeaveHandler);
2783
2803
  return function () {
2784
2804
  divElement.removeEventListener('click', onClickHandler);
2785
2805
  divElement.removeEventListener('mousedown', onMousedownHandler);
2786
2806
  divElement.removeEventListener('mouseover', onMouseOverHandler);
2807
+ divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
2787
2808
 
2788
2809
  if (markerRef.current) {
2789
2810
  controller.clearDrawable(markerRef.current);
@@ -5385,7 +5406,9 @@ var WoongKonvaMarkerComponent = function (_a) {
5385
5406
  maxCacheSize = _f === void 0 ? DEFAULT_MAX_CACHE_SIZE : _f,
5386
5407
  externalSelectedItems = _a.selectedItems,
5387
5408
  externalSelectedItem = _a.selectedItem,
5388
- options = __rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem"]); // --------------------------------------------------------------------------
5409
+ _g = _a.disablePointerEvents,
5410
+ disablePointerEvents = _g === void 0 ? false : _g,
5411
+ options = __rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disablePointerEvents"]); // --------------------------------------------------------------------------
5389
5412
  // Hooks & Context
5390
5413
  // --------------------------------------------------------------------------
5391
5414
 
@@ -5460,12 +5483,6 @@ var WoongKonvaMarkerComponent = function (_a) {
5460
5483
  x: 0,
5461
5484
  y: 0
5462
5485
  }); // --------------------------------------------------------------------------
5463
- // Event Handler Refs (클로저 문제 방지)
5464
- // --------------------------------------------------------------------------
5465
-
5466
- var onClickRef = useRef(onClick);
5467
- var onMouseOverRef = useRef(onMouseOver);
5468
- var onMouseOutRef = useRef(onMouseOut); // --------------------------------------------------------------------------
5469
5486
  // Performance Refs (캐싱 & 최적화)
5470
5487
  // --------------------------------------------------------------------------
5471
5488
 
@@ -5756,9 +5773,9 @@ var WoongKonvaMarkerComponent = function (_a) {
5756
5773
 
5757
5774
  var doRenderEvent = function () {
5758
5775
  var layer = eventLayerRef.current;
5759
- if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
5776
+ if (!layer) return;
5760
5777
 
5761
- if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
5778
+ if (!onClick && !onMouseOver && !onMouseOut) {
5762
5779
  layer.destroyChildren();
5763
5780
  layer.batchDraw();
5764
5781
  return;
@@ -5962,7 +5979,7 @@ var WoongKonvaMarkerComponent = function (_a) {
5962
5979
 
5963
5980
 
5964
5981
  var setHovered = function (data) {
5965
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
5982
+ if (!onMouseOver && !onMouseOut) return;
5966
5983
  hoveredItemRef.current = data;
5967
5984
 
5968
5985
  if (draggingRef.current) {
@@ -5987,7 +6004,7 @@ var WoongKonvaMarkerComponent = function (_a) {
5987
6004
 
5988
6005
 
5989
6006
  var handleLocalClick = function (data) {
5990
- if (!onClickRef.current) return; // 1. 선택 상태 업데이트
6007
+ if (!onClick) return; // 1. 선택 상태 업데이트
5991
6008
 
5992
6009
  if (enableMultiSelect) {
5993
6010
  // 다중 선택: Set과 Map 동시 업데이트
@@ -6038,7 +6055,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6038
6055
  var handleClick = function (event) {
6039
6056
  var _a;
6040
6057
 
6041
- if (!onClickRef.current) return;
6058
+ if (!onClick) return;
6042
6059
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6043
6060
 
6044
6061
  try {
@@ -6047,7 +6064,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6047
6064
 
6048
6065
  if (data) {
6049
6066
  handleLocalClick(data);
6050
- onClickRef.current(data, selectedIdsRef.current);
6067
+ onClick(data, selectedIdsRef.current);
6051
6068
  }
6052
6069
  } catch (error) {
6053
6070
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -6061,7 +6078,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6061
6078
  var handleMouseMove = function (event) {
6062
6079
  var _a;
6063
6080
 
6064
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6081
+ if (!onMouseOver && !onMouseOut) return;
6065
6082
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6066
6083
 
6067
6084
  try {
@@ -6071,8 +6088,8 @@ var WoongKonvaMarkerComponent = function (_a) {
6071
6088
 
6072
6089
  if (prevHovered !== hoveredItem) {
6073
6090
  setHovered(hoveredItem);
6074
- if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
6075
- if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
6091
+ if (prevHovered && onMouseOut) onMouseOut(prevHovered);
6092
+ if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
6076
6093
  }
6077
6094
  } catch (error) {
6078
6095
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -6102,7 +6119,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6102
6119
 
6103
6120
 
6104
6121
  var handleMouseLeave = function () {
6105
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6122
+ if (!onMouseOver && !onMouseOut) return;
6106
6123
  var prevHovered = hoveredItemRef.current;
6107
6124
 
6108
6125
  if (prevHovered) {
@@ -6110,8 +6127,8 @@ var WoongKonvaMarkerComponent = function (_a) {
6110
6127
  controller.setMapCursor('grab');
6111
6128
  doRenderEvent();
6112
6129
 
6113
- if (onMouseOutRef.current) {
6114
- onMouseOutRef.current(prevHovered);
6130
+ if (onMouseOut) {
6131
+ onMouseOut(prevHovered);
6115
6132
  }
6116
6133
  }
6117
6134
  }; // --------------------------------------------------------------------------
@@ -6212,20 +6229,13 @@ var WoongKonvaMarkerComponent = function (_a) {
6212
6229
  controller.addEventListener('IDLE', handleIdle);
6213
6230
  controller.addEventListener('ZOOMSTART', handleZoomStart);
6214
6231
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
6215
- controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
6216
-
6217
- if (onClick) {
6218
- controller.addEventListener('CLICK', handleClick);
6219
- } // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
6220
-
6221
-
6222
- if (onMouseOver || onMouseOut) {
6223
- controller.addEventListener('MOUSEMOVE', handleMouseMove);
6224
- mapDiv.addEventListener('mouseleave', handleMouseLeave);
6225
- }
6226
-
6232
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
6233
+ controller.addEventListener('CLICK', handleClick);
6234
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
6227
6235
  controller.addEventListener('DRAGSTART', handleDragStart);
6228
- controller.addEventListener('DRAGEND', handleDragEnd);
6236
+ controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
6237
+
6238
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
6229
6239
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
6230
6240
 
6231
6241
  var componentInstance = null;
@@ -6263,18 +6273,11 @@ var WoongKonvaMarkerComponent = function (_a) {
6263
6273
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
6264
6274
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
6265
6275
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
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
-
6276
+ controller.removeEventListener('CLICK', handleClick);
6277
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6276
6278
  controller.removeEventListener('DRAGSTART', handleDragStart);
6277
- controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
6279
+ controller.removeEventListener('DRAGEND', handleDragEnd);
6280
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
6278
6281
 
6279
6282
  if (context && componentInstance) {
6280
6283
  context.unregisterComponent(componentInstance);
@@ -6291,18 +6294,6 @@ var WoongKonvaMarkerComponent = function (_a) {
6291
6294
  spatialIndexRef.current.clear();
6292
6295
  };
6293
6296
  }, []); // --------------------------------------------------------------------------
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]); // --------------------------------------------------------------------------
6306
6297
  // Lifecycle: 외부 selectedItems 동기화
6307
6298
  // --------------------------------------------------------------------------
6308
6299
 
@@ -6393,23 +6384,15 @@ var WoongKonvaMarkerComponent = function (_a) {
6393
6384
 
6394
6385
  renderAllImmediate();
6395
6386
  }, [markers]);
6396
- var hasAnyHandler = onClick || onMouseOver || onMouseOut;
6397
6387
  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", {
6406
6388
  ref: containerRef,
6407
6389
  style: {
6408
6390
  position: 'absolute',
6409
6391
  width: '100%',
6410
- height: '100%'
6392
+ height: '100%',
6393
+ pointerEvents: disablePointerEvents ? 'none' : 'auto'
6411
6394
  }
6412
- })), divElement);
6395
+ }), divElement);
6413
6396
  };
6414
6397
  /**
6415
6398
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -6417,29 +6400,53 @@ var WoongKonvaMarkerComponent = function (_a) {
6417
6400
  * 비교 전략:
6418
6401
  * 1. markers 배열 비교
6419
6402
  * 2. selectedItems 배열 비교 (외부 제어)
6420
- * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
6421
6403
  *
6422
6404
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
6423
6405
  */
6424
6406
 
6425
6407
 
6426
6408
  var WoongKonvaMarker = React.memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6427
- // markers 배열 비교 (참조 비교)
6428
- if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
6409
+ // 1. markers 비교
6410
+ var prevMarkers = prevProps.markers;
6411
+ var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
6429
6412
 
6430
- if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
6413
+ if (prevMarkers !== nextMarkers) {
6414
+ // 길이가 다르면 변경됨
6415
+ if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
6416
+
6417
+ for (var i = 0; i < prevMarkers.length; i++) {
6418
+ if (prevMarkers[i].id !== nextMarkers[i].id) {
6419
+ return false; // 변경됨 → 리렌더링
6420
+ }
6421
+ }
6422
+ } // 2. selectedItems 비교 (참조만 비교)
6431
6423
 
6432
- if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
6433
6424
 
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 등 함수 비교
6425
+ if (prevProps.selectedItems !== nextProps.selectedItems) {
6426
+ return false; // 변경됨 리렌더링
6427
+ }
6437
6428
 
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는 변경되지 않는다고 가정
6429
+ if (prevProps.selectedItem !== nextProps.selectedItem) {
6430
+ return false; // 변경됨 리렌더링
6431
+ }
6441
6432
 
6442
- return true;
6433
+ if (prevProps.onClick !== nextProps.onClick) {
6434
+ return false; // 변경됨 → 리렌더링
6435
+ }
6436
+
6437
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) {
6438
+ return false; // 변경됨 → 리렌더링
6439
+ }
6440
+
6441
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) {
6442
+ return false; // 변경됨 → 리렌더링
6443
+ }
6444
+
6445
+ if (prevProps.disablePointerEvents !== nextProps.disablePointerEvents) {
6446
+ return false; // 변경됨 → 리렌더링
6447
+ }
6448
+
6449
+ return true; // 같음 → 리렌더링 스킵
6443
6450
  });
6444
6451
 
6445
6452
  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}";
@@ -7182,20 +7189,54 @@ function (_super) {
7182
7189
  }
7183
7190
  };
7184
7191
 
7185
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7192
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
7186
7193
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
7187
7194
  var parent_1 = marker.element.parentElement;
7188
7195
 
7189
- if (parent_1) {
7190
- parent_1.style.zIndex = String(zIndex);
7196
+ if (parent_1 && parent_1.style.zIndex) {
7197
+ var zIndex = Number(parent_1.style.zIndex);
7198
+ return isNaN(zIndex) ? undefined : zIndex;
7199
+ }
7200
+ }
7201
+
7202
+ return undefined;
7203
+ };
7204
+
7205
+ NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7206
+ if (this.map && marker.element && marker.element instanceof HTMLElement) {
7207
+ var parent_2 = marker.element.parentElement;
7208
+
7209
+ if (parent_2) {
7210
+ parent_2.style.zIndex = String(zIndex);
7191
7211
  }
7192
7212
  }
7193
7213
  };
7194
7214
 
7195
7215
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
7216
+ // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
7217
+ if (this.markerOriginalZIndex !== undefined) {
7218
+ return;
7219
+ }
7220
+
7221
+ var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
7222
+
7223
+ this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
7196
7224
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
7197
7225
  };
7198
7226
 
7227
+ NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
7228
+ if (this.markerOriginalZIndex !== undefined) {
7229
+ if (this.markerOriginalZIndex === null) {
7230
+ // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
7231
+ this.setMarkerZIndex(marker, 0);
7232
+ } else {
7233
+ this.setMarkerZIndex(marker, this.markerOriginalZIndex);
7234
+ }
7235
+
7236
+ this.markerOriginalZIndex = undefined;
7237
+ }
7238
+ };
7239
+
7199
7240
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
7200
7241
  var _a;
7201
7242
 
@@ -7950,6 +7991,10 @@ function (_super) {
7950
7991
  }
7951
7992
  };
7952
7993
 
7994
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
7995
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
7996
+ };
7997
+
7953
7998
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
7954
7999
  if (drawable && drawable.native) {
7955
8000
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -8672,6 +8717,10 @@ function (_super) {
8672
8717
  }
8673
8718
  };
8674
8719
 
8720
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
8721
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
8722
+ };
8723
+
8675
8724
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
8676
8725
  var _this = this;
8677
8726
 
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; //console.log('onMouseOverHandler', marker);
2757
+ var marker = markerRef.current;
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,6 +2767,25 @@
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
+ }
2770
2789
  }; //create object
2771
2790
 
2772
2791
 
@@ -2784,10 +2803,12 @@
2784
2803
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
2785
2804
 
2786
2805
  divElement.addEventListener('mouseover', onMouseOverHandler);
2806
+ divElement.addEventListener('mouseleave', onMouseLeaveHandler);
2787
2807
  return function () {
2788
2808
  divElement.removeEventListener('click', onClickHandler);
2789
2809
  divElement.removeEventListener('mousedown', onMousedownHandler);
2790
2810
  divElement.removeEventListener('mouseover', onMouseOverHandler);
2811
+ divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
2791
2812
 
2792
2813
  if (markerRef.current) {
2793
2814
  controller.clearDrawable(markerRef.current);
@@ -5389,7 +5410,9 @@
5389
5410
  maxCacheSize = _f === void 0 ? DEFAULT_MAX_CACHE_SIZE : _f,
5390
5411
  externalSelectedItems = _a.selectedItems,
5391
5412
  externalSelectedItem = _a.selectedItem,
5392
- options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem"]); // --------------------------------------------------------------------------
5413
+ _g = _a.disablePointerEvents,
5414
+ disablePointerEvents = _g === void 0 ? false : _g,
5415
+ options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disablePointerEvents"]); // --------------------------------------------------------------------------
5393
5416
  // Hooks & Context
5394
5417
  // --------------------------------------------------------------------------
5395
5418
 
@@ -5464,12 +5487,6 @@
5464
5487
  x: 0,
5465
5488
  y: 0
5466
5489
  }); // --------------------------------------------------------------------------
5467
- // Event Handler Refs (클로저 문제 방지)
5468
- // --------------------------------------------------------------------------
5469
-
5470
- var onClickRef = React.useRef(onClick);
5471
- var onMouseOverRef = React.useRef(onMouseOver);
5472
- var onMouseOutRef = React.useRef(onMouseOut); // --------------------------------------------------------------------------
5473
5490
  // Performance Refs (캐싱 & 최적화)
5474
5491
  // --------------------------------------------------------------------------
5475
5492
 
@@ -5760,9 +5777,9 @@
5760
5777
 
5761
5778
  var doRenderEvent = function () {
5762
5779
  var layer = eventLayerRef.current;
5763
- if (!layer) return; // 이벤트 핸들러가 없으면 Event Layer를 완전히 지움
5780
+ if (!layer) return;
5764
5781
 
5765
- if (!onClickRef.current && !onMouseOverRef.current && !onMouseOutRef.current) {
5782
+ if (!onClick && !onMouseOver && !onMouseOut) {
5766
5783
  layer.destroyChildren();
5767
5784
  layer.batchDraw();
5768
5785
  return;
@@ -5966,7 +5983,7 @@
5966
5983
 
5967
5984
 
5968
5985
  var setHovered = function (data) {
5969
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
5986
+ if (!onMouseOver && !onMouseOut) return;
5970
5987
  hoveredItemRef.current = data;
5971
5988
 
5972
5989
  if (draggingRef.current) {
@@ -5991,7 +6008,7 @@
5991
6008
 
5992
6009
 
5993
6010
  var handleLocalClick = function (data) {
5994
- if (!onClickRef.current) return; // 1. 선택 상태 업데이트
6011
+ if (!onClick) return; // 1. 선택 상태 업데이트
5995
6012
 
5996
6013
  if (enableMultiSelect) {
5997
6014
  // 다중 선택: Set과 Map 동시 업데이트
@@ -6042,7 +6059,7 @@
6042
6059
  var handleClick = function (event) {
6043
6060
  var _a;
6044
6061
 
6045
- if (!onClickRef.current) return;
6062
+ if (!onClick) return;
6046
6063
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6047
6064
 
6048
6065
  try {
@@ -6051,7 +6068,7 @@
6051
6068
 
6052
6069
  if (data) {
6053
6070
  handleLocalClick(data);
6054
- onClickRef.current(data, selectedIdsRef.current);
6071
+ onClick(data, selectedIdsRef.current);
6055
6072
  }
6056
6073
  } catch (error) {
6057
6074
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -6065,7 +6082,7 @@
6065
6082
  var handleMouseMove = function (event) {
6066
6083
  var _a;
6067
6084
 
6068
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6085
+ if (!onMouseOver && !onMouseOut) return;
6069
6086
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6070
6087
 
6071
6088
  try {
@@ -6075,8 +6092,8 @@
6075
6092
 
6076
6093
  if (prevHovered !== hoveredItem) {
6077
6094
  setHovered(hoveredItem);
6078
- if (prevHovered && onMouseOutRef.current) onMouseOutRef.current(prevHovered);
6079
- if (hoveredItem && onMouseOverRef.current) onMouseOverRef.current(hoveredItem);
6095
+ if (prevHovered && onMouseOut) onMouseOut(prevHovered);
6096
+ if (hoveredItem && onMouseOver) onMouseOver(hoveredItem);
6080
6097
  }
6081
6098
  } catch (error) {
6082
6099
  console.error('[WoongKonvaMarker] handleMouseMove error:', error);
@@ -6106,7 +6123,7 @@
6106
6123
 
6107
6124
 
6108
6125
  var handleMouseLeave = function () {
6109
- if (!onMouseOverRef.current && !onMouseOutRef.current) return;
6126
+ if (!onMouseOver && !onMouseOut) return;
6110
6127
  var prevHovered = hoveredItemRef.current;
6111
6128
 
6112
6129
  if (prevHovered) {
@@ -6114,8 +6131,8 @@
6114
6131
  controller.setMapCursor('grab');
6115
6132
  doRenderEvent();
6116
6133
 
6117
- if (onMouseOutRef.current) {
6118
- onMouseOutRef.current(prevHovered);
6134
+ if (onMouseOut) {
6135
+ onMouseOut(prevHovered);
6119
6136
  }
6120
6137
  }
6121
6138
  }; // --------------------------------------------------------------------------
@@ -6216,20 +6233,13 @@
6216
6233
  controller.addEventListener('IDLE', handleIdle);
6217
6234
  controller.addEventListener('ZOOMSTART', handleZoomStart);
6218
6235
  controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
6219
- controller.addEventListener('CENTER_CHANGED', handleCenterChanged); // onClick이 있을 때만 CLICK 이벤트 등록
6220
-
6221
- if (onClick) {
6222
- controller.addEventListener('CLICK', handleClick);
6223
- } // onMouseOver/onMouseOut이 있을 때만 MOUSEMOVE 이벤트 등록
6224
-
6225
-
6226
- if (onMouseOver || onMouseOut) {
6227
- controller.addEventListener('MOUSEMOVE', handleMouseMove);
6228
- mapDiv.addEventListener('mouseleave', handleMouseLeave);
6229
- }
6230
-
6236
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
6237
+ controller.addEventListener('CLICK', handleClick);
6238
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
6231
6239
  controller.addEventListener('DRAGSTART', handleDragStart);
6232
- controller.addEventListener('DRAGEND', handleDragEnd);
6240
+ controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
6241
+
6242
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
6233
6243
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
6234
6244
 
6235
6245
  var componentInstance = null;
@@ -6267,18 +6277,11 @@
6267
6277
  controller.removeEventListener('ZOOMSTART', handleZoomStart);
6268
6278
  controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
6269
6279
  controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
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
-
6280
+ controller.removeEventListener('CLICK', handleClick);
6281
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6280
6282
  controller.removeEventListener('DRAGSTART', handleDragStart);
6281
- controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
6283
+ controller.removeEventListener('DRAGEND', handleDragEnd);
6284
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
6282
6285
 
6283
6286
  if (context && componentInstance) {
6284
6287
  context.unregisterComponent(componentInstance);
@@ -6295,18 +6298,6 @@
6295
6298
  spatialIndexRef.current.clear();
6296
6299
  };
6297
6300
  }, []); // --------------------------------------------------------------------------
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]); // --------------------------------------------------------------------------
6310
6301
  // Lifecycle: 외부 selectedItems 동기화
6311
6302
  // --------------------------------------------------------------------------
6312
6303
 
@@ -6397,23 +6388,15 @@
6397
6388
 
6398
6389
  renderAllImmediate();
6399
6390
  }, [markers]);
6400
- var hasAnyHandler = onClick || onMouseOver || onMouseOut;
6401
6391
  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", {
6410
6392
  ref: containerRef,
6411
6393
  style: {
6412
6394
  position: 'absolute',
6413
6395
  width: '100%',
6414
- height: '100%'
6396
+ height: '100%',
6397
+ pointerEvents: disablePointerEvents ? 'none' : 'auto'
6415
6398
  }
6416
- })), divElement);
6399
+ }), divElement);
6417
6400
  };
6418
6401
  /**
6419
6402
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -6421,29 +6404,53 @@
6421
6404
  * 비교 전략:
6422
6405
  * 1. markers 배열 비교
6423
6406
  * 2. selectedItems 배열 비교 (외부 제어)
6424
- * 3. 이벤트 핸들러 비교 (onClick, onMouseOver, onMouseOut)
6425
6407
  *
6426
6408
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
6427
6409
  */
6428
6410
 
6429
6411
 
6430
6412
  var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6431
- // markers 배열 비교 (참조 비교)
6432
- if (prevProps.markers !== nextProps.markers) return false; // selectedItems 배열 비교 (참조 비교)
6413
+ // 1. markers 비교
6414
+ var prevMarkers = prevProps.markers;
6415
+ var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
6433
6416
 
6434
- if (prevProps.selectedItems !== nextProps.selectedItems) return false; // selectedItem 비교 (참조 비교)
6417
+ if (prevMarkers !== nextMarkers) {
6418
+ // 길이가 다르면 변경됨
6419
+ if (prevMarkers.length !== nextMarkers.length) return false; // 각 마커의 ID 비교
6420
+
6421
+ for (var i = 0; i < prevMarkers.length; i++) {
6422
+ if (prevMarkers[i].id !== nextMarkers[i].id) {
6423
+ return false; // 변경됨 → 리렌더링
6424
+ }
6425
+ }
6426
+ } // 2. selectedItems 비교 (참조만 비교)
6435
6427
 
6436
- if (prevProps.selectedItem !== nextProps.selectedItem) return false; // 이벤트 핸들러 비교 (참조 비교)
6437
6428
 
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 등 함수 비교
6429
+ if (prevProps.selectedItems !== nextProps.selectedItems) {
6430
+ return false; // 변경됨 리렌더링
6431
+ }
6441
6432
 
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는 변경되지 않는다고 가정
6433
+ if (prevProps.selectedItem !== nextProps.selectedItem) {
6434
+ return false; // 변경됨 리렌더링
6435
+ }
6445
6436
 
6446
- return true;
6437
+ if (prevProps.onClick !== nextProps.onClick) {
6438
+ return false; // 변경됨 → 리렌더링
6439
+ }
6440
+
6441
+ if (prevProps.onMouseOver !== nextProps.onMouseOver) {
6442
+ return false; // 변경됨 → 리렌더링
6443
+ }
6444
+
6445
+ if (prevProps.onMouseOut !== nextProps.onMouseOut) {
6446
+ return false; // 변경됨 → 리렌더링
6447
+ }
6448
+
6449
+ if (prevProps.disablePointerEvents !== nextProps.disablePointerEvents) {
6450
+ return false; // 변경됨 → 리렌더링
6451
+ }
6452
+
6453
+ return true; // 같음 → 리렌더링 스킵
6447
6454
  });
6448
6455
 
6449
6456
  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}";
@@ -7186,20 +7193,54 @@
7186
7193
  }
7187
7194
  };
7188
7195
 
7189
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7196
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
7190
7197
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
7191
7198
  var parent_1 = marker.element.parentElement;
7192
7199
 
7193
- if (parent_1) {
7194
- parent_1.style.zIndex = String(zIndex);
7200
+ if (parent_1 && parent_1.style.zIndex) {
7201
+ var zIndex = Number(parent_1.style.zIndex);
7202
+ return isNaN(zIndex) ? undefined : zIndex;
7203
+ }
7204
+ }
7205
+
7206
+ return undefined;
7207
+ };
7208
+
7209
+ NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7210
+ if (this.map && marker.element && marker.element instanceof HTMLElement) {
7211
+ var parent_2 = marker.element.parentElement;
7212
+
7213
+ if (parent_2) {
7214
+ parent_2.style.zIndex = String(zIndex);
7195
7215
  }
7196
7216
  }
7197
7217
  };
7198
7218
 
7199
7219
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
7220
+ // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
7221
+ if (this.markerOriginalZIndex !== undefined) {
7222
+ return;
7223
+ }
7224
+
7225
+ var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
7226
+
7227
+ this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
7200
7228
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
7201
7229
  };
7202
7230
 
7231
+ NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
7232
+ if (this.markerOriginalZIndex !== undefined) {
7233
+ if (this.markerOriginalZIndex === null) {
7234
+ // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
7235
+ this.setMarkerZIndex(marker, 0);
7236
+ } else {
7237
+ this.setMarkerZIndex(marker, this.markerOriginalZIndex);
7238
+ }
7239
+
7240
+ this.markerOriginalZIndex = undefined;
7241
+ }
7242
+ };
7243
+
7203
7244
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
7204
7245
  var _a;
7205
7246
 
@@ -7954,6 +7995,10 @@
7954
7995
  }
7955
7996
  };
7956
7997
 
7998
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
7999
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
8000
+ };
8001
+
7957
8002
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
7958
8003
  if (drawable && drawable.native) {
7959
8004
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -8676,6 +8721,10 @@
8676
8721
  }
8677
8722
  };
8678
8723
 
8724
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
8725
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
8726
+ };
8727
+
8679
8728
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
8680
8729
  var _this = this;
8681
8730
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.8",
3
+ "version": "1.2.0-test.9",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",