@mint-ui/map 1.2.0-test.15 → 1.2.0-test.17

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.
package/dist/index.es.js CHANGED
@@ -5535,9 +5535,12 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
5535
5535
  /**
5536
5536
  * 폴리곤 Event 렌더링 함수
5537
5537
  *
5538
- * @param selectedFillColor 선택된 폴리곤 채우기 색상
5539
- * @param selectedStrokeColor 선택된 폴리곤 테두리 색상
5540
- * @param selectedLineWidth 선택된 폴리곤 테두리 두께
5538
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
5539
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
5540
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
5541
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
5542
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
5543
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
5541
5544
  * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
5542
5545
  * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
5543
5546
  * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
@@ -5548,29 +5551,34 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
5548
5551
  *
5549
5552
  * @example
5550
5553
  * const renderEvent = renderPolygonEvent(
5551
- * 'rgba(255, 193, 7, 0.7)',
5552
- * 'rgba(255, 152, 0, 1)',
5553
- * 4,
5554
- * 'rgba(255, 0, 0, 0.8)',
5555
- * undefined,
5556
- * undefined,
5557
- * 'rgba(100, 150, 255, 0.8)'
5554
+ * 'rgba(255, 100, 100, 0.5)', // baseFillColor
5555
+ * 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
5556
+ * 2, // baseLineWidth
5557
+ * 'rgba(255, 193, 7, 0.7)', // selectedFillColor
5558
+ * 'rgba(255, 152, 0, 1)', // selectedStrokeColor
5559
+ * 4 // selectedLineWidth
5558
5560
  * );
5559
5561
  */
5560
5562
 
5561
- var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
5562
- // 기본값 설정 (selected 기준)
5563
- var _activeFillColor = activeFillColor || selectedFillColor;
5563
+ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
5564
+ // 기본값 설정 (base 기준)
5565
+ var _selectedFillColor = selectedFillColor || baseFillColor;
5564
5566
 
5565
- var _activeStrokeColor = activeStrokeColor || selectedStrokeColor;
5567
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
5566
5568
 
5567
- var _activeLineWidth = activeLineWidth || selectedLineWidth;
5569
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
5568
5570
 
5569
- var _hoveredFillColor = hoveredFillColor || selectedFillColor;
5571
+ var _activeFillColor = activeFillColor || _selectedFillColor;
5570
5572
 
5571
- var _hoveredStrokeColor = hoveredStrokeColor || selectedStrokeColor;
5573
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
5572
5574
 
5573
- var _hoveredLineWidth = hoveredLineWidth || selectedLineWidth;
5575
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
5576
+
5577
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
5578
+
5579
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
5580
+
5581
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
5574
5582
 
5575
5583
  return function (_a) {
5576
5584
  var ctx = _a.ctx,
@@ -5591,9 +5599,9 @@ var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selec
5591
5599
  ctx: ctx,
5592
5600
  polygonOffsets: polygonOffsets,
5593
5601
  isDonutPolygon: item.isDonutPolygon || false,
5594
- fillColor: selectedFillColor,
5595
- strokeColor: selectedStrokeColor,
5596
- lineWidth: selectedLineWidth
5602
+ fillColor: _selectedFillColor,
5603
+ strokeColor: _selectedStrokeColor,
5604
+ lineWidth: _selectedLineWidth
5597
5605
  });
5598
5606
  }
5599
5607
  } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
@@ -5636,7 +5644,7 @@ var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selec
5636
5644
  // 메인 컴포넌트
5637
5645
  // ============================================================================
5638
5646
 
