@mint-ui/map 1.2.0-test.23 → 1.2.0-test.25

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 (26) hide show
  1. package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
  2. package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.d.ts +8 -73
  3. package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.js +38 -88
  4. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -10
  5. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +5 -73
  6. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +14 -81
  7. package/dist/components/mint-map/core/advanced/woongCanvas/shared/index.d.ts +0 -11
  8. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +13 -62
  9. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +13 -62
  10. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +24 -78
  11. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +23 -77
  12. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +4 -21
  13. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +0 -6
  14. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +20 -142
  15. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +23 -146
  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 +4 -0
  19. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  20. package/dist/components/mint-map/kakao/KakaoMintMapController.js +4 -0
  21. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  22. package/dist/components/mint-map/naver/NaverMintMapController.js +37 -3
  23. package/dist/index.es.js +630 -916
  24. package/dist/index.js +0 -4
  25. package/dist/index.umd.js +629 -918
  26. package/package.json +1 -1
@@ -3,49 +3,32 @@ import { Position, Offset } from "../../../../types";
3
3
  /**
4
4
  * 캔버스 데이터 타입 Enum
5
5
  * 마커인지 폴리곤인지 구분하는 상수
6
- *
7
- * @enum {string}
8
- * @memberof WoongCanvasLayer
9
6
  */
10
7
  export declare enum CanvasDataType {
11
- /** 마커 타입 - 커스텀 렌더링 필요 */
12
8
  MARKER = "MARKER",
13
- /** 폴리곤 타입 - 자동 렌더링 지원 */
14
9
  POLYGON = "POLYGON"
15
10
  }
16
11
  /**
17
- * 폴리곤 경로 정의 (GeoJSON MultiPolygon 형식)
18
- *
19
- * @interface Paths
20
- * @memberof WoongCanvasLayer
12
+ * 폴리곤 경로 정의
21
13
  */
22
14
  export interface Paths {
23
- /** GeoJSON 타입 (MultiPolygon) */
24
15
  type: string;
25
- /** 4차원 좌표 배열 [MultiPolygon][Polygon][Point][x/y] */
26
16
  coordinates: number[][][][];
27
17
  }
18
+ /**
19
+ * 캔버스 마커/폴리곤 기본 옵션
20
+ */
28
21
  /**
29
22
  * Konva 캔버스 마커/폴리곤의 기본 필수 속성
30
23
  * (렌더링에 필요한 최소 정보)
31
- *
32
- * @interface KonvaCanvasOption
33
- * @memberof WoongCanvasLayer
34
24
  */
35
25
  export interface KonvaCanvasOption {
36
- /** 고유 식별자 */
37
26
  id: string;
38
- /** 지도상 위치 (위경도) */
39
27
  position: Position;
40
- /** 마커 본체 너비 (Hit Test 영역) */
41
28
  boxWidth?: number;
42
- /** 마커 본체 높이 (Hit Test 영역) */
43
29
  boxHeight?: number;
44
- /** 마커 꼬리 높이 (Viewport Culling용, Hit Test에서는 제외) */
45
30
  tailHeight?: number;
46
- /** 폴리곤 경로 (GeoJSON MultiPolygon) */
47
31
  paths?: Paths;
48
- /** 도넛 폴리곤 여부 (구멍이 있는 폴리곤) */
49
32
  isDonutPolygon?: boolean;
50
33
  }
51
34
  /**
@@ -5,16 +5,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  /**
6
6
  * 캔버스 데이터 타입 Enum
7
7
  * 마커인지 폴리곤인지 구분하는 상수
8
- *
9
- * @enum {string}
10
- * @memberof WoongCanvasLayer
11
8
  */
12
9
  exports.CanvasDataType = void 0;
13
10
 
14
11
  (function (CanvasDataType) {
15
- /** 마커 타입 - 커스텀 렌더링 필요 */
16
12
  CanvasDataType["MARKER"] = "MARKER";
17
- /** 폴리곤 타입 - 자동 렌더링 지원 */
18
-
19
13
  CanvasDataType["POLYGON"] = "POLYGON";
20
14
  })(exports.CanvasDataType || (exports.CanvasDataType = {}));
