@mint-ui/map 1.2.0-test.55 → 1.2.0-test.57

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.
@@ -139,7 +139,13 @@ interface CanvasPolygonLayerPropsWithIndividualStyles<T> extends CanvasPolygonLa
139
139
  hoveredLineWidth?: number;
140
140
  /** 다른 방식 props는 사용 불가 */
141
141
  renderStyle?: never;
142
- customStyle?: never;
142
+ /**
143
+ * 폴리곤 스타일 커스터마이징 함수 (선택)
144
+ *
145
+ * customStyle이 제공되면 우선적으로 사용되며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
146
+ * item 데이터와 상태 정보를 기반으로 자유롭게 스타일을 커스터마이징할 수 있습니다.
147
+ */
148
+ customStyle?: PolygonStyleCustomizer<T>;
143
149
  }
144
150
  /**
145
151
  * 객체 Props 방식
@@ -171,13 +177,19 @@ interface CanvasPolygonLayerPropsWithObjectStyle<T> extends CanvasPolygonLayerBa
171
177
  baseFillColor?: never;
172
178
  baseLineWidth?: never;
173
179
  baseStrokeColor?: never;
174
- customStyle?: never;
175
180
  hoveredFillColor?: never;
176
181
  hoveredLineWidth?: never;
177
182
  hoveredStrokeColor?: never;
178
183
  selectedFillColor?: never;
179
184
  selectedLineWidth?: never;
180
185
  selectedStrokeColor?: never;
186
+ /**
187
+ * 폴리곤 스타일 커스터마이징 함수 (선택)
188
+ *
189
+ * customStyle이 제공되면 우선적으로 사용되며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
190
+ * item 데이터와 상태 정보를 기반으로 자유롭게 스타일을 커스터마이징할 수 있습니다.
191
+ */
192
+ customStyle?: PolygonStyleCustomizer<T>;
181
193
  }
