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

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 (32) 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} +338 -237
  7. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +12 -1
  8. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +81 -12
  9. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +85 -14
  10. package/dist/components/mint-map/core/advanced/woongCanvas/shared/index.d.ts +11 -0
  11. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +62 -13
  12. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +62 -13
  13. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +115 -0
  14. package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +288 -0
  15. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +138 -16
  16. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +20 -0
  17. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +162 -10
  18. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +235 -14
  19. package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
  20. package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
  21. package/dist/components/mint-map/google/GoogleMintMapController.js +7 -1
  22. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  23. package/dist/components/mint-map/kakao/KakaoMintMapController.js +7 -1
  24. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  25. package/dist/components/mint-map/naver/NaverMintMapController.js +40 -4
  26. package/dist/index.es.js +1078 -283
  27. package/dist/index.js +35 -15
  28. package/dist/index.umd.js +1091 -283
  29. package/package.json +1 -1
  30. package/.claude/settings.local.json +0 -16
  31. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  32. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -48
@@ -0,0 +1,288 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * @fileoverview 폴리곤 렌더링을 위한 유틸리티 및 팩토리 함수
7
+ *
8
+ * 이 파일은 WoongCanvasLayer의 POLYGON 모드에서 사용하는 폴리곤 렌더링
9
+ * 함수들을 제공합니다. 다양한 상태(기본, 선택, 호버)에 따른 렌더링과
10
+ * 도넛 폴리곤(구멍이 있는 폴리곤) 지원을 포함합니다.
11
+ *
12
+ * ## 주요 기능
13
+ * - **폴리곤 그리기**: Canvas 2D API를 사용한 폴리곤 렌더링
14
+ * - **도넛 폴리곤 지원**: evenodd fill rule을 사용한 구멍 처리
15
+ * - **상태별 렌더링**: 기본/선택/호버 상태에 따른 색상 및 스타일 적용
16
+ * - **팩토리 함수**: 렌더링 함수를 쉽게 생성할 수 있는 헬퍼
17
+ *
18
+ * @version 2.2.1
19
+ * @since 2.0.0
20
+ * @author 박건웅
21
+ */
22
+
23
+ /**
24
+ * 폴리곤 그리기 헬퍼 함수
25
+ *
26
+ * Canvas 2D API를 사용하여 폴리곤을 그리는 핵심 함수입니다.
27
+ * 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
28
+ *
29
+ * @param ctx - Canvas 2D 렌더링 컨텍스트
30
+ * @param polygonOffsets - 변환된 폴리곤 좌표 배열
31
+ * @param isDonutPolygon - 도넛 폴리곤 여부
32
+ * @param fillColor - 채우기 색상
33
+ * @param strokeColor - 테두리 색상
34
+ * @param lineWidth - 테두리 두께
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * drawPolygon({
39
+ * ctx,
40
+ * polygonOffsets: [[[[100, 200], [200, 200], [200, 300], [100, 300]]]],
41
+ * isDonutPolygon: false,
42
+ * fillColor: 'rgba(255, 0, 0, 0.5)',
43
+ * strokeColor: 'rgba(255, 0, 0, 1)',
44
+ * lineWidth: 2
45
+ * });
46
+ * ```
47
+ */
48
+ var drawPolygon = function (_a) {
49
+ var ctx = _a.ctx,
50
+ polygonOffsets = _a.polygonOffsets,
51
+ isDonutPolygon = _a.isDonutPolygon,
52
+ fillColor = _a.fillColor,
53
+ strokeColor = _a.strokeColor,
54
+ lineWidth = _a.lineWidth;
55
+
56
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
57
+ var multiPolygon = polygonOffsets_1[_i];
58
+
59
+ if (isDonutPolygon) {
60
+ ctx.beginPath(); // 1. 외부 폴리곤 그리기
61
+
62
+ if (multiPolygon[0] && multiPolygon[0].length > 0) {
63
+ ctx.moveTo(multiPolygon[0][0][0], multiPolygon[0][0][1]);
64
+
65
+ for (var i = 1; i < multiPolygon[0].length; i++) {
66
+ ctx.lineTo(multiPolygon[0][i][0], multiPolygon[0][i][1]);
67
+ }
68
+
69
+ ctx.closePath();
70
+ } // 2. 내부 폴리곤 (구멍들) 그리기 - 같은 path에 추가
71
+
72
+
73
+ for (var j = 1; j < multiPolygon.length; j++) {
74
+ var innerPolygon = multiPolygon[j];
75
+ if (innerPolygon.length === 0) continue;
76
+ ctx.moveTo(innerPolygon[0][0], innerPolygon[0][1]);
77
+
78
+ for (var i = 1; i < innerPolygon.length; i++) {
79
+ ctx.lineTo(innerPolygon[i][0], innerPolygon[i][1]);
80
+ }
81
+
82
+ ctx.closePath();
83
+ } // 3. evenodd fill rule로 구멍 뚫기
84
+
85
+
86
+ ctx.fillStyle = fillColor;
87
+ ctx.fill('evenodd'); // 4. 외곽선 그리기
88
+
89
+ ctx.strokeStyle = strokeColor;
90
+ ctx.lineWidth = lineWidth;
91
+ ctx.stroke();
92
+ } else {
93
+ // 일반 폴리곤
94
+ for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
95
+ var polygonGroup = multiPolygon_1[_b];
96
+ if (!polygonGroup.length) continue;
97
+ ctx.beginPath();
98
+ var firstPoint = polygonGroup[0];
99
+ ctx.moveTo(firstPoint[0], firstPoint[1]);
100
+
101
+ for (var i = 1; i < polygonGroup.length; i++) {
102
+ var point = polygonGroup[i];
103
+ ctx.lineTo(point[0], point[1]);
104
+ }
105
+
106
+ ctx.closePath();
107
+ ctx.fillStyle = fillColor;
108
+ ctx.strokeStyle = strokeColor;
109
+ ctx.lineWidth = lineWidth;
110
+ ctx.fill();
111
+ ctx.stroke();
112
+ }
113
+ }
114
+ }
115
+ };
116
+ /**
117
+ * 폴리곤 Base Layer 렌더링 함수 팩토리
118
+ *
119
+ * 기본 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
120
+ * 선택된 폴리곤들은 Event Layer에서 렌더링되므로 제외됩니다.
121
+ *
122
+ * @param baseFillColor - 기본 폴리곤 채우기 색상
123
+ * @param baseStrokeColor - 기본 폴리곤 테두리 색상
124
+ * @param baseLineWidth - 기본 폴리곤 테두리 두께
125
+ * @returns Base Layer 렌더링 함수
126
+ *
127
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const renderBase = renderPolygonBase(
132
+ * 'rgba(255, 100, 100, 0.5)', // 기본 채우기 색상
133
+ * 'rgba(200, 50, 50, 0.8)', // 기본 테두리 색상
134
+ * 2 // 기본 테두리 두께
135
+ * );
136
+ * ```
137
+ */
138
+
139
+ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
140
+ return function (_a) {
141
+ var ctx = _a.ctx,
142
+ items = _a.items,
143
+ selectedIds = _a.selectedIds,
144
+ utils = _a.utils;
145
+
146
+ for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
147
+ var item = items_1[_i]; // 선택된 항목은 Event Layer에서 그림
148
+
149
+ if (selectedIds.has(item.id)) continue;
150
+ if (!item.paths) continue;
151
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
152
+ if (!polygonOffsets) continue;
153
+ drawPolygon({
154
+ ctx: ctx,
155
+ polygonOffsets: polygonOffsets,
156
+ isDonutPolygon: item.isDonutPolygon || false,
157
+ fillColor: baseFillColor,
158
+ strokeColor: baseStrokeColor,
159
+ lineWidth: baseLineWidth
160
+ });
161
+ }
162
+ };
163
+ };
164
+ /**
165
+ * 폴리곤 Event Layer 렌더링 함수 팩토리
166
+ *
167
+ * 선택, 호버, 활성 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
168
+ * 다양한 상태에 따른 색상과 스타일을 지원하며, fallback 메커니즘을 제공합니다.
169
+ *
170
+ * ## 상태별 렌더링 우선순위
171
+ * 1. **Hovered**: 마우스가 올라간 폴리곤 (최우선)
172
+ * 2. **Active**: 마지막으로 선택된 폴리곤
173
+ * 3. **Selected**: 선택된 폴리곤들
174
+ * 4. **Base**: 기본 상태 (fallback)
175
+ *
176
+ * @param baseFillColor - 기본 폴리곤 채우기 색상 (필수, fallback용)
177
+ * @param baseStrokeColor - 기본 폴리곤 테두리 색상 (필수, fallback용)
178
+ * @param baseLineWidth - 기본 폴리곤 테두리 두께 (필수, fallback용)
179
+ * @param selectedFillColor - 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
180
+ * @param selectedStrokeColor - 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
181
+ * @param selectedLineWidth - 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
182
+ * @param activeFillColor - 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
183
+ * @param activeStrokeColor - 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
184
+ * @param activeLineWidth - 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
185
+ * @param hoveredFillColor - Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
186
+ * @param hoveredStrokeColor - Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
187
+ * @param hoveredLineWidth - Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
188
+ * @returns Event Layer 렌더링 함수
189
+ *
190
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const renderEvent = renderPolygonEvent(
195
+ * 'rgba(255, 100, 100, 0.5)', // baseFillColor
196
+ * 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
197
+ * 2, // baseLineWidth
198
+ * 'rgba(255, 193, 7, 0.7)', // selectedFillColor
199
+ * 'rgba(255, 152, 0, 1)', // selectedStrokeColor
200
+ * 4 // selectedLineWidth
201
+ * );
202
+ * ```
203
+ */
204
+
205
+ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
206
+ // 기본값 설정 (base 기준)
207
+ var _selectedFillColor = selectedFillColor || baseFillColor;
208
+
209
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
210
+
211
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
212
+
213
+ var _activeFillColor = activeFillColor || _selectedFillColor;
214
+
215
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
216
+
217
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
218
+
219
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
220
+
221
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
222
+
223
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
224
+
225
+ return function (_a) {
226
+ var ctx = _a.ctx,
227
+ hoveredItem = _a.hoveredItem,
228
+ utils = _a.utils,
229
+ selectedItems = _a.selectedItems,
230
+ selectedItem = _a.selectedItem; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
231
+
232
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
233
+ for (var _i = 0, selectedItems_1 = selectedItems; _i < selectedItems_1.length; _i++) {
234
+ var item = selectedItems_1[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
235
+
236
+ if (item.id === (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id) || (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id) === item.id) continue;
237
+ if (!item.paths) continue;
238
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
239
+ if (!polygonOffsets) continue;
240
+ drawPolygon({
241
+ ctx: ctx,
242
+ polygonOffsets: polygonOffsets,
243
+ isDonutPolygon: item.isDonutPolygon || false,
244
+ fillColor: _selectedFillColor,
245
+ strokeColor: _selectedStrokeColor,
246
+ lineWidth: _selectedLineWidth
247
+ });
248
+ }
249
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
250
+
251
+
252
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id) !== selectedItem.id) {
253
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
254
+
255
+ if (polygonOffsets) {
256
+ drawPolygon({
257
+ ctx: ctx,
258
+ polygonOffsets: polygonOffsets,
259
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
260
+ fillColor: _activeFillColor,
261
+ strokeColor: _activeStrokeColor,
262
+ lineWidth: _activeLineWidth
263
+ });
264
+ }
265
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
266
+
267
+
268
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
269
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
270
+ if (!polygonOffsets) return;
271
+ var isSelected = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.some(function (item) {
272
+ return item.id === hoveredItem.id;
273
+ });
274
+ drawPolygon({
275
+ ctx: ctx,
276
+ polygonOffsets: polygonOffsets,
277
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
278
+ fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
279
+ strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor,
280
+ lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth
281
+ });
282
+ }
283
+ };
284
+ };
285
+
286
+ exports.drawPolygon = drawPolygon;
287
+ exports.renderPolygonBase = renderPolygonBase;
288
+ exports.renderPolygonEvent = renderPolygonEvent;
@@ -1,25 +1,51 @@
1
1
  import Konva from "konva";
