@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/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.d.ts +12 -17
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.js +78 -241
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +14 -12
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +29 -21
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +16 -72
- package/dist/components/mint-map/google/GoogleMintMapController.js +1 -1
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +1 -1
- package/dist/components/mint-map/naver/NaverMintMapController.js +1 -1
- package/dist/index.es.js +107 -262
- package/dist/index.umd.js +107 -262
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -5539,9 +5539,12 @@
|
|
|
5539
5539
|
/**
|
|
5540
5540
|
* 폴리곤 Event 렌더링 함수
|
|
5541
5541
|
*
|
|
5542
|
-
* @param
|
|
5543
|
-
* @param
|
|
5544
|
-
* @param
|
|
5542
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
5543
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
5544
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
5545
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
5546
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
5547
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
5545
5548
|
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
5546
5549
|
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
5547
5550
|
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
@@ -5552,29 +5555,34 @@
|
|
|
5552
5555
|
*
|
|
5553
5556
|
* @example
|
|
5554
5557
|
* const renderEvent = renderPolygonEvent(
|
|
5555
|
-
* 'rgba(255,
|
|
5556
|
-
* 'rgba(
|
|
5557
|
-
*
|
|
5558
|
-
* 'rgba(255,
|
|
5559
|
-
*
|
|
5560
|
-
*
|
|
5561
|
-
* 'rgba(100, 150, 255, 0.8)'
|
|
5558
|
+
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
5559
|
+
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
5560
|
+
* 2, // baseLineWidth
|
|
5561
|
+
* 'rgba(255, 193, 7, 0.7)', // selectedFillColor
|
|
5562
|
+
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
5563
|
+
* 4 // selectedLineWidth
|
|
5562
5564
|
* );
|
|
5563
5565
|
*/
|
|
5564
5566
|
|
|
5565
|
-
var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
5566
|
-
// 기본값 설정 (
|
|
5567
|
-
var
|
|
5567
|
+
var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
5568
|
+
// 기본값 설정 (base 기준)
|
|
5569
|
+
var _selectedFillColor = selectedFillColor || baseFillColor;
|
|
5568
5570
|
|
|
5569
|
-
var
|
|
5571
|
+
var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
|
|
5570
5572
|
|
|
5571
|
-
var
|
|
5573
|
+
var _selectedLineWidth = selectedLineWidth || baseLineWidth;
|
|
5572
5574
|
|
|
5573
|
-
var
|
|
5575
|
+
var _activeFillColor = activeFillColor || _selectedFillColor;
|
|
5574
5576
|
|
|
5575
|
-
var
|
|
5577
|
+
var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
|
|
5576
5578
|
|
|
5577
|
-
var
|
|
5579
|
+
var _activeLineWidth = activeLineWidth || _selectedLineWidth;
|
|
5580
|
+
|
|
5581
|
+
var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
|
|
5582
|
+
|
|
5583
|
+
var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
|
|
5584
|
+
|
|
5585
|
+
var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
|
|
5578
5586
|
|
|
5579
5587
|
return function (_a) {
|
|
5580
5588
|
var ctx = _a.ctx,
|
|
@@ -5595,9 +5603,9 @@
|
|
|
5595
5603
|
ctx: ctx,
|
|
5596
5604
|
polygonOffsets: polygonOffsets,
|
|
5597
5605
|
isDonutPolygon: item.isDonutPolygon || false,
|
|
5598
|
-
fillColor:
|
|
5599
|
-
strokeColor:
|
|
5600
|
-
lineWidth:
|
|
5606
|
+
fillColor: _selectedFillColor,
|
|
5607
|
+
strokeColor: _selectedStrokeColor,
|
|
5608
|
+
lineWidth: _selectedLineWidth
|
|
5601
5609
|
});
|
|
5602
5610
|
}
|
|
5603
5611
|
} // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
|
|
@@ -5640,7 +5648,7 @@
|
|
|
5640
5648
|
// 메인 컴포넌트
|
|
5641
5649
|
// ============================================================================
|
|
5642
5650
|
|
|
5643
|
-
var
|
|
5651
|
+
var WoongCanvasLayer = function (props) {
|
|
5644
5652
|
var data = props.data,
|
|
5645
5653
|
dataType = props.dataType,
|
|
5646
5654
|
onClick = props.onClick,
|
|
@@ -5694,9 +5702,6 @@
|
|
|
5694
5702
|
/** 상호작용 비활성화 상태 (Ref로 관리하여 클로저 문제 해결) */
|
|
5695
5703
|
|
|
5696
5704
|
var disableInteractionRef = React.useRef(disableInteraction);
|
|
5697
|
-
/** 렌더링 설정 (Ref로 관리하여 클로저 문제 해결) */
|
|
5698
|
-
|
|
5699
|
-
var renderConfigRef = React.useRef(dataType === exports.CanvasDataType.MARKER ? props.renderConfig : undefined);
|
|
5700
5705
|
/** 현재 Hover 중인 항목 */
|
|
5701
5706
|
|
|
5702
5707
|
var hoveredItemRef = React.useRef(null);
|
|
@@ -5785,55 +5790,11 @@
|
|
|
5785
5790
|
var bbox = boundingBoxCacheRef.current.get(item.id);
|
|
5786
5791
|
|
|
5787
5792
|
if (!bbox) {
|
|
5788
|
-
//
|
|
5789
|
-
|
|
5790
|
-
|
|
5791
|
-
|
|
5792
|
-
|
|
5793
|
-
var minX = Infinity,
|
|
5794
|
-
minY = Infinity,
|
|
5795
|
-
maxX = -Infinity,
|
|
5796
|
-
maxY = -Infinity;
|
|
5797
|
-
|
|
5798
|
-
for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
|
|
5799
|
-
var multiPolygon = offsets_1[_i];
|
|
5800
|
-
|
|
5801
|
-
for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
|
|
5802
|
-
var polygonGroup = multiPolygon_1[_a];
|
|
5803
|
-
|
|
5804
|
-
for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
|
|
5805
|
-
var _c = polygonGroup_1[_b],
|
|
5806
|
-
x = _c[0],
|
|
5807
|
-
y = _c[1];
|
|
5808
|
-
if (x < minX) minX = x;
|
|
5809
|
-
if (y < minY) minY = y;
|
|
5810
|
-
if (x > maxX) maxX = x;
|
|
5811
|
-
if (y > maxY) maxY = y;
|
|
5812
|
-
}
|
|
5813
|
-
}
|
|
5814
|
-
}
|
|
5815
|
-
|
|
5816
|
-
bbox = {
|
|
5817
|
-
minX: minX,
|
|
5818
|
-
minY: minY,
|
|
5819
|
-
maxX: maxX,
|
|
5820
|
-
maxY: maxY
|
|
5821
|
-
};
|
|
5822
|
-
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5823
|
-
} // 마커인 경우
|
|
5824
|
-
else {
|
|
5825
|
-
var offset = getOrComputeMarkerOffset(item);
|
|
5826
|
-
if (!offset) return false;
|
|
5827
|
-
var boxWidth = item.boxWidth || 50;
|
|
5828
|
-
var boxHeight = item.boxHeight || 28;
|
|
5829
|
-
bbox = {
|
|
5830
|
-
minX: offset.x - boxWidth / 2,
|
|
5831
|
-
minY: offset.y - boxHeight - 6,
|
|
5832
|
-
maxX: offset.x + boxWidth / 2,
|
|
5833
|
-
maxY: offset.y
|
|
5834
|
-
};
|
|
5835
|
-
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5836
|
-
}
|
|
5793
|
+
// 바운딩 박스 계산 (공통 함수 사용)
|
|
5794
|
+
var computed = computeBoundingBox(item);
|
|
5795
|
+
if (!computed) return false;
|
|
5796
|
+
bbox = computed;
|
|
5797
|
+
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5837
5798
|
} // 바운딩 박스와 viewport 교차 체크
|
|
5838
5799
|
|
|
5839
5800
|
|
|
@@ -5879,6 +5840,65 @@
|
|
|
5879
5840
|
|
|
5880
5841
|
return result;
|
|
5881
5842
|
}; // --------------------------------------------------------------------------
|
|
5843
|
+
// 유틸리티 함수: 바운딩 박스 계산
|
|
5844
|
+
// --------------------------------------------------------------------------
|
|
5845
|
+
|
|
5846
|
+
/**
|
|
5847
|
+
* 아이템의 바운딩 박스 계산 (폴리곤/마커 공통)
|
|
5848
|
+
*
|
|
5849
|
+
* @param item 마커 또는 폴리곤 데이터
|
|
5850
|
+
* @returns 바운딩 박스 또는 null
|
|
5851
|
+
*/
|
|
5852
|
+
|
|
5853
|
+
|
|
5854
|
+
var computeBoundingBox = function (item) {
|
|
5855
|
+
if (dataType === exports.CanvasDataType.POLYGON) {
|
|
5856
|
+
// 폴리곤: 모든 좌표의 최소/최대값 계산
|
|
5857
|
+
var offsets = getOrComputePolygonOffsets(item);
|
|
5858
|
+
if (!offsets) return null;
|
|
5859
|
+
var minX = Infinity,
|
|
5860
|
+
minY = Infinity,
|
|
5861
|
+
maxX = -Infinity,
|
|
5862
|
+
maxY = -Infinity;
|
|
5863
|
+
|
|
5864
|
+
for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
|
|
5865
|
+
var multiPolygon = offsets_1[_i];
|
|
5866
|
+
|
|
5867
|
+
for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
|
|
5868
|
+
var polygonGroup = multiPolygon_1[_a];
|
|
5869
|
+
|
|
5870
|
+
for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
|
|
5871
|
+
var _c = polygonGroup_1[_b],
|
|
5872
|
+
x = _c[0],
|
|
5873
|
+
y = _c[1];
|
|
5874
|
+
if (x < minX) minX = x;
|
|
5875
|
+
if (y < minY) minY = y;
|
|
5876
|
+
if (x > maxX) maxX = x;
|
|
5877
|
+
if (y > maxY) maxY = y;
|
|
5878
|
+
}
|
|
5879
|
+
}
|
|
5880
|
+
}
|
|
5881
|
+
|
|
5882
|
+
return {
|
|
5883
|
+
minX: minX,
|
|
5884
|
+
minY: minY,
|
|
5885
|
+
maxX: maxX,
|
|
5886
|
+
maxY: maxY
|
|
5887
|
+
};
|
|
5888
|
+
} else {
|
|
5889
|
+
// 마커: 중심점 기준 박스 크기 계산
|
|
5890
|
+
var offset = getOrComputeMarkerOffset(item);
|
|
5891
|
+
if (!offset) return null;
|
|
5892
|
+
var boxWidth = item.boxWidth || 50;
|
|
5893
|
+
var boxHeight = item.boxHeight || 28;
|
|
5894
|
+
return {
|
|
5895
|
+
minX: offset.x - boxWidth / 2,
|
|
5896
|
+
minY: offset.y - boxHeight - 6,
|
|
5897
|
+
maxX: offset.x + boxWidth / 2,
|
|
5898
|
+
maxY: offset.y
|
|
5899
|
+
};
|
|
5900
|
+
}
|
|
5901
|
+
}; // --------------------------------------------------------------------------
|
|
5882
5902
|
// 유틸리티 함수: 공간 인덱싱
|
|
5883
5903
|
// --------------------------------------------------------------------------
|
|
5884
5904
|
|
|
@@ -5893,52 +5913,12 @@
|
|
|
5893
5913
|
var currentMarkers = markersRef.current;
|
|
5894
5914
|
|
|
5895
5915
|
for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
|
|
5896
|
-
var item = currentMarkers_1[_i];
|
|
5916
|
+
var item = currentMarkers_1[_i]; // 바운딩 박스 계산 (공통 함수 사용)
|
|
5897
5917
|
|
|
5898
|
-
|
|
5899
|
-
// 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
|
|
5900
|
-
var offsets = getOrComputePolygonOffsets(item);
|
|
5901
|
-
|
|
5902
|
-
if (offsets) {
|
|
5903
|
-
var minX = Infinity,
|
|
5904
|
-
minY = Infinity,
|
|
5905
|
-
maxX = -Infinity,
|
|
5906
|
-
maxY = -Infinity;
|
|
5907
|
-
|
|
5908
|
-
for (var _a = 0, offsets_2 = offsets; _a < offsets_2.length; _a++) {
|
|
5909
|
-
var multiPolygon = offsets_2[_a];
|
|
5910
|
-
|
|
5911
|
-
for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
|
|
5912
|
-
var polygonGroup = multiPolygon_2[_b];
|
|
5913
|
-
|
|
5914
|
-
for (var _c = 0, polygonGroup_2 = polygonGroup; _c < polygonGroup_2.length; _c++) {
|
|
5915
|
-
var _d = polygonGroup_2[_c],
|
|
5916
|
-
x = _d[0],
|
|
5917
|
-
y = _d[1];
|
|
5918
|
-
if (x < minX) minX = x;
|
|
5919
|
-
if (y < minY) minY = y;
|
|
5920
|
-
if (x > maxX) maxX = x;
|
|
5921
|
-
if (y > maxY) maxY = y;
|
|
5922
|
-
}
|
|
5923
|
-
}
|
|
5924
|
-
}
|
|
5918
|
+
var bbox = computeBoundingBox(item);
|
|
5925
5919
|
|
|
5926
|
-
|
|
5927
|
-
|
|
5928
|
-
} else {
|
|
5929
|
-
// 마커: 점 기반 바운딩 박스
|
|
5930
|
-
var offset = getOrComputeMarkerOffset(item);
|
|
5931
|
-
|
|
5932
|
-
if (offset) {
|
|
5933
|
-
var boxWidth = item.boxWidth || 50;
|
|
5934
|
-
var boxHeight = item.boxHeight || 28;
|
|
5935
|
-
var tailHeight = 6;
|
|
5936
|
-
var minX = offset.x - boxWidth / 2;
|
|
5937
|
-
var minY = offset.y - boxHeight - tailHeight;
|
|
5938
|
-
var maxX = offset.x + boxWidth / 2;
|
|
5939
|
-
var maxY = offset.y;
|
|
5940
|
-
spatial.insert(item, minX, minY, maxX, maxY);
|
|
5941
|
-
}
|
|
5920
|
+
if (bbox) {
|
|
5921
|
+
spatial.insert(item, bbox.minX, bbox.minY, bbox.maxX, bbox.maxY);
|
|
5942
5922
|
}
|
|
5943
5923
|
}
|
|
5944
5924
|
}; // --------------------------------------------------------------------------
|
|
@@ -5967,7 +5947,7 @@
|
|
|
5967
5947
|
var renderAnimation = dataType === exports.CanvasDataType.MARKER ? props.renderAnimation : undefined;
|
|
5968
5948
|
var renderEvent = dataType === exports.CanvasDataType.MARKER ? props.renderEvent : function () {
|
|
5969
5949
|
var polygonProps = props;
|
|
5970
|
-
return renderPolygonEvent(polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
|
|
5950
|
+
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);
|
|
5971
5951
|
}();
|
|
5972
5952
|
/**
|
|
5973
5953
|
* Base 레이어 렌더링 (뷰포트 컬링 적용, 선택된 마커 제외)
|
|
@@ -5999,8 +5979,7 @@
|
|
|
5999
5979
|
ctx: ctx,
|
|
6000
5980
|
items: visibleMarkers,
|
|
6001
5981
|
selectedIds: selectedIdsRef.current,
|
|
6002
|
-
utils: renderUtils
|
|
6003
|
-
config: renderConfigRef.current
|
|
5982
|
+
utils: renderUtils
|
|
6004
5983
|
});
|
|
6005
5984
|
},
|
|
6006
5985
|
perfectDrawEnabled: false,
|
|
@@ -6030,8 +6009,7 @@
|
|
|
6030
6009
|
layer: layer,
|
|
6031
6010
|
selectedIds: selectedIdsRef.current,
|
|
6032
6011
|
items: markersRef.current,
|
|
6033
|
-
utils: renderUtils
|
|
6034
|
-
config: renderConfigRef.current
|
|
6012
|
+
utils: renderUtils
|
|
6035
6013
|
});
|
|
6036
6014
|
};
|
|
6037
6015
|
/**
|
|
@@ -6047,13 +6025,6 @@
|
|
|
6047
6025
|
var doRenderEvent = function () {
|
|
6048
6026
|
var layer = eventLayerRef.current;
|
|
6049
6027
|
if (!layer) return;
|
|
6050
|
-
|
|
6051
|
-
if (!onClick && !onMouseOver && !onMouseOut) {
|
|
6052
|
-
layer.destroyChildren();
|
|
6053
|
-
layer.batchDraw();
|
|
6054
|
-
return;
|
|
6055
|
-
}
|
|
6056
|
-
|
|
6057
6028
|
if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
6058
6029
|
|
|
6059
6030
|
var shape = layer.findOne('.event-render-shape');
|
|
@@ -6072,8 +6043,7 @@
|
|
|
6072
6043
|
hoveredItem: hoveredItemRef.current,
|
|
6073
6044
|
utils: renderUtils,
|
|
6074
6045
|
selectedItems: selectedItems,
|
|
6075
|
-
selectedItem: selectedItemRef.current
|
|
6076
|
-
config: renderConfigRef.current
|
|
6046
|
+
selectedItem: selectedItemRef.current
|
|
6077
6047
|
});
|
|
6078
6048
|
},
|
|
6079
6049
|
perfectDrawEnabled: false,
|
|
@@ -6253,7 +6223,6 @@
|
|
|
6253
6223
|
|
|
6254
6224
|
|
|
6255
6225
|
var setHovered = function (data) {
|
|
6256
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6257
6226
|
hoveredItemRef.current = data;
|
|
6258
6227
|
|
|
6259
6228
|
if (draggingRef.current) {
|
|
@@ -6278,8 +6247,7 @@
|
|
|
6278
6247
|
|
|
6279
6248
|
|
|
6280
6249
|
var handleLocalClick = function (data) {
|
|
6281
|
-
|
|
6282
|
-
|
|
6250
|
+
// 1. 선택 상태 업데이트
|
|
6283
6251
|
if (enableMultiSelect) {
|
|
6284
6252
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
6285
6253
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -6331,7 +6299,6 @@
|
|
|
6331
6299
|
|
|
6332
6300
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6333
6301
|
|
|
6334
|
-
if (!onClick) return;
|
|
6335
6302
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6336
6303
|
|
|
6337
6304
|
try {
|
|
@@ -6340,7 +6307,10 @@
|
|
|
6340
6307
|
|
|
6341
6308
|
if (data_1) {
|
|
6342
6309
|
handleLocalClick(data_1);
|
|
6343
|
-
|
|
6310
|
+
|
|
6311
|
+
if (onClick) {
|
|
6312
|
+
onClick(data_1, selectedIdsRef.current);
|
|
6313
|
+
}
|
|
6344
6314
|
}
|
|
6345
6315
|
} catch (error) {
|
|
6346
6316
|
console.error('[WoongKonvaMarker] handleClick error:', error);
|
|
@@ -6356,7 +6326,6 @@
|
|
|
6356
6326
|
|
|
6357
6327
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6358
6328
|
|
|
6359
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6360
6329
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6361
6330
|
|
|
6362
6331
|
try {
|
|
@@ -6399,7 +6368,6 @@
|
|
|
6399
6368
|
var handleMouseLeave = function () {
|
|
6400
6369
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6401
6370
|
|
|
6402
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6403
6371
|
var prevHovered = hoveredItemRef.current;
|
|
6404
6372
|
|
|
6405
6373
|
if (prevHovered) {
|
|
@@ -6585,18 +6553,6 @@
|
|
|
6585
6553
|
React.useEffect(function () {
|
|
6586
6554
|
disableInteractionRef.current = disableInteraction;
|
|
6587
6555
|
}, [disableInteraction]); // --------------------------------------------------------------------------
|
|
6588
|
-
// Lifecycle: renderConfig 동기화
|
|
6589
|
-
// --------------------------------------------------------------------------
|
|
6590
|
-
|
|
6591
|
-
React.useEffect(function () {
|
|
6592
|
-
if (dataType === exports.CanvasDataType.MARKER) {
|
|
6593
|
-
renderConfigRef.current = props.renderConfig; // config 변경 시 렌더링 업데이트
|
|
6594
|
-
|
|
6595
|
-
doRenderBase();
|
|
6596
|
-
doRenderAnimation();
|
|
6597
|
-
doRenderEvent();
|
|
6598
|
-
}
|
|
6599
|
-
}, [dataType === exports.CanvasDataType.MARKER ? props.renderConfig : undefined]); // --------------------------------------------------------------------------
|
|
6600
6556
|
// Lifecycle: 외부 selectedItems 동기화
|
|
6601
6557
|
// --------------------------------------------------------------------------
|
|
6602
6558
|
|
|
@@ -6696,117 +6652,6 @@
|
|
|
6696
6652
|
}
|
|
6697
6653
|
}), divElement);
|
|
6698
6654
|
};
|
|
6699
|
-
/**
|
|
6700
|
-
* 🚀 WoongCanvasLayer - Konva 기반 초고성능 마커/폴리곤 렌더링 컴포넌트
|
|
6701
|
-
*
|
|
6702
|
-
* ## 📌 주요 특징
|
|
6703
|
-
* - **30,000개 이상의 폴리곤/마커를 60fps로 렌더링**
|
|
6704
|
-
* - **Multi-Layer 아키텍처**: Base/Animation/Event 레이어 분리
|
|
6705
|
-
* - **Spatial Hash Grid**: O(1) 수준의 빠른 Hit Test
|
|
6706
|
-
* - **LRU 캐시**: 좌표 변환 결과 캐싱으로 성능 최적화
|
|
6707
|
-
* - **Viewport Culling**: 화면에 보이는 영역만 렌더링
|
|
6708
|
-
* - **Discriminated Union Props**: 타입 안전한 MARKER/POLYGON 모드
|
|
6709
|
-
*
|
|
6710
|
-
* ## 🎯 사용 방법
|
|
6711
|
-
*
|
|
6712
|
-
* ### 1️⃣ POLYGON 모드 (자동 렌더링)
|
|
6713
|
-
* ```tsx
|
|
6714
|
-
* <WoongCanvasLayer
|
|
6715
|
-
* dataType={CanvasDataType.POLYGON}
|
|
6716
|
-
* data={polygons}
|
|
6717
|
-
* baseFillColor="rgba(255, 100, 100, 0.5)"
|
|
6718
|
-
* baseStrokeColor="rgba(200, 50, 50, 0.8)"
|
|
6719
|
-
* baseLineWidth={2}
|
|
6720
|
-
* selectedFillColor="rgba(255, 193, 7, 0.7)"
|
|
6721
|
-
* selectedStrokeColor="rgba(255, 152, 0, 1)"
|
|
6722
|
-
* selectedLineWidth={4}
|
|
6723
|
-
* hoveredFillColor="rgba(100, 150, 255, 0.8)" // optional
|
|
6724
|
-
* hoveredStrokeColor="rgba(0, 100, 200, 1)" // optional
|
|
6725
|
-
* hoveredLineWidth={3} // optional
|
|
6726
|
-
* enableMultiSelect={true}
|
|
6727
|
-
* onClick={handleClick}
|
|
6728
|
-
* />
|
|
6729
|
-
* ```
|
|
6730
|
-
*
|
|
6731
|
-
* ### 2️⃣ MARKER 모드 (커스텀 렌더링)
|
|
6732
|
-
* ```tsx
|
|
6733
|
-
* <WoongCanvasLayer
|
|
6734
|
-
* dataType={CanvasDataType.MARKER}
|
|
6735
|
-
* data={markers}
|
|
6736
|
-
* renderBase={renderMarkerBase} // required
|
|
6737
|
-
* renderAnimation={renderMarkerAnimation} // optional
|
|
6738
|
-
* renderEvent={renderMarkerEvent} // optional
|
|
6739
|
-
* topOnHover={true}
|
|
6740
|
-
* onClick={handleClick}
|
|
6741
|
-
* />
|
|
6742
|
-
* ```
|
|
6743
|
-
*
|
|
6744
|
-
* ## 📊 데이터 형식
|
|
6745
|
-
* ```typescript
|
|
6746
|
-
* const data: KonvaCanvasData<T>[] = [
|
|
6747
|
-
* {
|
|
6748
|
-
* id: 'unique-id',
|
|
6749
|
-
* position: new Position(lat, lng),
|
|
6750
|
-
* // POLYGON: paths 필수
|
|
6751
|
-
* paths: [[[lat, lng], [lat, lng], ...]],
|
|
6752
|
-
* // MARKER: boxWidth/boxHeight 권장 (Hit Test 정확도)
|
|
6753
|
-
* boxWidth: 60,
|
|
6754
|
-
* boxHeight: 75,
|
|
6755
|
-
* // 커스텀 데이터
|
|
6756
|
-
* ...customData
|
|
6757
|
-
* }
|
|
6758
|
-
* ];
|
|
6759
|
-
* ```
|
|
6760
|
-
*
|
|
6761
|
-
* ## ⚡ 성능 최적화 팁
|
|
6762
|
-
* 1. **동적 boxWidth 계산**: `measureText()`로 실제 너비 계산 후 전달
|
|
6763
|
-
* 2. **enableViewportCulling**: 대량 데이터 시 필수 (기본 true)
|
|
6764
|
-
* 3. **selectedItems 외부 관리**: 상태를 외부에서 관리하여 리렌더링 최소화
|
|
6765
|
-
* 4. **React.memo 최적화**: 컴포넌트가 자동으로 불필요한 리렌더링 방지
|
|
6766
|
-
*
|
|
6767
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
6768
|
-
*
|
|
6769
|
-
* @example
|
|
6770
|
-
* // 동적 boxWidth 계산 예시
|
|
6771
|
-
* const tempCtx = document.createElement('canvas').getContext('2d');
|
|
6772
|
-
* tempCtx.font = 'bold 15px Arial';
|
|
6773
|
-
* const boxWidth = Math.max(60, tempCtx.measureText(text).width + 20);
|
|
6774
|
-
*
|
|
6775
|
-
* @see {@link https://github.com/your-repo/docs/WoongCanvasLayer.md} 전체 문서
|
|
6776
|
-
*/
|
|
6777
|
-
|
|
6778
|
-
|
|
6779
|
-
var WoongCanvasLayer = React__default["default"].memo(WoongCanvasLayerComponent, function (prevProps, nextProps) {
|
|
6780
|
-
// 1. data 비교
|
|
6781
|
-
var prevData = prevProps.data;
|
|
6782
|
-
var nextData = nextProps.data; // 참조가 같으면 스킵
|
|
6783
|
-
|
|
6784
|
-
if (prevData !== nextData) {
|
|
6785
|
-
// 길이가 다르면 변경됨
|
|
6786
|
-
if (prevData.length !== nextData.length) return false; // 각 데이터의 ID 비교
|
|
6787
|
-
|
|
6788
|
-
for (var i = 0; i < prevData.length; i++) {
|
|
6789
|
-
if (prevData[i].id !== nextData[i].id) {
|
|
6790
|
-
return false; // 변경됨 → 리렌더링
|
|
6791
|
-
}
|
|
6792
|
-
}
|
|
6793
|
-
} // 2. selectedItems 비교 (참조만 비교)
|
|
6794
|
-
|
|
6795
|
-
|
|
6796
|
-
if (prevProps.selectedItems !== nextProps.selectedItems) {
|
|
6797
|
-
return false; // 변경됨 → 리렌더링
|
|
6798
|
-
}
|
|
6799
|
-
|
|
6800
|
-
if (prevProps.selectedItem !== nextProps.selectedItem) {
|
|
6801
|
-
return false; // 변경됨 → 리렌더링
|
|
6802
|
-
}
|
|
6803
|
-
|
|
6804
|
-
if (prevProps.disableInteraction !== nextProps.disableInteraction) {
|
|
6805
|
-
return false; // 변경됨 → 리렌더링
|
|
6806
|
-
}
|
|
6807
|
-
|
|
6808
|
-
return true; // 같음 → 리렌더링 스킵
|
|
6809
|
-
});
|
|
6810
6655
|
|
|
6811
6656
|
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}";
|
|
6812
6657
|
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"};
|