@mint-ui/map 1.2.0-test.2 → 1.2.0-test.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +7 -7
  2. package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
  3. package/dist/components/mint-map/core/MintMapCore.js +1 -0
  4. package/dist/components/mint-map/core/advanced/index.d.ts +1 -4
  5. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +16 -14
  6. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +51 -18
  7. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +1 -0
  8. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +7 -7
  9. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +21 -11
  10. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +14 -0
  11. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +5 -5
  12. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +2 -2
  13. package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
  14. package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
  15. package/dist/components/mint-map/google/GoogleMintMapController.js +5 -0
  16. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  17. package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -0
  18. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  19. package/dist/components/mint-map/naver/NaverMintMapController.js +38 -3
  20. package/dist/index.es.js +127 -25
  21. package/dist/index.js +27 -13
  22. package/dist/index.umd.js +134 -24
  23. package/package.json +1 -1
  24. package/.claude/settings.local.json +0 -16
package/dist/index.umd.js CHANGED
@@ -654,6 +654,17 @@
654
654
  var styles$1 = {"mint-map-root":"MintMapCore-module_mint-map-root__SMfwn","mint-map-container":"MintMapCore-module_mint-map-container__8MIIr"};
655
655
  styleInject__default["default"](css_248z$1);
656
656
 
657
+ /**
658
+ * 캔버스 데이터 타입 Enum
659
+ * 마커인지 폴리곤인지 구분하는 상수
660
+ */
661
+ exports.CanvasDataType = void 0;
662
+
663
+ (function (CanvasDataType) {
664
+ CanvasDataType["MARKER"] = "MARKER";
665
+ CanvasDataType["POLYGON"] = "POLYGON";
666
+ })(exports.CanvasDataType || (exports.CanvasDataType = {}));
667
+
657
668
  var Drawable =
658
669
  /** @class */