2
2
  import { Position, Offset } from "../../../../types";
3
3
  /**
4
- * 폴리곤 경로 정의
4
+ * 캔버스 데이터 타입 Enum
5
+ * 마커인지 폴리곤인지 구분하는 상수
6
+ *
7
+ * @enum {string}
8
+ * @memberof WoongCanvasLayer
9
+ */
10
+ export declare enum CanvasDataType {
11
+ /** 마커 타입 - 커스텀 렌더링 필요 */
12
+ MARKER = "MARKER",
13
+ /** 폴리곤 타입 - 자동 렌더링 지원 */
14
+ POLYGON = "POLYGON"
15
+ }
16
+ /**
17
+ * 폴리곤 경로 정의 (GeoJSON MultiPolygon 형식)
18
+ *
19
+ * @interface Paths
20
+ * @memberof WoongCanvasLayer
5
21
  */
6
22
  export interface Paths {
23
+ /** GeoJSON 타입 (MultiPolygon) */
7
24
  type: string;
25
+ /** 4차원 좌표 배열 [MultiPolygon][Polygon][Point][x/y] */
8
26
  coordinates: number[][][][];
9
27
  }
10
28
  /**
11
- * 캔버스 마커/폴리곤 기본 옵션
12
- */
13
- /**
14
- * 캔버스 마커/폴리곤의 기본 필수 속성
29
+ * Konva 캔버스 마커/폴리곤의 기본 필수 속성
15
30
  * (렌더링에 필요한 최소 정보)
31
+ *
32
+ * @interface KonvaCanvasOption
33
+ * @memberof WoongCanvasLayer
16
34
  */
