@mint-ui/map 1.2.0-test.35 → 1.2.0-test.36

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 (22) hide show
  1. package/dist/components/mint-map/core/advanced/shared/context.d.ts +9 -71
  2. package/dist/components/mint-map/core/advanced/shared/context.js +43 -137
  3. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +5 -13
  4. package/dist/components/mint-map/core/advanced/shared/helpers.js +8 -20
  5. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +6 -76
  6. package/dist/components/mint-map/core/advanced/shared/hooks.js +18 -112
  7. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +9 -188
  8. package/dist/components/mint-map/core/advanced/shared/performance.js +53 -229
  9. package/dist/components/mint-map/core/advanced/shared/types.d.ts +18 -153
  10. package/dist/components/mint-map/core/advanced/shared/types.js +0 -1
  11. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +21 -126
  12. package/dist/components/mint-map/core/advanced/shared/utils.js +43 -151
  13. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +4 -34
  14. package/dist/components/mint-map/core/advanced/shared/viewport.js +4 -34
  15. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.d.ts +22 -74
  16. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +122 -516
  17. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +26 -76
  18. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +118 -432
  19. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +3 -3
  20. package/dist/index.es.js +409 -1632
  21. package/dist/index.umd.js +409 -1632
  22. package/package.json +1 -1
@@ -7,33 +7,9 @@ var tslib = require('tslib');
7
7
  /**
8
8
  * 지도 이벤트 핸들러 생성 함수
9
9
  *
10
- * 지도 이동, 줌, 드래그 등의 이벤트를 처리하는 핸들러들을 생성합니다.
11
- *
12
10
  * @template T 마커/폴리곤 데이터의 추가 속성 타입
13
11
  * @param deps 이벤트 핸들러 생성에 필요한 의존성
14
12
  * @returns 지도 이벤트 핸들러 객체
15
- *
16
- * @example
17
- * ```typescript
18
- * const {
19
- * handleIdle,
20
- * handleZoomStart,
21
- * handleZoomEnd,
22
- * handleCenterChanged,
23
- * handleDragStart,
24
- * handleDragEnd,
25
- * } = createMapEventHandlers({
26
- * controller,
27
- * containerRef,
28
- * markerRef,
29
- * options,
30
- * prevCenterOffsetRef,
31
- * accumTranslateRef,
32
- * offsetCacheRef,
33
- * boundingBoxCacheRef,
34
- * renderAllImmediate,
35
- * });
36
- * ```
37
13
  */
38
14
 
39
15
  var createMapEventHandlers = function (deps) {
@@ -45,14 +21,7 @@ var createMapEventHandlers = function (deps) {
45
21
  accumTranslateRef = deps.accumTranslateRef,
46
22
  offsetCacheRef = deps.offsetCacheRef,
47
23
  boundingBoxCacheRef = deps.boundingBoxCacheRef,
48
- renderAllImmediate = deps.renderAllImmediate;
49
- /**
50
- * 지도 이동/줌 완료 시 처리
51
- *
52
- * - 캐시 초기화: 좌표 변환 결과가 변경되었으므로 캐시 무효화
53
- * - 마커 위치 업데이트: 새로운 지도 위치에 맞게 마커 재배치
54
- * - 렌더링: 새 위치에서 전체 렌더링 수행
55
- */
24
+ renderAllImmediate = deps.renderAllImmediate; // 지도 이동/줌 완료 시 처리 (캐시 초기화 및 렌더링)
56
25
 
57
26
  var handleIdle = function () {
58
27
  prevCenterOffsetRef.current = null;
@@ -70,45 +39,34 @@ var createMapEventHandlers = function (deps) {
70
39
  position: bounds.nw
71
40
  }, options);
72
41
 
73
- markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // transform 제거 전에 새 데이터로 즉시 렌더링 (겹침 방지)
42
+ markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // transform 제거 전에 새 데이터로 즉시 렌더링 (transform 제거 시 잠깐 빈 화면이 보이는 것 방지)
74
43
 
75
44
  if (containerRef.current) {
76
45
  containerRef.current.style.transform = '';
77
46
  containerRef.current.style.visibility = '';
78
- } // 새 위치에서 렌더링
47
+ } // 새 위치에서 렌더링 (캐시는 이미 초기화됨)
79
48
 
80
49
 
81
50
  renderAllImmediate();
82
- };
83
- /**
84
- * 줌 시작 시 처리 (일시적으로 숨김)
85
- */
51
+ }; // 줌 시작 시 처리 (일시적으로 숨김)
86
52
 