659
670
  function () {
@@ -828,11 +839,11 @@
828
839
  */
829
840
 
830
841
  var computeMarkerOffset = function (markerData, controller) {
831
- if (!markerData.position || markerData.position.length === 0) {
842
+ if (!markerData.position) {
832
843
  return null;
833
844
  }
834
845
 
835
- return controller.positionToOffset(markerData.position[0]);
846
+ return controller.positionToOffset(markerData.position);
836
847
  };
837
848
  /**
838
849
  * Point-in-Polygon 알고리즘
@@ -2694,7 +2705,7 @@
2694
2705
  var onMouseOverHandler = function (e) {
2695
2706
  var _a;
2696
2707
 
2697
- var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
2708
+ var marker = markerRef.current;
2698
2709
 
2699
2710
  if (marker) {
2700
2711
  var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
@@ -2707,6 +2718,25 @@
2707
2718
 
2708
2719
  next && topOnHover && controller.markerToTheTop(marker);
2709
2720
  }
2721
+ }; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
2722
+
2723
+
2724
+ var onMouseLeaveHandler = function (e) {
2725
+ var _a;
2726
+
2727
+ var marker = markerRef.current;
2728
+
2729
+ if (marker) {
2730
+ var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
2731
+ var next = true;
2732
+
2733
+ if (mouseOutHandler) {
2734
+ var hasNext = mouseOutHandler(e);
2735
+ hasNext !== undefined && (next = hasNext);
2736
+ }
2737
+
2738
+ next && topOnHover && controller.restoreMarkerZIndex(marker);
2739
+ }
2710
2740
  }; //create object
2711
2741
 
2712
2742
 
@@ -2724,10 +2754,12 @@
2724
2754
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
2725
2755
 
2726
2756
  divElement.addEventListener('mouseover', onMouseOverHandler);
2757
+ divElement.addEventListener('mouseleave', onMouseLeaveHandler);
2727
2758
  return function () {
2728
2759
  divElement.removeEventListener('click', onClickHandler);
2729
2760
  divElement.removeEventListener('mousedown', onMousedownHandler);
2730
2761
  divElement.removeEventListener('mouseover', onMouseOverHandler);
2762
+ divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
2731
2763
 
2732
2764
  if (markerRef.current) {
2733
2765
  controller.clearDrawable(markerRef.current);
@@ -5310,6 +5342,7 @@
5310
5342
 
5311
5343
  var WoongKonvaMarkerComponent = function (_a) {
5312
5344
  var markers = _a.markers,
5345
+ dataType = _a.dataType,
5313
5346
  onClick = _a.onClick,
5314
5347
  onMouseOver = _a.onMouseOver,
5315
5348
  onMouseOut = _a.onMouseOut,
@@ -5327,7 +5360,7 @@
5327
5360
  _f = _a.maxCacheSize,
5328
5361
  maxCacheSize = _f === void 0 ? DEFAULT_MAX_CACHE_SIZE : _f,
5329
5362
  externalSelectedItems = _a.selectedItems,
5330
- options = tslib.__rest(_a, ["markers", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
5363
+ options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
5331
5364
  // Hooks & Context
5332
5365
  // --------------------------------------------------------------------------
5333
5366
 
@@ -5361,6 +5394,9 @@
5361
5394
  /** 현재 Hover 중인 항목 */
5362
5395
 
5363
5396
  var hoveredItemRef = React.useRef(null);
5397
+ /** 마지막으로 클릭된 항목 */
5398
+
5399
+ var lastClickedItemRef = React.useRef(null);
5364
5400
  /**
5365
5401
  * 선택된 항목의 ID Set
5366
5402
  *
@@ -5444,7 +5480,7 @@
5444
5480
 
5445
5481
  if (!bbox) {
5446
5482
  // 폴리곤인 경우
5447
- if (item.paths) {
5483
+ if (dataType === exports.CanvasDataType.POLYGON) {
5448
5484
  var offsets = getOrComputePolygonOffsets(item);
5449
5485
  if (!offsets) return false; // 바운딩 박스 계산 (최적화: 직접 비교)
5450
5486
 
@@ -5552,7 +5588,7 @@
5552
5588
  for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
5553
5589
  var item = currentMarkers_1[_i];
5554
5590
 
5555
- if (item.paths) {
5591
+ if (dataType === exports.CanvasDataType.POLYGON) {
5556
5592
  // 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
5557
5593
  var offsets = getOrComputePolygonOffsets(item);
5558
5594
 
@@ -5688,6 +5724,7 @@
5688
5724
 
5689
5725
 
5690
5726
  var doRenderEvent = function () {
5727
+ if (!renderEvent) return;
5691
5728
  var layer = eventLayerRef.current;
5692
5729
  if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
5693
5730
 
@@ -5706,7 +5743,8 @@
5706
5743
  ctx: ctx,
5707
5744
  hoveredItem: hoveredItemRef.current,
5708
5745
  utils: renderUtils,
5709
- selectedItems: selectedItems
5746
+ selectedItems: selectedItems,
5747
+ lastClickedItem: lastClickedItemRef.current
5710
5748
  });
5711
5749
  },
5712
5750
  perfectDrawEnabled: false,
@@ -5838,7 +5876,7 @@
5838
5876
  if (topOnHover && hoveredItemRef.current) {
5839
5877
  var hovered = hoveredItemRef.current; // 폴리곤인 경우
5840
5878
 
5841
- if (hovered.paths) {
5879
+ if (dataType === exports.CanvasDataType.POLYGON) {
5842
5880
  if (isPointInPolygonData(offset, hovered, getOrComputePolygonOffsets)) {
5843
5881
  return hovered; // 여전히 hover된 항목 위에 있음
5844
5882
  }
@@ -5851,23 +5889,22 @@
5851
5889
  } // Spatial Index로 후보 항목만 빠르게 추출 (30,000개 → ~10개)
5852
5890
 
5853
5891
 
5854
- var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 마커 우선 체크 (마커가 폴리곤 위에 표시됨)
5892
+ var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 데이터 타입에 따라 적절한 히트 테스트 수행
5855
5893
 
5856
- for (var i = candidates.length - 1; i >= 0; i--) {
5857
- var item = candidates[i];
5894
+ if (dataType === exports.CanvasDataType.MARKER) {
5895
+ // 마커 체크
5896
+ for (var i = candidates.length - 1; i >= 0; i--) {
5897
+ var item = candidates[i];
5858
5898
 
5859
- if (!item.paths) {
5860
5899
  if (isPointInMarkerData(offset, item, getOrComputeMarkerOffset)) {
5861
5900
  return item;
5862
5901
  }
5863
5902
  }
5864
- } // 폴리곤 체크
5865
-
5866
-
5867
- for (var i = candidates.length - 1; i >= 0; i--) {
5868
- var item = candidates[i];
5903
+ } else {
5904
+ // 폴리곤 체크
5905
+ for (var i = candidates.length - 1; i >= 0; i--) {
5906
+ var item = candidates[i];
5869
5907
 
5870
- if (item.paths) {
5871
5908
  if (isPointInPolygonData(offset, item, getOrComputePolygonOffsets)) {
5872
5909
  return item;
5873
5910
  }
@@ -5911,7 +5948,9 @@
5911
5948
 
5912
5949
 
5913
5950
  var handleLocalClick = function (data) {
5914
- // 1. 선택 상태 업데이트
5951
+ // 0. 마지막 클릭 항목 저장
5952
+ lastClickedItemRef.current = data; // 1. 선택 상태 업데이트
5953
+
5915
5954
  if (enableMultiSelect) {
5916
5955
  // 다중 선택: Set과 Map 동시 업데이트
5917
5956
  var newSelected = new Set(selectedIdsRef.current);
@@ -6016,6 +6055,24 @@
6016
6055
  var handleDragEnd = function () {
6017
6056
  draggingRef.current = false;
6018
6057
  controller.setMapCursor('grab');
6058
+ };
6059
+ /**
6060
+ * 마우스가 canvas를 벗어날 때 hover cleanup
6061
+ */
6062
+
6063
+
6064
+ var handleMouseLeave = function () {
6065
+ var prevHovered = hoveredItemRef.current;
6066
+
6067
+ if (prevHovered) {
6068
+ hoveredItemRef.current = null;
6069
+ controller.setMapCursor('grab');
6070
+ doRenderEvent();
6071
+
6072
+ if (onMouseOut) {
6073
+ onMouseOut(prevHovered);
6074
+ }
6075
+ }
6019
6076
  }; // --------------------------------------------------------------------------
6020
6077
  // Lifecycle: DOM 초기화
6021
6078
  // --------------------------------------------------------------------------
@@ -6118,7 +6175,9 @@
6118
6175
  controller.addEventListener('CLICK', handleClick);
6119
6176
  controller.addEventListener('MOUSEMOVE', handleMouseMove);
6120
6177
  controller.addEventListener('DRAGSTART', handleDragStart);
6121
- controller.addEventListener('DRAGEND', handleDragEnd);
6178
+ controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
6179
+
6180
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
6122
6181
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
6123
6182
 
6124
6183
  var componentInstance = null;
@@ -6159,7 +6218,8 @@
6159
6218
  controller.removeEventListener('CLICK', handleClick);
6160
6219
  controller.removeEventListener('MOUSEMOVE', handleMouseMove);
6161
6220
  controller.removeEventListener('DRAGSTART', handleDragStart);
6162
- controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
6221
+ controller.removeEventListener('DRAGEND', handleDragEnd);
6222
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
6163
6223
 
6164
6224
  if (context && componentInstance) {
6165
6225
  context.unregisterComponent(componentInstance);
@@ -7040,20 +7100,54 @@
7040
7100
  }
7041
7101
  };
7042
7102
 
7043
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7103
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
7044
7104
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
7045
7105
  var parent_1 = marker.element.parentElement;
7046
7106
 
7047
- if (parent_1) {
7048
- parent_1.style.zIndex = String(zIndex);
7107
+ if (parent_1 && parent_1.style.zIndex) {
7108
+ var zIndex = Number(parent_1.style.zIndex);
7109
+ return isNaN(zIndex) ? undefined : zIndex;
7110
+ }
7111
+ }
7112
+
7113
+ return undefined;
7114
+ };
7115
+
7116
+ NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
7117
+ if (this.map && marker.element && marker.element instanceof HTMLElement) {
7118
+ var parent_2 = marker.element.parentElement;
7119
+
7120
+ if (parent_2) {
7121
+ parent_2.style.zIndex = String(zIndex);
7049
7122
  }
7050
7123
  }