17
- export interface CanvasMarkerOption {
35
+ export interface KonvaCanvasOption {
36
+ /** 고유 식별자 */
18
37
  id: string;
19
- position: Position[];
38
+ /** 지도상 위치 (위경도) */
39
+ position: Position;
40
+ /** 마커 본체 너비 (Hit Test 영역) */
20
41
  boxWidth?: number;
42
+ /** 마커 본체 높이 (Hit Test 영역) */
21
43
  boxHeight?: number;
44
+ /** 마커 꼬리 높이 (Viewport Culling용, Hit Test에서는 제외) */
45
+ tailHeight?: number;
46
+ /** 폴리곤 경로 (GeoJSON MultiPolygon) */
22
47
  paths?: Paths;
48
+ /** 도넛 폴리곤 여부 (구멍이 있는 폴리곤) */
23
49
  isDonutPolygon?: boolean;
24
50
  }
25
51
  /**
@@ -27,16 +53,110 @@ export interface CanvasMarkerOption {
27
53
  * @template T 서버에서 받은 원본 데이터 타입 (예: Marker, Polygon)
28
54
  * @example
29
55
  * // API에서 받은 Marker 타입을 그대로 유지하면서 캔버스 렌더링 정보 추가
30
- * type MarkerWithCanvas = CanvasMarkerData<Marker>
56
+ * type MarkerWithCanvas = KonvaCanvasData<Marker>
31
57
  * // { raId, lat, lng, buildingName, totalArea } + { id, position, boxWidth, ... }
32
58
  */
33
- export declare type CanvasMarkerData<T = {}> = T & CanvasMarkerOption;
59
+ export declare type KonvaCanvasData<T = {}> = T & KonvaCanvasOption;
34
60
  /**
35
- * 렌더링 유틸리티 함수들
61
+ * 🛠️ 렌더링 유틸리티 함수들
62
+ *
63
+ * WoongCanvasLayer가 제공하는 헬퍼 함수 모음입니다.
64
+ * 커스텀 렌더링 함수 내에서 좌표 변환 시 사용하세요.
65
+ *
66
+ * ## 주요 기능
67
+ * - **자동 캐싱**: 좌표 변환 결과를 LRU 캐시에 저장 (성능 최적화)
68
+ * - **지도 좌표 → 화면 좌표**: 위경도를 픽셀 좌표로 자동 변환
69
+ * - **null 안전성**: 변환 실패 시 null 반환 (안전한 예외 처리)
70
+ *
71
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
72
+ *
73
+ * @example
74
+ * // 마커 렌더링 예시
75
+ * const renderBase = ({ ctx, items, utils }) => {
76
+ * for (const item of items) {
77
+ * const offset = utils.getOrComputeMarkerOffset(item);
78
+ * if (!offset) continue; // 변환 실패 시 스킵
79
+ *
80
+ * ctx.fillRect(offset.x, offset.y, 50, 50);
81
+ * }
82
+ * };
83
+ *
84
+ * @example
85
+ * // 폴리곤 렌더링 예시
86
+ * const renderBase = ({ ctx, items, utils }) => {
87
+ * for (const item of items) {
88
+ * const offsets = utils.getOrComputePolygonOffsets(item);
89
+ * if (!offsets) continue;
90
+ *
91
+ * for (const multiPolygon of offsets) {
92
+ * for (const polygon of multiPolygon) {
93
+ * ctx.beginPath();
94
+ * ctx.moveTo(polygon[0][0], polygon[0][1]);
95
+ * for (let i = 1; i < polygon.length; i++) {
96
+ * ctx.lineTo(polygon[i][0], polygon[i][1]);
97
+ * }
98
+ * ctx.closePath();
99
+ * ctx.fill();
100
+ * }
101
+ * }
102
+ * }
103
+ * };
36
104
  */
37
105
  export interface RenderUtils<T> {
38
- getOrComputePolygonOffsets: (polygonData: CanvasMarkerData<T>) => number[][][][] | null;
39
- getOrComputeMarkerOffset: (markerData: CanvasMarkerData<T>) => Offset | null;
106
+ /**
107
+ * 폴리곤의 위경도 좌표를 화면 픽셀 좌표로 변환합니다.
108
+ *
109
+ * - **자동 캐싱**: 동일한 폴리곤은 캐시에서 즉시 반환 (성능 최적화)
110
+ * - **MultiPolygon 지원**: GeoJSON MultiPolygon 형식 지원
111
+ * - **Donut Polygon 지원**: 구멍이 있는 폴리곤 지원
112
+ *
113
+ * @param polygonData 폴리곤 데이터 (paths 필드 필수)
114
+ * @returns 변환된 픽셀 좌표 배열 (4차원 배열) 또는 null (변환 실패 시)
115
+ *
116
+ * @example
117
+ * const offsets = utils.getOrComputePolygonOffsets(polygonItem);
118
+ * if (!offsets) return; // 변환 실패
119
+ *
120
+ * // offsets 구조: [MultiPolygon][Polygon][Point][x/y]
121
+ * for (const multiPolygon of offsets) {
122
+ * for (const polygon of multiPolygon) {
123
+ * ctx.beginPath();
124
+ * ctx.moveTo(polygon[0][0], polygon[0][1]);
125
+ * for (let i = 1; i < polygon.length; i++) {
126
+ * ctx.lineTo(polygon[i][0], polygon[i][1]);
127
+ * }
128
+ * ctx.closePath();
129
+ * ctx.fill();
130
+ * }
131
+ * }
132
+ */
133
+ getOrComputePolygonOffsets: (polygonData: KonvaCanvasData<T>) => number[][][][] | null;
134
+ /**
135
+ * 마커의 위경도 좌표를 화면 픽셀 좌표로 변환합니다.
136
+ *
137
+ * - **자동 캐싱**: 동일한 마커는 캐시에서 즉시 반환 (성능 최적화)
138
+ * - **중심점 기준**: 반환된 좌표는 마커의 중심점 (x, y)
139
+ *
140
+ * @param markerData 마커 데이터 (position 필드 필수)
141
+ * @returns 변환된 픽셀 좌표 { x, y } 또는 null (변환 실패 시)
142
+ *
143
+ * @example
144
+ * const offset = utils.getOrComputeMarkerOffset(markerItem);
145
+ * if (!offset) return; // 변환 실패
146
+ *
147
+ * // offset.x, offset.y는 화면 픽셀 좌표
148
+ * const boxWidth = markerItem.boxWidth || 60;
149
+ * const boxHeight = markerItem.boxHeight || 75;
150
+ *
151
+ * // 중앙 정렬, 하단 기준으로 그리기
152
+ * ctx.fillRect(
153
+ * offset.x - boxWidth / 2,
154
+ * offset.y - boxHeight,
155
+ * boxWidth,
156
+ * boxHeight
157
+ * );
158
+ */
159
+ getOrComputeMarkerOffset: (markerData: KonvaCanvasData<T>) => Offset | null;
40
160
  }
41
161
  /**
42
162
  * 커스텀 렌더링 함수 파라미터 - Base Layer
@@ -45,7 +165,7 @@ export interface RenderBaseParams<T> {
45
165
  /** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
46
166
  ctx: CanvasRenderingContext2D;
47
167
  /** 렌더링할 마커 데이터 배열 */
48
- items: CanvasMarkerData<T>[];
168
+ items: KonvaCanvasData<T>[];
49
169
  /** 현재 선택된 마커 ID Set */
50
170
  selectedIds: Set<string>;
51
171
  /** 렌더링 유틸리티 함수들 */
@@ -75,7 +195,7 @@ export interface RenderAnimationParams<T> {
75
195
  /** 현재 선택된 마커 ID Set */
76
196
  selectedIds: Set<string>;
77
197
  /** 전체 마커 데이터 배열 */
78
- items: CanvasMarkerData<T>[];
198
+ items: KonvaCanvasData<T>[];
79
199
  /** 렌더링 유틸리티 함수들 */
80
200
  utils: RenderUtils<T>;
81
201
  }
@@ -98,11 +218,13 @@ export interface RenderEventParams<T> {
98
218
  /** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
99
219
  ctx: CanvasRenderingContext2D;
100
220
  /** 현재 hover된 마커 데이터 */
101
- hoveredItem: CanvasMarkerData<T> | null;
221
+ hoveredItem: KonvaCanvasData<T> | null;
102
222
  /** 렌더링 유틸리티 함수들 */
103
223
  utils: RenderUtils<T>;
104
224
  /** 현재 선택된 마커 데이터 배열 (선택 강조용) */
105
- selectedItems?: CanvasMarkerData<T>[];
225
+ selectedItems?: KonvaCanvasData<T>[];
226
+ /** 외부에서 전달된 단일 선택 아이템 (특별한 효과용) */
227
+ selectedItem?: KonvaCanvasData<T> | null;
106
228
  }
107
229
  /**
108
230
  * 커스텀 렌더링 함수 타입 - Event Layer
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * 캔버스 데이터 타입 Enum
7
+ * 마커인지 폴리곤인지 구분하는 상수
8
+ *
9
+ * @enum {string}
10
+ * @memberof WoongCanvasLayer
11
+ */
12
+ exports.CanvasDataType = void 0;
13
+
14
+ (function (CanvasDataType) {
15
+ /** 마커 타입 - 커스텀 렌더링 필요 */
16
+ CanvasDataType["MARKER"] = "MARKER";
17
+ /** 폴리곤 타입 - 자동 렌더링 지원 */
18
+
19
+ CanvasDataType["POLYGON"] = "POLYGON";
20
+ })(exports.CanvasDataType || (exports.CanvasDataType = {}));