87
53
 
88
54
  var handleZoomStart = function () {
89
- if (containerRef.current) {
90
- containerRef.current.style.visibility = 'hidden';
91
- }
92
- };
93
- /**
94
- * 줌 종료 시 처리 (다시 표시)
95
- */
55
+ if (!containerRef.current) return;
56
+ containerRef.current.style.visibility = 'hidden';
57
+ }; // 줌 종료 시 처리 (다시 표시)
96
58
 
97
59
 
98
60
  var handleZoomEnd = function () {
99
- if (containerRef.current) {
100
- containerRef.current.style.visibility = '';
101
- }
102
- };
103
- /**
104
- * 지도 중심 변경 시 처리 (transform으로 이동 추적)
105
- */
61
+ if (!containerRef.current) return;
62
+ containerRef.current.style.visibility = '';
63
+ }; // 지도 중심 변경 시 처리 (transform으로 이동 추적, 캐시 유지)
106
64
 
107
65
 
108
66
  var handleCenterChanged = function () {
109
67
  var center = controller.getCurrBounds().getCenter();
110
68
  var curr = controller.positionToOffset(center);
111
- var prev = prevCenterOffsetRef.current;
69
+ var prev = prevCenterOffsetRef.current; // 첫 번째 호출 시 이전 위치 저장만 하고 종료
112
70
 
113
71
  if (!prev) {
114
72
  prevCenterOffsetRef.current = {
@@ -116,10 +74,12 @@ var createMapEventHandlers = function (deps) {
116
74
  y: curr.y
117
75
  };
118
76
  return;
119
- }
77
+ } // 이전 위치와 현재 위치의 차이 계산 (이동 거리)
78
+
120
79
 
121
80
  var dx = prev.x - curr.x;
122
- var dy = prev.y - curr.y;
81
+ var dy = prev.y - curr.y; // 누적 이동 거리 저장 (transform으로 화면만 이동, 캐시는 유지하여 성능 최적화)
82
+
123
83
  accumTranslateRef.current = {
124
84
  x: accumTranslateRef.current.x + dx,
125
85
  y: accumTranslateRef.current.y + dy
@@ -127,23 +87,15 @@ var createMapEventHandlers = function (deps) {
127
87
  prevCenterOffsetRef.current = {
128
88
  x: curr.x,
129
89
  y: curr.y
130
- };
90
+ }; // CSS transform으로 컨테이너 이동 (캐시된 좌표는 그대로 유지)
131
91
 
132
92
  if (containerRef.current) {
133
93
  containerRef.current.style.transform = "translate(".concat(accumTranslateRef.current.x, "px, ").concat(accumTranslateRef.current.y, "px)");
134
94
  }
135
95
  };
136
- /**
137
- * 드래그 시작 처리
138
- */
139
-
140
96
 
141
97
  var handleDragStart = function () {// 커서는 각 컴포넌트에서 처리
142
98
  };
143
- /**
144
- * 드래그 종료 처리
145
- */
146
-
147
99
 
148
100
  var handleDragEnd = function () {// 커서는 각 컴포넌트에서 처리
149
101
  };
@@ -160,26 +112,10 @@ var createMapEventHandlers = function (deps) {
160
112
  /**
161
113
  * 공간 인덱스 빌드 (빠른 Hit Test를 위한 자료구조)
162
114
  *
163
- * Spatial Hash Grid에 모든 데이터의 바운딩 박스를 삽입합니다.
164
- * 이를 통해 클릭/호버 시 O(1) 수준의 빠른 Hit Test가 가능합니다.
165
- *
166
115
  * @template T 마커/폴리곤 데이터의 추가 속성 타입
167
116
  * @param data 공간 인덱스에 삽입할 데이터 배열
168
117
  * @param spatialIndex Spatial Hash Grid 인스턴스
169
118
  * @param computeBoundingBox 바운딩 박스 계산 함수
170
- *
171
- * @remarks
172
- * - 성능: O(n) 시간복잡도, n은 데이터 개수
173
- * - 호출 시점: 데이터 변경 시 또는 지도 이동/줌 완료 시
174
- *
175
- * @example
176
- * ```typescript
177
- * buildSpatialIndex(
178
- * dataRef.current,
179
- * spatialIndexRef.current,
180
- * computeBoundingBox
181
- * );
182
- * ```
183
119
  */
184
120
 
185
121
  var buildSpatialIndex = function (data, spatialIndex, computeBoundingBox) {
@@ -195,29 +131,13 @@ var buildSpatialIndex = function (data, spatialIndex, computeBoundingBox) {
195
131
  }
196
132
  };
197
133
  /**
198
- * 선택 상태 동기화 유틸리티
199
- *
200
- * 데이터 변경 시 선택된 항목의 참조를 최신 데이터로 업데이트합니다.
201
- * 화면 밖에 있는 선택된 항목도 선택 상태를 유지합니다.
134
+ * 선택 상태 동기화 (화면 밖 데이터도 선택 상태 유지)
202
135
  *
203
136
  * @template T 마커/폴리곤 데이터의 추가 속성 타입
204
137
  * @param data 최신 데이터 배열
205
138
  * @param selectedIds 선택된 항목 ID Set
206
139
  * @param selectedItemsMap 현재 선택된 항목 Map
207
140
  * @returns 업데이트된 선택된 항목 Map
208
- *
209
- * @remarks
210
- * - 성능: O(n + m), n은 전체 데이터 수, m은 선택된 항목 수
211
- * - 화면 밖 데이터도 선택 상태 유지 (최신 데이터가 없으면 기존 데이터 유지)
212
- *
213
- * @example
214
- * ```typescript
215
- * selectedItemsMapRef.current = syncSelectedItems(
216
- * data,
217
- * selectedIdsRef.current,
218
- * selectedItemsMapRef.current
219
- * );
220
- * ```
221
141
  */
222
142
 
223
143
  var syncSelectedItems = function (data, selectedIds, selectedItemsMap) {
@@ -245,24 +165,10 @@ var syncSelectedItems = function (data, selectedIds, selectedItemsMap) {
245
165
  /**
246
166
  * 외부 selectedItems를 내부 상태로 동기화
247
167
  *
248
- * 외부에서 전달된 selectedItems prop을 내부 ref 상태로 동기화합니다.
249
- *
250
168
  * @template T 마커/폴리곤 데이터의 추가 속성 타입
251
- * @param externalSelectedItems 외부에서 전달된 선택된 항목 배열 (undefined면 동기화 안 함)
169
+ * @param externalSelectedItems 외부에서 전달된 선택된 항목 배열
252
170
  * @param selectedIdsRef 선택된 ID Set ref
253
171
  * @param selectedItemsMapRef 선택된 항목 Map ref
254
- *
255
- * @remarks
256
- * - externalSelectedItems가 undefined면 외부 제어가 아니므로 아무 작업도 하지 않음
257
- * - 성능: O(m), m은 externalSelectedItems의 길이
258
- *
259
- * @example
260
- * ```typescript
261
- * useEffect(() => {
262
- * syncExternalSelectedItems(externalSelectedItems, selectedIdsRef, selectedItemsMapRef);
263
- * // 렌더링...
264
- * }, [externalSelectedItems]);
265
- * ```
266
172
  */
267
173
 
268
174
  var syncExternalSelectedItems = function (externalSelectedItems, selectedIdsRef, selectedItemsMapRef) {
@@ -1,98 +1,34 @@
1
1
  /**
2
- * 공간 인덱스 그리드 셀 크기 (px)
2
+ * 공간 인덱스 그리드 셀 크기 (픽셀 단위)
3
3
  *
4
- * 최적값 계산:
5
- * - 목표: 클릭 시 셀당 10~30개 항목만 체크 (빠른 Hit Test)
6
- * - 화면 크기: 1920×1080 기준
7
- * - 30,000개 항목 → 50px 셀 크기 = 약 800개 셀 = 셀당 ~37개
8
- *
9
- * 성능 비교 (30,000개 기준):
10
- * - 200px: 셀당 ~577개 → Hit Test O(577) ❌ 느림
11
- * - 50px: 셀당 ~37개 → Hit Test O(37) ✅ 15배 빠름!
12
- *
13
- * 트레이드오프:
14
- * - 작을수록: Hit Test 빠름, 메모리 사용량 증가
15
- * - 클수록: 메모리 효율적, Hit Test 느림
4
+ * @default 50
16
5
  */
17
6
  export declare const SPATIAL_GRID_CELL_SIZE = 50;
18
7
  /**
19
- * 뷰포트 컬링 여유 공간 (px)
8
+ * 뷰포트 컬링 여유 공간 (픽셀 단위)
20
9
  *
21
- * 화면 밖 100px까지 렌더링하여 스크롤 시 부드러운 전환
22
- * 30,000개 중 실제 렌더링: 화면에 보이는 1,000~3,000개만
10
+ * @default 100
23
11
  */
24
12
  export declare const DEFAULT_CULLING_MARGIN = 100;
25
13
  /**
26
14
  * LRU 캐시 최대 항목 수
27
15
  *
28
- * 좌표 변환 결과 캐싱 (positionToOffset 연산 비용 절약)
29
- *
30
- * 최적값 계산:
31
- * - 전체 항목: 30,000개
32
- * - 캐시 크기: 30,000개 → 100% 히트율 (메모리: ~2.4MB)
33
- *
34
- * 메모리 사용량 (항목당 ~80 bytes):
35
- * - 10,000개: ~800KB → 캐시 히트율 33% ❌
36
- * - 30,000개: ~2.4MB → 캐시 히트율 100% ✅
37
- *
38
- * zoom/pan 시 어차피 clear() 호출되므로 메모리 누적 없음
16
+ * @default 30000
39
17
  */
40
18
  export declare const DEFAULT_MAX_CACHE_SIZE = 30000;
41
19
  /**
42
- * LRU (Least Recently Used) Cache
20
+ * LRU Cache (Least Recently Used)
43
21
  *
44
- * 메모리 제한을 위한 캐시 구현입니다. WoongCanvas 컴포넌트에서 좌표 변환 결과를 캐싱하는데 사용됩니다.
22
+ * 좌표 변환 결과를 캐싱하기 위한 캐시 구현
45
23
  *
46
24
  * @template K 캐시 키 타입
47
25
  * @template V 캐시 값 타입
48
- *
49
- * @remarks
50
- * **개선 사항**:
51
- * 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
52
- * 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
53
- * 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
54
- *
55
- * **트레이드오프**:
56
- * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
57
- * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
58
- *
59
- * WoongCanvasMarker 사용 사례에 최적:
60
- * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
61
- * - 접근 빈도 추적보다 빠른 조회가 더 중요
62
- *
63
- * @example
64
- * ```typescript
65
- * const cache = new LRUCache<string, Offset>(30000);
66
- * cache.set(item.id, offset);
67
- * const cached = cache.get(item.id);
68
- * ```
69
26
  */
70
27
  export declare class LRUCache<K, V> {
71
28
  private cache;
72
29
  private maxSize;
73
30
  constructor(maxSize?: number);
74
- /**
75
- * 캐시에서 값 조회
76
- *
77
- * @param key 조회할 키
78
- * @returns 캐시된 값 또는 undefined (캐시 미스 시)
79
- *
80
- * @remarks
81
- * - 성능: O(1) 해시 조회
82
- * - 최적화: delete+set 제거로 읽기 성능 대폭 향상
83
- */
84
31
  get(key: K): V | undefined;
85
- /**
86
- * 캐시에 값 저장
87
- *
88
- * @param key 저장할 키
89
- * @param value 저장할 값
90
- *
91
- * @remarks
92
- * - 기존 키 업데이트: 단순 덮어쓰기 (크기 변화 없음)
93
- * - 신규 키 추가: 크기 체크 후 필요시 가장 오래된 항목 제거 (FIFO)
94
- * - 성능: O(1) 평균 시간복잡도
95
- */
96
32
  set(key: K, value: V): void;
97
33
  clear(): void;
98
34
  size(): number;
@@ -100,140 +36,25 @@ export declare class LRUCache<K, V> {
100
36
  }
101
37
  /**
102
38
  * Spatial Hash Grid (공간 해시 그리드)
103
- * 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
104
39
  *
105
- * 개선 사항:
106
- * 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
107
- * 2. 메모리 누수 방지: 기존 항목 자동 제거
108
- * 3. 성능 최적화: 불필요한 배열 생성 최소화
40
+ * 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
109
41
  *
110
- * 사용 사례:
111
- * - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
112
- * - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
42
+ * @template T 인덱싱할 항목 타입
113
43
  */
114
44
  export declare class SpatialHashGrid<T> {
115
45
  private cellSize;
116
46
  private grid;
117
47
  private itemToCells;
118
48
  constructor(cellSize?: number);
119
- /**
120
- * 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
121
- */
122
49
  private getCellKey;
123
- /**
124
- * 바운딩 박스가 걸치는 모든 셀 키 배열 반환
125
- */
126
50
  private getCellsForBounds;
127
- /**
128
- * 항목 추가 (바운딩 박스 기반)
129
- *
130
- * 항목을 공간 인덱스에 추가합니다. 바운딩 박스가 걸치는 모든 셀에 삽입됩니다.
131
- *
132
- * @param item 추가할 항목
133
- * @param minX 바운딩 박스 최소 X 좌표
134
- * @param minY 바운딩 박스 최소 Y 좌표
135
- * @param maxX 바운딩 박스 최대 X 좌표
136
- * @param maxY 바운딩 박스 최대 Y 좌표
137
- *
138
- * @remarks
139
- * - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
140
- * - 메모리 누수 방지: 이전 셀 참조 완전 제거
141
- * - 성능: O(1) 평균 시간복잡도
142
- */
143
51
  insert(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
144
- /**
145
- * 항목 제거
146
- *
147
- * 공간 인덱스에서 항목을 제거합니다.
148
- *
149
- * @param item 제거할 항목
150
- *
151
- * @remarks
152
- * - 메모리 누수 방지: 모든 셀에서 참조 완전 제거
153
- * - 빈 셀 정리: 항목이 없어진 셀은 자동으로 정리됨
154
- * - 성능: O(셀 개수), 보통 O(1)
155
- */
156
52
  remove(item: T): void;
157
- /**
158
- * 항목 위치 업데이트
159
- *
160
- * 항목의 위치를 업데이트합니다. remove + insert의 편의 함수입니다.
161
- *
162
- * @param item 업데이트할 항목
163
- * @param minX 새로운 바운딩 박스 최소 X 좌표
164
- * @param minY 새로운 바운딩 박스 최소 Y 좌표
165
- * @param maxX 새로운 바운딩 박스 최대 X 좌표
166
- * @param maxY 새로운 바운딩 박스 최대 Y 좌표
167
- */
168
53
  update(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
169
- /**
170
- * 점 주변의 항목 조회 (1개 셀만)
171
- *
172
- * 특정 좌표가 속한 셀의 모든 항목을 반환합니다.
173
- *
174
- * @param x 조회할 X 좌표
175
- * @param y 조회할 Y 좌표
176
- * @returns 해당 셀의 항목 배열 (없으면 빈 배열)
177
- *
178
- * @remarks
179
- * - 성능: O(해당 셀의 항목 수) - 보통 ~10개 (30,000개 전체를 체크하지 않음)
180
- * - Hit Test에 최적화된 메서드
181
- * - 빈 배열 재사용으로 메모리 할당 최소화
182
- *
183
- * @example
184
- * ```typescript
185
- * const candidates = grid.queryPoint(mouseX, mouseY);
186
- * for (const item of candidates) {
187
- * if (isPointInItem(item, mouseX, mouseY)) {
188
- * return item;
189
- * }
190
- * }
191
- * ```
192
- */
193
54
  queryPoint(x: number, y: number): T[];
194
- /**
195
- * 영역 내 항목 조회
196
- *
197
- * 특정 영역(바운딩 박스)과 교차하는 모든 항목을 반환합니다.
198
- *
199
- * @param minX 영역 최소 X 좌표
200
- * @param minY 영역 최소 Y 좌표
201
- * @param maxX 영역 최대 X 좌표
202
- * @param maxY 영역 최대 Y 좌표
203
- * @returns 영역과 교차하는 항목 배열 (중복 제거됨)
204
- *
205
- * @remarks
206
- * - 성능: O(셀 개수 × 셀당 평균 항목 수)
207
- * - Set으로 중복 제거 보장 (항목이 여러 셀에 걸쳐 있어도 한 번만 반환)
208
- * - Viewport Culling에 유용
209
- */
210
55
  queryBounds(minX: number, minY: number, maxX: number, maxY: number): T[];
211
- /**
212
- * 항목 존재 여부 확인
213
- *
214
- * @param item 확인할 항목
215
- * @returns 항목이 인덱스에 있으면 true, 아니면 false
216
- *
217
- * @remarks
218
- * - 성능: O(1) 해시 조회
219
- */
220
56
  has(item: T): boolean;
221
- /**
222
- * 전체 초기화
223
- */
224
57
  clear(): void;
225
- /**
226
- * 통계 정보
227
- *
228
- * 공간 인덱스의 현재 상태를 반환합니다. 디버깅 및 성능 분석에 유용합니다.
229
- *
230
- * @returns 통계 정보 객체
231
- *
232
- * @remarks
233
- * - totalCells: 현재 사용 중인 셀 개수
234
- * - totalItems: 인덱스에 등록된 고유 항목 수 (정확)
235
- * - avgItemsPerCell: 셀당 평균 항목 수
236
- */
237
58
  stats(): {
238
59
  totalCells: number;
239
60
  totalItems: number;