5639
- var WoongCanvasLayerComponent = function (props) {
5647
+ var WoongCanvasLayer = function (props) {
5640
5648
  var data = props.data,
5641
5649
  dataType = props.dataType,
5642
5650
  onClick = props.onClick,
@@ -5690,9 +5698,6 @@ var WoongCanvasLayerComponent = function (props) {
5690
5698
  /** 상호작용 비활성화 상태 (Ref로 관리하여 클로저 문제 해결) */
5691
5699
 
5692
5700
  var disableInteractionRef = useRef(disableInteraction);
5693
- /** 렌더링 설정 (Ref로 관리하여 클로저 문제 해결) */
5694
-
5695
- var renderConfigRef = useRef(dataType === CanvasDataType.MARKER ? props.renderConfig : undefined);
5696
5701
  /** 현재 Hover 중인 항목 */
5697
5702
 
5698
5703
  var hoveredItemRef = useRef(null);
@@ -5781,55 +5786,11 @@ var WoongCanvasLayerComponent = function (props) {
5781
5786
  var bbox = boundingBoxCacheRef.current.get(item.id);
5782
5787
 
5783
5788
  if (!bbox) {
5784
- // 폴리곤인 경우
5785
- if (dataType === CanvasDataType.POLYGON) {
5786
- var offsets = getOrComputePolygonOffsets(item);
5787
- if (!offsets) return false; // 바운딩 박스 계산 (최적화: 직접 비교)
5788
-
5789
- var minX = Infinity,
5790
- minY = Infinity,
5791
- maxX = -Infinity,
5792
- maxY = -Infinity;
5793
-
5794
- for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
5795
- var multiPolygon = offsets_1[_i];
5796
-
5797
- for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
5798
- var polygonGroup = multiPolygon_1[_a];
5799
-
5800
- for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
5801
- var _c = polygonGroup_1[_b],
5802
- x = _c[0],
5803
- y = _c[1];
5804
- if (x < minX) minX = x;
5805
- if (y < minY) minY = y;
5806
- if (x > maxX) maxX = x;
5807
- if (y > maxY) maxY = y;
5808
- }
5809
- }
5810
- }
5811
-
5812
- bbox = {
5813
- minX: minX,
5814
- minY: minY,
5815
- maxX: maxX,
5816
- maxY: maxY
5817
- };
5818
- boundingBoxCacheRef.current.set(item.id, bbox);
5819
- } // 마커인 경우
5820
- else {
5821
- var offset = getOrComputeMarkerOffset(item);
5822
- if (!offset) return false;
5823
- var boxWidth = item.boxWidth || 50;
5824
- var boxHeight = item.boxHeight || 28;
5825
- bbox = {
5826
- minX: offset.x - boxWidth / 2,
5827
- minY: offset.y - boxHeight - 6,
5828
- maxX: offset.x + boxWidth / 2,
5829
- maxY: offset.y
5830
- };
5831
- boundingBoxCacheRef.current.set(item.id, bbox);
5832
- }
5789
+ // 바운딩 박스 계산 (공통 함수 사용)
5790
+ var computed = computeBoundingBox(item);
5791
+ if (!computed) return false;
5792
+ bbox = computed;
5793
+ boundingBoxCacheRef.current.set(item.id, bbox);
5833
5794
  } // 바운딩 박스와 viewport 교차 체크
5834
5795
 
5835
5796
 
@@ -5875,6 +5836,65 @@ var WoongCanvasLayerComponent = function (props) {
5875
5836
 
5876
5837
  return result;
5877
5838
  }; // --------------------------------------------------------------------------
5839
+ // 유틸리티 함수: 바운딩 박스 계산
5840
+ // --------------------------------------------------------------------------
5841
+
5842
+ /**
5843
+ * 아이템의 바운딩 박스 계산 (폴리곤/마커 공통)
5844
+ *
5845
+ * @param item 마커 또는 폴리곤 데이터
5846
+ * @returns 바운딩 박스 또는 null
5847
+ */
5848
+
5849
+
5850
+ var computeBoundingBox = function (item) {
5851
+ if (dataType === CanvasDataType.POLYGON) {
5852
+ // 폴리곤: 모든 좌표의 최소/최대값 계산
5853
+ var offsets = getOrComputePolygonOffsets(item);
5854
+ if (!offsets) return null;
5855
+ var minX = Infinity,
5856
+ minY = Infinity,
5857
+ maxX = -Infinity,
5858
+ maxY = -Infinity;
5859
+
5860
+ for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
5861
+ var multiPolygon = offsets_1[_i];
5862
+
5863
+ for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
5864
+ var polygonGroup = multiPolygon_1[_a];
5865
+
5866
+ for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
5867
+ var _c = polygonGroup_1[_b],
5868
+ x = _c[0],
5869
+ y = _c[1];
5870
+ if (x < minX) minX = x;
5871
+ if (y < minY) minY = y;
5872
+ if (x > maxX) maxX = x;
5873
+ if (y > maxY) maxY = y;
5874
+ }
5875
+ }
5876
+ }
5877
+
5878
+ return {
5879
+ minX: minX,
5880
+ minY: minY,
5881
+ maxX: maxX,
5882
+ maxY: maxY
5883
+ };
5884
+ } else {
5885
+ // 마커: 중심점 기준 박스 크기 계산
5886
+ var offset = getOrComputeMarkerOffset(item);
5887
+ if (!offset) return null;
5888
+ var boxWidth = item.boxWidth || 50;
5889
+ var boxHeight = item.boxHeight || 28;
5890
+ return {
5891
+ minX: offset.x - boxWidth / 2,
5892
+ minY: offset.y - boxHeight - 6,
5893
+ maxX: offset.x + boxWidth / 2,
5894
+ maxY: offset.y
5895
+ };
5896
+ }
5897
+ }; // --------------------------------------------------------------------------
5878
5898
  // 유틸리티 함수: 공간 인덱싱
