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

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 (29) 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 +2 -2
  4. package/dist/components/mint-map/core/advanced/index.d.ts +1 -4
  5. package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.d.ts +227 -0
  6. package/dist/components/mint-map/core/advanced/woongCanvas/{WoongKonvaMarker.js → WoongCanvasLayer.js} +297 -215
  7. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +2 -1
  8. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +8 -7
  9. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +6 -2
  10. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +61 -0
  11. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +234 -0
  12. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +138 -16
  13. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +20 -0
  14. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +37 -7
  15. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +109 -11
  16. package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
  17. package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
  18. package/dist/components/mint-map/google/GoogleMintMapController.js +7 -1
  19. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  20. package/dist/components/mint-map/kakao/KakaoMintMapController.js +7 -1
  21. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  22. package/dist/components/mint-map/naver/NaverMintMapController.js +40 -4
  23. package/dist/index.es.js +713 -230
  24. package/dist/index.js +31 -15
  25. package/dist/index.umd.js +723 -230
  26. package/package.json +1 -1
  27. package/.claude/settings.local.json +0 -16
  28. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  29. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -48
@@ -47,11 +47,11 @@ var computePolygonOffsets = function (polygonData, controller) {
47
47
  */
48
48
 
49
49
  var computeMarkerOffset = function (markerData, controller) {
50
- if (!markerData.position || markerData.position.length === 0) {
50
+ if (!markerData.position) {
51
51
  return null;
52
52
  }
53
53
 
54
- return controller.positionToOffset(markerData.position[0]);
54
+ return controller.positionToOffset(markerData.position);
55
55
  };
56
56
  /**
57
57
  * Point-in-Polygon 알고리즘
@@ -72,18 +72,67 @@ var isPointInPolygon = function (point, polygon) {
72
72
  return inside;
73
73
  };
74
74
  /**
75
- * 폴리곤 히트 테스트
75
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
76
+ *
77
+ * 로직:
78
+ * 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
79
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
80
+ *
81
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
82
+ * - 도넛 폴리곤 A: isDonutPolygon=true
83
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
76
84
  */
77
85
 
78
86
  var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
79
87
  var polygonOffsets = getPolygonOffsets(polygonData);
80
- if (!polygonOffsets) return false;
88
+ if (!polygonOffsets) return false; // 🍩 도넛 폴리곤 처리 (isDonutPolygon === true)
81
89
 
82
- for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
83
- var multiPolygon = polygonOffsets_1[_i];
90
+ if (polygonData.isDonutPolygon) {
91
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
92
+ var multiPolygon = polygonOffsets_1[_i];
93
+ if (multiPolygon.length === 0) continue; // 외부 폴리곤만 있는 경우 (구멍 없음) - 일반 폴리곤처럼 처리
84
94
 
85
- for (var _a = 0, multiPolygon_2 = multiPolygon; _a < multiPolygon_2.length; _a++) {
86
- var polygonGroup = multiPolygon_2[_a];
95
+ if (multiPolygon.length === 1) {
96
+ if (isPointInPolygon(clickedOffset, multiPolygon[0])) {
97
+ return true;
98
+ }
99
+
100
+ continue;
101
+ } // 1. 외부 폴리곤(첫 번째)에 포함되는지 확인
102
+
103
+
104
+ var outerPolygon = multiPolygon[0];
105
+
106
+ if (!isPointInPolygon(clickedOffset, outerPolygon)) {
107
+ continue; // 외부 폴리곤 밖이면 다음 multiPolygon 확인
108
+ } // 2. 내부 구멍들(나머지)에 포함되는지 확인
109
+
110
+
111
+ for (var i = 1; i < multiPolygon.length; i++) {
112
+ var hole = multiPolygon[i];
113
+
114
+ if (isPointInPolygon(clickedOffset, hole)) {
115
+ // ❌ 구멍 안에 있음 → 이 도넛 폴리곤은 히트 안 됨
116
+ // 다른 multiPolygon 체크하지 않고 바로 false 반환
117
+ // (도넛 폴리곤의 구멍 안은 무조건 클릭 불가)
118
+ return false;
119
+ }
120
+ } // ✅ 외부 폴리곤 안 + 구멍 밖 = 히트!
121
+
122
+
123
+ return true;
124
+ }
125
+
126
+ return false;
127
+ } // 일반 폴리곤 처리 (isDonutPolygon === false 또는 undefined)
128
+
129
+
130
+ for (var _a = 0, polygonOffsets_2 = polygonOffsets; _a < polygonOffsets_2.length; _a++) {
131
+ var multiPolygon = polygonOffsets_2[_a];
132
+
133
+ for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
134
+ var polygonGroup = multiPolygon_2[_b];
135
+ if (polygonGroup.length === 0) continue;
87
136
 
88
137
  if (isPointInPolygon(clickedOffset, polygonGroup)) {
89
138
  return true;
@@ -94,7 +143,12 @@ var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffse
94
143
  return false;
95
144
  };
96
145
  /**
97
- * 마커 히트 테스트
146
+ * 마커 히트 테스트 (클릭/hover 영역 체크)
147
+ *
148
+ * 🎯 중요: 꼬리(tail)는 Hit Test 영역에서 제외됩니다!
149
+ * - markerOffset.y는 마커 최하단(꼬리 끝) 좌표
150
+ * - boxHeight는 마커 본체만 포함 (꼬리 제외)
151
+ * - tailHeight만큼 위로 올려서 본체만 Hit Test 영역으로 사용
98
152
  */
99
153
 
100
154
  var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset) {
@@ -102,14 +156,58 @@ var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset)
102
156
  if (!markerOffset) return false;
103
157
  var boxWidth = markerData.boxWidth || 50;
104
158
  var boxHeight = markerData.boxHeight || 28;
105
- var tailHeight = 6;
159
+ var tailHeight = markerData.tailHeight || 0; // 🎯 tailHeight 사용!
160
+
106
161
  var x = markerOffset.x - boxWidth / 2;
107
- var y = markerOffset.y - boxHeight - tailHeight;
162
+ var y = markerOffset.y - boxHeight - tailHeight; // 🔥 꼬리만큼 위로!
163
+
108
164
  return clickedOffset.x >= x && clickedOffset.x <= x + boxWidth && clickedOffset.y >= y && clickedOffset.y <= y + boxHeight;
109
165
  };
166
+ var hexToRgba = function (hexColor, alpha) {
167
+ if (alpha === void 0) {
168
+ alpha = 1;
169
+ } // NOTE: 입력된 hexColor에서 "#" 제거
170
+
171
+
172
+ var hex = hexColor.replace('#', ''); // NOTE: 6자리일 경우 알파 값은 사용자가 제공한 alpha 값으로 설정
173
+
174
+ if (hex.length === 6) {
175
+ var r = parseInt(hex.substring(0, 2), 16);
176
+ var g = parseInt(hex.substring(2, 4), 16);
177
+ var b = parseInt(hex.substring(4, 6), 16);
178
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
179
+ }
180
+
181
+ throw new Error('Invalid hex color format');
182
+ };
183
+ var tempCanvas = document.createElement('canvas');
184
+ var tempCtx = tempCanvas.getContext('2d');
185
+ /**
186
+ * 텍스트 박스의 너비를 계산합니다.
187
+ *
188
+ * @param {Object} params - 파라미터 객체
189
+ * @param {string} params.text - 측정할 텍스트
190
+ * @param {string} params.fontConfig - 폰트 설정 (예: 'bold 16px Arial')
191
+ * @param {number} params.padding - 텍스트 박스에 적용할 패딩 값
192
+ * @param {number} params.minWidth - 최소 너비
193
+ * @returns {number} 계산된 텍스트 박스의 너비
194
+ */
195
+
196
+ var calculateTextBoxWidth = function (_a) {
197
+ var text = _a.text,
198
+ fontConfig = _a.fontConfig,
199
+ padding = _a.padding,
200
+ minWidth = _a.minWidth;
201
+ if (!tempCtx) return 0;
202
+ tempCtx.font = fontConfig;
203
+ var textWidth = tempCtx.measureText(text).width;
204
+ return Math.max(minWidth, textWidth + padding);
205
+ };
110
206
 
207
+ exports.calculateTextBoxWidth = calculateTextBoxWidth;
111
208
  exports.computeMarkerOffset = computeMarkerOffset;
112
209
  exports.computePolygonOffsets = computePolygonOffsets;
210
+ exports.hexToRgba = hexToRgba;
113
211
  exports.isPointInMarkerData = isPointInMarkerData;
114
212
  exports.isPointInPolygon = isPointInPolygon;
115
213
  exports.isPointInPolygonData = isPointInPolygonData;
@@ -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;
@@ -20,7 +20,9 @@ var polygon = require('../core/util/polygon.js');
20
20
  require('../naver/NaverMintMapController.js');
21
21
  require('../core/advanced/canvas/CanvasMarkerClaude.js');
22
22
  require('../core/advanced/MapLoadingComponents.js');
23
- require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
23
+ require('konva');
24
+ require('../core/advanced/woongCanvas/shared/types.js');
25
+ require('../core/advanced/woongCanvas/shared/utils.js');
24
26
  require('../core/advanced/woongCanvas/shared/context.js');
25
27
  require('../core/advanced/woongCanvas/shared/performance.js');
26
28
  require('../core/wrapper/MapControlWrapper.js');
@@ -339,6 +341,10 @@ function (_super) {
339
341
  }
340
342
  };