182
194
  /**
183
195
  * 함수 Props 방식 (커스터마이징 방식)
@@ -240,7 +252,8 @@ interface CanvasPolygonLayerPropsWithCustomStyle<T> extends CanvasPolygonLayerBa
240
252
  * 2. 객체 방식: renderStyle 객체가 있으면 자동으로 객체 방식
241
253
  * 3. 함수 방식: customStyle 함수가 있으면 자동으로 함수 방식
242
254
  *
243
- * 방식은 동시에 사용할 수 없습니다 (mutually exclusive).
255
+ * customStyle은 개별 props 방식 또는 renderStyle 객체 방식과 함께 사용할 수 있습니다.
256
+ * customStyle이 제공되면 우선적으로 사용되며, null/undefined를 반환하면 기본 스타일을 사용합니다.
244
257
  * styleMode prop은 필요 없으며, 각 prop의 존재 여부로 자동 판단됩니다.
245
258
  *
246
259
  * @template T 폴리곤 데이터의 추가 속성 타입
@@ -39,14 +39,14 @@ var CanvasPolygonLayer = function (props) {
39
39
  externalSelectedItem = props.selectedItem,
40
40
  _e = props.disableInteraction,
41
41
  disableInteraction = _e === void 0 ? false : _e,
42
- options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // 세 가지 방식 중 하나만 선택: customStyle > renderStyle > 개별 props
42
+ options = tslib.__rest(props, ["data", "onClick", "enableMultiSelect", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // customStyle 다른 방식과 함께 사용 가능
43
43
 
44
44
 
45
- var isCustomStyleMode = 'customStyle' in props && props.customStyle !== undefined;
46
- var isObjectMode = !isCustomStyleMode && 'renderStyle' in props && props.renderStyle !== undefined;
47
- var isIndividualMode = !isCustomStyleMode && !isObjectMode; // 각 방식별 props 추출
45
+ var hasCustomStyle = 'customStyle' in props && props.customStyle !== undefined;
46
+ var isObjectMode = 'renderStyle' in props && props.renderStyle !== undefined;
47
+ var isIndividualMode = 'baseFillColor' in props && props.baseFillColor !== undefined; // 각 방식별 props 추출
48
48
 
49
- var customStyleProps = isCustomStyleMode ? props : undefined;
49
+ var customStyle = hasCustomStyle ? props.customStyle : undefined;
50
50
  var individualProps = isIndividualMode ? props : undefined;
51
51
  var objectProps = isObjectMode ? props : undefined; // --------------------------------------------------------------------------
52
52
  // Hooks & Context
@@ -156,17 +156,32 @@ var CanvasPolygonLayer = function (props) {
156
156
  }; // 렌더링 함수 생성 (스타일 지정 방식에 따라 분기)
157
157
 
158
158
  var renderBase;
159
- var renderEvent;
160
-
161
- if (isCustomStyleMode && customStyleProps) {
162
- renderBase = renderer.renderPolygonBaseWithCustomStyle(customStyleProps.customStyle);
163
- renderEvent = renderer.renderPolygonEventWithCustomStyle(customStyleProps.customStyle);
164
- } else if (isObjectMode && objectProps) {
165
- renderBase = renderer.renderPolygonBaseWithObject(objectProps.renderStyle);
166
- renderEvent = renderer.renderPolygonEventWithObject(objectProps.renderStyle);
159
+ var renderEvent; // customStyle이 있으면 하이브리드 방식 사용, 없으면 기존 방식 사용
160
+
161
+ if (isObjectMode && objectProps) {
162
+ if (hasCustomStyle) {
163
+ // customStyle + renderStyle 하이브리드
164
+ renderBase = renderer.renderPolygonBaseWithHybridObject(customStyle, objectProps.renderStyle);
165
+ renderEvent = renderer.renderPolygonEventWithHybridObject(customStyle, objectProps.renderStyle);
166
+ } else {
167
+ // renderStyle만 사용
168
+ renderBase = renderer.renderPolygonBaseWithObject(objectProps.renderStyle);
169
+ renderEvent = renderer.renderPolygonEventWithObject(objectProps.renderStyle);
170
+ }
167
171
  } else if (isIndividualMode && individualProps) {
168
- renderBase = renderer.renderPolygonBase(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth);
169
- renderEvent = renderer.renderPolygonEvent(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth, individualProps.selectedFillColor, individualProps.selectedStrokeColor, individualProps.selectedLineWidth, individualProps.activeFillColor, individualProps.activeStrokeColor, individualProps.activeLineWidth, individualProps.hoveredFillColor, individualProps.hoveredStrokeColor, individualProps.hoveredLineWidth);
172
+ if (hasCustomStyle) {
173
+ // customStyle + 개별 props 하이브리드
174
+ renderBase = renderer.renderPolygonBaseWithHybrid(customStyle, individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth);
175
+ renderEvent = renderer.renderPolygonEventWithHybrid(customStyle, individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth, individualProps.selectedFillColor, individualProps.selectedStrokeColor, individualProps.selectedLineWidth, individualProps.activeFillColor, individualProps.activeStrokeColor, individualProps.activeLineWidth, individualProps.hoveredFillColor, individualProps.hoveredStrokeColor, individualProps.hoveredLineWidth);
176
+ } else {
177
+ // 개별 props만 사용
178
+ renderBase = renderer.renderPolygonBase(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth);
179
+ renderEvent = renderer.renderPolygonEvent(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth, individualProps.selectedFillColor, individualProps.selectedStrokeColor, individualProps.selectedLineWidth, individualProps.activeFillColor, individualProps.activeStrokeColor, individualProps.activeLineWidth, individualProps.hoveredFillColor, individualProps.hoveredStrokeColor, individualProps.hoveredLineWidth);
180
+ }
181
+ } else if (hasCustomStyle && customStyle) {
182
+ // customStyle만 사용 (기존 방식)
183
+ renderBase = renderer.renderPolygonBaseWithCustomStyle(customStyle);
184
+ renderEvent = renderer.renderPolygonEventWithCustomStyle(customStyle);
170
185
  } else {
171
186
  throw new Error('Invalid props: one of customStyle, renderStyle, or individual style props must be provided');
172
187
  } // Base Layer 렌더링 (뷰포트 컬링 적용)
@@ -239,4 +239,65 @@ export declare const renderPolygonBaseWithCustomStyle: <T = unknown>(customStyle
239
239
  * ```
240
240
  */
