@mint-ui/map 1.2.0-test.2 → 1.2.0-test.4

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.
Files changed (24) hide show
  1. package/README.md +7 -7
  2. package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
  3. package/dist/components/mint-map/core/MintMapCore.js +1 -0
  4. package/dist/components/mint-map/core/advanced/index.d.ts +1 -4
  5. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +16 -14
  6. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +51 -18
  7. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +1 -0
  8. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +7 -7
  9. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +21 -11
  10. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +14 -0
  11. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +5 -5
  12. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +2 -2
  13. package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
  14. package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
  15. package/dist/components/mint-map/google/GoogleMintMapController.js +5 -0
  16. package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
  17. package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -0
  18. package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
  19. package/dist/components/mint-map/naver/NaverMintMapController.js +38 -3
  20. package/dist/index.es.js +127 -25
  21. package/dist/index.js +27 -13
  22. package/dist/index.umd.js +134 -24
  23. package/package.json +1 -1
  24. package/.claude/settings.local.json +0 -16
package/README.md CHANGED
@@ -129,7 +129,7 @@ npm pack
129
129
  #### 5. NPM에 배포
130
130
  스코프 패키지(`@mint-ui/map`)는 기본적으로 private이므로 public으로 배포해야 합니다.
131
131
  ```bash
132
- npm publish --access public
132
+ npm publish
133
133
  ```
134
134
 
135
135
  #### 6. 배포 완료 확인
@@ -154,7 +154,7 @@ npm version patch
154
154
  npm pack
155
155
 
156
156
  # 5단계: 배포
157
- npm publish --access public
157
+ npm publish
158
158
  ```
159
159
 
160
160
  ### 현재 패키지 정보
@@ -185,7 +185,7 @@ npm publish --access public
185
185
  npm run build
186
186
 
187
187
  # test tag로 배포
188
- npm publish --access public --tag test
188
+ npm publish --tag test
189
189
  ```
190
190
 
191
191
  3. **변경사항 커밋 및 푸시**
@@ -202,7 +202,7 @@ npm publish --access public
202
202
 
203
203
  # 빌드 및 배포
204
204
  npm run build
205
- npm publish --access public --tag test
205
+ npm publish --tag test
206
206
 
207
207
  # 커밋 및 푸시
208
208
  git add .
@@ -215,7 +215,7 @@ npm publish --access public
215
215
  git checkout -b 1.2.0-test.2
216
216
  npm version 1.2.0-test.2 --no-git-tag-version
217
217
  npm run build
218
- npm publish --access public --tag test
218
+ npm publish --tag test
219
219
  git add .
220
220
  git commit -m "chore: release 1.2.0-test.2"
221
221
  git push origin 1.2.0-test.2
@@ -234,7 +234,7 @@ npm publish --access public
234
234
 
235
235
  # 빌드 및 배포
236
236
  npm run build
237
- npm publish --access public
237
+ npm publish
238
238
 
239
239
  # main에 푸시
240
240
  git push origin main
@@ -267,5 +267,5 @@ npm install @mint-ui/map@1.2.0-test.1
267
267
  ### 주의사항
268
268
  - 배포하기 전에 반드시 `npm run build`를 실행해야 합니다
269
269
  - 버전은 한 번 배포하면 되돌릴 수 없으니 신중하게 결정하세요
270
- - 스코프 패키지는 `--access public` 옵션을 반드시 붙여야 합니다
270
+ - 스코프 패키지는 `` 옵션을 반드시 붙여야 합니다
271
271
  - test tag로 배포할 때는 `--no-git-tag-version` 옵션을 사용하여 git tag 생성을 방지합니다
