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

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