@mint-ui/map 1.2.0-test.50 → 1.2.0-test.52

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.
@@ -7,6 +7,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
  *
8
8
  * 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
9
9
  * GeoJSON MultiPolygon 형식을 지원하며, 도넛 폴리곤(구멍이 있는 폴리곤)도 처리할 수 있습니다.
10
+ *
11
+ * 세 가지 스타일 지정 방식을 지원하는 렌더링 함수를 제공합니다:
12
+ * 1. 개별 props 방식: renderPolygonBase, renderPolygonEvent
13
+ * 2. 객체 방식: renderPolygonBaseWithObject, renderPolygonEventWithObject
14
+ * 3. 함수 방식: renderPolygonBaseWithCustomStyle, renderPolygonEventWithCustomStyle
10
15
  */
11
16
 
12
17
  /**
@@ -290,13 +295,13 @@ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth
290
295
  };
291
296
  };
292
297
  /**
293
- * 폴리곤 Base 렌더링 함수 팩토리 (함수 방식)
298
+ * 폴리곤 Base 렌더링 함수 팩토리 (객체 방식)
294
299
  *
295
300
  * Base Layer에서 사용할 렌더링 함수를 생성합니다.
296
- * renderStyle 함수를 사용하여 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
301
+ * renderStyle 객체를 사용하여 기본 스타일을 적용합니다.
297
302
  *
298
303
  * @template T 폴리곤 데이터의 추가 속성 타입
299
- * @param renderStyle 폴리곤 스타일 함수
304
+ * @param renderStyle 폴리곤 스타일 객체
300
305
  * @returns Base Layer 렌더링 함수
301
306
  *
302
307
  * @remarks
@@ -306,17 +311,13 @@ var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth
306
311
  *
307
312
  * @example
308
313
  * ```typescript
309
- * const renderBase = renderPolygonBaseWithFunction<MyDataType>(
310
- * (item, context) => ({
311
- * fillColor: 'rgba(255, 100, 100, 0.5)',
312
- * strokeColor: 'rgba(200, 50, 50, 0.8)',
313
- * lineWidth: 2
314
- * })
315
- * );
314
+ * const renderBase = renderPolygonBaseWithObject<MyDataType>({
315
+ * base: { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 }
316
+ * });
316
317
  * ```
317
318
  */
318
319
 