@@ -1,171 +1,49 @@
1
- /**
2
- * @fileoverview WoongCanvasLayer를 위한 유틸리티 함수들
3
- *
4
- * 이 파일은 좌표 변환, 히트 테스트, 색상 변환 등 WoongCanvasLayer에서
5
- * 사용하는 다양한 유틸리티 함수들을 제공합니다.
6
- *
7
- * ## 주요 기능
8
- * - **좌표 변환**: 지도 좌표(위경도) ↔ 화면 좌표(픽셀) 변환
9
- * - **히트 테스트**: 마우스 클릭/호버 시 어떤 마커/폴리곤인지 찾기
10
- * - **색상 변환**: 다양한 색상 형식 간 변환
11
- * - **바운딩 박스**: 폴리곤의 경계 영역 계산
12
- *
13
- * @version 2.2.1
14
- * @since 2.0.0
15
- * @author 박건웅
16
- */
17
1
  import { Offset } from "../../../../types";
18
2
  import { MintMapController } from "../../../MintMapController";
19
3
  import { KonvaCanvasData } from "./types";
20
4
  /**
21
- * 폴리곤 좌표를 화면 좌표로 변환
22
- *
23
- * GeoJSON MultiPolygon 형식의 폴리곤 데이터를 Canvas에서 그릴 수 있는
24
- * 화면 좌표 배열로 변환합니다.
25
- *
26
- * @param polygonData - 변환할 폴리곤 데이터
27
- * @param controller - 지도 컨트롤러 (좌표 변환용)
28
- * @returns 변환된 좌표 배열 또는 null (변환 실패 시)
29
- *
30
- * @example
31
- * ```typescript
32
- * const offsets = computePolygonOffsets(polygonData, controller);
33
- * if (offsets) {
34
- * // offsets[0][0][0] = [x, y] - 첫 번째 MultiPolygon의 첫 번째 Polygon의 첫 번째 점
35
- * }
36
- * ```
5
+ * 폴리곤 offset 계산
37
6
  */
38
7
  export declare const computePolygonOffsets: (polygonData: KonvaCanvasData<any>, controller: MintMapController) => number[][][][] | null;
39
8
  /**
40
- * 마커 좌표를 화면 좌표로 변환
41
- *
42
- * 마커의 지도 좌표(위경도)를 Canvas에서 그릴 수 있는 화면 좌표로 변환합니다.
43
- *
44
- * @param markerData - 변환할 마커 데이터
45
- * @param controller - 지도 컨트롤러 (좌표 변환용)
46
- * @returns 변환된 화면 좌표 또는 null (변환 실패 시)
47
- *
48
- * @example
49
- * ```typescript
50
- * const offset = computeMarkerOffset(markerData, controller);
51
- * if (offset) {
52
- * console.log(`마커 위치: (${offset.x}, ${offset.y})`);
53
- * }
54
- * ```
9
+ * 마커 offset 계산
55
10
  */
56
11
  export declare const computeMarkerOffset: (markerData: KonvaCanvasData<any>, controller: MintMapController) => Offset | null;
57
12
  /**
58
- * Point-in-Polygon 알고리즘 (Ray Casting)
59
- *
60
- * 주어진 점이 폴리곤 내부에 있는지 확인하는 알고리즘입니다.
61
- * Ray Casting 방식을 사용하여 홀수 번 교차하면 내부, 짝수 번 교차하면 외부로 판단합니다.
62
- *
63
- * @param point - 확인할 점의 좌표
64
- * @param polygon - 폴리곤의 좌표 배열 (순서대로 연결된 점들)
65
- * @returns 점이 폴리곤 내부에 있으면 true, 외부에 있으면 false
66
- *
67
- * @example
68
- * ```typescript
69
- * const point = { x: 100, y: 100 };
70
- * const polygon = [[0, 0], [200, 0], [200, 200], [0, 200]];
71
- * const isInside = isPointInPolygon(point, polygon); // true
72
- * ```
13
+ * Point-in-Polygon 알고리즘
73
14
  */
74
15
  export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => boolean;
