@mint-ui/map 1.2.0-test.43 → 1.2.0-test.45

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.
@@ -55,20 +55,19 @@ export interface CanvasOption {
55
55
  * };
56
56
  *
57
57
  * // ✅ 올바른 사용 (헬퍼 함수 사용)
58
- * const dataArray = createCanvasDataArray([serverData], (item) => ({
59
- * id: String(item.id),
58
+ * const data = createCanvasData(serverData, {
59
+ * id: String(serverData.id),
60
60
  * position: new Position(lat, lng)
61
- * }));
62
- * const data = dataArray[0]; // 단일 항목이 필요한 경우
61
+ * });
63
62
  * ```
64
63
  */
65
64
  export declare type CanvasData<T = {}> = T & CanvasOption;
66
65
  /**
67
- * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
66
+ * 서버 데이터를 CanvasData 변환하는 헬퍼 함수들
68
67
  *
69
- * @see createCanvasDataArray in ./utils.ts
68
+ * @see createCanvasData, createCanvasDataArray in ./utils.ts
70
69
  */
71
- export { createCanvasDataArray } from './utils';
70
+ export { createCanvasData, createCanvasDataArray } from './utils';
72
71
  /**
73
72
  * 렌더링 유틸리티 함수들 (좌표 변환)
74
73
  *
@@ -14,4 +14,5 @@ exports.CanvasDataType = void 0;
14
14
  CanvasDataType["POLYGON"] = "POLYGON";
15
15
  })(exports.CanvasDataType || (exports.CanvasDataType = {}));
16
16
 
17
+ exports.createCanvasData = utils.createCanvasData;
17
18
  exports.createCanvasDataArray = utils.createCanvasDataArray;
@@ -60,6 +60,39 @@ export declare const calculateTextBoxWidth: ({ text, fontConfig, padding, minWid
60
60
  padding: number;
61
61
  minWidth: number;
62
62
  }) => number;
63
+ /**
64
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수
65
+ *
66
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
67
+ * 이 함수를 사용하여 명시적으로 매핑할 수 있습니다.
68
+ *
69
+ * @template T 서버에서 받은 원본 데이터 타입
70
+ * @param serverData 서버에서 받은 원본 데이터
71
+ * @param canvasOptions CanvasOption 필드들 (충돌하는 필드는 여기서 명시적으로 지정)
72
+ * @returns CanvasData<T> 타입의 데이터
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * interface ServerData {
77
+ * id: number; // CanvasOption의 id와 충돌
78
+ * name: string;
79
+ * }
80
+ *
81
+ * const serverData: ServerData = { id: 123, name: "Test" };
82
+ *
83
+ * // ✅ 올바른 사용
84
+ * const canvasData = createCanvasData(serverData, {
85
+ * id: String(serverData.id), // 명시적으로 변환
86
+ * position: new Position(37.5, 127.0)
87
+ * });
88
+ *
89
+ * // canvasData는 CanvasData<ServerData> 타입이며:
90
+ * // - id: string (CanvasOption의 id)
91
+ * // - name: string (서버 데이터의 name)
92
+ * // - position: Position (CanvasOption의 position)
93
+ * ```
94
+ */
95
+ export declare function createCanvasData<T extends Record<string, any>>(serverData: T, canvasOptions: CanvasOption): CanvasData<T>;
63
96
  /**
64
97
  * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
65
98
  *
@@ -212,6 +212,44 @@ var calculateTextBoxWidth = function (_a) {
212
212
  var textWidth = tempCtx.measureText(text).width;
213
213
  return Math.max(minWidth, textWidth + padding);
214
214
  };
215
+ /**
216
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수
217
+ *
218
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
219
+ * 이 함수를 사용하여 명시적으로 매핑할 수 있습니다.
220
+ *
221
+ * @template T 서버에서 받은 원본 데이터 타입
222
+ * @param serverData 서버에서 받은 원본 데이터
223
+ * @param canvasOptions CanvasOption 필드들 (충돌하는 필드는 여기서 명시적으로 지정)
224
+ * @returns CanvasData<T> 타입의 데이터
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * interface ServerData {
229
+ * id: number; // CanvasOption의 id와 충돌
230
+ * name: string;
231
+ * }
232
+ *
233
+ * const serverData: ServerData = { id: 123, name: "Test" };
234
+ *
235
+ * // ✅ 올바른 사용
236
+ * const canvasData = createCanvasData(serverData, {
237
+ * id: String(serverData.id), // 명시적으로 변환
238
+ * position: new Position(37.5, 127.0)
239
+ * });
240
+ *
241
+ * // canvasData는 CanvasData<ServerData> 타입이며:
242
+ * // - id: string (CanvasOption의 id)
243
+ * // - name: string (서버 데이터의 name)
244
+ * // - position: Position (CanvasOption의 position)
245
+ * ```
246
+ */
247
+
248
+ function createCanvasData(serverData, canvasOptions) {
249
+ // 서버 데이터와 CanvasOption을 결합
250
+ // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
251
+ return tslib.__assign(tslib.__assign({}, serverData), canvasOptions);
252
+ }
215
253
  /**
216
254
  * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
217
255
  *
@@ -249,16 +287,15 @@ var calculateTextBoxWidth = function (_a) {
249
287
 
250
288
  function createCanvasDataArray(serverDataArray, getCanvasOptions) {
251
289
  return serverDataArray.map(function (serverData, index) {
252
- var canvasOptions = getCanvasOptions(serverData, index); // 서버 데이터와 CanvasOption을 결합
253
- // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
254
-
255
- return tslib.__assign(tslib.__assign({}, serverData), canvasOptions);
290
+ var canvasOptions = getCanvasOptions(serverData, index);
291
+ return createCanvasData(serverData, canvasOptions);
256
292
  });
257
293
  }
258
294
 
259
295
  exports.calculateTextBoxWidth = calculateTextBoxWidth;
260
296
  exports.computeMarkerOffset = computeMarkerOffset;
261
297
  exports.computePolygonOffsets = computePolygonOffsets;
298
+ exports.createCanvasData = createCanvasData;
262
299
  exports.createCanvasDataArray = createCanvasDataArray;
263
300
  exports.hexToRgba = hexToRgba;
264
301
  exports.isPointInMarkerData = isPointInMarkerData;
@@ -72,7 +72,9 @@ var WoongCanvasMarker = function (props) {
72
72
  var accumTranslateRef = React.useRef({
73
73
  x: 0,
74
74
  y: 0
75
- }); // 성능 최적화 Refs
75
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
76
+
77
+ var dragStartHoveredItemRef = React.useRef(null); // 성능 최적화 Refs
76
78
 
77
79
  var offsetCacheRef = React.useRef(new performance.LRUCache(maxCacheSize));
78
80
  var spatialIndexRef = React.useRef(new performance.SpatialHashGrid(performance.SPATIAL_GRID_CELL_SIZE));
@@ -271,14 +273,18 @@ var WoongCanvasMarker = function (props) {
271
273
  handleDragEndShared = _g.handleDragEnd;
272
274
 
273
275
  var handleDragStart = function () {
274
- handleDragStartShared();
276
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
277
+
278
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
275
279
  draggingRef.current = true;
276
280
  controller.setMapCursor('grabbing');
277
281
  };
278
282
 
279
283
  var handleDragEnd = function () {
280
284
  handleDragEndShared();
281
- draggingRef.current = false;
285
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
286
+
287
+ dragStartHoveredItemRef.current = null;
282
288
  controller.setMapCursor('grab');
283
289
  }; // Hit Test: 특정 좌표의 마커 찾기
284
290
 
@@ -309,6 +315,11 @@ var WoongCanvasMarker = function (props) {
309
315
 
310
316
 
311
317
  var setHovered = function (data) {
318
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
319
+ if (draggingRef.current) {
320
+ return;
321
+ }
322
+
312
323
  hoveredItemRef.current = data;
313
324
 
314
325
  if (draggingRef.current) {
@@ -358,6 +369,7 @@ var WoongCanvasMarker = function (props) {
358
369
 
359
370
 
360
371
  var handleClick = function (event) {
372
+ if (controller.isMapDragged()) return;
361
373
  if (disableInteractionRef.current) return;
362
374
  var clickedOffset = helpers.validateEvent(event, context$1, controller);
363
375
  if (!clickedOffset) return;
@@ -369,7 +381,9 @@ var WoongCanvasMarker = function (props) {
369
381
 
370
382
 
371
383
  var handleMouseMove = function (event) {
372
- if (disableInteractionRef.current) return;
384
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
385
+
386
+ if (draggingRef.current) return;
373
387
  var mouseOffset = helpers.validateEvent(event, context$1, controller);
374
388
  if (!mouseOffset) return;
375
389
  var hoveredItem = findData(mouseOffset);
@@ -82,7 +82,9 @@ var WoongCanvasPolygon = function (props) {
82
82
  var accumTranslateRef = React.useRef({
83
83
  x: 0,
84
84
  y: 0
85
- }); // 성능 최적화 Refs
85
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
86
+
87
+ var dragStartHoveredItemRef = React.useRef(null); // 성능 최적화 Refs
86
88
 
87
89
  var offsetCacheRef = React.useRef(new performance.LRUCache(maxCacheSize));
88
90
  var spatialIndexRef = React.useRef(new performance.SpatialHashGrid(performance.SPATIAL_GRID_CELL_SIZE));
@@ -255,14 +257,18 @@ var WoongCanvasPolygon = function (props) {
255
257
  handleDragEndShared = _f.handleDragEnd;
256
258
 
257
259
  var handleDragStart = function () {
258
- handleDragStartShared();
260
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
261
+
262
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
259
263
  draggingRef.current = true;
260
264
  controller.setMapCursor('grabbing');
261
265
  };
262
266
 
263
267
  var handleDragEnd = function () {
264
268
  handleDragEndShared();
265
- draggingRef.current = false;
269
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
270
+
271
+ dragStartHoveredItemRef.current = null;
266
272
  controller.setMapCursor('grab');
267
273
  }; // Hit Test: 특정 좌표의 폴리곤 찾기
268
274
 
@@ -284,6 +290,11 @@ var WoongCanvasPolygon = function (props) {
284
290
 
285
291
 
286
292
  var setHovered = function (data) {
293
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
294
+ if (draggingRef.current) {
295
+ return;
296
+ }
297
+
287
298
  hoveredItemRef.current = data;
288
299
 
289
300
  if (draggingRef.current) {
@@ -329,6 +340,7 @@ var WoongCanvasPolygon = function (props) {
329
340
 
330
341
 
331
342
  var handleClick = function (event) {
343
+ if (controller.isMapDragged()) return;
332
344
  if (disableInteractionRef.current) return;
333
345
  var clickedOffset = helpers.validateEvent(event, context$1, controller);
334
346
  if (!clickedOffset) return;
@@ -340,7 +352,9 @@ var WoongCanvasPolygon = function (props) {
340
352
 
341
353
 
342
354
  var handleMouseMove = function (event) {
343
- if (disableInteractionRef.current) return;
355
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
356
+
357
+ if (draggingRef.current) return;
344
358
  var mouseOffset = helpers.validateEvent(event, context$1, controller);
345
359
  if (!mouseOffset) return;
346
360
  var hoveredItem = findData(mouseOffset);
package/dist/index.es.js CHANGED
@@ -988,6 +988,44 @@ var calculateTextBoxWidth = function (_a) {
988
988
  var textWidth = tempCtx.measureText(text).width;
989
989
  return Math.max(minWidth, textWidth + padding);
990
990
  };
991
+ /**
992
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수
993
+ *
994
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
995
+ * 이 함수를 사용하여 명시적으로 매핑할 수 있습니다.
996
+ *
997
+ * @template T 서버에서 받은 원본 데이터 타입
998
+ * @param serverData 서버에서 받은 원본 데이터
999
+ * @param canvasOptions CanvasOption 필드들 (충돌하는 필드는 여기서 명시적으로 지정)
1000
+ * @returns CanvasData<T> 타입의 데이터
1001
+ *
1002
+ * @example
1003
+ * ```typescript
1004
+ * interface ServerData {
1005
+ * id: number; // CanvasOption의 id와 충돌
1006
+ * name: string;
1007
+ * }
1008
+ *
1009
+ * const serverData: ServerData = { id: 123, name: "Test" };
1010
+ *
1011
+ * // ✅ 올바른 사용
1012
+ * const canvasData = createCanvasData(serverData, {
1013
+ * id: String(serverData.id), // 명시적으로 변환
1014
+ * position: new Position(37.5, 127.0)
1015
+ * });
1016
+ *
1017
+ * // canvasData는 CanvasData<ServerData> 타입이며:
1018
+ * // - id: string (CanvasOption의 id)
1019
+ * // - name: string (서버 데이터의 name)
1020
+ * // - position: Position (CanvasOption의 position)
1021
+ * ```
1022
+ */
1023
+
1024
+ function createCanvasData(serverData, canvasOptions) {
1025
+ // 서버 데이터와 CanvasOption을 결합
1026
+ // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
1027
+ return __assign(__assign({}, serverData), canvasOptions);
1028
+ }
991
1029
  /**
992
1030
  * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
993
1031
  *
@@ -1025,10 +1063,8 @@ var calculateTextBoxWidth = function (_a) {
1025
1063
 
1026
1064
  function createCanvasDataArray(serverDataArray, getCanvasOptions) {
1027
1065
  return serverDataArray.map(function (serverData, index) {
1028
- var canvasOptions = getCanvasOptions(serverData, index); // 서버 데이터와 CanvasOption을 결합
1029
- // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
1030
-
1031
- return __assign(__assign({}, serverData), canvasOptions);
1066
+ var canvasOptions = getCanvasOptions(serverData, index);
1067
+ return createCanvasData(serverData, canvasOptions);
1032
1068
  });
1033
1069
  }
1034
1070
 
@@ -5676,7 +5712,9 @@ var WoongCanvasMarker = function (props) {
5676
5712
  var accumTranslateRef = useRef({
5677
5713
  x: 0,
5678
5714
  y: 0
5679
- }); // 성능 최적화 Refs
5715
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
5716
+
5717
+ var dragStartHoveredItemRef = useRef(null); // 성능 최적화 Refs
5680
5718
 
5681
5719
  var offsetCacheRef = useRef(new LRUCache(maxCacheSize));
5682
5720
  var spatialIndexRef = useRef(new SpatialHashGrid(SPATIAL_GRID_CELL_SIZE));
@@ -5875,14 +5913,18 @@ var WoongCanvasMarker = function (props) {
5875
5913
  handleDragEndShared = _g.handleDragEnd;
5876
5914
 
5877
5915
  var handleDragStart = function () {
5878
- handleDragStartShared();
5916
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
5917
+
5918
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
5879
5919
  draggingRef.current = true;
5880
5920
  controller.setMapCursor('grabbing');
5881
5921
  };
5882
5922
 
5883
5923
  var handleDragEnd = function () {
5884
5924
  handleDragEndShared();
5885
- draggingRef.current = false;
5925
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
5926
+
5927
+ dragStartHoveredItemRef.current = null;
5886
5928
  controller.setMapCursor('grab');
5887
5929
  }; // Hit Test: 특정 좌표의 마커 찾기
5888
5930
 
@@ -5913,6 +5955,11 @@ var WoongCanvasMarker = function (props) {
5913
5955
 
5914
5956
 
5915
5957
  var setHovered = function (data) {
5958
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
5959
+ if (draggingRef.current) {
5960
+ return;
5961
+ }
5962
+
5916
5963
  hoveredItemRef.current = data;
5917
5964
 
5918
5965
  if (draggingRef.current) {
@@ -5962,6 +6009,7 @@ var WoongCanvasMarker = function (props) {
5962
6009
 
5963
6010
 
5964
6011
  var handleClick = function (event) {
6012
+ if (controller.isMapDragged()) return;
5965
6013
  if (disableInteractionRef.current) return;
5966
6014
  var clickedOffset = validateEvent(event, context, controller);
5967
6015
  if (!clickedOffset) return;
@@ -5973,7 +6021,9 @@ var WoongCanvasMarker = function (props) {
5973
6021
 
5974
6022
 
5975
6023
  var handleMouseMove = function (event) {
5976
- if (disableInteractionRef.current) return;
6024
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
6025
+
6026
+ if (draggingRef.current) return;
5977
6027
  var mouseOffset = validateEvent(event, context, controller);
5978
6028
  if (!mouseOffset) return;
5979
6029
  var hoveredItem = findData(mouseOffset);
@@ -6560,7 +6610,9 @@ var WoongCanvasPolygon = function (props) {
6560
6610
  var accumTranslateRef = useRef({
6561
6611
  x: 0,
6562
6612
  y: 0
6563
- }); // 성능 최적화 Refs
6613
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
6614
+
6615
+ var dragStartHoveredItemRef = useRef(null); // 성능 최적화 Refs
6564
6616
 
6565
6617
  var offsetCacheRef = useRef(new LRUCache(maxCacheSize));
6566
6618
  var spatialIndexRef = useRef(new SpatialHashGrid(SPATIAL_GRID_CELL_SIZE));
@@ -6733,14 +6785,18 @@ var WoongCanvasPolygon = function (props) {
6733
6785
  handleDragEndShared = _f.handleDragEnd;
6734
6786
 
6735
6787
  var handleDragStart = function () {
6736
- handleDragStartShared();
6788
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
6789
+
6790
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
6737
6791
  draggingRef.current = true;
6738
6792
  controller.setMapCursor('grabbing');
6739
6793
  };
6740
6794
 
6741
6795
  var handleDragEnd = function () {
6742
6796
  handleDragEndShared();
6743
- draggingRef.current = false;
6797
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
6798
+
6799
+ dragStartHoveredItemRef.current = null;
6744
6800
  controller.setMapCursor('grab');
6745
6801
  }; // Hit Test: 특정 좌표의 폴리곤 찾기
6746
6802
 
@@ -6762,6 +6818,11 @@ var WoongCanvasPolygon = function (props) {
6762
6818
 
6763
6819
 
6764
6820
  var setHovered = function (data) {
6821
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
6822
+ if (draggingRef.current) {
6823
+ return;
6824
+ }
6825
+
6765
6826
  hoveredItemRef.current = data;
6766
6827
 
6767
6828
  if (draggingRef.current) {
@@ -6807,6 +6868,7 @@ var WoongCanvasPolygon = function (props) {
6807
6868
 
6808
6869
 
6809
6870
  var handleClick = function (event) {
6871
+ if (controller.isMapDragged()) return;
6810
6872
  if (disableInteractionRef.current) return;
6811
6873
  var clickedOffset = validateEvent(event, context, controller);
6812
6874
  if (!clickedOffset) return;
@@ -6818,7 +6880,9 @@ var WoongCanvasPolygon = function (props) {
6818
6880
 
6819
6881
 
6820
6882
  var handleMouseMove = function (event) {
6821
- if (disableInteractionRef.current) return;
6883
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
6884
+
6885
+ if (draggingRef.current) return;
6822
6886
  var mouseOffset = validateEvent(event, context, controller);
6823
6887
  if (!mouseOffset) return;
6824
6888
  var hoveredItem = findData(mouseOffset);
@@ -9885,4 +9949,4 @@ function MintMap(_a) {
9885
9949
  }), loading));
9886
9950
  }
9887
9951
 
9888
- export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerHanquf, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, LRUCache, MapBuildingProjection, MapCanvasMarkerWrapper, MapCanvasWrapper, MapControlWrapper, MapEvent, MapLoadingWithImage, MapMarkerWrapper, MapPolygonWrapper, MapPolylineWrapper, MapUIEvent, Marker, MintMap, MintMapCanvasRenderer, MintMapController, MintMapCore, MintMapProvider, NaverMintMapController, Offset, PointLoading, Polygon, PolygonCalculator, PolygonMarker, Polyline, Position, SPATIAL_GRID_CELL_SIZE, SVGCircle, SVGPolygon, SVGRect, Spacing, SpatialHashGrid, Status, WoongCanvasMarker, WoongCanvasPolygon, WoongCanvasProvider, buildSpatialIndex, calculateTextBoxWidth, computeMarkerOffset, computePolygonOffsets, createCanvasDataArray, createMapEventHandlers, getClusterInfo, getMapOfType, hexToRgba, isInViewport, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, mapValuesToArray, syncExternalSelectedItems, syncSelectedItems, updateViewport, useMarkerMoving, useMintMapController, useWoongCanvasContext, validateEvent, waiting };
9952
+ export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerHanquf, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, LRUCache, MapBuildingProjection, MapCanvasMarkerWrapper, MapCanvasWrapper, MapControlWrapper, MapEvent, MapLoadingWithImage, MapMarkerWrapper, MapPolygonWrapper, MapPolylineWrapper, MapUIEvent, Marker, MintMap, MintMapCanvasRenderer, MintMapController, MintMapCore, MintMapProvider, NaverMintMapController, Offset, PointLoading, Polygon, PolygonCalculator, PolygonMarker, Polyline, Position, SPATIAL_GRID_CELL_SIZE, SVGCircle, SVGPolygon, SVGRect, Spacing, SpatialHashGrid, Status, WoongCanvasMarker, WoongCanvasPolygon, WoongCanvasProvider, buildSpatialIndex, calculateTextBoxWidth, computeMarkerOffset, computePolygonOffsets, createCanvasData, createCanvasDataArray, createMapEventHandlers, getClusterInfo, getMapOfType, hexToRgba, isInViewport, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, mapValuesToArray, syncExternalSelectedItems, syncSelectedItems, updateViewport, useMarkerMoving, useMintMapController, useWoongCanvasContext, validateEvent, waiting };
package/dist/index.js CHANGED
@@ -72,6 +72,7 @@ Object.defineProperty(exports, 'CanvasDataType', {
72
72
  exports.calculateTextBoxWidth = utils.calculateTextBoxWidth;
73
73
  exports.computeMarkerOffset = utils.computeMarkerOffset;
74
74
  exports.computePolygonOffsets = utils.computePolygonOffsets;
75
+ exports.createCanvasData = utils.createCanvasData;
75
76
  exports.createCanvasDataArray = utils.createCanvasDataArray;
76
77
  exports.hexToRgba = utils.hexToRgba;
77
78
  exports.isPointInMarkerData = utils.isPointInMarkerData;
package/dist/index.umd.js CHANGED
@@ -992,6 +992,44 @@
992
992
  var textWidth = tempCtx.measureText(text).width;
993
993
  return Math.max(minWidth, textWidth + padding);
994
994
  };
995
+ /**
996
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수
997
+ *
998
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
999
+ * 이 함수를 사용하여 명시적으로 매핑할 수 있습니다.
1000
+ *
1001
+ * @template T 서버에서 받은 원본 데이터 타입
1002
+ * @param serverData 서버에서 받은 원본 데이터
1003
+ * @param canvasOptions CanvasOption 필드들 (충돌하는 필드는 여기서 명시적으로 지정)
1004
+ * @returns CanvasData<T> 타입의 데이터
1005
+ *
1006
+ * @example
1007
+ * ```typescript
1008
+ * interface ServerData {
1009
+ * id: number; // CanvasOption의 id와 충돌
1010
+ * name: string;
1011
+ * }
1012
+ *
1013
+ * const serverData: ServerData = { id: 123, name: "Test" };
1014
+ *
1015
+ * // ✅ 올바른 사용
1016
+ * const canvasData = createCanvasData(serverData, {
1017
+ * id: String(serverData.id), // 명시적으로 변환
1018
+ * position: new Position(37.5, 127.0)
1019
+ * });
1020
+ *
1021
+ * // canvasData는 CanvasData<ServerData> 타입이며:
1022
+ * // - id: string (CanvasOption의 id)
1023
+ * // - name: string (서버 데이터의 name)
1024
+ * // - position: Position (CanvasOption의 position)
1025
+ * ```
1026
+ */
1027
+
1028
+ function createCanvasData(serverData, canvasOptions) {
1029
+ // 서버 데이터와 CanvasOption을 결합
1030
+ // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
1031
+ return tslib.__assign(tslib.__assign({}, serverData), canvasOptions);
1032
+ }
995
1033
  /**
996
1034
  * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
997
1035
  *
@@ -1029,10 +1067,8 @@
1029
1067
 
1030
1068
  function createCanvasDataArray(serverDataArray, getCanvasOptions) {
1031
1069
  return serverDataArray.map(function (serverData, index) {
1032
- var canvasOptions = getCanvasOptions(serverData, index); // 서버 데이터와 CanvasOption을 결합
1033
- // CanvasOption의 필드가 우선되므로 충돌하는 필드는 canvasOptions의 값이 사용됨
1034
-
1035
- return tslib.__assign(tslib.__assign({}, serverData), canvasOptions);
1070
+ var canvasOptions = getCanvasOptions(serverData, index);
1071
+ return createCanvasData(serverData, canvasOptions);
1036
1072
  });
1037
1073
  }
1038
1074
 
@@ -5680,7 +5716,9 @@
5680
5716
  var accumTranslateRef = React.useRef({
5681
5717
  x: 0,
5682
5718
  y: 0
5683
- }); // 성능 최적화 Refs
5719
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
5720
+
5721
+ var dragStartHoveredItemRef = React.useRef(null); // 성능 최적화 Refs
5684
5722
 
5685
5723
  var offsetCacheRef = React.useRef(new LRUCache(maxCacheSize));
5686
5724
  var spatialIndexRef = React.useRef(new SpatialHashGrid(SPATIAL_GRID_CELL_SIZE));
@@ -5879,14 +5917,18 @@
5879
5917
  handleDragEndShared = _g.handleDragEnd;
5880
5918
 
5881
5919
  var handleDragStart = function () {
5882
- handleDragStartShared();
5920
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
5921
+
5922
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
5883
5923
  draggingRef.current = true;
5884
5924
  controller.setMapCursor('grabbing');
5885
5925
  };
5886
5926
 
5887
5927
  var handleDragEnd = function () {
5888
5928
  handleDragEndShared();
5889
- draggingRef.current = false;
5929
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
5930
+
5931
+ dragStartHoveredItemRef.current = null;
5890
5932
  controller.setMapCursor('grab');
5891
5933
  }; // Hit Test: 특정 좌표의 마커 찾기
5892
5934
 
@@ -5917,6 +5959,11 @@
5917
5959
 
5918
5960
 
5919
5961
  var setHovered = function (data) {
5962
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
5963
+ if (draggingRef.current) {
5964
+ return;
5965
+ }
5966
+
5920
5967
  hoveredItemRef.current = data;
5921
5968
 
5922
5969
  if (draggingRef.current) {
@@ -5966,6 +6013,7 @@
5966
6013
 
5967
6014
 
5968
6015
  var handleClick = function (event) {
6016
+ if (controller.isMapDragged()) return;
5969
6017
  if (disableInteractionRef.current) return;
5970
6018
  var clickedOffset = validateEvent(event, context, controller);
5971
6019
  if (!clickedOffset) return;
@@ -5977,7 +6025,9 @@
5977
6025
 
5978
6026
 
5979
6027
  var handleMouseMove = function (event) {
5980
- if (disableInteractionRef.current) return;
6028
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
6029
+
6030
+ if (draggingRef.current) return;
5981
6031
  var mouseOffset = validateEvent(event, context, controller);
5982
6032
  if (!mouseOffset) return;
5983
6033
  var hoveredItem = findData(mouseOffset);
@@ -6564,7 +6614,9 @@
6564
6614
  var accumTranslateRef = React.useRef({
6565
6615
  x: 0,
6566
6616
  y: 0
6567
- }); // 성능 최적화 Refs
6617
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
6618
+
6619
+ var dragStartHoveredItemRef = React.useRef(null); // 성능 최적화 Refs
6568
6620
 
6569
6621
  var offsetCacheRef = React.useRef(new LRUCache(maxCacheSize));
6570
6622
  var spatialIndexRef = React.useRef(new SpatialHashGrid(SPATIAL_GRID_CELL_SIZE));
@@ -6737,14 +6789,18 @@
6737
6789
  handleDragEndShared = _f.handleDragEnd;
6738
6790
 
6739
6791
  var handleDragStart = function () {
6740
- handleDragStartShared();
6792
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
6793
+
6794
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
6741
6795
  draggingRef.current = true;
6742
6796
  controller.setMapCursor('grabbing');
6743
6797
  };
6744
6798
 
6745
6799
  var handleDragEnd = function () {
6746
6800
  handleDragEndShared();
6747
- draggingRef.current = false;
6801
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
6802
+
6803
+ dragStartHoveredItemRef.current = null;
6748
6804
  controller.setMapCursor('grab');
6749
6805
  }; // Hit Test: 특정 좌표의 폴리곤 찾기
6750
6806
 
@@ -6766,6 +6822,11 @@
6766
6822
 
6767
6823
 
6768
6824
  var setHovered = function (data) {
6825
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
6826
+ if (draggingRef.current) {
6827
+ return;
6828
+ }
6829
+
6769
6830
  hoveredItemRef.current = data;
6770
6831
 
6771
6832
  if (draggingRef.current) {
@@ -6811,6 +6872,7 @@
6811
6872
 
6812
6873
 
6813
6874
  var handleClick = function (event) {
6875
+ if (controller.isMapDragged()) return;
6814
6876
  if (disableInteractionRef.current) return;
6815
6877
  var clickedOffset = validateEvent(event, context, controller);
6816
6878
  if (!clickedOffset) return;
@@ -6822,7 +6884,9 @@
6822
6884
 
6823
6885
 
6824
6886
  var handleMouseMove = function (event) {
6825
- if (disableInteractionRef.current) return;
6887
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
6888
+
6889
+ if (draggingRef.current) return;
6826
6890
  var mouseOffset = validateEvent(event, context, controller);
6827
6891
  if (!mouseOffset) return;
6828
6892
  var hoveredItem = findData(mouseOffset);
@@ -9939,6 +10003,7 @@
9939
10003
  exports.calculateTextBoxWidth = calculateTextBoxWidth;
9940
10004
  exports.computeMarkerOffset = computeMarkerOffset;
9941
10005
  exports.computePolygonOffsets = computePolygonOffsets;
10006
+ exports.createCanvasData = createCanvasData;
9942
10007
  exports.createCanvasDataArray = createCanvasDataArray;
9943
10008
  exports.createMapEventHandlers = createMapEventHandlers;
9944
10009
  exports.getClusterInfo = getClusterInfo;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.43",
3
+ "version": "1.2.0-test.45",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",