5879
5899
  // --------------------------------------------------------------------------
5880
5900
 
@@ -5889,52 +5909,12 @@ var WoongCanvasLayerComponent = function (props) {
5889
5909
  var currentMarkers = markersRef.current;
5890
5910
 
5891
5911
  for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
5892
- var item = currentMarkers_1[_i];
5912
+ var item = currentMarkers_1[_i]; // 바운딩 박스 계산 (공통 함수 사용)
5893
5913
 
5894
- if (dataType === CanvasDataType.POLYGON) {
5895
- // 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
5896
- var offsets = getOrComputePolygonOffsets(item);
5897
-
5898
- if (offsets) {
5899
- var minX = Infinity,
5900
- minY = Infinity,
5901
- maxX = -Infinity,
5902
- maxY = -Infinity;
5903
-
5904
- for (var _a = 0, offsets_2 = offsets; _a < offsets_2.length; _a++) {
5905
- var multiPolygon = offsets_2[_a];
5906
-
5907
- for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
5908
- var polygonGroup = multiPolygon_2[_b];
5909
-
5910
- for (var _c = 0, polygonGroup_2 = polygonGroup; _c < polygonGroup_2.length; _c++) {
5911
- var _d = polygonGroup_2[_c],
5912
- x = _d[0],
5913
- y = _d[1];
5914
- if (x < minX) minX = x;
5915
- if (y < minY) minY = y;
5916
- if (x > maxX) maxX = x;
5917
- if (y > maxY) maxY = y;
5918
- }
5919
- }
5920
- }
5914
+ var bbox = computeBoundingBox(item);
5921
5915
 
5922
- spatial.insert(item, minX, minY, maxX, maxY);
5923
- }
5924
- } else {
5925
- // 마커: 점 기반 바운딩 박스
5926
- var offset = getOrComputeMarkerOffset(item);
5927
-
5928
- if (offset) {
5929
- var boxWidth = item.boxWidth || 50;
5930
- var boxHeight = item.boxHeight || 28;
5931
- var tailHeight = 6;
5932
- var minX = offset.x - boxWidth / 2;
5933
- var minY = offset.y - boxHeight - tailHeight;
5934
- var maxX = offset.x + boxWidth / 2;
5935
- var maxY = offset.y;
5936
- spatial.insert(item, minX, minY, maxX, maxY);
5937
- }
5916
+ if (bbox) {
5917
+ spatial.insert(item, bbox.minX, bbox.minY, bbox.maxX, bbox.maxY);
5938
5918
  }
5939
5919
  }
5940
5920
  }; // --------------------------------------------------------------------------