241
241
  export declare const renderPolygonEventWithCustomStyle: <T = unknown>(customStyle: PolygonStyleCustomizer<T>) => CustomRenderEvent<T>;
242
+ /**
243
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
244
+ *
245
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
246
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
247
+ *
248
+ * @template T 폴리곤 데이터의 추가 속성 타입
249
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
250
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
251
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
252
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
253
+ * @returns Base Layer 렌더링 함수
254
+ */
255
+ export declare const renderPolygonBaseWithHybrid: <T = unknown>(customStyle: PolygonStyleCustomizer<T> | undefined, baseFillColor: string, baseStrokeColor: string, baseLineWidth: number) => CustomRenderBase<T>;
256
+ /**
257
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
258
+ *
259
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
260
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
261
+ *
262
+ * @template T 폴리곤 데이터의 추가 속성 타입
263
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
264
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
265
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
266
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
267
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (fallback용)
268
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (fallback용)
269
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (fallback용)
270
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (fallback용)
271
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (fallback용)
272
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (fallback용)
273
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (fallback용)
274
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (fallback용)
275
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (fallback용)
276
+ * @returns Event Layer 렌더링 함수
277
+ */
278
+ export declare const renderPolygonEventWithHybrid: <T = unknown>(customStyle: PolygonStyleCustomizer<T> | undefined, baseFillColor: string, baseStrokeColor: string, baseLineWidth: number, selectedFillColor: string | undefined, selectedStrokeColor: string | undefined, selectedLineWidth: number | undefined, activeFillColor: string | undefined, activeStrokeColor: string | undefined, activeLineWidth: number | undefined, hoveredFillColor: string | undefined, hoveredStrokeColor: string | undefined, hoveredLineWidth: number | undefined) => CustomRenderEvent<T>;
279
+ /**
280
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
281
+ *
282
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
283
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
284
+ *
285
+ * @template T 폴리곤 데이터의 추가 속성 타입
286
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
287
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
288
+ * @returns Base Layer 렌더링 함수
289
+ */
290
+ export declare const renderPolygonBaseWithHybridObject: <T = unknown>(customStyle: PolygonStyleCustomizer<T> | undefined, renderStyle: PolygonStyleObject) => CustomRenderBase<T>;
291
+ /**
292
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
293
+ *
294
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
295
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
296
+ *
297
+ * @template T 폴리곤 데이터의 추가 속성 타입
298
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
299
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
300
+ * @returns Event Layer 렌더링 함수
301
+ */
302
+ export declare const renderPolygonEventWithHybridObject: <T = unknown>(customStyle: PolygonStyleCustomizer<T> | undefined, renderStyle: PolygonStyleObject) => CustomRenderEvent<T>;
242
303
  export {};
@@ -648,11 +648,444 @@ var renderPolygonEventWithCustomStyle = function (customStyle) {
648
648
  }
649
649
  };
650
650
  };