319
- var renderPolygonBaseWithFunction = function (renderStyle) {
320
+ var renderPolygonBaseWithObject = function (renderStyle) {
320
321
  return function (_a) {
321
322
  var ctx = _a.ctx,
322
323
  items = _a.items,
@@ -331,14 +332,179 @@ var renderPolygonBaseWithFunction = function (renderStyle) {
331
332
  if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
332
333
 
333
334
  var polygonOffsets = utils.getOrComputePolygonOffsets(item);
334
- if (!polygonOffsets) continue; // 스타일 함수로 스타일 가져오기 (Base Layer는 선택되지 않은 항목만)
335
+ if (!polygonOffsets) continue; // Base Layer는 선택되지 않은 항목만 그리므로 base 스타일 사용
336
+
337
+ var style = renderStyle.base; // 폴리곤 그리기
338
+
339
+ drawPolygon({
340
+ ctx: ctx,
341
+ polygonOffsets: polygonOffsets,
342
+ isDonutPolygon: item.isDonutPolygon || false,
343
+ fillColor: style.fillColor,
344
+ strokeColor: style.strokeColor,
345
+ lineWidth: style.lineWidth
346
+ });
347
+ }
348
+ };
349
+ };
350
+ /**
351
+ * 폴리곤 Event 렌더링 함수 팩토리 (객체 방식)
352
+ *
353
+ * Event Layer에서 사용할 렌더링 함수를 생성합니다.
354
+ * renderStyle 객체를 사용하여 개별 props 방식과 동일한 알고리즘으로 스타일을 적용합니다.
355
+ *
356
+ * @template T 폴리곤 데이터의 추가 속성 타입
357
+ * @param renderStyle 폴리곤 스타일 객체
358
+ * @returns Event Layer 렌더링 함수
359
+ *
360
+ * @remarks
361
+ * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
362
+ * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
363
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
364
+ * - **알고리즘**: 개별 props 방식과 동일
365
+ * - 기본값 설정: selected/active/hovered가 없으면 base 또는 상위 값 사용
366
+ * - 선택된 항목: selected 스타일
367
+ * - 마지막 선택된 항목 (호버 안 됨): active 스타일
368
+ * - 호버된 항목: 선택되어 있으면 active, 아니면 hovered 스타일
369
+ *
370
+ * @example
371
+ * ```typescript
372
+ * const renderEvent = renderPolygonEventWithObject<MyDataType>({
373
+ * base: { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 },
374
+ * selected: { fillColor: 'rgba(255, 193, 7, 0.7)', strokeColor: 'rgba(255, 152, 0, 1)', lineWidth: 4 },
375
+ * active: { fillColor: 'rgba(255, 152, 0, 0.8)', strokeColor: 'rgba(255, 87, 34, 1)', lineWidth: 5 },
376
+ * hovered: { fillColor: 'rgba(100, 150, 255, 0.8)', strokeColor: 'rgba(0, 100, 200, 1)', lineWidth: 3 }
377
+ * });
378
+ * ```
379
+ */
380
+
381
+ var renderPolygonEventWithObject = function (renderStyle) {
382
+ // 기본값 설정 (개별 props 방식과 동일한 로직)
383
+ var _selectedStyle = renderStyle.selected || renderStyle.base;
384
+
385
+ var _activeStyle = renderStyle.active || _selectedStyle;
386
+
387
+ var _hoveredStyle = renderStyle.hovered || _selectedStyle;
388
+
389
+ return function (_a) {
390
+ var ctx = _a.ctx,
391
+ hoveredItem = _a.hoveredItem,
392
+ utils = _a.utils,
393
+ selectedItems = _a.selectedItems,
394
+ selectedItem = _a.selectedItem; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
395
+
396
+ var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
397
+ return item.id;
398
+ })) : new Set();
399
+ var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
400
+ var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
401
+
402
+ if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
403
+ for (var _i = 0, selectedItems_2 = selectedItems; _i < selectedItems_2.length; _i++) {
404
+ var item = selectedItems_2[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
405
+
406
+ if (item.id === selectedItemId || item.id === hoveredItemId) continue;
407
+ if (!item.paths) continue;
408
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
409
+ if (!polygonOffsets) continue;
410
+ drawPolygon({
411
+ ctx: ctx,
412
+ polygonOffsets: polygonOffsets,
413
+ isDonutPolygon: item.isDonutPolygon || false,
414
+ fillColor: _selectedStyle.fillColor,
415
+ strokeColor: _selectedStyle.strokeColor,
416
+ lineWidth: _selectedStyle.lineWidth
417
+ });
418
+ }
419
+ } // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
420
+
421
+
422
+ if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
423
+ var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
424
+
425
+ if (polygonOffsets) {
426
+ drawPolygon({
427
+ ctx: ctx,
428
+ polygonOffsets: polygonOffsets,
429
+ isDonutPolygon: selectedItem.isDonutPolygon || false,
430
+ fillColor: _activeStyle.fillColor,
431
+ strokeColor: _activeStyle.strokeColor,
432
+ lineWidth: _activeStyle.lineWidth
433
+ });
434
+ }
435
+ } // 3. 호버된 항목 그리기 (가장 위에 표시)
436
+
437
+
438
+ if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
439
+ var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
440
+ if (!polygonOffsets) return; // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
441
+ // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
442
+
443
+ var isSelected = selectedIdsSet.has(hoveredItem.id);
444
+ drawPolygon({
445
+ ctx: ctx,
446
+ polygonOffsets: polygonOffsets,
447
+ isDonutPolygon: hoveredItem.isDonutPolygon || false,
448
+ fillColor: isSelected ? _activeStyle.fillColor : _hoveredStyle.fillColor,
449
+ strokeColor: isSelected ? _activeStyle.strokeColor : _hoveredStyle.strokeColor,
450
+ lineWidth: isSelected ? _activeStyle.lineWidth : _hoveredStyle.lineWidth
451
+ });
452
+ }
453
+ };
454
+ };
455
+ /**
456
+ * 폴리곤 Base 렌더링 함수 팩토리 (커스터마이징 방식)
457
+ *
458
+ * Base Layer에서 사용할 렌더링 함수를 생성합니다.
459
+ * customStyle 함수를 사용하여 각 폴리곤의 스타일을 자유롭게 커스터마이징합니다.
460
+ *
461
+ * @template T 폴리곤 데이터의 추가 속성 타입
462
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수
463
+ * @returns Base Layer 렌더링 함수
464
+ *
465
+ * @remarks
466
+ * - 선택된 항목은 Event Layer에서 그려지므로 Base Layer에서는 스킵
467
+ * - 성능: O(n), n은 렌더링할 폴리곤 개수
468
+ * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
469
+ *
470
+ * @example
471
+ * ```typescript
472
+ * const renderBase = renderPolygonBaseWithCustomStyle<MyDataType>(
473
+ * (item, context) => {
474
+ * if (item.someProperty > 100) {
475
+ * return { fillColor: 'red', strokeColor: 'darkred', lineWidth: 3 };
476
+ * }
477
+ * // 아무것도 반환하지 않으면 그리지 않음
478
+ * }
479
+ * );
480
+ * ```
481
+ */
482
+
483
+ var renderPolygonBaseWithCustomStyle = function (customStyle) {
484
+ return function (_a) {
485
+ var ctx = _a.ctx,
486
+ items = _a.items,
487
+ selectedIds = _a.selectedIds,
488
+ utils = _a.utils;
489
+
490
+ for (var _i = 0, items_3 = items; _i < items_3.length; _i++) {
491
+ var item = items_3[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
492
+
493
+ if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
494
+
495
+ if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
496
+
497
+ var polygonOffsets = utils.getOrComputePolygonOffsets(item);
498
+ if (!polygonOffsets) continue; // Base Layer는 선택되지 않은 항목만 그리므로
335
499
 
336
500
  var context = {
337
501
  isSelected: false,
338
502
  isHovered: false,
339
503
  isActive: false
340
504
  };
341
- var style = renderStyle(item, context); // 폴리곤 그리기
505
+ var style = customStyle(item, context); // null 또는 undefined를 반환하면 그리지 않음
506
+
507
+ if (!style) continue; // 폴리곤 그리기
342
508
 
343
509
  drawPolygon({
344
510
  ctx: ctx,
@@ -352,47 +518,47 @@ var renderPolygonBaseWithFunction = function (renderStyle) {
352
518
  };
353
519
  };
354
520
  /**
355
- * 폴리곤 Event 렌더링 함수 팩토리 (함수 방식)
521
+ * 폴리곤 Event 렌더링 함수 팩토리 (커스터마이징 방식)
356
522
  *
357
523
  * Event Layer에서 사용할 렌더링 함수를 생성합니다.
358
- * renderStyle 함수를 사용하여 각 폴리곤의 상태에 따라 스타일을 동적으로 결정합니다.
524
+ * customStyle 함수를 사용하여 각 폴리곤의 스타일을 자유롭게 커스터마이징합니다.
359
525
  *
360
526
  * @template T 폴리곤 데이터의 추가 속성 타입
361
- * @param renderStyle 폴리곤 스타일 함수
527
+ * @param customStyle 폴리곤 스타일 커스터마이징 함수
362
528
  * @returns Event Layer 렌더링 함수
363
529
  *
364
530
  * @remarks
365
531
  * - **렌더링 순서**: 선택된 항목 → 마지막 선택된 항목 → hover된 항목 (최상단)
366
532
  * - **성능**: O(m), m은 선택된 항목 수 + hover된 항목 수
367
533
  * - 좌표 변환은 자동으로 캐싱되어 성능 최적화됨
368
- * - hover된 항목이 선택되어 있으면 active 스타일 적용
369
534
  *
370
535
  * @example
371
536
  * ```typescript
372
- * const renderEvent = renderPolygonEventWithFunction<MyDataType>(
537
+ * const renderEvent = renderPolygonEventWithCustomStyle<MyDataType>(
373
538
  * (item, context) => {
374
539
  * if (context.isActive) {
375
- * return { fillColor: 'rgba(255, 152, 0, 0.8)', strokeColor: 'rgba(255, 87, 34, 1)', lineWidth: 5 };
540
+ * return { fillColor: 'yellow', strokeColor: 'orange', lineWidth: 5 };
376
541
  * }
377
542
  * if (context.isHovered) {
378
- * return { fillColor: 'rgba(100, 150, 255, 0.8)', strokeColor: 'rgba(0, 100, 200, 1)', lineWidth: 3 };
543
+ * return { fillColor: 'blue', strokeColor: 'darkblue', lineWidth: 3 };
379
544
  * }
380
545
  * if (context.isSelected) {
381
- * return { fillColor: 'rgba(255, 193, 7, 0.7)', strokeColor: 'rgba(255, 152, 0, 1)', lineWidth: 4 };
546
+ * return { fillColor: 'green', strokeColor: 'darkgreen', lineWidth: 4 };
382
547
  * }
383
- * return { fillColor: 'rgba(255, 100, 100, 0.5)', strokeColor: 'rgba(200, 50, 50, 0.8)', lineWidth: 2 };
548
+ * // 아무것도 반환하지 않으면 그리지 않음
384
549
  * }
385
550
  * );
386
551
  * ```
387
552
  */
388
553
 
389
- var renderPolygonEventWithFunction = function (renderStyle) {
554
+ var renderPolygonEventWithCustomStyle = function (customStyle) {
390
555
  return function (_a) {
391
556
  var ctx = _a.ctx,
392
557
  hoveredItem = _a.hoveredItem,
393
558
  utils = _a.utils,
394
559
  selectedItems = _a.selectedItems,
395
- selectedItem = _a.selectedItem;
560
+ selectedItem = _a.selectedItem; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
561
+
396
562
  var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
397
563
  return item.id;
398
564
  })) : new Set();
@@ -400,8 +566,8 @@ var renderPolygonEventWithFunction = function (renderStyle) {
400
566
  var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
401
567
 
402
568
  if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
403
- for (var _i = 0, selectedItems_2 = selectedItems; _i < selectedItems_2.length; _i++) {
404
- var item = selectedItems_2[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
569
+ for (var _i = 0, selectedItems_3 = selectedItems; _i < selectedItems_3.length; _i++) {
570
+ var item = selectedItems_3[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
405
571
 
406
572
  if (item.id === selectedItemId || item.id === hoveredItemId) continue;
407
573
  if (!item.paths) continue;
@@ -412,7 +578,9 @@ var renderPolygonEventWithFunction = function (renderStyle) {
412
578
  isHovered: false,
413
579
  isActive: false
414
580
  };
415
- var style = renderStyle(item, context);
581
+ var style = customStyle(item, context); // null 또는 undefined를 반환하면 그리지 않음
582
+
583
+ if (!style) continue;
416
584
  drawPolygon({
417
585
  ctx: ctx,
418
586
  polygonOffsets: polygonOffsets,
@@ -434,7 +602,9 @@ var renderPolygonEventWithFunction = function (renderStyle) {
434
602
  isHovered: false,
435
603
  isActive: true
436
604
  };
437
- var style = renderStyle(selectedItem, context);
605
+ var style = customStyle(selectedItem, context); // null 또는 undefined를 반환하면 그리지 않음
606
+
607
+ if (!style) return;
438
608
  drawPolygon({
439
609
  ctx: ctx,
440
610
  polygonOffsets: polygonOffsets,
@@ -450,19 +620,17 @@ var renderPolygonEventWithFunction = function (renderStyle) {
450
620
  if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
451
621
  var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
452
622
  if (!polygonOffsets) return; // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
453
- // hover된 항목이 선택되어 있는지 확인
623
+ // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
454
624
 
455
625
  var isSelected = selectedIdsSet.has(hoveredItem.id);
456
- var isActive = isSelected && hoveredItem.id === selectedItemId; // 개별 props 방식과 동일한 로직: 선택된 항목이 hover되면 active 스타일을 사용
457
- // 따라서 선택된 항목이 hover될 때는 isHovered를 false로 설정하여
458
- // renderStyle 함수에서 isActive를 우선적으로 체크할 수 있도록 함
459
-
460
626
  var context = {
461
627
  isSelected: isSelected,
462
628
  isHovered: !isSelected,
463
- isActive: isActive
629
+ isActive: isSelected && hoveredItem.id === selectedItemId
464
630
  };
465
- var style = renderStyle(hoveredItem, context);
631
+ var style = customStyle(hoveredItem, context); // null 또는 undefined를 반환하면 그리지 않음
632
+
633
+ if (!style) return;
466
634
  drawPolygon({
467
635
  ctx: ctx,
468
636
  polygonOffsets: polygonOffsets,
@@ -477,6 +645,8 @@ var renderPolygonEventWithFunction = function (renderStyle) {
477
645
 
478
646
  exports.drawPolygon = drawPolygon;
479
647
  exports.renderPolygonBase = renderPolygonBase;
480
- exports.renderPolygonBaseWithFunction = renderPolygonBaseWithFunction;
648
+ exports.renderPolygonBaseWithCustomStyle = renderPolygonBaseWithCustomStyle;
649
+ exports.renderPolygonBaseWithObject = renderPolygonBaseWithObject;
481
650
  exports.renderPolygonEvent = renderPolygonEvent;
482
- exports.renderPolygonEventWithFunction = renderPolygonEventWithFunction;
651
+ exports.renderPolygonEventWithCustomStyle = renderPolygonEventWithCustomStyle;
652
+ exports.renderPolygonEventWithObject = renderPolygonEventWithObject;