@@ -5963,7 +5943,7 @@ var WoongCanvasLayerComponent = function (props) {
5963
5943
  var renderAnimation = dataType === CanvasDataType.MARKER ? props.renderAnimation : undefined;
5964
5944
  var renderEvent = dataType === CanvasDataType.MARKER ? props.renderEvent : function () {
5965
5945
  var polygonProps = props;
5966
- return renderPolygonEvent(polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
5946
+ return renderPolygonEvent(polygonProps.baseFillColor, polygonProps.baseStrokeColor, polygonProps.baseLineWidth, polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
5967
5947
  }();
5968
5948
  /**
5969
5949
  * Base 레이어 렌더링 (뷰포트 컬링 적용, 선택된 마커 제외)
@@ -5995,8 +5975,7 @@ var WoongCanvasLayerComponent = function (props) {
5995
5975
  ctx: ctx,
5996
5976
  items: visibleMarkers,
5997
5977
  selectedIds: selectedIdsRef.current,
5998
- utils: renderUtils,
5999
- config: renderConfigRef.current
5978
+ utils: renderUtils
6000
5979
  });
6001
5980
  },
6002
5981
  perfectDrawEnabled: false,
@@ -6026,8 +6005,7 @@ var WoongCanvasLayerComponent = function (props) {
6026
6005
  layer: layer,
6027
6006
  selectedIds: selectedIdsRef.current,
6028
6007
  items: markersRef.current,
6029
- utils: renderUtils,
6030
- config: renderConfigRef.current
6008
+ utils: renderUtils
6031
6009
  });
6032
6010
  };
6033
6011
  /**
@@ -6043,13 +6021,6 @@ var WoongCanvasLayerComponent = function (props) {
6043
6021
  var doRenderEvent = function () {
6044
6022
  var layer = eventLayerRef.current;
6045
6023
  if (!layer) return;
6046
-
6047
- if (!onClick && !onMouseOver && !onMouseOut) {
6048
- layer.destroyChildren();
6049
- layer.batchDraw();
6050
- return;
6051
- }
6052
-
6053
6024
  if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
6054
6025
 
6055
6026
  var shape = layer.findOne('.event-render-shape');
@@ -6068,8 +6039,7 @@ var WoongCanvasLayerComponent = function (props) {
6068
6039
  hoveredItem: hoveredItemRef.current,
6069
6040
  utils: renderUtils,
6070
6041
  selectedItems: selectedItems,
6071
- selectedItem: selectedItemRef.current,
6072
- config: renderConfigRef.current
6042
+ selectedItem: selectedItemRef.current
6073
6043
  });
6074
6044
  },
6075
6045
  perfectDrawEnabled: false,
@@ -6249,7 +6219,6 @@ var WoongCanvasLayerComponent = function (props) {
6249
6219
 
6250
6220
 
6251
6221
  var setHovered = function (data) {
6252
- if (!onMouseOver && !onMouseOut) return;
6253
6222
  hoveredItemRef.current = data;
6254
6223
 
6255
6224
  if (draggingRef.current) {
@@ -6274,8 +6243,7 @@ var WoongCanvasLayerComponent = function (props) {
6274
6243
 
6275
6244
 
6276
6245
  var handleLocalClick = function (data) {
6277
- if (!onClick) return; // 1. 선택 상태 업데이트
6278
-
6246
+ // 1. 선택 상태 업데이트
6279
6247
  if (enableMultiSelect) {
6280
6248
  // 다중 선택: Set과 Map 동시 업데이트
6281
6249
  var newSelected = new Set(selectedIdsRef.current);
@@ -6327,7 +6295,6 @@ var WoongCanvasLayerComponent = function (props) {
6327
6295
 
6328
6296
  if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
6329
6297
 
6330
- if (!onClick) return;
6331
6298
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6332
6299
 
6333
6300
  try {
@@ -6336,7 +6303,10 @@ var WoongCanvasLayerComponent = function (props) {
6336
6303
 
6337
6304
  if (data_1) {
6338
6305
  handleLocalClick(data_1);
6339
- onClick(data_1, selectedIdsRef.current);
6306
+
6307
+ if (onClick) {
6308
+ onClick(data_1, selectedIdsRef.current);
6309
+ }
6340
6310
  }
6341
6311
  } catch (error) {
6342
6312
  console.error('[WoongKonvaMarker] handleClick error:', error);
@@ -6352,7 +6322,6 @@ var WoongCanvasLayerComponent = function (props) {
6352
6322
 
6353
6323
  if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
6354
6324
 
6355
- if (!onMouseOver && !onMouseOut) return;
6356
6325
  if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
6357
6326
 
6358
6327
  try {
@@ -6395,7 +6364,6 @@ var WoongCanvasLayerComponent = function (props) {
6395
6364
  var handleMouseLeave = function () {
6396
6365
  if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
6397
6366
 
6398
- if (!onMouseOver && !onMouseOut) return;
6399
6367
  var prevHovered = hoveredItemRef.current;
6400
6368
 
6401
6369
  if (prevHovered) {
@@ -6581,18 +6549,6 @@ var WoongCanvasLayerComponent = function (props) {
6581
6549
  useEffect(function () {
6582
6550
  disableInteractionRef.current = disableInteraction;
6583
6551
  }, [disableInteraction]); // --------------------------------------------------------------------------
6584
- // Lifecycle: renderConfig 동기화
6585
- // --------------------------------------------------------------------------
6586
-
6587
- useEffect(function () {
6588
- if (dataType === CanvasDataType.MARKER) {
6589
- renderConfigRef.current = props.renderConfig; // config 변경 시 렌더링 업데이트
6590
-
6591
- doRenderBase();
6592
- doRenderAnimation();
6593
- doRenderEvent();
6594
- }
6595
- }, [dataType === CanvasDataType.MARKER ? props.renderConfig : undefined]); // --------------------------------------------------------------------------
6596
6552
  // Lifecycle: 외부 selectedItems 동기화
6597
6553
  // --------------------------------------------------------------------------
6598
6554
 
@@ -6692,117 +6648,6 @@ var WoongCanvasLayerComponent = function (props) {
6692
6648
  }
6693
6649
  }), divElement);
6694
6650
  };
6695
- /**
6696
- * 🚀 WoongCanvasLayer - Konva 기반 초고성능 마커/폴리곤 렌더링 컴포넌트
6697
- *
6698
- * ## 📌 주요 특징
6699
- * - **30,000개 이상의 폴리곤/마커를 60fps로 렌더링**
6700
- * - **Multi-Layer 아키텍처**: Base/Animation/Event 레이어 분리
6701
- * - **Spatial Hash Grid**: O(1) 수준의 빠른 Hit Test
6702
- * - **LRU 캐시**: 좌표 변환 결과 캐싱으로 성능 최적화
6703
- * - **Viewport Culling**: 화면에 보이는 영역만 렌더링
6704
- * - **Discriminated Union Props**: 타입 안전한 MARKER/POLYGON 모드
6705
- *
6706
- * ## 🎯 사용 방법
6707
- *
6708
- * ### 1️⃣ POLYGON 모드 (자동 렌더링)
6709
- * ```tsx
6710
- * <WoongCanvasLayer
6711
- * dataType={CanvasDataType.POLYGON}
6712
- * data={polygons}
6713
- * baseFillColor="rgba(255, 100, 100, 0.5)"
6714
- * baseStrokeColor="rgba(200, 50, 50, 0.8)"
6715
- * baseLineWidth={2}
6716
- * selectedFillColor="rgba(255, 193, 7, 0.7)"
6717
- * selectedStrokeColor="rgba(255, 152, 0, 1)"
6718
- * selectedLineWidth={4}
6719
- * hoveredFillColor="rgba(100, 150, 255, 0.8)" // optional
6720
- * hoveredStrokeColor="rgba(0, 100, 200, 1)" // optional
6721
- * hoveredLineWidth={3} // optional
6722
- * enableMultiSelect={true}
6723
- * onClick={handleClick}
6724
- * />
6725
- * ```
6726
- *
6727
- * ### 2️⃣ MARKER 모드 (커스텀 렌더링)
6728
- * ```tsx
6729
- * <WoongCanvasLayer
6730
- * dataType={CanvasDataType.MARKER}
6731
- * data={markers}
6732
- * renderBase={renderMarkerBase} // required
6733
- * renderAnimation={renderMarkerAnimation} // optional
6734
- * renderEvent={renderMarkerEvent} // optional
6735
- * topOnHover={true}
6736
- * onClick={handleClick}
6737
- * />
6738
- * ```
6739
- *
6740
- * ## 📊 데이터 형식
6741
- * ```typescript
6742
- * const data: KonvaCanvasData<T>[] = [
6743
- * {
6744
- * id: 'unique-id',
6745
- * position: new Position(lat, lng),
6746
- * // POLYGON: paths 필수
6747
- * paths: [[[lat, lng], [lat, lng], ...]],
6748
- * // MARKER: boxWidth/boxHeight 권장 (Hit Test 정확도)
6749
- * boxWidth: 60,
6750
- * boxHeight: 75,
6751
- * // 커스텀 데이터
6752
- * ...customData
6753
- * }
6754
- * ];
6755
- * ```
6756
- *
6757
- * ## ⚡ 성능 최적화 팁
6758
- * 1. **동적 boxWidth 계산**: `measureText()`로 실제 너비 계산 후 전달
6759
- * 2. **enableViewportCulling**: 대량 데이터 시 필수 (기본 true)
6760
- * 3. **selectedItems 외부 관리**: 상태를 외부에서 관리하여 리렌더링 최소화
6761
- * 4. **React.memo 최적화**: 컴포넌트가 자동으로 불필요한 리렌더링 방지
6762
- *
6763
- * @template T 마커/폴리곤 데이터의 추가 속성 타입
6764
- *
6765
- * @example
6766
- * // 동적 boxWidth 계산 예시
6767
- * const tempCtx = document.createElement('canvas').getContext('2d');
6768
- * tempCtx.font = 'bold 15px Arial';
6769
- * const boxWidth = Math.max(60, tempCtx.measureText(text).width + 20);
6770
- *
6771
- * @see {@link https://github.com/your-repo/docs/WoongCanvasLayer.md} 전체 문서
6772
- */
6773
-
6774
-
6775
- var WoongCanvasLayer = React.memo(WoongCanvasLayerComponent, function (prevProps, nextProps) {
6776
- // 1. data 비교
6777
- var prevData = prevProps.data;
6778
- var nextData = nextProps.data; // 참조가 같으면 스킵
6779
-
6780
- if (prevData !== nextData) {
6781
- // 길이가 다르면 변경됨
6782
- if (prevData.length !== nextData.length) return false; // 각 데이터의 ID 비교
6783
-
6784
- for (var i = 0; i < prevData.length; i++) {
6785
- if (prevData[i].id !== nextData[i].id) {
6786
- return false; // 변경됨 → 리렌더링
6787
- }
6788
- }
6789
- } // 2. selectedItems 비교 (참조만 비교)
6790
-
6791
-
6792
- if (prevProps.selectedItems !== nextProps.selectedItems) {
6793
- return false; // 변경됨 → 리렌더링
6794
- }
6795
-
6796
- if (prevProps.selectedItem !== nextProps.selectedItem) {
6797
- return false; // 변경됨 → 리렌더링
6798
- }
6799
-
6800
- if (prevProps.disableInteraction !== nextProps.disableInteraction) {
6801
- return false; // 변경됨 → 리렌더링
6802
- }
6803
-
6804
- return true; // 같음 → 리렌더링 스킵
6805
- });
6806
6651
 
6807
6652
  var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
6808
6653
  var styles = {"mint-map-control-wrapper-container":"MintMapWrapper-module_mint-map-control-wrapper-container__DONh7","mint-map-overlay-wrapper":"MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV"};