75
16
  /**
76
17
  * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
77
18
  *
78
- * 클릭된 좌표가 폴리곤 내부에 있는지 확인합니다.
79
- * 도넛 폴리곤(구멍이 있는 폴리곤) 지원합니다.
19
+ * 로직:
20
+ * 1. 외부 폴리곤( 번째): 내부에 있어야 함
21
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
80
22
  *
81
- * ## 도넛 폴리곤 처리 로직
82
- * 1. **외부 폴리곤(첫 번째)**: 내부에 있어야 함
83
- * 2. **내부 구멍들(나머지)**: 내부에 있으면 안 됨 (evenodd 규칙)
84
- *
85
- * ## 중요 사항
86
- * 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됩니다:
87
- * - 도넛 폴리곤 A: `isDonutPolygon=true`
88
- * - 내부 폴리곤 B: `isDonutPolygon=false` (별도 데이터)
89
- *
90
- * @param clickedOffset - 클릭된 좌표
91
- * @param polygonData - 확인할 폴리곤 데이터
92
- * @param getPolygonOffsets - 폴리곤 좌표를 가져오는 함수
93
- * @returns 클릭된 좌표가 폴리곤 내부에 있으면 true, 외부에 있으면 false
94
- *
95
- * @example
96
- * ```typescript
97
- * const isHit = isPointInPolygonData(
98
- * { x: 100, y: 100 },
99
- * polygonData,
100
- * (data) => computePolygonOffsets(data, controller)
101
- * );
102
- * ```
23
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
24
+ * - 도넛 폴리곤 A: isDonutPolygon=true
25
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
103
26
  */
104
27
  export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasData<any>, getPolygonOffsets: (data: KonvaCanvasData<any>) => number[][][][] | null) => boolean;
105
28
  /**
106
29
  * 마커 히트 테스트 (클릭/hover 영역 체크)
107
30
  *
108
- * 클릭된 좌표가 마커의 클릭 가능한 영역 내부에 있는지 확인합니다.
109
- *
110
- * ## 중요 사항
111
- * **꼬리(tail)는 Hit Test 영역에서 제외됩니다!**
112
- * - `markerOffset.y`는 마커 최하단(꼬리 끝) 좌표
113
- * - `boxHeight`는 마커 본체만 포함 (꼬리 제외)
114
- * - `tailHeight`만큼 위로 올려서 본체만 Hit Test 영역으로 사용
115
- *
116
- * @param clickedOffset - 클릭된 좌표
117
- * @param markerData - 확인할 마커 데이터
118
- * @param getMarkerOffset - 마커 좌표를 가져오는 함수
119
- * @returns 클릭된 좌표가 마커 내부에 있으면 true, 외부에 있으면 false
120
- *
121
- * @example
122
- * ```typescript
123
- * const isHit = isPointInMarkerData(
124
- * { x: 100, y: 100 },
125
- * markerData,
126
- * (data) => computeMarkerOffset(data, controller)
127
- * );
128
- * ```
31
+ * 🎯 중요: 꼬리(tail)는 Hit Test 영역에서 제외됩니다!
32
+ * - markerOffset.y는 마커 최하단(꼬리 끝) 좌표
33
+ * - boxHeight는 마커 본체만 포함 (꼬리 제외)
34
+ * - tailHeight만큼 위로 올려서 본체만 Hit Test 영역으로 사용
129
35
  */
130
36
  export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasData<any>, getMarkerOffset: (data: KonvaCanvasData<any>) => Offset | null) => boolean;
131
- /**
132
- * HEX 색상을 RGBA 색상으로 변환
133
- *
134
- * 16진수 색상 코드를 RGBA 형식으로 변환합니다.
135
- *
136
- * @param hexColor - 변환할 HEX 색상 (예: "#FF0000" 또는 "FF0000")
137
- * @param alpha - 알파 값 (0~1, 기본값: 1)
138
- * @returns RGBA 형식의 색상 문자열
139
- *
140
- * @example
141
- * ```typescript
142
- * const rgba = hexToRgba('#FF0000', 0.5); // "rgba(255, 0, 0, 0.5)"
143
- * const rgba2 = hexToRgba('FF0000', 1); // "rgba(255, 0, 0, 1)"
144
- * ```
145
- */
146
37
  export declare const hexToRgba: (hexColor: string, alpha?: number) => string;