341
343
 
344
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
345
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
346
+ };
347
+
342
348
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
343
349
  if (drawable && drawable.native) {
344
350
  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;
@@ -21,7 +21,9 @@ var polygon = require('../core/util/polygon.js');
21
21
  require('../naver/NaverMintMapController.js');
22
22
  require('../core/advanced/canvas/CanvasMarkerClaude.js');
23
23
  require('../core/advanced/MapLoadingComponents.js');
24
- require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
24
+ require('konva');
25
+ require('../core/advanced/woongCanvas/shared/types.js');
26
+ require('../core/advanced/woongCanvas/shared/utils.js');
25
27
  require('../core/advanced/woongCanvas/shared/context.js');
26
28
  require('../core/advanced/woongCanvas/shared/performance.js');
27
29
  require('../core/wrapper/MapControlWrapper.js');
@@ -347,6 +349,10 @@ function (_super) {
347
349
  }
348
350
  };
349
351
 
352
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
353
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
354
+ };
355
+
350
356
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
351
357
  var _this = this;
352
358
 
@@ -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;
@@ -20,7 +20,9 @@ require('../core/util/geo.js');
20
20
  var polygon = require('../core/util/polygon.js');
21
21
  require('../core/advanced/canvas/CanvasMarkerClaude.js');
