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

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 (60) hide show
  1. package/.eslintrc.js +11 -4
  2. package/.vscode/settings.json +32 -9
  3. package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
  4. package/dist/components/mint-map/core/MintMapCore.js +5 -6
  5. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +12 -0
  6. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +962 -0
  7. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/index.d.ts +4 -0
  8. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/types.d.ts +280 -0
  9. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +17 -0
  10. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +624 -0
  11. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/index.d.ts +4 -0
  12. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +303 -0
  13. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +1091 -0
  14. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/types.d.ts +284 -0
  15. package/dist/components/mint-map/core/advanced/canvas/CanvasMarker.d.ts +7 -0
  16. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js +7 -7
  17. package/dist/components/mint-map/core/advanced/canvas/index.d.ts +0 -1
  18. package/dist/components/mint-map/core/advanced/index.d.ts +4 -2
  19. package/dist/components/mint-map/core/advanced/shared/context.d.ts +44 -0
  20. package/dist/components/mint-map/core/advanced/shared/context.js +230 -0
  21. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  22. package/dist/components/mint-map/core/advanced/shared/helpers.js +41 -0
  23. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  24. package/dist/components/mint-map/core/advanced/shared/hooks.js +196 -0
  25. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +5 -2
  26. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +82 -0
  27. package/dist/components/mint-map/core/advanced/shared/performance.js +288 -0
  28. package/dist/components/mint-map/core/advanced/shared/types.d.ts +150 -0
  29. package/dist/components/mint-map/core/advanced/shared/types.js +31 -0
  30. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +173 -0
  31. package/dist/components/mint-map/core/advanced/shared/utils.js +382 -0
  32. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  33. package/dist/components/mint-map/core/advanced/shared/viewport.js +52 -0
  34. package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
  35. package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
  36. package/dist/components/mint-map/google/GoogleMintMapController.js +13 -8
  37. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  38. package/dist/components/mint-map/kakao/KakaoMintMapController.js +13 -8
  39. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  40. package/dist/components/mint-map/naver/NaverMintMapController.js +46 -11
  41. package/dist/index.es.js +5605 -4056
  42. package/dist/index.js +47 -27
  43. package/dist/index.umd.js +5621 -4059
  44. package/package.json +1 -1
  45. package/CLAUDE.md +0 -100
  46. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.d.ts +0 -22
  47. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.js +0 -413
  48. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  49. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -53
  50. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1123
  51. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
  52. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
  53. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +0 -164
  54. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
  55. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
  56. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
  57. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +0 -14
  58. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -31
  59. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -164
  60. package/dist/components/mint-map/core/util/geohash.js +0 -125
