@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.es.js
CHANGED
|
@@ -5535,9 +5535,12 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
5535
5535
|
/**
|
|
5536
5536
|
* 폴리곤 Event 렌더링 함수
|
|
5537
5537
|
*
|
|
5538
|
-
* @param
|
|
5539
|
-
* @param
|
|
5540
|
-
* @param
|
|
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,
|
|
5552
|
-
* 'rgba(
|
|
5553
|
-
*
|
|
5554
|
-
* 'rgba(255,
|
|
5555
|
-
*
|
|
5556
|
-
*
|
|
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
|
-
// 기본값 설정 (
|
|
5563
|
-
var
|
|
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
|
|
5567
|
+
var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
|
|
5566
5568
|
|
|
5567
|
-
var
|
|
5569
|
+
var _selectedLineWidth = selectedLineWidth || baseLineWidth;
|
|
5568
5570
|
|
|
5569
|
-
var
|
|
5571
|
+
var _activeFillColor = activeFillColor || _selectedFillColor;
|
|
5570
5572
|
|
|
5571
|
-
var
|
|
5573
|
+
var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
|
|
5572
5574
|
|
|
5573
|
-
var
|
|
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:
|
|
5595
|
-
strokeColor:
|
|
5596
|
-
lineWidth:
|
|
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
|
|
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
|
-
|
|
5786
|
-
|
|
5787
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"};
|