147
38
  /**
148
- * 텍스트 박스의 너비를 계산
149
- *
150
- * Canvas 2D API의 measureText()를 사용하여 텍스트의 실제 너비를 측정하고,
151
- * 패딩과 최소 너비를 고려하여 최종 박스 너비를 계산합니다.
152
- *
153
- * @param params - 파라미터 객체
154
- * @param params.text - 측정할 텍스트
155
- * @param params.fontConfig - 폰트 설정 (예: 'bold 16px Arial')
156
- * @param params.padding - 텍스트 박스에 적용할 패딩 값
157
- * @param params.minWidth - 최소 너비
158
- * @returns 계산된 텍스트 박스의 너비
39
+ * 텍스트 박스의 너비를 계산합니다.
159
40
  *
160
- * @example
161
- * ```typescript
162
- * const width = calculateTextBoxWidth({
163
- * text: 'Hello World',
164
- * fontConfig: 'bold 16px Arial',
165
- * padding: 10,
166
- * minWidth: 50
167
- * });
168
- * ```
41
+ * @param {Object} params - 파라미터 객체
42
+ * @param {string} params.text - 측정할 텍스트
43
+ * @param {string} params.fontConfig - 폰트 설정 (예: 'bold 16px Arial')
44
+ * @param {number} params.padding - 텍스트 박스에 적용할 패딩 값
45
+ * @param {number} params.minWidth - 최소 너비
46
+ * @returns {number} 계산된 텍스트 박스의 너비
169
47
  */