@@ -0,0 +1,1091 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /* eslint-disable no-restricted-syntax */
6
+
7
+ /* eslint-disable no-continue */
8
+
9
+ /* eslint-disable no-underscore-dangle */
10
+
11
+ /**
12
+ * 폴리곤 렌더링 유틸리티
13
+ *
14
+ * 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
15
+ * GeoJSON MultiPolygon 형식을 지원하며, 도넛 폴리곤(구멍이 있는 폴리곤)도 처리할 수 있습니다.
16
+ *
17
+ * 세 가지 스타일 지정 방식을 지원하는 렌더링 함수를 제공합니다:
18
+ * 1. 개별 props 방식: renderPolygonBase, renderPolygonEvent
19
+ * 2. 객체 방식: renderPolygonBaseWithObject, renderPolygonEventWithObject
20
+ * 3. 함수 방식: renderPolygonBaseWithCustomStyle, renderPolygonEventWithCustomStyle
21
+ */
22
+
23
+ /**
24
+ * 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
25
+ *
26
+ * Canvas 2D Context를 사용하여 폴리곤을 그립니다.
27
+ * 도넛 폴리곤의 경우 evenodd fill rule을 사용하여 구멍을 처리합니다.
28
+ *
29
+ * @param params 폴리곤 그리기 파라미터
30
+ *
31
+ * @remarks
32
+ * - **도넛 폴리곤 처리**:
33
+ * - 외부 폴리곤과 내부 구멍들을 같은 path에 추가
34
+ * - `fill('evenodd')`를 사용하여 구멍 뚫기
35
+ * - **일반 폴리곤 처리**: 각 폴리곤 그룹을 개별적으로 그리기
36
+ * - **성능**: O(n), n은 폴리곤의 총 좌표 수
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * drawPolygon({
41
+ * ctx,
42
+ * polygonOffsets: [[[[100, 200], [200, 200], [200, 100], [100, 100]]]],
43
+ * isDonutPolygon: false,
44
+ * fillColor: 'rgba(255, 0, 0, 0.5)',
45
+ * strokeColor: 'rgba(255, 0, 0, 1)',
46
+ * lineWidth: 2
47
+ * });
48
+ * ```
49
+ */
50
+ var drawPolygon = function (_a) {
51
+ var ctx = _a.ctx,
52
+ fillColor = _a.fillColor,
53
+ isDonutPolygon = _a.isDonutPolygon,
54
+ lineWidth = _a.lineWidth,
55
+ polygonOffsets = _a.polygonOffsets,
56
+ strokeColor = _a.strokeColor;
57
+
58
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
59
+ var multiPolygon = polygonOffsets_1[_i];
60
+
61
+ if (isDonutPolygon) {
62
+ // 도넛 폴리곤 처리: 외부 폴리곤 + 내부 구멍들을 같은 path에 추가
63
+ ctx.beginPath(); // 1. 외부 폴리곤 그리기 (첫 번째 폴리곤)
64
+
65
+ var outerPolygon = multiPolygon[0];
66
+
67
+ if (outerPolygon && outerPolygon.length > 0) {
68
+ ctx.moveTo(outerPolygon[0][0], outerPolygon[0][1]);
69
+
70
+ for (var i = 1; i < outerPolygon.length; i++) {
71
+ ctx.lineTo(outerPolygon[i][0], outerPolygon[i][1]);
72
+ }
73
+
74
+ ctx.closePath();
75
+ } // 2. 내부 폴리곤 (구멍들) 그리기 - 같은 path에 추가
76
+
77
+
78
+ for (var j = 1; j < multiPolygon.length; j++) {
79
+ var innerPolygon = multiPolygon[j];
80
+ if (innerPolygon.length === 0) continue;
81
+ ctx.moveTo(innerPolygon[0][0], innerPolygon[0][1]);
82
+
83
+ for (var i = 1; i < innerPolygon.length; i++) {
84
+ ctx.lineTo(innerPolygon[i][0], innerPolygon[i][1]);
85
+ }
86
+
87
+ ctx.closePath();
88
+ } // 3. evenodd fill rule로 구멍 뚫기
89
+
90
+
91
+ ctx.fillStyle = fillColor;
92
+ ctx.fill('evenodd'); // 4. 외곽선 그리기
93
+
94
+ ctx.strokeStyle = strokeColor;
95
+ ctx.lineWidth = lineWidth;
96
+ ctx.stroke();
97
+ } else {
98
+ // 일반 폴리곤 처리: 각 폴리곤 그룹을 개별적으로 그리기
99
+ for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
100
+ var polygonGroup = multiPolygon_1[_b];
101
+ if (!polygonGroup.length) continue;
102
+ ctx.beginPath();
103
+ var firstPoint = polygonGroup[0];
104
+ ctx.moveTo(firstPoint[0], firstPoint[1]);
105
+
106
+ for (var i = 1; i < polygonGroup.length; i++) {
107
+ var point = polygonGroup[i];
108
+ ctx.lineTo(point[0], point[1]);
109
+ }
110
+
111
+ ctx.closePath(); // 스타일 설정 및 렌더링
112
+
113
+ ctx.fillStyle = fillColor;
114
+ ctx.strokeStyle = strokeColor;
115
+ ctx.lineWidth = lineWidth;
116
+ ctx.fill();
117
+ ctx.stroke();
118
+ }
119
+ }
120
+ }
121
+ };
122
+ /**
123
+ * 폴리곤 Base 렌더링 함수 팩토리
124
+ *
125
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
126
+ * 선택되지 않은 폴리곤만 렌더링하며, 선택된 항목은 Event Layer에서 처리됩니다.
127
+ *
128
+ * @template T 폴리곤 데이터의 추가 속성 타입
129
+ * @param baseFillColor 기본 폴리곤 채우기 색상
130
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상
131
+ * @param baseLineWidth 기본 폴리곤 테두리 두께
132
+ * @returns Base Layer 렌더링 함수
133
+ *
134
+ * @remarks
135
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
136
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
137
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const renderBase = renderPolygonBase(
142
+ * 'rgba(255, 100, 100, 0.5)',
143
+ * 'rgba(200, 50, 50, 0.8)',
144
+ * 2
145
+ * );
146
+ * ```
147
+ */
148
+
149
+ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
150
+ return function (_a) {
151
+ var ctx = _a.ctx,
152
+ items = _a.items,
153
+ selectedIds = _a.selectedIds,
154
+ utils = _a.utils;
155
+
156
+ for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
157
+ var item = items_1[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
158
+
159
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
160
+
161
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
162
+
163
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
164
+ if (!polygonOffsets) continue; // 폴리곤 그리기
165
+
166
+ drawPolygon({
167
+ ctx: ctx,
168
+ fillColor: baseFillColor,
169
+ isDonutPolygon: item.isDonutPolygon || false,
170
+ lineWidth: baseLineWidth,
171
+ polygonOffsets: polygonOffsets,
172
+ strokeColor: baseStrokeColor
173
+ });
174
+ }
175
+ };
176
+ };
177
+ /**
178
+ * 폴리곤 Event 렌더링 함수 팩토리
179
+ *
180
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
181
+ * 선택된 항목, hover된 항목, 마지막 선택된 항목을 각각 다른 스타일로 렌더링합니다.
182
+ *
183
+ * @template T 폴리곤 데이터의 추가 속성 타입
184
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
185
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
186
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
187
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
188
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
189
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
190
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
191
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
192
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
193
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
194
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
195
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
196
+ * @returns Event Layer 렌더링 함수
197
+ *
198
+ * @remarks
199
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
200
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
201
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
202
+ * - hover된 항목이 선택되어 있으면 active 스타일 적용
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * const renderEvent = renderPolygonEvent(
207
+ * 'rgba(255, 100, 100, 0.5)', // baseFillColor
208
+ * 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
209
+ * 2, // baseLineWidth
210
+ * 'rgba(255, 193, 7, 0.7)', // selectedFillColor
211
+ * 'rgba(255, 152, 0, 1)', // selectedStrokeColor
212
+ * 4 // selectedLineWidth
213
+ * );
214
+ * ```
215
+ */
216
+
217
+ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
218
+ // 기본값 설정 (base 기준)
219
+ var _selectedFillColor = selectedFillColor || baseFillColor;
220
+
221
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
222
+
223
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
224
+
225
+ var _activeFillColor = activeFillColor || _selectedFillColor;
226
+
227
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
228
+
229
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
230
+
231
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
232
+
233
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
234
+
235
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
236
+
237
+ return function (_a) {
238
+ var ctx = _a.ctx,
239
+ hoveredItem = _a.hoveredItem,
240
+ selectedItem = _a.selectedItem,
241
+ selectedItems = _a.selectedItems,
242
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
243
+
244
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
245
+ return item.id;
246
+ })) : new Set();
247
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
248
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 호버된 항목 그리기 (가장 위에 표시)
249
+
250
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
251
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
252
+
253
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
254
+
255
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
256
+ drawPolygon({
257
+ ctx: ctx,
258
+ fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
259
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
260
+ lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth,
261
+ polygonOffsets: polygonOffsets,
262
+ strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor
263
+ });
264
+ } // 2. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
265
+
266
+
267
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
268
+ for (var _i = 0, selectedItems_1 = selectedItems; _i < selectedItems_1.length; _i++) {
269
+ var item = selectedItems_1[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
270
+
271
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
272
+ if (!item.paths) continue;
273
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
274
+ if (!polygonOffsets) continue;
275
+ drawPolygon({
276
+ ctx: ctx,
277
+ fillColor: _selectedFillColor,
278
+ isDonutPolygon: item.isDonutPolygon || false,
279
+ lineWidth: _selectedLineWidth,
280
+ polygonOffsets: polygonOffsets,
281
+ strokeColor: _selectedStrokeColor
282
+ });
283
+ }
284
+ } // 3. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
285
+
286
+
287
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
288
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
289
+
290
+ if (polygonOffsets) {
291
+ drawPolygon({
292
+ ctx: ctx,
293
+ fillColor: _activeFillColor,
294
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
295
+ lineWidth: _activeLineWidth,
296
+ polygonOffsets: polygonOffsets,
297
+ strokeColor: _activeStrokeColor
298
+ });
299
+ }
300
+ }
301
+ };
302
+ };
303
+ /**
304
+ * 폴리곤 Base 렌더링 함수 팩토리 (객체 방식)
305
+ *
306
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
307
+ * renderStyle 객체를 사용하여 기본 스타일을 적용합니다.
308
+ *
309
+ * @template T 폴리곤 데이터의 추가 속성 타입
310
+ * @param renderStyle 폴리곤 스타일 객체
311
+ * @returns Base Layer 렌더링 함수
312
+ *
313
+ * @remarks
314
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
315
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
316
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * const renderBase = renderPolygonBaseWithObject<MyDataType>({
321
+ * base: { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 }
322
+ * });
323
+ * ```
324
+ */
325
+
326
+ var renderPolygonBaseWithObject = function (renderStyle) {
327
+ return function (_a) {
328
+ var ctx = _a.ctx,
329
+ items = _a.items,
330
+ selectedIds = _a.selectedIds,
331
+ utils = _a.utils;
332
+
333
+ for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
334
+ var item = items_2[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
335
+
336
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
337
+
338
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
339
+
340
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
341
+ if (!polygonOffsets) continue; // Base Layer는 선택되지 않은 항목만 그리므로 base 스타일 사용
342
+
343
+ var style = renderStyle.base; // 폴리곤 그리기
344
+
345
+ drawPolygon({
346
+ ctx: ctx,
347
+ fillColor: style.fillColor,
348
+ isDonutPolygon: item.isDonutPolygon || false,
349
+ lineWidth: style.lineWidth,
350
+ polygonOffsets: polygonOffsets,
351
+ strokeColor: style.strokeColor
352
+ });
353
+ }
354
+ };
355
+ };
356
+ /**
357
+ * 폴리곤 Event 렌더링 함수 팩토리 (객체 방식)
358
+ *
359
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
360
+ * renderStyle 객체를 사용하여 개별 props 방식과 동일한 알고리즘으로 스타일을 적용합니다.
361
+ *
362
+ * @template T 폴리곤 데이터의 추가 속성 타입
363
+ * @param renderStyle 폴리곤 스타일 객체
364
+ * @returns Event Layer 렌더링 함수
365
+ *
366
+ * @remarks
367
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
368
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
369
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
370
+ * - **알고리즘**: 개별 props 방식과 동일
371
+ * - 기본값 설정: selected/active/hovered가 없으면 base 또는 상위 값 사용
372
+ * - 선택된 항목: selected 스타일
373
+ * - 마지막 선택된 항목 (호버 안 됨): active 스타일
374
+ * - 호버된 항목: 선택되어 있으면 active, 아니면 hovered 스타일
375
+ *
376
+ * @example
377
+ * ```typescript
378
+ * const renderEvent = renderPolygonEventWithObject<MyDataType>({
379
+ * base: { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 },
380
+ * selected: { fillColor: 'rgba(255, 193, 7, 0.7)', strokeColor: 'rgba(255, 152, 0, 1)', lineWidth: 4 },
381
+ * active: { fillColor: 'rgba(255, 152, 0, 0.8)', strokeColor: 'rgba(255, 87, 34, 1)', lineWidth: 5 },
382
+ * hovered: { fillColor: 'rgba(100, 150, 255, 0.8)', strokeColor: 'rgba(0, 100, 200, 1)', lineWidth: 3 }
383
+ * });
384
+ * ```
385
+ */
386
+
387
+ var renderPolygonEventWithObject = function (renderStyle) {
388
+ // 기본값 설정 (개별 props 방식과 동일한 로직)
389
+ var _selectedStyle = renderStyle.selected || renderStyle.base;
390
+
391
+ var _activeStyle = renderStyle.active || _selectedStyle;
392
+
393
+ var _hoveredStyle = renderStyle.hovered || _selectedStyle;
394
+
395
+ return function (_a) {
396
+ var ctx = _a.ctx,
397
+ hoveredItem = _a.hoveredItem,
398
+ selectedItem = _a.selectedItem,
399
+ selectedItems = _a.selectedItems,
400
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
401
+
402
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
403
+ return item.id;
404
+ })) : new Set();
405
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
406
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 호버된 항목 그리기 (가장 위에 표시)
407
+
408
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
409
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
410
+
411
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
412
+
413
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
414
+ drawPolygon({
415
+ ctx: ctx,
416
+ fillColor: isSelected ? _activeStyle.fillColor : _hoveredStyle.fillColor,
417
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
418
+ lineWidth: isSelected ? _activeStyle.lineWidth : _hoveredStyle.lineWidth,
419
+ polygonOffsets: polygonOffsets,
420
+ strokeColor: isSelected ? _activeStyle.strokeColor : _hoveredStyle.strokeColor
421
+ });
422
+ } // 2. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
423
+
424
+
425
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
426
+ for (var _i = 0, selectedItems_2 = selectedItems; _i < selectedItems_2.length; _i++) {
427
+ var item = selectedItems_2[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
428
+
429
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
430
+ if (!item.paths) continue;
431
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
432
+ if (!polygonOffsets) continue;
433
+ drawPolygon({
434
+ ctx: ctx,
435
+ fillColor: _selectedStyle.fillColor,
436
+ isDonutPolygon: item.isDonutPolygon || false,
437
+ lineWidth: _selectedStyle.lineWidth,
438
+ polygonOffsets: polygonOffsets,
439
+ strokeColor: _selectedStyle.strokeColor
440
+ });
441
+ }
442
+ } // 3. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
443
+
444
+
445
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
446
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
447
+
448
+ if (polygonOffsets) {
449
+ drawPolygon({
450
+ ctx: ctx,
451
+ fillColor: _activeStyle.fillColor,
452
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
453
+ lineWidth: _activeStyle.lineWidth,
454
+ polygonOffsets: polygonOffsets,
455
+ strokeColor: _activeStyle.strokeColor
456
+ });
457
+ }
458
+ }
459
+ };
460
+ };
461
+ /**
462
+ * 폴리곤 Base 렌더링 함수 팩토리 (커스터마이징 방식)
463
+ *
464
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
465
+ * customStyle 함수를 사용하여 각 폴리곤의 스타일을 자유롭게 커스터마이징합니다.
466
+ *
467
+ * @template T 폴리곤 데이터의 추가 속성 타입
468
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수
469
+ * @returns Base Layer 렌더링 함수
470
+ *
471
+ * @remarks
472
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
473
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
474
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
475
+ *
476
+ * @example
477
+ * ```typescript
478
+ * const renderBase = renderPolygonBaseWithCustomStyle<MyDataType>(
479
+ * (item, context) => {
480
+ * if (item.someProperty > 100) {
481
+ * return { fillColor: 'red', strokeColor: 'darkred', lineWidth: 3 };
482
+ * }
483
+ * // 아무것도 반환하지 않으면 그리지 않음
484
+ * }
485
+ * );
486
+ * ```
487
+ */
488
+
489
+ var renderPolygonBaseWithCustomStyle = function (customStyle) {
490
+ return function (_a) {
491
+ var ctx = _a.ctx,
492
+ items = _a.items,
493
+ selectedIds = _a.selectedIds,
494
+ utils = _a.utils;
495
+
496
+ for (var _i = 0, items_3 = items; _i < items_3.length; _i++) {
497
+ var item = items_3[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
498
+
499
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
500
+
501
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
502
+
503
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
504
+ if (!polygonOffsets) continue; // Base Layer는 선택되지 않은 항목만 그리므로
505
+
506
+ var context = {
507
+ isActive: false,
508
+ isHovered: false,
509
+ isSelected: false
510
+ };
511
+ var style = customStyle(item, context); // null 또는 undefined를 반환하면 그리지 않음
512
+
513
+ if (!style) continue; // 폴리곤 그리기
514
+
515
+ drawPolygon({
516
+ ctx: ctx,
517
+ fillColor: style.fillColor,
518
+ isDonutPolygon: item.isDonutPolygon || false,
519
+ lineWidth: style.lineWidth,
520
+ polygonOffsets: polygonOffsets,
521
+ strokeColor: style.strokeColor
522
+ });
523
+ }
524
+ };
525
+ };
526
+ /**
527
+ * 폴리곤 Event 렌더링 함수 팩토리 (커스터마이징 방식)
528
+ *
529
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
530
+ * customStyle 함수를 사용하여 각 폴리곤의 스타일을 자유롭게 커스터마이징합니다.
531
+ *
532
+ * @template T 폴리곤 데이터의 추가 속성 타입
533
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수
534
+ * @returns Event Layer 렌더링 함수
535
+ *
536
+ * @remarks
537
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
538
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
539
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
540
+ *
541
+ * @example
542
+ * ```typescript
543
+ * const renderEvent = renderPolygonEventWithCustomStyle<MyDataType>(
544
+ * (item, context) => {
545
+ * if (context.isActive) {
546
+ * return { fillColor: 'yellow', strokeColor: 'orange', lineWidth: 5 };
547
+ * }
548
+ * if (context.isHovered) {
549
+ * return { fillColor: 'blue', strokeColor: 'darkblue', lineWidth: 3 };
550
+ * }
551
+ * if (context.isSelected) {
552
+ * return { fillColor: 'green', strokeColor: 'darkgreen', lineWidth: 4 };
553
+ * }
554
+ * // 아무것도 반환하지 않으면 그리지 않음
555
+ * }
556
+ * );
557
+ * ```
558
+ */
559
+
560
+ var renderPolygonEventWithCustomStyle = function (customStyle) {
561
+ return function (_a) {
562
+ var ctx = _a.ctx,
563
+ hoveredItem = _a.hoveredItem,
564
+ selectedItem = _a.selectedItem,
565
+ selectedItems = _a.selectedItems,
566
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
567
+
568
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
569
+ return item.id;
570
+ })) : new Set();
571
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
572
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 호버된 항목 그리기 (가장 위에 표시)
573
+
574
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
575
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
576
+
577
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
578
+
579
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
580
+ var context = {
581
+ isActive: isSelected && hoveredItem.id === selectedItemId,
582
+ isHovered: !isSelected,
583
+ isSelected: isSelected
584
+ };
585
+ var style = customStyle(hoveredItem, context); // null 또는 undefined를 반환하면 그리지 않음
586
+
587
+ if (!style) return;
588
+ drawPolygon({
589
+ ctx: ctx,
590
+ fillColor: style.fillColor,
591
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
592
+ lineWidth: style.lineWidth,
593
+ polygonOffsets: polygonOffsets,
594
+ strokeColor: style.strokeColor
595
+ });
596
+ } // 2. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
597
+
598
+
599
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
600
+ for (var _i = 0, selectedItems_3 = selectedItems; _i < selectedItems_3.length; _i++) {
601
+ var item = selectedItems_3[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
602
+
603
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
604
+ if (!item.paths) continue;
605
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
606
+ if (!polygonOffsets) continue;
607
+ var context = {
608
+ isActive: false,
609
+ isHovered: false,
610
+ isSelected: true
611
+ };
612
+ var style = customStyle(item, context); // null 또는 undefined를 반환하면 그리지 않음
613
+
614
+ if (!style) continue;
615
+ drawPolygon({
616
+ ctx: ctx,
617
+ fillColor: style.fillColor,
618
+ isDonutPolygon: item.isDonutPolygon || false,
619
+ lineWidth: style.lineWidth,
620
+ polygonOffsets: polygonOffsets,
621
+ strokeColor: style.strokeColor
622
+ });
623
+ }
624
+ } // 3. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
625
+
626
+
627
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
628
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
629
+
630
+ if (polygonOffsets) {
631
+ var context = {
632
+ isActive: true,
633
+ isHovered: false,
634
+ isSelected: true
635
+ };
636
+ var style = customStyle(selectedItem, context); // null 또는 undefined를 반환하면 그리지 않음
637
+
638
+ if (!style) return;
639
+ drawPolygon({
640
+ ctx: ctx,
641
+ fillColor: style.fillColor,
642
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
643
+ lineWidth: style.lineWidth,
644
+ polygonOffsets: polygonOffsets,
645
+ strokeColor: style.strokeColor
646
+ });
647
+ }
648
+ }
649
+ };
650
+ };
651
+ /**
652
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
653
+ *
654
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
655
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
656
+ *
657
+ * @template T 폴리곤 데이터의 추가 속성 타입
658
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
659
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
660
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
661
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
662
+ * @returns Base Layer 렌더링 함수
663
+ */
664
+
665
+ var renderPolygonBaseWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth) {
666
+ return function (_a) {
667
+ var ctx = _a.ctx,
668
+ items = _a.items,
669
+ selectedIds = _a.selectedIds,
670
+ utils = _a.utils;
671
+
672
+ for (var _i = 0, items_4 = items; _i < items_4.length; _i++) {
673
+ var item = items_4[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
674
+
675
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
676
+
677
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
678
+
679
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
680
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
681
+
682
+ var style = void 0;
683
+
684
+ if (customStyle) {
685
+ var context = {
686
+ isActive: false,
687
+ isHovered: false,
688
+ isSelected: false
689
+ };
690
+ style = customStyle(item, context);
691
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
692
+
693
+
694
+ if (!style) {
695
+ style = {
696
+ fillColor: baseFillColor,
697
+ lineWidth: baseLineWidth,
698
+ strokeColor: baseStrokeColor
699
+ };
700
+ } // 폴리곤 그리기
701
+
702
+
703
+ drawPolygon({
704
+ ctx: ctx,
705
+ fillColor: style.fillColor,
706
+ isDonutPolygon: item.isDonutPolygon || false,
707
+ lineWidth: style.lineWidth,
708
+ polygonOffsets: polygonOffsets,
709
+ strokeColor: style.strokeColor
710
+ });
711
+ }
712
+ };
713
+ };
714
+ /**
715
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
716
+ *
717
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
718
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
719
+ *
720
+ * @template T 폴리곤 데이터의 추가 속성 타입
721
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
722
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
723
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
724
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
725
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (fallback용)
726
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (fallback용)
727
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (fallback용)
728
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (fallback용)
729
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (fallback용)
730
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (fallback용)
731
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (fallback용)
732
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (fallback용)
733
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (fallback용)
734
+ * @returns Event Layer 렌더링 함수
735
+ */
736
+
737
+ var renderPolygonEventWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
738
+ // 기본값 설정 (base 기준)
739
+ var _selectedFillColor = selectedFillColor || baseFillColor;
740
+
741
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
742
+
743
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
744
+
745
+ var _activeFillColor = activeFillColor || _selectedFillColor;
746
+
747
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
748
+
749
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
750
+
751
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
752
+
753
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
754
+
755
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
756
+
757
+ return function (_a) {
758
+ var ctx = _a.ctx,
759
+ hoveredItem = _a.hoveredItem,
760
+ selectedItem = _a.selectedItem,
761
+ selectedItems = _a.selectedItems,
762
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
763
+
764
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
765
+ return item.id;
766
+ })) : new Set();
767
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
768
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 호버된 항목 그리기 (가장 위에 표시)
769
+
770
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
771
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
772
+
773
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
774
+
775
+ var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
776
+
777
+ var style = void 0;
778
+
779
+ if (customStyle) {
780
+ var context = {
781
+ isActive: isSelected && hoveredItem.id === selectedItemId,
782
+ isHovered: !isSelected,
783
+ isSelected: isSelected
784
+ };
785
+ style = customStyle(hoveredItem, context);
786
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
787
+
788
+
789
+ if (!style) {
790
+ style = {
791
+ fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
792
+ lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth,
793
+ strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor
794
+ };
795
+ }
796
+
797
+ drawPolygon({
798
+ ctx: ctx,
799
+ fillColor: style.fillColor,
800
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
801
+ lineWidth: style.lineWidth,
802
+ polygonOffsets: polygonOffsets,
803
+ strokeColor: style.strokeColor
804
+ });
805
+ } // 2. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
806
+
807
+
808
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
809
+ for (var _i = 0, selectedItems_4 = selectedItems; _i < selectedItems_4.length; _i++) {
810
+ var item = selectedItems_4[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
811
+
812
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
813
+ if (!item.paths) continue;
814
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
815
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
816
+
817
+ var style = void 0;
818
+
819
+ if (customStyle) {
820
+ var context = {
821
+ isActive: false,
822
+ isHovered: false,
823
+ isSelected: true
824
+ };
825
+ style = customStyle(item, context);
826
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
827
+
828
+
829
+ if (!style) {
830
+ style = {
831
+ fillColor: _selectedFillColor,
832
+ lineWidth: _selectedLineWidth,
833
+ strokeColor: _selectedStrokeColor
834
+ };
835
+ }
836
+
837
+ drawPolygon({
838
+ ctx: ctx,
839
+ fillColor: style.fillColor,
840
+ isDonutPolygon: item.isDonutPolygon || false,
841
+ lineWidth: style.lineWidth,
842
+ polygonOffsets: polygonOffsets,
843
+ strokeColor: style.strokeColor
844
+ });
845
+ }
846
+ } // 3. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
847
+
848
+
849
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
850
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
851
+
852
+ if (polygonOffsets) {
853
+ // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
854
+ var style = void 0;
855
+
856
+ if (customStyle) {
857
+ var context = {
858
+ isActive: true,
859
+ isHovered: false,
860
+ isSelected: true
861
+ };
862
+ style = customStyle(selectedItem, context);
863
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
864
+
865
+
866
+ if (!style) {
867
+ style = {
868
+ fillColor: _activeFillColor,
869
+ lineWidth: _activeLineWidth,
870
+ strokeColor: _activeStrokeColor
871
+ };
872
+ }
873
+
874
+ drawPolygon({
875
+ ctx: ctx,
876
+ fillColor: style.fillColor,
877
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
878
+ lineWidth: style.lineWidth,
879
+ polygonOffsets: polygonOffsets,
880
+ strokeColor: style.strokeColor
881
+ });
882
+ }
883
+ }
884
+ };
885
+ };
886
+ /**
887
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
888
+ *
889
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
890
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
891
+ *
892
+ * @template T 폴리곤 데이터의 추가 속성 타입
893
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
894
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
895
+ * @returns Base Layer 렌더링 함수
896
+ */
897
+
898
+ var renderPolygonBaseWithHybridObject = function (customStyle, renderStyle) {
899
+ return function (_a) {
900
+ var ctx = _a.ctx,
901
+ items = _a.items,
902
+ selectedIds = _a.selectedIds,
903
+ utils = _a.utils;
904
+
905
+ for (var _i = 0, items_5 = items; _i < items_5.length; _i++) {
906
+ var item = items_5[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
907
+
908
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
909
+
910
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
911
+
912
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
913
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
914
+
915
+ var style = void 0;
916
+
917
+ if (customStyle) {
918
+ var context = {
919
+ isActive: false,
920
+ isHovered: false,
921
+ isSelected: false
922
+ };
923
+ style = customStyle(item, context);
924
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
925
+
926
+
927
+ if (!style) {
928
+ style = renderStyle.base;
929
+ } // 폴리곤 그리기
930
+
931
+
932
+ drawPolygon({
933
+ ctx: ctx,
934
+ fillColor: style.fillColor,
935
+ isDonutPolygon: item.isDonutPolygon || false,
936
+ lineWidth: style.lineWidth,
937
+ polygonOffsets: polygonOffsets,
938
+ strokeColor: style.strokeColor
939
+ });
940
+ }
941
+ };
942
+ };
943
+ /**
944
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
945
+ *
946
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
947
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
948
+ *
949
+ * @template T 폴리곤 데이터의 추가 속성 타입
950
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
951
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
952
+ * @returns Event Layer 렌더링 함수
953
+ */
954
+
955
+ var renderPolygonEventWithHybridObject = function (customStyle, renderStyle) {
956
+ // 기본값 설정 (개별 props 방식과 동일한 로직)
957
+ var _selectedStyle = renderStyle.selected || renderStyle.base;
958
+
959
+ var _activeStyle = renderStyle.active || _selectedStyle;
960
+
961
+ var _hoveredStyle = renderStyle.hovered || _selectedStyle;
962
+
963
+ return function (_a) {
964
+ var ctx = _a.ctx,
965
+ hoveredItem = _a.hoveredItem,
966
+ selectedItem = _a.selectedItem,
967
+ selectedItems = _a.selectedItems,
968
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
969
+
970
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
971
+ return item.id;
972
+ })) : new Set();
973
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
974
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 호버된 항목 그리기 (가장 위에 표시)
975
+
976
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
977
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
978
+
979
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
980
+
981
+ var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
982
+
983
+ var style = void 0;
984
+
985
+ if (customStyle) {
986
+ var context = {
987
+ isActive: isSelected && hoveredItem.id === selectedItemId,
988
+ isHovered: !isSelected,
989
+ isSelected: isSelected
990
+ };
991
+ style = customStyle(hoveredItem, context);
992
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
993
+
994
+
995
+ if (!style) {
996
+ style = isSelected ? _activeStyle : _hoveredStyle;
997
+ }
998
+
999
+ drawPolygon({
1000
+ ctx: ctx,
1001
+ fillColor: style.fillColor,
1002
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
1003
+ lineWidth: style.lineWidth,
1004
+ polygonOffsets: polygonOffsets,
1005
+ strokeColor: style.strokeColor
1006
+ });
1007
+ } // 2. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
1008
+
1009
+
1010
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
1011
+ for (var _i = 0, selectedItems_5 = selectedItems; _i < selectedItems_5.length; _i++) {
1012
+ var item = selectedItems_5[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
1013
+
1014
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
1015
+ if (!item.paths) continue;
1016
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
1017
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
1018
+
1019
+ var style = void 0;
1020
+
1021
+ if (customStyle) {
1022
+ var context = {
1023
+ isActive: false,
1024
+ isHovered: false,
1025
+ isSelected: true
1026
+ };
1027
+ style = customStyle(item, context);
1028
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
1029
+
1030
+
1031
+ if (!style) {
1032
+ style = _selectedStyle;
1033
+ }
1034
+
1035
+ drawPolygon({
1036
+ ctx: ctx,
1037
+ fillColor: style.fillColor,
1038
+ isDonutPolygon: item.isDonutPolygon || false,
1039
+ lineWidth: style.lineWidth,
1040
+ polygonOffsets: polygonOffsets,
1041
+ strokeColor: style.strokeColor
1042
+ });
1043
+ }
1044
+ } // 3. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
1045
+
1046
+
1047
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
1048
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
1049
+
1050
+ if (polygonOffsets) {
1051
+ // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
1052
+ var style = void 0;
1053
+
1054
+ if (customStyle) {
1055
+ var context = {
1056
+ isActive: true,
1057
+ isHovered: false,
1058
+ isSelected: true
1059
+ };
1060
+ style = customStyle(selectedItem, context);
1061
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
1062
+
1063
+
1064
+ if (!style) {
1065
+ style = _activeStyle;
1066
+ }
1067
+
1068
+ drawPolygon({
1069
+ ctx: ctx,
1070
+ fillColor: style.fillColor,
1071
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
1072
+ lineWidth: style.lineWidth,
1073
+ polygonOffsets: polygonOffsets,
1074
+ strokeColor: style.strokeColor
1075
+ });
1076
+ }
1077
+ }
1078
+ };
1079
+ };
1080
+
1081
+ exports.drawPolygon = drawPolygon;
1082
+ exports.renderPolygonBase = renderPolygonBase;
1083
+ exports.renderPolygonBaseWithCustomStyle = renderPolygonBaseWithCustomStyle;
1084
+ exports.renderPolygonBaseWithHybrid = renderPolygonBaseWithHybrid;
1085
+ exports.renderPolygonBaseWithHybridObject = renderPolygonBaseWithHybridObject;
1086
+ exports.renderPolygonBaseWithObject = renderPolygonBaseWithObject;
1087
+ exports.renderPolygonEvent = renderPolygonEvent;
1088
+ exports.renderPolygonEventWithCustomStyle = renderPolygonEventWithCustomStyle;
1089
+ exports.renderPolygonEventWithHybrid = renderPolygonEventWithHybrid;
1090
+ exports.renderPolygonEventWithHybridObject = renderPolygonEventWithHybridObject;
1091
+ exports.renderPolygonEventWithObject = renderPolygonEventWithObject;