7051
7124
  };
7052
7125
 
7053
7126
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
7127
+ // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
7128
+ if (this.markerOriginalZIndex !== undefined) {
7129
+ return;
7130
+ }
7131
+
7132
+ var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
7133
+
7134
+ this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
7054
7135
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
7055
7136
  };
7056
7137
 
7138
+ NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
7139
+ if (this.markerOriginalZIndex !== undefined) {
7140
+ if (this.markerOriginalZIndex === null) {
7141
+ // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
7142
+ this.setMarkerZIndex(marker, 0);
7143
+ } else {
7144
+ this.setMarkerZIndex(marker, this.markerOriginalZIndex);
7145
+ }
7146
+
7147
+ this.markerOriginalZIndex = undefined;
7148
+ }
7149
+ };
7150
+
7057
7151
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
7058
7152
  var _a;
7059
7153
 
@@ -7808,6 +7902,10 @@
7808
7902
  }
7809
7903
  };
7810
7904
 
7905
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
7906
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
7907
+ };
7908
+
7811
7909
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
7812
7910
  if (drawable && drawable.native) {
7813
7911
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -8530,6 +8628,10 @@
8530
8628
  }
8531
8629
  };
8532
8630
 
8631
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
8632
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
8633
+ };
8634
+
8533
8635
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
8534
8636
  var _this = this;
