@mint-ui/map 1.2.0-test.5 → 1.2.0-test.50

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 (49) hide show
  1. package/CLAUDE.md +0 -1
  2. package/dist/components/mint-map/core/MintMapCore.js +5 -6
  3. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +47 -0
  4. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +634 -0
  5. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/index.d.ts +3 -0
  6. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +183 -0
  7. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +593 -0
  8. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/index.d.ts +3 -0
  9. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +183 -0
  10. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +482 -0
  11. package/dist/components/mint-map/core/advanced/canvas/CanvasMarker.d.ts +7 -0
  12. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js +7 -7
  13. package/dist/components/mint-map/core/advanced/canvas/index.d.ts +0 -1
  14. package/dist/components/mint-map/core/advanced/index.d.ts +3 -1
  15. package/dist/components/mint-map/core/advanced/shared/context.d.ts +39 -0
  16. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/context.js +62 -79
  17. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  18. package/dist/components/mint-map/core/advanced/shared/helpers.js +40 -0
  19. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  20. package/dist/components/mint-map/core/advanced/shared/hooks.js +189 -0
  21. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +3 -0
  22. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +77 -0
  23. package/dist/components/mint-map/core/advanced/shared/performance.js +262 -0
  24. package/dist/components/mint-map/core/advanced/shared/types.d.ts +127 -0
  25. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/types.js +5 -1
  26. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +130 -0
  27. package/dist/components/mint-map/core/advanced/shared/utils.js +303 -0
  28. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  29. package/dist/components/mint-map/core/advanced/shared/viewport.js +51 -0
  30. package/dist/components/mint-map/google/GoogleMintMapController.js +5 -4
  31. package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -4
  32. package/dist/components/mint-map/naver/NaverMintMapController.js +5 -4
  33. package/dist/index.es.js +3064 -2682
  34. package/dist/index.js +25 -10
  35. package/dist/index.umd.js +3078 -2684
  36. package/package.json +1 -1
  37. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.d.ts +0 -22
  38. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.js +0 -413
  39. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  40. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -50
  41. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1065
  42. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
  43. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
  44. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
  45. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
  46. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
  47. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -31
  48. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -164
  49. package/dist/components/mint-map/core/util/geohash.js +0 -125