@@ -24,6 +24,7 @@ export declare abstract class MintMapController {
24
24
  abstract updateMarker(marker: Marker, options: MarkerOptions): void;
25
25
  abstract clearDrawable(drawable: Drawable): boolean;
26
26
  abstract markerToTheTop(marker: Marker): void;
27
+ abstract restoreMarkerZIndex(marker: Marker): void;
27
28
  abstract isMapDragged(): boolean;
28
29
  abstract setMapDragged(value: boolean): void;
29
30
  abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
@@ -8,6 +8,7 @@ var React = require('react');
8
8
  var MapTypes = require('../types/MapTypes.js');
9
9
  var MintMapProvider = require('./provider/MintMapProvider.js');
10
10
  var MintMapCore_module = require('./MintMapCore.module.scss.js');
11
+ require('./advanced/woongCanvas/shared/types.js');
11
12
  require('../types/MapDrawables.js');
12
13
  require('../types/MapEventTypes.js');
13
14
  var context = require('./advanced/woongCanvas/shared/context.js');
@@ -2,7 +2,4 @@ export * from './shapes';
2
2
  export * from './canvas';
3
3
  export * from './MapBuildingProjection';
4
4
  export * from './MapLoadingComponents';
5
- export { default as WoongKonvaMarker } from './woongCanvas/WoongKonvaMarker';
6
- export type { WoongKonvaMarkerProps } from './woongCanvas/WoongKonvaMarker';
7
- export { KonvaMarkerProvider, LRUCache, SpatialHashGrid, useKonvaMarkerContext } from './woongCanvas/shared';
8
- export type { RenderUtils, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderBaseParams, RenderAnimationParams, RenderEventParams } from './woongCanvas/shared';
5
+ export * from './woongCanvas';
@@ -1,27 +1,29 @@
1
1
  import React from "react";
2
2
  import { MarkerOptions } from "../../../types";
3
- import { CanvasMarkerData, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent } from "./shared";
4
- export { KonvaMarkerProvider, LRUCache, SpatialHashGrid } from "./shared";
5
- export type { CanvasMarkerOption, Paths, CanvasMarkerData, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderUtils, RenderBaseParams, RenderAnimationParams, RenderEventParams } from "./shared";
3
+ import { KonvaCanvasMarkerData, CanvasDataType, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent } from "./shared";
4
+ export { KonvaMarkerProvider, LRUCache, SpatialHashGrid, CanvasDataType } from "./shared";
5
+ export type { KonvaCanvasMarkerOption, Paths, KonvaCanvasMarkerData, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderUtils, RenderBaseParams, RenderAnimationParams, RenderEventParams } from "./shared";
6
6
  /**
7
7
  * WoongKonvaMarker 컴포넌트 Props
8
8
  * @template T 마커 데이터의 추가 속성 타입
9
9
  */
10
10
  export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
11
11
  /** 렌더링할 마커 데이터 배열 */
12
- markers: CanvasMarkerData<T>[];
13
- /** 마커 클릭 호출되는 콜백 */
14
- onClick?: (payload: CanvasMarkerData<T>, selectedIds: Set<string>) => void;
15
- /** 마커에 마우스 오버 시 호출되는 콜백 */
16
- onMouseOver?: (payload: CanvasMarkerData<T>) => void;
17
- /** 마커에서 마우스 아웃 시 호출되는 콜백 */
18
- onMouseOut?: (payload: CanvasMarkerData<T>) => void;
12
+ markers: KonvaCanvasMarkerData<T>[];
13
+ /** 데이터 타입 (MARKER 또는 POLYGON) */
14
+ dataType: CanvasDataType;
15
+ /** 마커 클릭 시 호출되는 콜백 (선택) */
16
+ onClick?: (payload: KonvaCanvasMarkerData<T>, selectedIds: Set<string>) => void;
17
+ /** 마커에 마우스 오버 시 호출되는 콜백 (선택) */
18
+ onMouseOver?: (payload: KonvaCanvasMarkerData<T>) => void;
19
+ /** 마커에서 마우스 아웃 시 호출되는 콜백 (선택) */
20
+ onMouseOut?: (payload: KonvaCanvasMarkerData<T>) => void;
19
21
  /** Base Layer 렌더링 함수 (필수) */
20
22
  renderBase: CustomRenderBase<T>;
21
23
  /** Animation Layer 렌더링 함수 (선택, 애니메이션용) */
22
24
  renderAnimation?: CustomRenderAnimation<T>;
23
- /** Event Layer 렌더링 함수 (필수) */
24
- renderEvent: CustomRenderEvent<T>;
25
+ /** Event Layer 렌더링 함수 (선택) */
26
+ renderEvent?: CustomRenderEvent<T>;
25
27
  /** 다중 선택 활성화 여부 (기본: false) */
26
28
  enableMultiSelect?: boolean;
27
29
  /** hover 시 마커를 최상단으로 표시 (기본: false) */
@@ -33,7 +35,7 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
33
35
  /** LRU 캐시 최대 크기 (기본: 10000) */
34
36
  maxCacheSize?: number;
35
37
  /** 외부에서 제어하는 선택된 항목 배열 (선택) */
36
- selectedItems?: CanvasMarkerData<T>[];
38
+ selectedItems?: KonvaCanvasMarkerData<T>[];
37
39
  }