170
48
  export declare const calculateTextBoxWidth: ({ text, fontConfig, padding, minWidth, }: {
171
49
  text: string;
@@ -7,38 +7,7 @@ var MapTypes = require('../../../../types/MapTypes.js');
7
7
  require('../../../../types/MapEventTypes.js');
8
8
 
9
9
  /**
10
- * @fileoverview WoongCanvasLayer를 위한 유틸리티 함수들
11
- *
12
- * 이 파일은 좌표 변환, 히트 테스트, 색상 변환 등 WoongCanvasLayer에서
13
- * 사용하는 다양한 유틸리티 함수들을 제공합니다.
14
- *
15
- * ## 주요 기능
16
- * - **좌표 변환**: 지도 좌표(위경도) ↔ 화면 좌표(픽셀) 변환
17
- * - **히트 테스트**: 마우스 클릭/호버 시 어떤 마커/폴리곤인지 찾기
18
- * - **색상 변환**: 다양한 색상 형식 간 변환
19
- * - **바운딩 박스**: 폴리곤의 경계 영역 계산
20
- *
21
- * @version 2.2.1
22
- * @since 2.0.0
23
- * @author 박건웅
24
- */
25
- /**
26
- * 폴리곤 좌표를 화면 좌표로 변환
27
- *
28
- * GeoJSON MultiPolygon 형식의 폴리곤 데이터를 Canvas에서 그릴 수 있는
29
- * 화면 좌표 배열로 변환합니다.
30
- *
31
- * @param polygonData - 변환할 폴리곤 데이터
32
- * @param controller - 지도 컨트롤러 (좌표 변환용)
33
- * @returns 변환된 좌표 배열 또는 null (변환 실패 시)
34
- *
35
- * @example
36
- * ```typescript
37
- * const offsets = computePolygonOffsets(polygonData, controller);
38
- * if (offsets) {
39
- * // offsets[0][0][0] = [x, y] - 첫 번째 MultiPolygon의 첫 번째 Polygon의 첫 번째 점
40
- * }
41
- * ```
10
+ * 폴리곤 offset 계산
42
11
  */
43
12
 
44
13
  var computePolygonOffsets = function (polygonData, controller) {
@@ -74,21 +43,7 @@ var computePolygonOffsets = function (polygonData, controller) {
74
43
  return result;
75
44
  };
76
45
  /**
77
- * 마커 좌표를 화면 좌표로 변환
78
- *
79
- * 마커의 지도 좌표(위경도)를 Canvas에서 그릴 수 있는 화면 좌표로 변환합니다.
80
- *
81
- * @param markerData - 변환할 마커 데이터
82
- * @param controller - 지도 컨트롤러 (좌표 변환용)
83
- * @returns 변환된 화면 좌표 또는 null (변환 실패 시)
84
- *
85
- * @example
86
- * ```typescript
87
- * const offset = computeMarkerOffset(markerData, controller);
88
- * if (offset) {
89
- * console.log(`마커 위치: (${offset.x}, ${offset.y})`);
90
- * }
91
- * ```
46
+ * 마커 offset 계산
92
47
  */
93
48
 
94
49
  var computeMarkerOffset = function (markerData, controller) {
@@ -99,21 +54,7 @@ var computeMarkerOffset = function (markerData, controller) {
99
54
  return controller.positionToOffset(markerData.position);
100
55
  };
101
56
  /**
102
- * Point-in-Polygon 알고리즘 (Ray Casting)
103
- *
104
- * 주어진 점이 폴리곤 내부에 있는지 확인하는 알고리즘입니다.
105
- * Ray Casting 방식을 사용하여 홀수 번 교차하면 내부, 짝수 번 교차하면 외부로 판단합니다.
106
- *
107
- * @param point - 확인할 점의 좌표
108
- * @param polygon - 폴리곤의 좌표 배열 (순서대로 연결된 점들)
109
- * @returns 점이 폴리곤 내부에 있으면 true, 외부에 있으면 false
110
- *
111
- * @example
112
- * ```typescript
113
- * const point = { x: 100, y: 100 };
114
- * const polygon = [[0, 0], [200, 0], [200, 200], [0, 200]];
115
- * const isInside = isPointInPolygon(point, polygon); // true
116
- * ```
57
+ * Point-in-Polygon 알고리즘
117
58
  */
118
59
 
119
60
  var isPointInPolygon = function (point, polygon) {
@@ -133,31 +74,13 @@ var isPointInPolygon = function (point, polygon) {
133
74
  /**
134
75
  * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
135
76
  *
136
- * 클릭된 좌표가 폴리곤 내부에 있는지 확인합니다.
137
- * 도넛 폴리곤(구멍이 있는 폴리곤) 지원합니다.
138
- *
139
- * ## 도넛 폴리곤 처리 로직
140
- * 1. **외부 폴리곤(첫 번째)**: 내부에 있어야 함
141
- * 2. **내부 구멍들(나머지)**: 내부에 있으면 안 됨 (evenodd 규칙)
77
+ * 로직:
78
+ * 1. 외부 폴리곤( 번째): 내부에 있어야 함
79
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
142
80
  *
143
- * ## 중요 사항
144
- * 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됩니다:
145
- * - 도넛 폴리곤 A: `isDonutPolygon=true`
146
- * - 내부 폴리곤 B: `isDonutPolygon=false` (별도 데이터)
147
- *
148
- * @param clickedOffset - 클릭된 좌표
149
- * @param polygonData - 확인할 폴리곤 데이터
150
- * @param getPolygonOffsets - 폴리곤 좌표를 가져오는 함수
151
- * @returns 클릭된 좌표가 폴리곤 내부에 있으면 true, 외부에 있으면 false
152
- *
153
- * @example
154
- * ```typescript
155
- * const isHit = isPointInPolygonData(
156
- * { x: 100, y: 100 },
157
- * polygonData,
158
- * (data) => computePolygonOffsets(data, controller)
159
- * );
160
- * ```
81
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
82
+ * - 도넛 폴리곤 A: isDonutPolygon=true
83
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
161
84
  */
162
85
 
163
86
  var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
@@ -222,27 +145,10 @@ var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffse
222
145
  /**
223
146
  * 마커 히트 테스트 (클릭/hover 영역 체크)
224
147
  *
225
- * 클릭된 좌표가 마커의 클릭 가능한 영역 내부에 있는지 확인합니다.
226
- *
227
- * ## 중요 사항
228
- * **꼬리(tail)는 Hit Test 영역에서 제외됩니다!**
229
- * - `markerOffset.y`는 마커 최하단(꼬리 끝) 좌표
230
- * - `boxHeight`는 마커 본체만 포함 (꼬리 제외)
231
- * - `tailHeight`만큼 위로 올려서 본체만 Hit Test 영역으로 사용
232
- *
233
- * @param clickedOffset - 클릭된 좌표
234
- * @param markerData - 확인할 마커 데이터
235
- * @param getMarkerOffset - 마커 좌표를 가져오는 함수
236
- * @returns 클릭된 좌표가 마커 내부에 있으면 true, 외부에 있으면 false
237
- *
238
- * @example
239
- * ```typescript
240
- * const isHit = isPointInMarkerData(
241
- * { x: 100, y: 100 },
242
- * markerData,
243
- * (data) => computeMarkerOffset(data, controller)
244
- * );
245
- * ```
148
+ * 🎯 중요: 꼬리(tail)는 Hit Test 영역에서 제외됩니다!
149
+ * - markerOffset.y는 마커 최하단(꼬리 끝) 좌표
150
+ * - boxHeight는 마커 본체만 포함 (꼬리 제외)
151
+ * - tailHeight만큼 위로 올려서 본체만 Hit Test 영역으로 사용
246
152
  */
247
153
 
248
154
  var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset) {
@@ -257,29 +163,13 @@ var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset)
257
163
 
258
164
  return clickedOffset.x >= x && clickedOffset.x <= x + boxWidth && clickedOffset.y >= y && clickedOffset.y <= y + boxHeight;
259
165
  };
260
- /**
261
- * HEX 색상을 RGBA 색상으로 변환
262
- *
263
- * 16진수 색상 코드를 RGBA 형식으로 변환합니다.
264
- *
265
- * @param hexColor - 변환할 HEX 색상 (예: "#FF0000" 또는 "FF0000")
266
- * @param alpha - 알파 값 (0~1, 기본값: 1)
267
- * @returns RGBA 형식의 색상 문자열
268
- *
269
- * @example
270
- * ```typescript
271
- * const rgba = hexToRgba('#FF0000', 0.5); // "rgba(255, 0, 0, 0.5)"
272
- * const rgba2 = hexToRgba('FF0000', 1); // "rgba(255, 0, 0, 1)"
273
- * ```
274
- */
275
-
276
166
  var hexToRgba = function (hexColor, alpha) {
277
167
  if (alpha === void 0) {
278
168
  alpha = 1;
279
- } // 입력된 hexColor에서 "#" 제거
169
+ } // NOTE: 입력된 hexColor에서 "#" 제거
280
170
 
281
171
 
282
- var hex = hexColor.replace('#', ''); // 6자리일 경우 알파 값은 사용자가 제공한 alpha 값으로 설정
172
+ var hex = hexColor.replace('#', ''); // NOTE: 6자리일 경우 알파 값은 사용자가 제공한 alpha 값으로 설정
283
173
 
284
174
  if (hex.length === 6) {
285
175
  var r = parseInt(hex.substring(0, 2), 16);
@@ -293,27 +183,14 @@ var hexToRgba = function (hexColor, alpha) {
293
183
  var tempCanvas = document.createElement('canvas');
294
184
  var tempCtx = tempCanvas.getContext('2d');
295
185
  /**
296
- * 텍스트 박스의 너비를 계산
297
- *
298
- * Canvas 2D API의 measureText()를 사용하여 텍스트의 실제 너비를 측정하고,
299
- * 패딩과 최소 너비를 고려하여 최종 박스 너비를 계산합니다.
300
- *
301
- * @param params - 파라미터 객체
302
- * @param params.text - 측정할 텍스트
303
- * @param params.fontConfig - 폰트 설정 (예: 'bold 16px Arial')
304
- * @param params.padding - 텍스트 박스에 적용할 패딩 값
305
- * @param params.minWidth - 최소 너비
306
- * @returns 계산된 텍스트 박스의 너비
307
- *
308
- * @example
309
- * ```typescript
310
- * const width = calculateTextBoxWidth({
311
- * text: 'Hello World',
312
- * fontConfig: 'bold 16px Arial',
313
- * padding: 10,
314
- * minWidth: 50
315
- * });
316
- * ```
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} 계산된 텍스트 박스의 너비
317
194
  */
318
195
 
319
196
  var calculateTextBoxWidth = function (_a) {
@@ -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;
@@ -341,6 +341,10 @@ function (_super) {
341
341
  }
342
342
  };
343
343
 
344
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
345
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
346
+ };
347
+
344
348
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
345
349
  if (drawable && drawable.native) {
346
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;
@@ -349,6 +349,10 @@ function (_super) {
349
349
  }
350
350
  };
351
351
 
352
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
353
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
354
+ };
355
+
352
356
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
353
357
  var _this = this;
354
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;
@@ -341,20 +341,54 @@ function (_super) {
341
341
  }
342
342
  };
343
343
 
344
- NaverMintMapController.prototype.setMarkerZIndex = function (marker, zIndex) {
344
+ NaverMintMapController.prototype.getCurrentZIndex = function (marker) {
345
345
  if (this.map && marker.element && marker.element instanceof HTMLElement) {
346
346
  var parent_1 = marker.element.parentElement;
347
347
 
348
- if (parent_1) {
349
- 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);
350
363
  }
351
364
  }
352
365
  };
353
366
 
354
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;
355
376
  this.setMarkerZIndex(marker, this.getMaxZIndex(1));
356
377
  };
357
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
+
358
392
  NaverMintMapController.prototype.clearDrawable = function (drawable) {
359
393
  var _a;
360
394