@@ -0,0 +1,183 @@
1
+ /**
2
+ * 폴리곤 렌더링 유틸리티
3
+ *
4
+ * 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
5
+ * GeoJSON MultiPolygon 형식을 지원하며, 도넛 폴리곤(구멍이 있는 폴리곤)도 처리할 수 있습니다.
6
+ */
7
+ import { CustomRenderBase, CustomRenderEvent } from "../shared/types";
8
+ import type { PolygonStyleFunction } from "./CanvasPolygonLayer";
9
+ /**
10
+ * 폴리곤 그리기 파라미터 인터페이스
11
+ */
12
+ interface DrawPolygonParams {
13
+ /** Canvas 2D 렌더링 컨텍스트 */
14
+ ctx: CanvasRenderingContext2D;
15
+ /** 변환된 폴리곤 좌표 배열 (4차원: [MultiPolygon][Polygon][Point][x/y]) */
16
+ polygonOffsets: number[][][][];
17
+ /** 도넛 폴리곤 여부 (구멍이 있는 폴리곤) */
18
+ isDonutPolygon: boolean;
19
+ /** 채우기 색상 */
20
+ fillColor: string;
21
+ /** 테두리 색상 */
22
+ strokeColor: string;
23
+ /** 테두리 두께 */
24
+ lineWidth: number;
25
+ }
26
+ /**
27
+ * 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
28
+ *
29
+ * Canvas 2D Context를 사용하여 폴리곤을 그립니다.
30
+ * 도넛 폴리곤의 경우 evenodd fill rule을 사용하여 구멍을 처리합니다.
31
+ *
32
+ * @param params 폴리곤 그리기 파라미터
33
+ *
34
+ * @remarks
35
+ * - **도넛 폴리곤 처리**:
36
+ * - 외부 폴리곤과 내부 구멍들을 같은 path에 추가
37
+ * - `fill('evenodd')`를 사용하여 구멍 뚫기
38
+ * - **일반 폴리곤 처리**: 각 폴리곤 그룹을 개별적으로 그리기
39
+ * - **성능**: O(n), n은 폴리곤의 총 좌표 수
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * drawPolygon({
44
+ * ctx,
45
+ * polygonOffsets: [[[[100, 200], [200, 200], [200, 100], [100, 100]]]],
46
+ * isDonutPolygon: false,
47
+ * fillColor: 'rgba(255, 0, 0, 0.5)',
48
+ * strokeColor: 'rgba(255, 0, 0, 1)',
49
+ * lineWidth: 2
50
+ * });
51
+ * ```
52
+ */
53
+ export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillColor, strokeColor, lineWidth }: DrawPolygonParams) => void;
54
+ /**
55
+ * 폴리곤 Base 렌더링 함수 팩토리
56
+ *
57
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
58
+ * 선택되지 않은 폴리곤만 렌더링하며, 선택된 항목은 Event Layer에서 처리됩니다.
59
+ *
60
+ * @template T 폴리곤 데이터의 추가 속성 타입
61
+ * @param baseFillColor 기본 폴리곤 채우기 색상
62
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상
63
+ * @param baseLineWidth 기본 폴리곤 테두리 두께
64
+ * @returns Base Layer 렌더링 함수
65
+ *
66
+ * @remarks
67
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
68
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
69
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const renderBase = renderPolygonBase(
74
+ * 'rgba(255, 100, 100, 0.5)',
75
+ * 'rgba(200, 50, 50, 0.8)',
76
+ * 2
77
+ * );
78
+ * ```
79
+ */
80
+ export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number) => CustomRenderBase<T>;
81
+ /**
82
+ * 폴리곤 Event 렌더링 함수 팩토리
83
+ *
84
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
85
+ * 선택된 항목, hover된 항목, 마지막 선택된 항목을 각각 다른 스타일로 렌더링합니다.
86
+ *
87
+ * @template T 폴리곤 데이터의 추가 속성 타입
88
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
89
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
90
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
91
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
92
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
93
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
94
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
95
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
96
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
97
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
98
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
99
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
100
+ * @returns Event Layer 렌더링 함수
101
+ *
102
+ * @remarks
103
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
104
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
105
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
106
+ * - hover된 항목이 선택되어 있으면 active 스타일 적용
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const renderEvent = renderPolygonEvent(
111
+ * 'rgba(255, 100, 100, 0.5)', // baseFillColor
112
+ * 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
113
+ * 2, // baseLineWidth
114
+ * 'rgba(255, 193, 7, 0.7)', // selectedFillColor
115
+ * 'rgba(255, 152, 0, 1)', // selectedStrokeColor
116
+ * 4 // selectedLineWidth
117
+ * );
118
+ * ```
119
+ */
120
+ export declare const renderPolygonEvent: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number, selectedFillColor?: string, selectedStrokeColor?: string, selectedLineWidth?: number, activeFillColor?: string, activeStrokeColor?: string, activeLineWidth?: number, hoveredFillColor?: string, hoveredStrokeColor?: string, hoveredLineWidth?: number) => CustomRenderEvent<T>;
121
+ /**
122
+ * 폴리곤 Base 렌더링 함수 팩토리 (함수 방식)
123
+ *
124
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
125
+ * renderStyle 함수를 사용하여 각 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
126
+ *
127
+ * @template T 폴리곤 데이터의 추가 속성 타입
128
+ * @param renderStyle 폴리곤 스타일 함수
129
+ * @returns Base Layer 렌더링 함수
130
+ *
131
+ * @remarks
132
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
133
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
134
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const renderBase = renderPolygonBaseWithFunction<MyDataType>(
139
+ * (item, context) => ({
140
+ * fillColor: 'rgba(255, 100, 100, 0.5)',
141
+ * strokeColor: 'rgba(200, 50, 50, 0.8)',
142
+ * lineWidth: 2
143
+ * })
144
+ * );
145
+ * ```
146
+ */
147
+ export declare const renderPolygonBaseWithFunction: <T = any>(renderStyle: PolygonStyleFunction<T>) => CustomRenderBase<T>;
148
+ /**
149
+ * 폴리곤 Event 렌더링 함수 팩토리 (함수 방식)
150
+ *
151
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
152
+ * renderStyle 함수를 사용하여 각 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
153
+ *
154
+ * @template T 폴리곤 데이터의 추가 속성 타입
155
+ * @param renderStyle 폴리곤 스타일 함수
156
+ * @returns Event Layer 렌더링 함수
157
+ *
158
+ * @remarks
159
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
160
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
161
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
162
+ * - hover된 항목이 선택되어 있으면 active 스타일 적용
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * const renderEvent = renderPolygonEventWithFunction<MyDataType>(
167
+ * (item, context) => {
168
+ * if (context.isActive) {
169
+ * return { fillColor: 'rgba(255, 152, 0, 0.8)', strokeColor: 'rgba(255, 87, 34, 1)', lineWidth: 5 };
170
+ * }
171
+ * if (context.isHovered) {
172
+ * return { fillColor: 'rgba(100, 150, 255, 0.8)', strokeColor: 'rgba(0, 100, 200, 1)', lineWidth: 3 };
173
+ * }
174
+ * if (context.isSelected) {
175
+ * return { fillColor: 'rgba(255, 193, 7, 0.7)', strokeColor: 'rgba(255, 152, 0, 1)', lineWidth: 4 };
176
+ * }
177
+ * return { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 };
178
+ * }
179
+ * );
180
+ * ```
181
+ */
182
+ export declare const renderPolygonEventWithFunction: <T = any>(renderStyle: PolygonStyleFunction<T>) => CustomRenderEvent<T>;
183
+ export {};
@@ -0,0 +1,482 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * 폴리곤 렌더링 유틸리티
7
+ *
8
+ * 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
9
+ * GeoJSON MultiPolygon 형식을 지원하며, 도넛 폴리곤(구멍이 있는 폴리곤)도 처리할 수 있습니다.
10
+ */
11
+
12
+ /**
13
+ * 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
14
+ *
15
+ * Canvas 2D Context를 사용하여 폴리곤을 그립니다.
16
+ * 도넛 폴리곤의 경우 evenodd fill rule을 사용하여 구멍을 처리합니다.
17
+ *
18
+ * @param params 폴리곤 그리기 파라미터
19
+ *
20
+ * @remarks
21
+ * - **도넛 폴리곤 처리**:
22
+ * - 외부 폴리곤과 내부 구멍들을 같은 path에 추가
23
+ * - `fill('evenodd')`를 사용하여 구멍 뚫기
24
+ * - **일반 폴리곤 처리**: 각 폴리곤 그룹을 개별적으로 그리기
25
+ * - **성능**: O(n), n은 폴리곤의 총 좌표 수
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * drawPolygon({
30
+ * ctx,
31
+ * polygonOffsets: [[[[100, 200], [200, 200], [200, 100], [100, 100]]]],
32
+ * isDonutPolygon: false,
33
+ * fillColor: 'rgba(255, 0, 0, 0.5)',
34
+ * strokeColor: 'rgba(255, 0, 0, 1)',
35
+ * lineWidth: 2
36
+ * });
37
+ * ```
38
+ */
39
+ var drawPolygon = function (_a) {
40
+ var ctx = _a.ctx,
41
+ polygonOffsets = _a.polygonOffsets,
42
+ isDonutPolygon = _a.isDonutPolygon,
43
+ fillColor = _a.fillColor,
44
+ strokeColor = _a.strokeColor,
45
+ lineWidth = _a.lineWidth;
46
+
47
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
48
+ var multiPolygon = polygonOffsets_1[_i];
49
+
50
+ if (isDonutPolygon) {
51
+ // 도넛 폴리곤 처리: 외부 폴리곤 + 내부 구멍들을 같은 path에 추가
52
+ ctx.beginPath(); // 1. 외부 폴리곤 그리기 (첫 번째 폴리곤)
53
+
54
+ var outerPolygon = multiPolygon[0];
55
+
56
+ if (outerPolygon && outerPolygon.length > 0) {
57
+ ctx.moveTo(outerPolygon[0][0], outerPolygon[0][1]);
58
+
59
+ for (var i = 1; i < outerPolygon.length; i++) {
60
+ ctx.lineTo(outerPolygon[i][0], outerPolygon[i][1]);
61
+ }
62
+
63
+ ctx.closePath();
64
+ } // 2. 내부 폴리곤 (구멍들) 그리기 - 같은 path에 추가
65
+
66
+
67
+ for (var j = 1; j < multiPolygon.length; j++) {
68
+ var innerPolygon = multiPolygon[j];
69
+ if (innerPolygon.length === 0) continue;
70
+ ctx.moveTo(innerPolygon[0][0], innerPolygon[0][1]);
71
+
72
+ for (var i = 1; i < innerPolygon.length; i++) {
73
+ ctx.lineTo(innerPolygon[i][0], innerPolygon[i][1]);
74
+ }
75
+
76
+ ctx.closePath();
77
+ } // 3. evenodd fill rule로 구멍 뚫기
78
+
79
+
80
+ ctx.fillStyle = fillColor;
81
+ ctx.fill('evenodd'); // 4. 외곽선 그리기
82
+
83
+ ctx.strokeStyle = strokeColor;
84
+ ctx.lineWidth = lineWidth;
85
+ ctx.stroke();
86
+ } else {
87
+ // 일반 폴리곤 처리: 각 폴리곤 그룹을 개별적으로 그리기
88
+ for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
89
+ var polygonGroup = multiPolygon_1[_b];
90
+ if (!polygonGroup.length) continue;
91
+ ctx.beginPath();
92
+ var firstPoint = polygonGroup[0];
93
+ ctx.moveTo(firstPoint[0], firstPoint[1]);
94
+
95
+ for (var i = 1; i < polygonGroup.length; i++) {
96
+ var point = polygonGroup[i];
97
+ ctx.lineTo(point[0], point[1]);
98
+ }
99
+
100
+ ctx.closePath(); // 스타일 설정 및 렌더링
101
+
102
+ ctx.fillStyle = fillColor;
103
+ ctx.strokeStyle = strokeColor;
104
+ ctx.lineWidth = lineWidth;
105
+ ctx.fill();
106
+ ctx.stroke();
107
+ }
108
+ }
109
+ }
110
+ };
111
+ /**
112
+ * 폴리곤 Base 렌더링 함수 팩토리
113
+ *
114
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
115
+ * 선택되지 않은 폴리곤만 렌더링하며, 선택된 항목은 Event Layer에서 처리됩니다.
116
+ *
117
+ * @template T 폴리곤 데이터의 추가 속성 타입
118
+ * @param baseFillColor 기본 폴리곤 채우기 색상
119
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상
120
+ * @param baseLineWidth 기본 폴리곤 테두리 두께
121
+ * @returns Base Layer 렌더링 함수
122
+ *
123
+ * @remarks
124
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
125
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
126
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const renderBase = renderPolygonBase(
131
+ * 'rgba(255, 100, 100, 0.5)',
132
+ * 'rgba(200, 50, 50, 0.8)',
133
+ * 2
134
+ * );
135
+ * ```
136
+ */
137
+
138
+ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
139
+ return function (_a) {
140
+ var ctx = _a.ctx,
141
+ items = _a.items,
142
+ selectedIds = _a.selectedIds,
143
+ utils = _a.utils;
144
+
145
+ for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
146
+ var item = items_1[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
147
+
148
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
149
+
150
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
151
+
152
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
153
+ if (!polygonOffsets) continue; // 폴리곤 그리기
154
+
155
+ drawPolygon({
156
+ ctx: ctx,
157
+ polygonOffsets: polygonOffsets,
158
+ isDonutPolygon: item.isDonutPolygon || false,
159
+ fillColor: baseFillColor,
160
+ strokeColor: baseStrokeColor,
161
+ lineWidth: baseLineWidth
162
+ });
163
+ }
164
+ };
165
+ };
166
+ /**
167
+ * 폴리곤 Event 렌더링 함수 팩토리
168
+ *
169
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
170
+ * 선택된 항목, hover된 항목, 마지막 선택된 항목을 각각 다른 스타일로 렌더링합니다.
171
+ *
172
+ * @template T 폴리곤 데이터의 추가 속성 타입
173
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
174
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
175
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
176
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
177
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
178
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
179
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
180
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
181
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
182
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
183
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
184
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
185
+ * @returns Event Layer 렌더링 함수
186
+ *
187
+ * @remarks
188
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
189
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
190
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
191
+ * - hover된 항목이 선택되어 있으면 active 스타일 적용
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * const renderEvent = renderPolygonEvent(
196
+ * 'rgba(255, 100, 100, 0.5)', // baseFillColor
197
+ * 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
198
+ * 2, // baseLineWidth
199
+ * 'rgba(255, 193, 7, 0.7)', // selectedFillColor
200
+ * 'rgba(255, 152, 0, 1)', // selectedStrokeColor
201
+ * 4 // selectedLineWidth
202
+ * );
203
+ * ```
204
+ */
205
+
206
+ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
207
+ // 기본값 설정 (base 기준)
208
+ var _selectedFillColor = selectedFillColor || baseFillColor;
209
+
210
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
211
+
212
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
213
+
214
+ var _activeFillColor = activeFillColor || _selectedFillColor;
215
+
216
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
217
+
218
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
219
+
220
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
221
+
222
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
223
+
224
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
225
+
226
+ return function (_a) {
227
+ var ctx = _a.ctx,
228
+ hoveredItem = _a.hoveredItem,
229
+ utils = _a.utils,
230
+ selectedItems = _a.selectedItems,
231
+ selectedItem = _a.selectedItem; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
232
+
233
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
234
+ return item.id;
235
+ })) : new Set();
236
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
237
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
238
+
239
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
240
+ for (var _i = 0, selectedItems_1 = selectedItems; _i < selectedItems_1.length; _i++) {
241
+ var item = selectedItems_1[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
242
+
243
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
244
+ if (!item.paths) continue;
245
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
246
+ if (!polygonOffsets) continue;
247
+ drawPolygon({
248
+ ctx: ctx,
249
+ polygonOffsets: polygonOffsets,
250
+ isDonutPolygon: item.isDonutPolygon || false,
251
+ fillColor: _selectedFillColor,
252
+ strokeColor: _selectedStrokeColor,
253
+ lineWidth: _selectedLineWidth
254
+ });
255
+ }
256
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
257
+
258
+
259
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
260
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
261
+
262
+ if (polygonOffsets) {
263
+ drawPolygon({
264
+ ctx: ctx,
265
+ polygonOffsets: polygonOffsets,
266
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
267
+ fillColor: _activeFillColor,
268
+ strokeColor: _activeStrokeColor,
269
+ lineWidth: _activeLineWidth
270
+ });
271
+ }
272
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
273
+
274
+
275
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
276
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
277
+ if (!polygonOffsets) return; // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
278
+ // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
279
+
280
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
281
+ drawPolygon({
282
+ ctx: ctx,
283
+ polygonOffsets: polygonOffsets,
284
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
285
+ fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
286
+ strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor,
287
+ lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth
288
+ });
289
+ }
290
+ };
291
+ };
292
+ /**
293
+ * 폴리곤 Base 렌더링 함수 팩토리 (함수 방식)
294
+ *
295
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
296
+ * renderStyle 함수를 사용하여 각 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
297
+ *
298
+ * @template T 폴리곤 데이터의 추가 속성 타입
299
+ * @param renderStyle 폴리곤 스타일 함수
300
+ * @returns Base Layer 렌더링 함수
301
+ *
302
+ * @remarks
303
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
304
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
305
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
306
+ *
307
+ * @example
308
+ * ```typescript
309
+ * const renderBase = renderPolygonBaseWithFunction<MyDataType>(
310
+ * (item, context) => ({
311
+ * fillColor: 'rgba(255, 100, 100, 0.5)',
312
+ * strokeColor: 'rgba(200, 50, 50, 0.8)',
313
+ * lineWidth: 2
314
+ * })
315
+ * );
316
+ * ```
317
+ */
318
+
319
+ var renderPolygonBaseWithFunction = function (renderStyle) {
320
+ return function (_a) {
321
+ var ctx = _a.ctx,
322
+ items = _a.items,
323
+ selectedIds = _a.selectedIds,
324
+ utils = _a.utils;
325
+
326
+ for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
327
+ var item = items_2[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
328
+
329
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
330
+
331
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
332
+
333
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
334
+ if (!polygonOffsets) continue; // 스타일 함수로 스타일 가져오기 (Base Layer는 선택되지 않은 항목만)
335
+
336
+ var context = {
337
+ isSelected: false,
338
+ isHovered: false,
339
+ isActive: false
340
+ };
341
+ var style = renderStyle(item, context); // 폴리곤 그리기
342
+
343
+ drawPolygon({
344
+ ctx: ctx,
345
+ polygonOffsets: polygonOffsets,
346
+ isDonutPolygon: item.isDonutPolygon || false,
347
+ fillColor: style.fillColor,
348
+ strokeColor: style.strokeColor,
349
+ lineWidth: style.lineWidth
350
+ });
351
+ }
352
+ };
353
+ };
354
+ /**
355
+ * 폴리곤 Event 렌더링 함수 팩토리 (함수 방식)
356
+ *
357
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
358
+ * renderStyle 함수를 사용하여 각 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
359
+ *
360
+ * @template T 폴리곤 데이터의 추가 속성 타입
361
+ * @param renderStyle 폴리곤 스타일 함수
362
+ * @returns Event Layer 렌더링 함수
363
+ *
364
+ * @remarks
365
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
366
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
367
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
368
+ * - hover된 항목이 선택되어 있으면 active 스타일 적용
369
+ *
370
+ * @example
371
+ * ```typescript
372
+ * const renderEvent = renderPolygonEventWithFunction<MyDataType>(
373
+ * (item, context) => {
374
+ * if (context.isActive) {
375
+ * return { fillColor: 'rgba(255, 152, 0, 0.8)', strokeColor: 'rgba(255, 87, 34, 1)', lineWidth: 5 };
376
+ * }
377
+ * if (context.isHovered) {
378
+ * return { fillColor: 'rgba(100, 150, 255, 0.8)', strokeColor: 'rgba(0, 100, 200, 1)', lineWidth: 3 };
379
+ * }
380
+ * if (context.isSelected) {
381
+ * return { fillColor: 'rgba(255, 193, 7, 0.7)', strokeColor: 'rgba(255, 152, 0, 1)', lineWidth: 4 };
382
+ * }
383
+ * return { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 };
384
+ * }
385
+ * );
386
+ * ```
387
+ */
388
+
389
+ var renderPolygonEventWithFunction = function (renderStyle) {
390
+ return function (_a) {
391
+ var ctx = _a.ctx,
392
+ hoveredItem = _a.hoveredItem,
393
+ utils = _a.utils,
394
+ selectedItems = _a.selectedItems,
395
+ selectedItem = _a.selectedItem;
396
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
397
+ return item.id;
398
+ })) : new Set();
399
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
400
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
401
+
402
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
403
+ for (var _i = 0, selectedItems_2 = selectedItems; _i < selectedItems_2.length; _i++) {
404
+ var item = selectedItems_2[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
405
+
406
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
407
+ if (!item.paths) continue;
408
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
409
+ if (!polygonOffsets) continue;
410
+ var context = {
411
+ isSelected: true,
412
+ isHovered: false,
413
+ isActive: false
414
+ };
415
+ var style = renderStyle(item, context);
416
+ drawPolygon({
417
+ ctx: ctx,
418
+ polygonOffsets: polygonOffsets,
419
+ isDonutPolygon: item.isDonutPolygon || false,
420
+ fillColor: style.fillColor,
421
+ strokeColor: style.strokeColor,
422
+ lineWidth: style.lineWidth
423
+ });
424
+ }
425
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
426
+
427
+
428
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
429
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
430
+
431
+ if (polygonOffsets) {
432
+ var context = {
433
+ isSelected: true,
434
+ isHovered: false,
435
+ isActive: true
436
+ };
437
+ var style = renderStyle(selectedItem, context);
438
+ drawPolygon({
439
+ ctx: ctx,
440
+ polygonOffsets: polygonOffsets,
441
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
442
+ fillColor: style.fillColor,
443
+ strokeColor: style.strokeColor,
444
+ lineWidth: style.lineWidth
445
+ });
446
+ }
447
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
448
+
449
+
450
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
451
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
452
+ if (!polygonOffsets) return; // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
453
+ // hover된 항목이 선택되어 있는지 확인
454
+
455
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
456
+ var isActive = isSelected && hoveredItem.id === selectedItemId; // 개별 props 방식과 동일한 로직: 선택된 항목이 hover되면 active 스타일을 사용
457
+ // 따라서 선택된 항목이 hover될 때는 isHovered를 false로 설정하여
458
+ // renderStyle 함수에서 isActive를 우선적으로 체크할 수 있도록 함
459
+
460
+ var context = {
461
+ isSelected: isSelected,
462
+ isHovered: !isSelected,
463
+ isActive: isActive
464
+ };
465
+ var style = renderStyle(hoveredItem, context);
466
+ drawPolygon({
467
+ ctx: ctx,
468
+ polygonOffsets: polygonOffsets,
469
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
470
+ fillColor: style.fillColor,
471
+ strokeColor: style.strokeColor,
472
+ lineWidth: style.lineWidth
473
+ });
474
+ }
475
+ };
476
+ };
477
+
478
+ exports.drawPolygon = drawPolygon;
479
+ exports.renderPolygonBase = renderPolygonBase;
480
+ exports.renderPolygonBaseWithFunction = renderPolygonBaseWithFunction;
481
+ exports.renderPolygonEvent = renderPolygonEvent;
482
+ exports.renderPolygonEventWithFunction = renderPolygonEventWithFunction;
@@ -1,5 +1,12 @@
1
1
  import React from "react";
2
2
  import { MarkerOptions, Offset, Position } from "../../../types";
3
+ /**
4
+ * 2026-01-06 장한별
5
+ * 고주영팀장님이 만든 캔버스 마커
6
+ * 클릭, hover 등의 이벤트가 구현되어있지 않는 버전
7
+ * RA 지도 제품에서 CanvasMarker 컴포넌트를 사용하고 있음
8
+ *
9
+ */
3
10
  export interface CanvasMarkerRendererParams<T> {
4
11
  context: CanvasRenderingContext2D;
5
12
  offset: Offset[];