651
+ /**
652
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
653
+ *
654
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
655
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
656
+ *
657
+ * @template T 폴리곤 데이터의 추가 속성 타입
658
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
659
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
660
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
661
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
662
+ * @returns Base Layer 렌더링 함수
663
+ */
664
+
665
+ var renderPolygonBaseWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth) {
666
+ return function (_a) {
667
+ var ctx = _a.ctx,
668
+ items = _a.items,
669
+ selectedIds = _a.selectedIds,
670
+ utils = _a.utils;
671
+
672
+ for (var _i = 0, items_4 = items; _i < items_4.length; _i++) {
673
+ var item = items_4[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
674
+
675
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
676
+
677
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
678
+
679
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
680
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
681
+
682
+ var style = void 0;
683
+
684
+ if (customStyle) {
685
+ var context = {
686
+ isActive: false,
687
+ isHovered: false,
688
+ isSelected: false
689
+ };
690
+ style = customStyle(item, context);
691
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
692
+
693
+
694
+ if (!style) {
695
+ style = {
696
+ fillColor: baseFillColor,
697
+ lineWidth: baseLineWidth,
698
+ strokeColor: baseStrokeColor
699
+ };
700
+ } // 폴리곤 그리기
701
+
702
+
703
+ drawPolygon({
704
+ ctx: ctx,
705
+ fillColor: style.fillColor,
706
+ isDonutPolygon: item.isDonutPolygon || false,
707
+ lineWidth: style.lineWidth,
708
+ polygonOffsets: polygonOffsets,
709
+ strokeColor: style.strokeColor
710
+ });
711
+ }
712
+ };
713
+ };
714
+ /**
715
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
716
+ *
717
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
718
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
719
+ *
720
+ * @template T 폴리곤 데이터의 추가 속성 타입
721
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
722
+ * @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
723
+ * @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
724
+ * @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
725
+ * @param selectedFillColor 선택된 폴리곤 채우기 색상 (fallback용)
726
+ * @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (fallback용)
727
+ * @param selectedLineWidth 선택된 폴리곤 테두리 두께 (fallback용)
728
+ * @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (fallback용)
729
+ * @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (fallback용)
730
+ * @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (fallback용)
731
+ * @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (fallback용)
732
+ * @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (fallback용)
733
+ * @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (fallback용)
734
+ * @returns Event Layer 렌더링 함수
735
+ */
736
+
737
+ var renderPolygonEventWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
738
+ // 기본값 설정 (base 기준)
739
+ var _selectedFillColor = selectedFillColor || baseFillColor;
740
+
741
+ var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
742
+
743
+ var _selectedLineWidth = selectedLineWidth || baseLineWidth;
744
+
745
+ var _activeFillColor = activeFillColor || _selectedFillColor;
746
+
747
+ var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
748
+
749
+ var _activeLineWidth = activeLineWidth || _selectedLineWidth;
750
+
751
+ var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
752
+
753
+ var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
754
+
755
+ var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
756
+
757
+ return function (_a) {
758
+ var ctx = _a.ctx,
759
+ hoveredItem = _a.hoveredItem,
760
+ selectedItem = _a.selectedItem,
761
+ selectedItems = _a.selectedItems,
762
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
763
+
764
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
765
+ return item.id;
766
+ })) : new Set();
767
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
768
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
769
+
770
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
771
+ for (var _i = 0, selectedItems_4 = selectedItems; _i < selectedItems_4.length; _i++) {
772
+ var item = selectedItems_4[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
773
+
774
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
775
+ if (!item.paths) continue;
776
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
777
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
778
+
779
+ var style = void 0;
780
+
781
+ if (customStyle) {
782
+ var context = {
783
+ isActive: false,
784
+ isHovered: false,
785
+ isSelected: true
786
+ };
787
+ style = customStyle(item, context);
788
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
789
+
790
+
791
+ if (!style) {
792
+ style = {
793
+ fillColor: _selectedFillColor,
794
+ lineWidth: _selectedLineWidth,
795
+ strokeColor: _selectedStrokeColor
796
+ };
797
+ }
798
+
799
+ drawPolygon({
800
+ ctx: ctx,
801
+ fillColor: style.fillColor,
802
+ isDonutPolygon: item.isDonutPolygon || false,
803
+ lineWidth: style.lineWidth,
804
+ polygonOffsets: polygonOffsets,
805
+ strokeColor: style.strokeColor
806
+ });
807
+ }
808
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
809
+
810
+
811
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
812
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
813
+
814
+ if (polygonOffsets) {
815
+ // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
816
+ var style = void 0;
817
+
818
+ if (customStyle) {
819
+ var context = {
820
+ isActive: true,
821
+ isHovered: false,
822
+ isSelected: true
823
+ };
824
+ style = customStyle(selectedItem, context);
825
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
826
+
827
+
828
+ if (!style) {
829
+ style = {
830
+ fillColor: _activeFillColor,
831
+ lineWidth: _activeLineWidth,
832
+ strokeColor: _activeStrokeColor
833
+ };
834
+ }
835
+
836
+ drawPolygon({
837
+ ctx: ctx,
838
+ fillColor: style.fillColor,
839
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
840
+ lineWidth: style.lineWidth,
841
+ polygonOffsets: polygonOffsets,
842
+ strokeColor: style.strokeColor
843
+ });
844
+ }
845
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
846
+
847
+
848
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
849
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
850
+
851
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
852
+
853
+ var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
854
+
855
+ var style = void 0;
856
+
857
+ if (customStyle) {
858
+ var context = {
859
+ isActive: isSelected && hoveredItem.id === selectedItemId,
860
+ isHovered: !isSelected,
861
+ isSelected: isSelected
862
+ };
863
+ style = customStyle(hoveredItem, context);
864
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
865
+
866
+
867
+ if (!style) {
868
+ style = {
869
+ fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
870
+ lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth,
871
+ strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor
872
+ };
873
+ }
874
+
875
+ drawPolygon({
876
+ ctx: ctx,
877
+ fillColor: style.fillColor,
878
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
879
+ lineWidth: style.lineWidth,
880
+ polygonOffsets: polygonOffsets,
881
+ strokeColor: style.strokeColor
882
+ });
883
+ }
884
+ };
885
+ };
886
+ /**
887
+ * 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
888
+ *
889
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
890
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
891
+ *
892
+ * @template T 폴리곤 데이터의 추가 속성 타입
893
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
894
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
895
+ * @returns Base Layer 렌더링 함수
896
+ */
897
+
898
+ var renderPolygonBaseWithHybridObject = function (customStyle, renderStyle) {
899
+ return function (_a) {
900
+ var ctx = _a.ctx,
901
+ items = _a.items,
902
+ selectedIds = _a.selectedIds,
903
+ utils = _a.utils;
904
+
905
+ for (var _i = 0, items_5 = items; _i < items_5.length; _i++) {
906
+ var item = items_5[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
907
+
908
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
909
+
910
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
911
+
912
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
913
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
914
+
915
+ var style = void 0;
916
+
917
+ if (customStyle) {
918
+ var context = {
919
+ isActive: false,
920
+ isHovered: false,
921
+ isSelected: false
922
+ };
923
+ style = customStyle(item, context);
924
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
925
+
926
+
927
+ if (!style) {
928
+ style = renderStyle.base;
929
+ } // 폴리곤 그리기
930
+
931
+
932
+ drawPolygon({
933
+ ctx: ctx,
934
+ fillColor: style.fillColor,
935
+ isDonutPolygon: item.isDonutPolygon || false,
936
+ lineWidth: style.lineWidth,
937
+ polygonOffsets: polygonOffsets,
938
+ strokeColor: style.strokeColor
939
+ });
940
+ }
941
+ };
942
+ };
943
+ /**
944
+ * 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
945
+ *
946
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
947
+ * customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
948
+ *
949
+ * @template T 폴리곤 데이터의 추가 속성 타입
950
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
951
+ * @param renderStyle 폴리곤 스타일 객체 (fallback용)
952
+ * @returns Event Layer 렌더링 함수
953
+ */
954
+
955
+ var renderPolygonEventWithHybridObject = function (customStyle, renderStyle) {
956
+ // 기본값 설정 (개별 props 방식과 동일한 로직)
957
+ var _selectedStyle = renderStyle.selected || renderStyle.base;
958
+
959
+ var _activeStyle = renderStyle.active || _selectedStyle;
960
+
961
+ var _hoveredStyle = renderStyle.hovered || _selectedStyle;
962
+
963
+ return function (_a) {
964
+ var ctx = _a.ctx,
965
+ hoveredItem = _a.hoveredItem,
966
+ selectedItem = _a.selectedItem,
967
+ selectedItems = _a.selectedItems,
968
+ utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
969
+
970
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
971
+ return item.id;
972
+ })) : new Set();
973
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
974
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
975
+
976
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
977
+ for (var _i = 0, selectedItems_5 = selectedItems; _i < selectedItems_5.length; _i++) {
978
+ var item = selectedItems_5[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
979
+
980
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
981
+ if (!item.paths) continue;
982
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
983
+ if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
984
+
985
+ var style = void 0;
986
+
987
+ if (customStyle) {
988
+ var context = {
989
+ isActive: false,
990
+ isHovered: false,
991
+ isSelected: true
992
+ };
993
+ style = customStyle(item, context);
994
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
995
+
996
+
997
+ if (!style) {
998
+ style = _selectedStyle;
999
+ }
1000
+
1001
+ drawPolygon({
1002
+ ctx: ctx,
1003
+ fillColor: style.fillColor,
1004
+ isDonutPolygon: item.isDonutPolygon || false,
1005
+ lineWidth: style.lineWidth,
1006
+ polygonOffsets: polygonOffsets,
1007
+ strokeColor: style.strokeColor
1008
+ });
1009
+ }
1010
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
1011
+
1012
+
1013
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
1014
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
1015
+
1016
+ if (polygonOffsets) {
1017
+ // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
1018
+ var style = void 0;
1019
+
1020
+ if (customStyle) {
1021
+ var context = {
1022
+ isActive: true,
1023
+ isHovered: false,
1024
+ isSelected: true
1025
+ };
1026
+ style = customStyle(selectedItem, context);
1027
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
1028
+
1029
+
1030
+ if (!style) {
1031
+ style = _activeStyle;
1032
+ }
1033
+
1034
+ drawPolygon({
1035
+ ctx: ctx,
1036
+ fillColor: style.fillColor,
1037
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
1038
+ lineWidth: style.lineWidth,
1039
+ polygonOffsets: polygonOffsets,
1040
+ strokeColor: style.strokeColor
1041
+ });
1042
+ }
1043
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
1044
+
1045
+
1046
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
1047
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
1048
+
1049
+ if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
1050
+
1051
+ var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
1052
+
1053
+ var style = void 0;
1054
+
1055
+ if (customStyle) {
1056
+ var context = {
1057
+ isActive: isSelected && hoveredItem.id === selectedItemId,
1058
+ isHovered: !isSelected,
1059
+ isSelected: isSelected
1060
+ };
1061
+ style = customStyle(hoveredItem, context);
1062
+ } // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
1063
+
1064
+
1065
+ if (!style) {
1066
+ style = isSelected ? _activeStyle : _hoveredStyle;
1067
+ }
1068
+
1069
+ drawPolygon({
1070
+ ctx: ctx,
1071
+ fillColor: style.fillColor,
1072
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
1073
+ lineWidth: style.lineWidth,
1074
+ polygonOffsets: polygonOffsets,
1075
+ strokeColor: style.strokeColor
1076
+ });
1077
+ }
1078
+ };
1079
+ };
651
1080
 
652
1081
  exports.drawPolygon = drawPolygon;
653
1082
  exports.renderPolygonBase = renderPolygonBase;
654
1083
  exports.renderPolygonBaseWithCustomStyle = renderPolygonBaseWithCustomStyle;
1084
+ exports.renderPolygonBaseWithHybrid = renderPolygonBaseWithHybrid;
1085
+ exports.renderPolygonBaseWithHybridObject = renderPolygonBaseWithHybridObject;
655
1086
  exports.renderPolygonBaseWithObject = renderPolygonBaseWithObject;
656
1087
  exports.renderPolygonEvent = renderPolygonEvent;
657
1088
  exports.renderPolygonEventWithCustomStyle = renderPolygonEventWithCustomStyle;
1089
+ exports.renderPolygonEventWithHybrid = renderPolygonEventWithHybrid;
1090
+ exports.renderPolygonEventWithHybridObject = renderPolygonEventWithHybridObject;
658
1091
  exports.renderPolygonEventWithObject = renderPolygonEventWithObject;