8535
8637
 
@@ -9095,6 +9197,8 @@
9095
9197
  exports.CanvasMarkerClaude = CanvasMarkerClaude;
9096
9198
  exports.CanvasMarkerHanquf = CanvasMarkerHanquf;
9097
9199
  exports.CircleMarker = CircleMarker;
9200
+ exports.DEFAULT_CULLING_MARGIN = DEFAULT_CULLING_MARGIN;
9201
+ exports.DEFAULT_MAX_CACHE_SIZE = DEFAULT_MAX_CACHE_SIZE;
9098
9202
  exports.Drawable = Drawable;
9099
9203
  exports.GeoCalulator = GeoCalulator;
9100
9204
  exports.GoogleMintMapController = GoogleMintMapController;
@@ -9124,6 +9228,7 @@
9124
9228
  exports.PolygonMarker = PolygonMarker;
9125
9229
  exports.Polyline = Polyline;
9126
9230
  exports.Position = Position;
9231
+ exports.SPATIAL_GRID_CELL_SIZE = SPATIAL_GRID_CELL_SIZE;
9127
9232
  exports.SVGCircle = SVGCircle;
9128
9233
  exports.SVGPolygon = SVGPolygon;
9129
9234
  exports.SVGRect = SVGRect;
@@ -9131,8 +9236,13 @@
9131
9236
  exports.SpatialHashGrid = SpatialHashGrid;
9132
9237
  exports.Status = Status;
9133
9238
  exports.WoongKonvaMarker = WoongKonvaMarker;
9239
+ exports.computeMarkerOffset = computeMarkerOffset;
9240
+ exports.computePolygonOffsets = computePolygonOffsets;
9134
9241
  exports.getClusterInfo = getClusterInfo;
9135
9242
  exports.getMapOfType = getMapOfType;
9243
+ exports.isPointInMarkerData = isPointInMarkerData;
9244
+ exports.isPointInPolygon = isPointInPolygon;
9245
+ exports.isPointInPolygonData = isPointInPolygonData;
9136
9246
  exports.log = log;
9137
9247
  exports.useKonvaMarkerContext = useKonvaMarkerContext;
9138
9248
  exports.useMarkerMoving = useMarkerMoving;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.2",
3
+ "version": "1.2.0-test.4",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",
@@ -1,16 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Read(//var/folders/7t/vchtbctx3m788mhcq9fn2x540000gn/T/TemporaryItems/NSIRD_screencaptureui_OsfFWn/**)",
5
- "Read(//Users/hans/Desktop/**)",
6
- "WebSearch",
7
- "Read(//var/folders/7t/vchtbctx3m788mhcq9fn2x540000gn/T/TemporaryItems/NSIRD_screencaptureui_4DskwH/**)",
8
- "WebFetch(domain:www.bdsplanet.com)",
9
- "mcp__ide__getDiagnostics",
10
- "Bash(npm run storybook:*)",
11
- "Read(//var/folders/7t/vchtbctx3m788mhcq9fn2x540000gn/T/TemporaryItems/NSIRD_screencaptureui_HMhrPV/**)"
12
- ],
13
- "deny": [],
14
- "ask": []
15
- }
16
- }