38
40
  /**
39
41
  * 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
@@ -44,5 +46,5 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
44
46
  *
45
47
  * 주의: JSON.stringify() 사용 금지! (매우 느림)
46
48
  */
47
- declare const WoongKonvaMarker: <T>({ markers, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
49
+ declare const WoongKonvaMarker: <T>({ markers, dataType, onClick, onMouseOver, onMouseOut, renderBase, renderAnimation, renderEvent, enableMultiSelect, topOnHover, enableViewportCulling, cullingMargin, maxCacheSize, selectedItems: externalSelectedItems, ...options }: WoongKonvaMarkerProps<T>) => React.ReactPortal;
48
50
  export default WoongKonvaMarker;
@@ -10,6 +10,7 @@ var MapDrawables = require('../../../types/MapDrawables.js');
10
10
  require('../../../types/MapTypes.js');
11
11
  require('../../../types/MapEventTypes.js');
12
12
  var reactDom = require('react-dom');
13
+ var types = require('./shared/types.js');
13
14
  var utils = require('./shared/utils.js');
14
15
  var context = require('./shared/context.js');
15
16
  var performance = require('./shared/performance.js');
@@ -36,6 +37,7 @@ var Konva__default = /*#__PURE__*/_interopDefaultLegacy(Konva);
36
37
 
37
38
  var WoongKonvaMarkerComponent = function (_a) {
38
39
  var markers = _a.markers,
40
+ dataType = _a.dataType,
39
41
  onClick = _a.onClick,
40
42
  onMouseOver = _a.onMouseOver,
41
43
  onMouseOut = _a.onMouseOut,
@@ -53,7 +55,7 @@ var WoongKonvaMarkerComponent = function (_a) {
53
55
  _f = _a.maxCacheSize,
54
56
  maxCacheSize = _f === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _f,
55
57
  externalSelectedItems = _a.selectedItems,
56
- options = tslib.__rest(_a, ["markers", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
58
+ options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems"]); // --------------------------------------------------------------------------
57
59
  // Hooks & Context
58
60
  // --------------------------------------------------------------------------
59
61
 
@@ -87,6 +89,9 @@ var WoongKonvaMarkerComponent = function (_a) {
87
89
  /** 현재 Hover 중인 항목 */
88
90
 
89
91
  var hoveredItemRef = React.useRef(null);
92
+ /** 마지막으로 클릭된 항목 */
93
+
94
+ var lastClickedItemRef = React.useRef(null);
90
95
  /**
91
96
  * 선택된 항목의 ID Set
92
97
  *
@@ -170,7 +175,7 @@ var WoongKonvaMarkerComponent = function (_a) {
170
175
 
171
176
  if (!bbox) {
172
177
  // 폴리곤인 경우
173
- if (item.paths) {
178
+ if (dataType === types.CanvasDataType.POLYGON) {
174
179
  var offsets = getOrComputePolygonOffsets(item);
175
180
  if (!offsets) return false; // 바운딩 박스 계산 (최적화: 직접 비교)
176
181
 
@@ -278,7 +283,7 @@ var WoongKonvaMarkerComponent = function (_a) {
278
283
  for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
279
284
  var item = currentMarkers_1[_i];
280
285
 
281
- if (item.paths) {
286
+ if (dataType === types.CanvasDataType.POLYGON) {
282
287
  // 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
283
288
  var offsets = getOrComputePolygonOffsets(item);
284
289
 
@@ -414,6 +419,7 @@ var WoongKonvaMarkerComponent = function (_a) {
414
419
 
415
420
 
416
421
  var doRenderEvent = function () {
422
+ if (!renderEvent) return;
417
423
  var layer = eventLayerRef.current;
418
424
  if (!layer) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
419
425
 
@@ -432,7 +438,8 @@ var WoongKonvaMarkerComponent = function (_a) {
432
438
  ctx: ctx,
433
439
  hoveredItem: hoveredItemRef.current,
434
440
  utils: renderUtils,
435
- selectedItems: selectedItems
441
+ selectedItems: selectedItems,
442
+ lastClickedItem: lastClickedItemRef.current
436
443
  });
437
444
  },
438
445
  perfectDrawEnabled: false,
@@ -564,7 +571,7 @@ var WoongKonvaMarkerComponent = function (_a) {
564
571
  if (topOnHover && hoveredItemRef.current) {
565
572
  var hovered = hoveredItemRef.current; // 폴리곤인 경우
566
573
 
567
- if (hovered.paths) {
574
+ if (dataType === types.CanvasDataType.POLYGON) {
568
575
  if (utils.isPointInPolygonData(offset, hovered, getOrComputePolygonOffsets)) {
569
576
  return hovered; // 여전히 hover된 항목 위에 있음
570
577
  }
@@ -577,23 +584,22 @@ var WoongKonvaMarkerComponent = function (_a) {
577
584
  } // Spatial Index로 후보 항목만 빠르게 추출 (30,000개 → ~10개)
578
585
 
579
586
 
580
- var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 마커 우선 체크 (마커가 폴리곤 위에 표시됨)
587
+ var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 데이터 타입에 따라 적절한 히트 테스트 수행
581
588
 
582
- for (var i = candidates.length - 1; i >= 0; i--) {
583
- var item = candidates[i];
589
+ if (dataType === types.CanvasDataType.MARKER) {
590
+ // 마커 체크
591
+ for (var i = candidates.length - 1; i >= 0; i--) {
592
+ var item = candidates[i];
584
593
 
585
- if (!item.paths) {
586
594
  if (utils.isPointInMarkerData(offset, item, getOrComputeMarkerOffset)) {
587
595
  return item;
588
596
  }
589
597
  }
590
- } // 폴리곤 체크
591
-
592
-
593
- for (var i = candidates.length - 1; i >= 0; i--) {
594
- var item = candidates[i];
598
+ } else {
599
+ // 폴리곤 체크
600
+ for (var i = candidates.length - 1; i >= 0; i--) {
601
+ var item = candidates[i];
595
602
 
596
- if (item.paths) {
597
603
  if (utils.isPointInPolygonData(offset, item, getOrComputePolygonOffsets)) {
598
604
  return item;
599
605
  }
@@ -637,7 +643,9 @@ var WoongKonvaMarkerComponent = function (_a) {
637
643
 
638
644
 
639
645
  var handleLocalClick = function (data) {
640
- // 1. 선택 상태 업데이트
646
+ // 0. 마지막 클릭 항목 저장
647
+ lastClickedItemRef.current = data; // 1. 선택 상태 업데이트
648
+
641
649
  if (enableMultiSelect) {
642
650
  // 다중 선택: Set과 Map 동시 업데이트
643
651
  var newSelected = new Set(selectedIdsRef.current);
@@ -742,6 +750,24 @@ var WoongKonvaMarkerComponent = function (_a) {
742
750
  var handleDragEnd = function () {
743
751
  draggingRef.current = false;
744
752
  controller.setMapCursor('grab');
753
+ };
754
+ /**
755
+ * 마우스가 canvas를 벗어날 때 hover cleanup
756
+ */
757
+
758
+
759
+ var handleMouseLeave = function () {
760
+ var prevHovered = hoveredItemRef.current;
761
+
762
+ if (prevHovered) {
763
+ hoveredItemRef.current = null;
764
+ controller.setMapCursor('grab');
765
+ doRenderEvent();
766
+
767
+ if (onMouseOut) {
768
+ onMouseOut(prevHovered);
769
+ }
770
+ }
745
771
  }; // --------------------------------------------------------------------------
746
772
  // Lifecycle: DOM 초기화
747
773
  // --------------------------------------------------------------------------
@@ -844,7 +870,9 @@ var WoongKonvaMarkerComponent = function (_a) {
844
870
  controller.addEventListener('CLICK', handleClick);
845
871
  controller.addEventListener('MOUSEMOVE', handleMouseMove);
846
872
  controller.addEventListener('DRAGSTART', handleDragStart);
847
- controller.addEventListener('DRAGEND', handleDragEnd);
873
+ controller.addEventListener('DRAGEND', handleDragEnd); // 맵 컨테이너에 mouseleave 이벤트 추가
874
+
875
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
848
876
  renderAllImmediate(); // Context 사용 시 컴포넌트 등록 (다중 인스턴스 관리)
849
877
 
850
878
  var componentInstance = null;
@@ -885,7 +913,8 @@ var WoongKonvaMarkerComponent = function (_a) {
885
913
  controller.removeEventListener('CLICK', handleClick);
886
914
  controller.removeEventListener('MOUSEMOVE', handleMouseMove);
887
915
  controller.removeEventListener('DRAGSTART', handleDragStart);
888
- controller.removeEventListener('DRAGEND', handleDragEnd); // Context 정리
916
+ controller.removeEventListener('DRAGEND', handleDragEnd);
917
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave); // Context 정리
889
918
 
890
919
  if (context$1 && componentInstance) {
891
920
  context$1.unregisterComponent(componentInstance);
@@ -1026,6 +1055,10 @@ var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent,
1026
1055
  return true; // 같음 → 리렌더링 스킵
1027
1056
  });
1028
1057
 
1058
+ Object.defineProperty(exports, 'CanvasDataType', {
1059
+ enumerable: true,
1060
+ get: function () { return types.CanvasDataType; }
1061
+ });
1029
1062
  exports.KonvaMarkerProvider = context.KonvaMarkerProvider;
1030
1063
  exports.LRUCache = performance.LRUCache;
1031
1064
  exports.SpatialHashGrid = performance.SpatialHashGrid;
@@ -1,2 +1,3 @@
1
+ export { default as WoongKonvaMarker } from "./WoongKonvaMarker";
1
2
  export * from "./WoongKonvaMarker";
2
3
  export * from "./shared";
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { Offset } from "../../../../types";
3
- import { CanvasMarkerData } from "./types";
3
+ import { KonvaCanvasMarkerData } from "./types";
4
4
  /**
5
5
  * 다중 WoongKonvaMarker 인스턴스를 관리하기 위한 Context
6
6
  *
@@ -12,12 +12,12 @@ import { CanvasMarkerData } from "./types";
12
12
  export interface ComponentInstance<T> {
13
13
  zIndex: number;
14
14
  hitTest: (offset: Offset) => boolean;
15
- onClick?: (payload: CanvasMarkerData<T>, selectedIds: Set<string>) => void;
16
- onMouseOver?: (payload: CanvasMarkerData<T>) => void;
17
- onMouseOut?: (payload: CanvasMarkerData<T>) => void;
18
- findData: (offset: Offset) => CanvasMarkerData<T> | null;
19
- setHovered: (data: CanvasMarkerData<T> | null) => void;
20
- handleLocalClick: (data: CanvasMarkerData<T>) => void;
15
+ onClick?: (payload: KonvaCanvasMarkerData<T>, selectedIds: Set<string>) => void;
16
+ onMouseOver?: (payload: KonvaCanvasMarkerData<T>) => void;
17
+ onMouseOut?: (payload: KonvaCanvasMarkerData<T>) => void;
18
+ findData: (offset: Offset) => KonvaCanvasMarkerData<T> | null;
19
+ setHovered: (data: KonvaCanvasMarkerData<T> | null) => void;
20
+ handleLocalClick: (data: KonvaCanvasMarkerData<T>) => void;
21
21
  getSelectedIds: () => Set<string>;
22
22
  }
23
23
  interface KonvaMarkerContextValue {
@@ -1,5 +1,13 @@
1
1
  import Konva from "konva";
2
2
  import { Position, Offset } from "../../../../types";
3
+ /**
4
+ * 캔버스 데이터 타입 Enum
5
+ * 마커인지 폴리곤인지 구분하는 상수
6
+ */
7
+ export declare enum CanvasDataType {
8
+ MARKER = "MARKER",
9
+ POLYGON = "POLYGON"
10
+ }
3
11
  /**
4
12
  * 폴리곤 경로 정의
5
13
  */
@@ -11,12 +19,12 @@ export interface Paths {
11
19
  * 캔버스 마커/폴리곤 기본 옵션
12
20
  */
13
21
  /**
14
- * 캔버스 마커/폴리곤의 기본 필수 속성
22
+ * Konva 캔버스 마커/폴리곤의 기본 필수 속성
15
23
  * (렌더링에 필요한 최소 정보)
16
24
  */
17
- export interface CanvasMarkerOption {
25
+ export interface KonvaCanvasMarkerOption {
18
26
  id: string;
19
- position: Position[];
27
+ position: Position;
20
28
  boxWidth?: number;
21
29
  boxHeight?: number;
22
30
  paths?: Paths;
@@ -27,16 +35,16 @@ export interface CanvasMarkerOption {
27
35
  * @template T 서버에서 받은 원본 데이터 타입 (예: Marker, Polygon)
28
36
  * @example
29
37
  * // API에서 받은 Marker 타입을 그대로 유지하면서 캔버스 렌더링 정보 추가
30
- * type MarkerWithCanvas = CanvasMarkerData<Marker>
38
+ * type MarkerWithCanvas = KonvaCanvasMarkerData<Marker>
31
39
  * // { raId, lat, lng, buildingName, totalArea } + { id, position, boxWidth, ... }
32
40
  */
33
- export declare type CanvasMarkerData<T = {}> = T & CanvasMarkerOption;
41
+ export declare type KonvaCanvasMarkerData<T = {}> = T & KonvaCanvasMarkerOption;
34
42
  /**
35
43
  * 렌더링 유틸리티 함수들
36
44
  */
37
45
  export interface RenderUtils<T> {
38
- getOrComputePolygonOffsets: (polygonData: CanvasMarkerData<T>) => number[][][][] | null;
39
- getOrComputeMarkerOffset: (markerData: CanvasMarkerData<T>) => Offset | null;
46
+ getOrComputePolygonOffsets: (polygonData: KonvaCanvasMarkerData<T>) => number[][][][] | null;
47
+ getOrComputeMarkerOffset: (markerData: KonvaCanvasMarkerData<T>) => Offset | null;
40
48
  }
41
49
  /**
42
50
  * 커스텀 렌더링 함수 파라미터 - Base Layer
@@ -45,7 +53,7 @@ export interface RenderBaseParams<T> {
45
53
  /** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
46
54
  ctx: CanvasRenderingContext2D;
47
55
  /** 렌더링할 마커 데이터 배열 */
48
- items: CanvasMarkerData<T>[];
56
+ items: KonvaCanvasMarkerData<T>[];
49
57
  /** 현재 선택된 마커 ID Set */
50
58
  selectedIds: Set<string>;
51
59
  /** 렌더링 유틸리티 함수들 */
@@ -75,7 +83,7 @@ export interface RenderAnimationParams<T> {
75
83
  /** 현재 선택된 마커 ID Set */
76
84
  selectedIds: Set<string>;
77
85
  /** 전체 마커 데이터 배열 */
78
- items: CanvasMarkerData<T>[];
86
+ items: KonvaCanvasMarkerData<T>[];
79
87
  /** 렌더링 유틸리티 함수들 */
80
88
  utils: RenderUtils<T>;
81
89
  }
@@ -98,11 +106,13 @@ export interface RenderEventParams<T> {
98
106
  /** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
99
107
  ctx: CanvasRenderingContext2D;
100
108
  /** 현재 hover된 마커 데이터 */
101
- hoveredItem: CanvasMarkerData<T> | null;
109
+ hoveredItem: KonvaCanvasMarkerData<T> | null;
102
110
  /** 렌더링 유틸리티 함수들 */
103
111
  utils: RenderUtils<T>;
104
112
  /** 현재 선택된 마커 데이터 배열 (선택 강조용) */
105
- selectedItems?: CanvasMarkerData<T>[];
113
+ selectedItems?: KonvaCanvasMarkerData<T>[];
114
+ /** 마지막으로 클릭된 마커 데이터 */
115
+ lastClickedItem: KonvaCanvasMarkerData<T> | null;
106
116
  }
107
117
  /**
108
118
  * 커스텀 렌더링 함수 타입 - Event Layer
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * 캔버스 데이터 타입 Enum
7
+ * 마커인지 폴리곤인지 구분하는 상수
8
+ */
9
+ exports.CanvasDataType = void 0;
10
+
11
+ (function (CanvasDataType) {
12
+ CanvasDataType["MARKER"] = "MARKER";
13
+ CanvasDataType["POLYGON"] = "POLYGON";
14
+ })(exports.CanvasDataType || (exports.CanvasDataType = {}));
@@ -1,14 +1,14 @@
1
1
  import { Offset } from "../../../../types";
2
2
  import { MintMapController } from "../../../MintMapController";
3
- import { CanvasMarkerData } from "./types";
3
+ import { KonvaCanvasMarkerData } from "./types";
4
4
  /**
5
5
  * 폴리곤 offset 계산
6
6
  */
7
- export declare const computePolygonOffsets: (polygonData: CanvasMarkerData<any>, controller: MintMapController) => number[][][][] | null;
7
+ export declare const computePolygonOffsets: (polygonData: KonvaCanvasMarkerData<any>, controller: MintMapController) => number[][][][] | null;
8
8
  /**
9
9
  * 마커 offset 계산
10
10
  */
11
- export declare const computeMarkerOffset: (markerData: CanvasMarkerData<any>, controller: MintMapController) => Offset | null;
11
+ export declare const computeMarkerOffset: (markerData: KonvaCanvasMarkerData<any>, controller: MintMapController) => Offset | null;
12
12
  /**
13
13
  * Point-in-Polygon 알고리즘
14
14
  */
@@ -16,8 +16,8 @@ export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => b
16
16
  /**
17
17
  * 폴리곤 히트 테스트
18
18
  */
19
- export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: CanvasMarkerData<any>, getPolygonOffsets: (data: CanvasMarkerData<any>) => number[][][][] | null) => boolean;
19
+ export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasMarkerData<any>, getPolygonOffsets: (data: KonvaCanvasMarkerData<any>) => number[][][][] | null) => boolean;
20
20
  /**
21
21
  * 마커 히트 테스트
22
22
  */
23
- export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: CanvasMarkerData<any>, getMarkerOffset: (data: CanvasMarkerData<any>) => Offset | null) => boolean;
23
+ export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasMarkerData<any>, getMarkerOffset: (data: KonvaCanvasMarkerData<any>) => Offset | null) => boolean;
@@ -47,11 +47,11 @@ var computePolygonOffsets = function (polygonData, controller) {
47
47
  */
48
48
 
49
49
  var computeMarkerOffset = function (markerData, controller) {
50
- if (!markerData.position || markerData.position.length === 0) {
50
+ if (!markerData.position) {
51
51
  return null;
52
52
  }
53
53
 
54
- return controller.positionToOffset(markerData.position[0]);
54
+ return controller.positionToOffset(markerData.position);
55
55
  };
56
56
  /**
57
57
  * Point-in-Polygon 알고리즘
@@ -172,7 +172,7 @@ function MapMarkerWrapper(_a) {
172
172
  var onMouseOverHandler = function (e) {
173
173
  var _a;
174
174
 
175
- var marker = markerRef.current; //console.log('onMouseOverHandler', marker);
175
+ var marker = markerRef.current;
176
176
 
177
177
  if (marker) {
178
178
  var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
@@ -185,6 +185,25 @@ function MapMarkerWrapper(_a) {
185
185
 
186
186
  next && topOnHover && controller.markerToTheTop(marker);
187
187
  }
188
+ }; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
189
+
190
+
191
+ var onMouseLeaveHandler = function (e) {
192
+ var _a;
193
+
194
+ var marker = markerRef.current;
195
+
196
+ if (marker) {
197
+ var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
198
+ var next = true;
199
+
200
+ if (mouseOutHandler) {
201
+ var hasNext = mouseOutHandler(e);
202
+ hasNext !== undefined && (next = hasNext);
203
+ }
204
+
205
+ next && topOnHover && controller.restoreMarkerZIndex(marker);
206
+ }
188
207
  }; //create object
189
208
 
190
209
 
@@ -202,10 +221,12 @@ function MapMarkerWrapper(_a) {
202
221
  }); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
203
222
 
204
223
  divElement.addEventListener('mouseover', onMouseOverHandler);
224
+ divElement.addEventListener('mouseleave', onMouseLeaveHandler);
205
225
  return function () {
206
226
  divElement.removeEventListener('click', onClickHandler);
207
227
  divElement.removeEventListener('mousedown', onMousedownHandler);
208
228
  divElement.removeEventListener('mouseover', onMouseOverHandler);
229
+ divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
209
230
 
210
231
  if (markerRef.current) {
211
232
  controller.clearDrawable(markerRef.current);
@@ -28,6 +28,7 @@ export declare class GoogleMintMapController extends MintMapController {
28
28
  private getMaxZIndex;
29
29
  setMarkerZIndex(marker: Marker, zIndex: number): void;
30
30
  markerToTheTop(marker: Marker): void;
31
+ restoreMarkerZIndex(marker: Marker): void;
31
32
  clearDrawable(drawable: Drawable): boolean;
32
33
  private dragged;
33
34
  isMapDragged(): boolean;
@@ -21,6 +21,7 @@ require('../naver/NaverMintMapController.js');
21
21
  require('../core/advanced/canvas/CanvasMarkerClaude.js');
22
22
  require('../core/advanced/MapLoadingComponents.js');
23
23
  require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
24
+ require('../core/advanced/woongCanvas/shared/types.js');
24
25
  require('../core/advanced/woongCanvas/shared/context.js');
25
26
  require('../core/advanced/woongCanvas/shared/performance.js');
26
27
  require('../core/wrapper/MapControlWrapper.js');
@@ -339,6 +340,10 @@ function (_super) {
339
340
  }
340
341
  };
341
342
 
343
+ GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
344
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
345
+ };
346
+
342
347
  GoogleMintMapController.prototype.clearDrawable = function (drawable) {
343
348
  if (drawable && drawable.native) {
344
349
  if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
@@ -31,6 +31,7 @@ export declare class KakaoMintMapController extends MintMapController {
31
31
  private getMaxZIndex;
32
32
  setMarkerZIndex(marker: Marker, zIndex: number): void;
33
33
  markerToTheTop(marker: Marker): void;
34
+ restoreMarkerZIndex(marker: Marker): void;
34
35
  clearDrawable(drawable: Drawable): boolean;
35
36
  private dragged;
36
37
  isMapDragged(): boolean;
@@ -22,6 +22,7 @@ require('../naver/NaverMintMapController.js');
22
22
  require('../core/advanced/canvas/CanvasMarkerClaude.js');
23
23
  require('../core/advanced/MapLoadingComponents.js');
24
24
  require('../core/advanced/woongCanvas/WoongKonvaMarker.js');
25
+ require('../core/advanced/woongCanvas/shared/types.js');
25
26
  require('../core/advanced/woongCanvas/shared/context.js');
26
27
  require('../core/advanced/woongCanvas/shared/performance.js');
27
28
  require('../core/wrapper/MapControlWrapper.js');
@@ -347,6 +348,10 @@ function (_super) {
347
348
  }
348
349
  };
349
350
 
351
+ KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
352
+ // 이 기능은 Naver Maps에서만 사용 가능합니다.
353
+ };
354
+
350
355
  KakaoMintMapController.prototype.clearDrawable = function (drawable) {
351
356
  var _this = this;
352
357
 
@@ -27,9 +27,12 @@ export declare class NaverMintMapController extends MintMapController {
27
27
  createMarker(marker: Marker): void;
28
28
  updateMarker(marker: Marker, options: MarkerOptions): void;
29
29
  private markerMaxZIndex;
30
+ private markerOriginalZIndex;
30
31
  private getMaxZIndex;
32
+ private getCurrentZIndex;
31
33
  setMarkerZIndex(marker: Marker, zIndex: number): void;
32
34
  markerToTheTop(marker: Marker): void;
35
+ restoreMarkerZIndex(marker: Marker): void;
33
36
  clearDrawable(drawable: Drawable): boolean;
34
37
  private dragged;
35
38
  isMapDragged(): boolean;