22
22
  require('../core/advanced/MapLoadingComponents.js');
23
- require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
23
+ require('konva');
24
+ require('../core/advanced/woongCanvas/shared/types.js');
25
+ require('../core/advanced/woongCanvas/shared/utils.js');
24
26
  require('../core/advanced/woongCanvas/shared/context.js');
25
27
  require('../core/advanced/woongCanvas/shared/performance.js');
26
28
  require('../core/wrapper/MapControlWrapper.js');
@@ -339,20 +341,54 @@ function (_super) {
339
341
  }
340
342
  };
341
343
 
342
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
344
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
343
345
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
344
346
  var parent_1 = marker.element.parentElement;
345
347
 
346
- if (parent_1) {
347
- parent_1.style.zIndex = String(zIndex);
348
+ if (parent_1 && parent_1.style.zIndex) {
349
+ var zIndex = Number(parent_1.style.zIndex);
350
+ return isNaN(zIndex) ? undefined : zIndex;
351
+ }
352
+ }
353
+
354
+ return undefined;
355
+ };
356
+
357
+ NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
358
+ if (this.map && marker.element && marker.element instanceof HTMLElement) {
359
+ var parent_2 = marker.element.parentElement;
360
+
361
+ if (parent_2) {
362
+ parent_2.style.zIndex = String(zIndex);
348
363
  }
349
364
  }
350
365
  };
351
366
 
352
367
  NaverMintMapController.prototype.markerToTheTop = function (marker) {
368
+ // 이미 최상위로 올라간 상태면 (원래 zIndex가 이미 저장됨) 중복 실행 방지
369
+ if (this.markerOriginalZIndex !== undefined) {
370
+ return;
371
+ }
372
+
373
+ var currentZIndex = this.getCurrentZIndex(marker); // undefined면 null로 저장 (원래 zIndex가 없었음을 표시)
374
+
375
+ this.markerOriginalZIndex = currentZIndex !== undefined ? currentZIndex : null;
353
376
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
354
377
  };
355
378
 
379
+ NaverMintMapController.prototype.restoreMarkerZIndex = function (marker) {
380
+ if (this.markerOriginalZIndex !== undefined) {
381
+ if (this.markerOriginalZIndex === null) {
382
+ // 원래 zIndex가 없었으면 제거 (또는 초기값 0으로)
383
+ this.setMarkerZIndex(marker, 0);
384
+ } else {
385
+ this.setMarkerZIndex(marker, this.markerOriginalZIndex);
386
+ }
387
+
388
+ this.markerOriginalZIndex = undefined;
389
+ }
390
+ };
391
+
356
392
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
357
393
  var _a;
358
394