@mint-ui/map 1.2.0-test.9 → 1.2.1

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 (55) hide show
  1. package/.eslintrc.js +11 -4
  2. package/.vscode/settings.json +32 -9
  3. package/dist/components/mint-map/core/MintMapCore.js +5 -6
  4. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +12 -0
  5. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +974 -0
  6. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/index.d.ts +4 -0
  7. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/types.d.ts +294 -0
  8. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +17 -0
  9. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +635 -0
  10. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/index.d.ts +4 -0
  11. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +303 -0
  12. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +1091 -0
  13. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/types.d.ts +286 -0
  14. package/dist/components/mint-map/core/advanced/canvas/CanvasMarker.d.ts +7 -0
  15. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js +7 -7
  16. package/dist/components/mint-map/core/advanced/canvas/index.d.ts +0 -1
  17. package/dist/components/mint-map/core/advanced/index.d.ts +4 -2
  18. package/dist/components/mint-map/core/advanced/shared/context.d.ts +44 -0
  19. package/dist/components/mint-map/core/advanced/shared/context.js +230 -0
  20. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  21. package/dist/components/mint-map/core/advanced/shared/helpers.js +41 -0
  22. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  23. package/dist/components/mint-map/core/advanced/shared/hooks.js +196 -0
  24. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +5 -2
  25. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +82 -0
  26. package/dist/components/mint-map/core/advanced/shared/performance.js +288 -0
  27. package/dist/components/mint-map/core/advanced/shared/types.d.ts +150 -0
  28. package/dist/components/mint-map/core/advanced/shared/types.js +31 -0
  29. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +173 -0
  30. package/dist/components/mint-map/core/advanced/shared/utils.js +382 -0
  31. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  32. package/dist/components/mint-map/core/advanced/shared/viewport.js +52 -0
  33. package/dist/components/mint-map/google/GoogleMintMapController.js +9 -8
  34. package/dist/components/mint-map/kakao/KakaoMintMapController.js +9 -8
  35. package/dist/components/mint-map/naver/NaverMintMapController.js +9 -8
  36. package/dist/index.es.js +5568 -4045
  37. package/dist/index.js +47 -27
  38. package/dist/index.umd.js +5584 -4048
  39. package/package.json +1 -1
  40. package/CLAUDE.md +0 -100
  41. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.d.ts +0 -22
  42. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.js +0 -413
  43. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  44. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -53
  45. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1109
  46. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
  47. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
  48. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +0 -164
  49. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
  50. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
  51. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
  52. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +0 -14
  53. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -31
  54. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -164
  55. package/dist/components/mint-map/core/util/geohash.js +0 -125
@@ -0,0 +1,974 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var Konva = require('konva');
7
+ var React = require('react');
8
+ var reactDom = require('react-dom');
9
+ var MapDrawables = require('../../../types/MapDrawables.js');
10
+ require('../../../types/MapTypes.js');
11
+ require('../../../types/MapEventTypes.js');
12
+ var MintMapProvider = require('../../provider/MintMapProvider.js');
13
+ var context = require('../shared/context.js');
14
+ var helpers = require('../shared/helpers.js');
15
+ var hooks = require('../shared/hooks.js');
16
+ var performance = require('../shared/performance.js');
17
+ var types = require('../shared/types.js');
18
+ var utils = require('../shared/utils.js');
19
+ var viewport = require('../shared/viewport.js');
20
+
21
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
22
+
23
+ var Konva__default = /*#__PURE__*/_interopDefaultLegacy(Konva);
24
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
+
26
+ var CanvasMarkerLayer = function (props) {
27
+ // 타입 가드: renderEvent가 있는지 확인
28
+ var hasRenderEvent = 'renderEvent' in props && props.renderEvent !== undefined; // renderEvent가 있는 경우와 없는 경우를 구분하여 props 추출
29
+
30
+ var data = props.data,
31
+ _a = props.cullingMargin,
32
+ cullingMargin = _a === void 0 ? performance.DEFAULT_CULLING_MARGIN : _a,
33
+ onOptimizationDataUpdate = props.onOptimizationDataUpdate,
34
+ renderBase = props.renderBase,
35
+ _b = props.spatialGridCellSize,
36
+ spatialGridCellSize = _b === void 0 ? performance.SPATIAL_GRID_CELL_SIZE : _b,
37
+ options = tslib.__rest(props, ["data", "cullingMargin", "onOptimizationDataUpdate", "renderBase", "spatialGridCellSize"]); // renderEvent가 있는 경우에만 인터랙션 관련 props 추출
38
+
39
+
40
+ var _c = hasRenderEvent && 'renderEvent' in props ? props : {
41
+ disableInteraction: false,
42
+ onClick: undefined,
43
+ onMouseOut: undefined,
44
+ onMouseOver: undefined,
45
+ renderEvent: undefined,
46
+ selectedItem: undefined,
47
+ selectedItems: undefined,
48
+ topStageZIndex: undefined
49
+ },
50
+ _d = _c.disableInteraction,
51
+ disableInteraction = _d === void 0 ? false : _d,
52
+ onClick = _c.onClick,
53
+ onMouseOut = _c.onMouseOut,
54
+ onMouseOver = _c.onMouseOver,
55
+ renderEvent = _c.renderEvent,
56
+ externalSelectedItem = _c.selectedItem,
57
+ externalSelectedItems = _c.selectedItems,
58
+ rawTopStageZIndex = _c.topStageZIndex; // topStageZIndex가 있으면 hover 최상단 표시 활성화, 없으면 비활성화 (성능 우선)
59
+
60
+
61
+ var topStageZIndex = rawTopStageZIndex;
62
+ var controller = MintMapProvider.useMintMapController();
63
+ var context$1 = context.useCanvasContext();
64
+ var currentZIndex = options.zIndex !== undefined ? options.zIndex : 0; // DOM Refs
65
+
66
+ var divRef = React.useRef(document.createElement('div'));
67
+ var divElement = divRef.current;
68
+ var containerRef = React.useRef(null);
69
+ var markerRef = React.useRef(); // Top Layer용 별도 DOM Refs (topStageZIndex가 설정된 경우에만 사용)
70
+
71
+ var topDivRef = React.useRef(document.createElement('div'));
72
+ var topDivElement = topDivRef.current;
73
+ var topContainerRef = React.useRef(null);
74
+ var topMarkerRef = React.useRef(); // Konva Refs
75
+
76
+ var stageRef = React.useRef(null);
77
+ var baseLayerRef = React.useRef(null);
78
+ var eventLayerRef = React.useRef(null);
79
+ var topStageRef = React.useRef(null);
80
+ var topLayerRef = React.useRef(null); // 상태 관리 Refs (React 리렌더링 최소화)
81
+
82
+ var dataRef = React.useRef(data);
83
+ var disableInteractionRef = React.useRef(disableInteraction);
84
+ var hoveredItemRef = React.useRef(null);
85
+ var selectedItemRef = React.useRef(externalSelectedItem);
86
+ var selectedIdsRef = React.useRef(new Set());
87
+ var selectedItemsMapRef = React.useRef(new Map()); // 드래그 상태 Refs
88
+
89
+ var draggingRef = React.useRef(false);
90
+ var prevCenterOffsetRef = React.useRef(null);
91
+ var accumTranslateRef = React.useRef({
92
+ x: 0,
93
+ y: 0
94
+ }); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
95
+
96
+ var dragStartHoveredItemRef = React.useRef(null); // 공유 캐시 사용 (모든 마커 레이어가 공유)
97
+
98
+ var sharedMarkerCache = context$1 === null || context$1 === void 0 ? void 0 : context$1.sharedMarkerCache;
99
+
100
+ if (!sharedMarkerCache) {
101
+ throw new Error('CanvasMarkerLayer must be used within CanvasProvider');
102
+ } // 성능 최적화 Refs
103
+
104
+
105
+ var spatialIndexRef = React.useRef(new performance.SpatialHashGrid(spatialGridCellSize));
106
+ var boundingBoxCacheRef = React.useRef(new Map());
107
+ var viewportRef = React.useRef(null); // 뷰포트 영역 계산 (Viewport Culling용)
108
+
109
+ var updateViewport = function () {
110
+ viewport.updateViewport(stageRef.current, cullingMargin, viewportRef);
111
+ }; // 마커 좌표 변환 (위경도 → 화면 좌표, 공유 캐시 사용)
112
+
113
+
114
+ var getOrComputeMarkerOffset = function (markerData) {
115
+ var cached = sharedMarkerCache.get(markerData.id);
116
+ if (cached) return cached;
117
+ var result = utils.computeMarkerOffset(markerData, controller);
118
+ if (!result) return null;
119
+ sharedMarkerCache.set(markerData.id, result);
120
+ return result;
121
+ }; // 마커 바운딩 박스 계산 (Viewport Culling 및 Hit Test용, 오프셋 지원)
122
+
123
+
124
+ var computeBoundingBox = function (item) {
125
+ var offset = getOrComputeMarkerOffset(item);
126
+ if (!offset) return null;
127
+ var boxWidth = item.boxWidth || 50;
128
+ var boxHeight = item.boxHeight || 28;
129
+ var tailHeight = item.tailHeight || 0;
130
+ var offsetX = item.offsetX || 0;
131
+ var offsetY = item.offsetY || 0; // 오프셋을 적용한 마커 중심점 기준으로 바운딩 박스 계산
132
+
133
+ return {
134
+ maxX: offset.x + offsetX + boxWidth / 2,
135
+ maxY: offset.y + offsetY,
136
+ minX: offset.x + offsetX - boxWidth / 2,
137
+ minY: offset.y + offsetY - boxHeight - tailHeight
138
+ };
139
+ }; // 뷰포트 내부 여부 확인 (바운딩 박스 캐싱)
140
+
141
+
142
+ var isInViewport = function (item) {
143
+ return viewport.isInViewport(item, viewportRef, boundingBoxCacheRef, computeBoundingBox);
144
+ }; // 공간 인덱스 빌드 (빠른 Hit Test용)
145
+
146
+
147
+ var buildSpatialIndex = function () {
148
+ hooks.buildSpatialIndex(dataRef.current, spatialIndexRef.current, computeBoundingBox);
149
+ }; // spatialGridCellSize가 변경되면 SpatialHashGrid 재생성
150
+
151
+
152
+ React.useEffect(function () {
153
+ spatialIndexRef.current = new performance.SpatialHashGrid(spatialGridCellSize); // 인덱스 재구성 (데이터가 있을 때만)
154
+
155
+ if (dataRef.current.length > 0) {
156
+ buildSpatialIndex();
157
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
158
+
159
+ }, [spatialGridCellSize]); // 렌더링 유틸리티 객체
160
+
161
+ var renderUtils = {
162
+ getOrComputeMarkerOffset: getOrComputeMarkerOffset,
163
+ getOrComputePolygonOffsets: function () {
164
+ return null;
165
+ }
166
+ }; // Base Layer 렌더링 (뷰포트 컬링 적용, 선택된 마커 제외)
167
+
168
+ var doRenderBase = function () {
169
+ var layer = baseLayerRef.current;
170
+ if (!layer) return;
171
+ var shape = layer.findOne('.base-render-shape');
172
+
173
+ if (!shape) {
174
+ shape = new Konva__default["default"].Shape({
175
+ hitStrokeWidth: 0,
176
+ listening: false,
177
+ name: 'base-render-shape',
178
+ perfectDrawEnabled: false,
179
+ sceneFunc: function (konvaContext) {
180
+ var ctx = konvaContext; // 뷰포트 컬링: 화면에 보이는 항목만 필터링 (항상 활성화)
181
+
182
+ var visibleItems = dataRef.current.filter(function (item) {
183
+ return isInViewport(item);
184
+ }); // Base Layer는 기본 마커만 렌더링 (hover된 항목도 포함)
185
+ // hover 스타일은 Event Layer와 Top Layer에서 덧그려짐
186
+
187
+ renderBase({
188
+ ctx: ctx,
189
+ hoveredItem: null,
190
+ items: visibleItems,
191
+ selectedIds: new Set(),
192
+ utils: renderUtils
193
+ });
194
+ }
195
+ });
196
+ layer.add(shape);
197
+ }
198
+
199
+ layer.batchDraw();
200
+ }; // Event Layer 렌더링 (hover 효과 및 선택 상태 표시)
201
+
202
+
203
+ var doRenderEvent = function () {
204
+ var layer = eventLayerRef.current;
205
+ if (!layer || !renderEvent) return;
206
+ var shape = layer.findOne('.event-render-shape');
207
+
208
+ if (!shape) {
209
+ shape = new Konva__default["default"].Shape({
210
+ hitStrokeWidth: 0,
211
+ listening: false,
212
+ name: 'event-render-shape',
213
+ perfectDrawEnabled: false,
214
+ sceneFunc: function (konvaContext) {
215
+ var ctx = konvaContext;
216
+ var selectedItems = helpers.mapValuesToArray(selectedItemsMapRef.current);
217
+ var hovered = hoveredItemRef.current; // selectedItem이 있으면 selectedItems 배열에 포함 (renderMarkerEvent가 selectedItems만 사용하므로)
218
+
219
+ if (selectedItemRef.current) {
220
+ // selectedItem이 이미 selectedItems에 포함되어 있지 않으면 추가
221
+ var selectedItemId_1 = selectedItemRef.current.id;
222
+
223
+ if (!selectedItems.some(function (item) {
224
+ return item.id === selectedItemId_1;
225
+ })) {
226
+ selectedItems = tslib.__spreadArray(tslib.__spreadArray([], selectedItems, true), [selectedItemRef.current], false);
227
+ }
228
+ } // Event Layer는 hover 효과 및 선택 상태를 덧그림
229
+ // topStageZIndex가 있으면 hover된 항목은 Top Stage에서도 처리되지만,
230
+ // Event Layer에서도 hover 스타일을 덧그려서 Base Layer 위에 표시됨
231
+
232
+
233
+ renderEvent({
234
+ ctx: ctx,
235
+ hasTopStage: topStageZIndex !== undefined,
236
+ hoveredItem: hovered,
237
+ renderSource: types.RenderSource.EVENT,
238
+ selectedItem: selectedItemRef.current,
239
+ selectedItems: selectedItems,
240
+ utils: renderUtils
241
+ });
242
+ }
243
+ });
244
+ layer.add(shape);
245
+ }
246
+
247
+ layer.batchDraw();
248
+ }; // Top Layer 렌더링 (hover된 항목만, 별도 캔버스 DOM에 그리기)
249
+
250
+
251
+ var doRenderTop = function () {
252
+ var stage = topStageRef.current;
253
+ var layer = topLayerRef.current;
254
+ if (!stage || !layer || topStageZIndex === undefined) return;
255
+ var hovered = hoveredItemRef.current;
256
+ var shape = layer.findOne('.top-render-shape'); // hover된 항목이 없으면 shape 제거
257
+
258
+ if (!hovered) {
259
+ if (shape) {
260
+ shape.destroy();
261
+ }
262
+
263
+ layer.batchDraw();
264
+ return;
265
+ } // shape가 없으면 생성
266
+
267
+
268
+ if (!shape) {
269
+ shape = new Konva__default["default"].Shape({
270
+ hitStrokeWidth: 0,
271
+ listening: false,
272
+ name: 'top-render-shape',
273
+ perfectDrawEnabled: false,
274
+ sceneFunc: function () {} // 초기화만
275
+
276
+ });
277
+ layer.add(shape);
278
+ } // sceneFunc를 매번 업데이트하여 최신 상태 반영
279
+
280
+
281
+ shape.sceneFunc(function (konvaContext) {
282
+ var _a;
283
+
284
+ var ctx = konvaContext;
285
+ var currentHovered = hoveredItemRef.current; // hover된 항목이 없으면 아무것도 그리지 않음
286
+
287
+ if (!currentHovered) return; // 뷰포트 컬링 확인 (항상 활성화)
288
+
289
+ if (!isInViewport(currentHovered)) {
290
+ return;
291
+ }
292
+
293
+ var selectedItems = helpers.mapValuesToArray(selectedItemsMapRef.current); // selectedItem이 있으면 hover된 항목이 선택되었는지 확인
294
+
295
+ var hoveredIsSelected = selectedItems.some(function (item) {
296
+ return item.id === currentHovered.id;
297
+ }) || ((_a = selectedItemRef.current) === null || _a === void 0 ? void 0 : _a.id) === currentHovered.id; // Top Layer에서는 hover된 마커만 hover 스타일로 그리기
298
+ // renderEvent가 있으면: base는 그리지 않고 event만 그리기 (hover 스타일 적용)
299
+ // renderEvent가 없으면: base를 hover 스타일로 그리기
300
+
301
+ if (renderEvent) {
302
+ // renderEvent가 있으면 hover 스타일로만 그리기
303
+ var hoverSelectedItems = hoveredIsSelected ? [currentHovered] : [];
304
+ renderEvent({
305
+ ctx: ctx,
306
+ hasTopStage: true,
307
+ hoveredItem: currentHovered,
308
+ renderSource: types.RenderSource.TOP,
309
+ selectedItem: selectedItemRef.current,
310
+ selectedItems: hoverSelectedItems,
311
+ utils: renderUtils
312
+ });
313
+ } else {
314
+ // renderEvent가 없으면 base를 hover 스타일로 그리기
315
+ renderBase({
316
+ ctx: ctx,
317
+ hoveredItem: currentHovered,
318
+ items: [currentHovered],
319
+ selectedIds: selectedIdsRef.current,
320
+ utils: renderUtils
321
+ });
322
+ }
323
+ });
324
+ layer.batchDraw();
325
+ }; // 최적화 데이터 업데이트 콜백 호출
326
+
327
+
328
+ var notifyOptimizationData = function () {
329
+ if (!onOptimizationDataUpdate) return; // 공유 캐시에서 마커 타입 항목만 필터링 (Offset 타입만)
330
+
331
+ var allCacheEntries = sharedMarkerCache.getAllEntries();
332
+ var cacheEntries = allCacheEntries.map(function (_a) {
333
+ var key = _a[0],
334
+ value = _a[1];
335
+ return [key, value];
336
+ });
337
+ var spatialGridCells = spatialIndexRef.current.getAllCells();
338
+ onOptimizationDataUpdate({
339
+ cacheEntries: cacheEntries,
340
+ cacheSize: sharedMarkerCache.size(),
341
+ spatialGridCells: spatialGridCells
342
+ });
343
+ }; // 전체 즉시 렌더링
344
+
345
+
346
+ var renderAllImmediate = function () {
347
+ updateViewport();
348
+ buildSpatialIndex();
349
+ doRenderBase();
350
+ doRenderEvent(); // 메인 stage의 transform을 topStage에도 동기화
351
+
352
+ if (topStageZIndex !== undefined && topContainerRef.current && containerRef.current) {
353
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
354
+ }
355
+
356
+ if (topStageZIndex !== undefined) {
357
+ doRenderTop();
358
+ } // 최적화 데이터 업데이트 콜백 호출
359
+
360
+
361
+ notifyOptimizationData();
362
+ }; // 지도 이벤트 핸들러 생성
363
+
364
+
365
+ var _e = hooks.createMapEventHandlers({
366
+ accumTranslateRef: accumTranslateRef,
367
+ boundingBoxCacheRef: boundingBoxCacheRef,
368
+ clearCache: function () {
369
+ return sharedMarkerCache.clear();
370
+ },
371
+ containerRef: containerRef,
372
+ controller: controller,
373
+ markerRef: markerRef,
374
+ options: options,
375
+ prevCenterOffsetRef: prevCenterOffsetRef,
376
+ renderAllImmediate: renderAllImmediate
377
+ }),
378
+ handleIdleShared = _e.handleIdle,
379
+ handleZoomStart = _e.handleZoomStart,
380
+ handleZoomEnd = _e.handleZoomEnd,
381
+ handleCenterChangedShared = _e.handleCenterChanged,
382
+ handleDragStartShared = _e.handleDragStart,
383
+ handleDragEndShared = _e.handleDragEnd; // handleIdle 래핑: topStage transform 제거 추가
384
+
385
+
386
+ var handleIdle = function () {
387
+ handleIdleShared(); // 드래그 완료 시 topStage의 transform도 제거 (메인 stage와 동기화)
388
+
389
+ if (topStageZIndex !== undefined && topContainerRef.current) {
390
+ topContainerRef.current.style.transform = '';
391
+ }
392
+ }; // handleCenterChanged 래핑: topStage transform 동기화 추가
393
+
394
+
395
+ var handleCenterChanged = function () {
396
+ handleCenterChangedShared(); // 드래그 중 메인 stage의 transform을 topStage에도 동기화 (반대 방향 이동 방지)
397
+
398
+ if (topStageZIndex !== undefined && topContainerRef.current && containerRef.current) {
399
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
400
+ }
401
+ };
402
+
403
+ var handleDragStart = function () {
404
+ handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
405
+
406
+ dragStartHoveredItemRef.current = hoveredItemRef.current;
407
+ draggingRef.current = true;
408
+ controller.setMapCursor('grabbing'); // 메인 stage의 transform을 topStage에도 동기화
409
+
410
+ if (topStageZIndex !== undefined && topContainerRef.current && containerRef.current) {
411
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
412
+ }
413
+ };
414
+
415
+ var handleDragEnd = function () {
416
+ handleDragEndShared();
417
+ draggingRef.current = false; // 드래그 종료 후 hover 상태 초기화 (다음 MOUSEMOVE에서 업데이트됨)
418
+
419
+ dragStartHoveredItemRef.current = null;
420
+ controller.setMapCursor('grab'); // 메인 stage의 transform을 topStage에도 동기화
421
+
422
+ if (topStageZIndex !== undefined && topContainerRef.current && containerRef.current) {
423
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
424
+ }
425
+ }; // Hit Test: 특정 좌표의 마커 찾기
426
+
427
+
428
+ var findData = function (offset) {
429
+ // hover된 항목이 있으면 최우선으로 확인 (topOnHover 기능 지원)
430
+ // topStageZIndex가 없어도 hover된 항목이 다른 마커 위에 있어도 계속 hover 상태 유지
431
+ if (hoveredItemRef.current) {
432
+ var hovered = hoveredItemRef.current;
433
+
434
+ if (utils.isPointInMarkerData(offset, hovered, getOrComputeMarkerOffset)) {
435
+ return hovered;
436
+ }
437
+ } // 공간 인덱스에서 후보 항목 조회 (O(1) 수준의 빠른 조회)
438
+
439
+
440
+ var candidates = spatialIndexRef.current.queryPoint(offset.x, offset.y); // 역순 순회: 나중에 추가된 항목(최상위)이 먼저 선택되도록
441
+
442
+ for (var i = candidates.length - 1; i >= 0; i--) {
443
+ var item = candidates[i];
444
+
445
+ if (utils.isPointInMarkerData(offset, item, getOrComputeMarkerOffset)) {
446
+ return item;
447
+ }
448
+ }
449
+
450
+ return null;
451
+ }; // Hover 상태 설정 및 렌더링
452
+
453
+
454
+ var setHovered = function (hoveredData) {
455
+ // 드래그 중에는 hover 상태 변경을 무시하고 드래그 시작 시점의 상태 유지
456
+ if (draggingRef.current) {
457
+ return;
458
+ }
459
+
460
+ hoveredItemRef.current = hoveredData;
461
+
462
+ if (draggingRef.current) {
463
+ controller.setMapCursor('grabbing');
464
+ } else {
465
+ controller.setMapCursor(hoveredData ? 'pointer' : 'grab');
466
+ }
467
+
468
+ if (topStageZIndex !== undefined) {
469
+ // topStageZIndex가 설정된 경우 Top Layer에서 hover된 항목 렌더링
470
+ // Base Layer는 모든 마커를 포함하므로 hover 상태 변경 시 재렌더링 불필요
471
+ // Event Layer는 hover 스타일과 선택된 항목을 렌더링하므로 업데이트 필요
472
+ doRenderEvent();
473
+ doRenderTop();
474
+ } else if (renderEvent) {
475
+ // renderEvent가 있을 때는 Event Layer만 업데이트
476
+ // topStageZIndex가 없으면 Base Layer는 정적이므로 재렌더링 불필요 (성능 우선)
477
+ // hover 효과는 Event Layer에서만 처리하면 됨
478
+ doRenderEvent();
479
+ }
480
+ }; // 클릭 처리: 선택 상태 업데이트 (단일 선택만 지원)
481
+
482
+
483
+ var handleLocalClick = function (clickedData) {
484
+ var newSelected = new Set();
485
+
486
+ if (!selectedIdsRef.current.has(clickedData.id)) {
487
+ newSelected.add(clickedData.id);
488
+ selectedItemsMapRef.current.clear();
489
+ selectedItemsMapRef.current.set(clickedData.id, clickedData); // externalSelectedItem이 있을 때를 대비해 selectedItemRef도 업데이트
490
+
491
+ selectedItemRef.current = clickedData;
492
+ } else {
493
+ selectedItemsMapRef.current.clear();
494
+ selectedItemRef.current = null;
495
+ }
496
+
497
+ selectedIdsRef.current = newSelected; // 선택 상태 변경은 Event Layer에서만 처리 (Base Layer는 정적이므로 재렌더링 불필요)
498
+
499
+ doRenderEvent();
500
+
501
+ if (topStageZIndex !== undefined) {
502
+ doRenderTop();
503
+ }
504
+ }; // 클릭 이벤트 핸들러
505
+
506
+
507
+ var handleClick = function (event) {
508
+ if (controller.isMapDragged()) return;
509
+ if (disableInteractionRef.current) return;
510
+ var clickedOffset = helpers.validateEvent(event, context$1, controller);
511
+ if (!clickedOffset) return;
512
+ var clickedData = findData(clickedOffset);
513
+ if (!clickedData) return;
514
+ handleLocalClick(clickedData);
515
+ onClick === null || onClick === void 0 ? void 0 : onClick(clickedData, selectedIdsRef.current);
516
+ }; // 마커 바운딩 박스의 왼쪽 상단과 우측 하단을 위도/경도로 변환
517
+
518
+
519
+ var getMarkerBoundingBoxCoordinates = function (item) {
520
+ if (!item.position) return null;
521
+ return utils.calculateMarkerBoundingBox({
522
+ controller: controller,
523
+ height: item.boxHeight || 28,
524
+ lat: item.position.lat,
525
+ lng: item.position.lng,
526
+ offsetX: item.offsetX || 0,
527
+ offsetY: item.offsetY || 0,
528
+ tailHeight: item.tailHeight || 0,
529
+ width: item.boxWidth || 50
530
+ });
531
+ }; // 마우스 이동 이벤트 핸들러 (hover 감지)
532
+
533
+
534
+ var handleMouseMove = function (event) {
535
+ if (disableInteractionRef.current) return; // 드래그 중에는 hover 상태를 업데이트하지 않음 (드래그 시작 시점의 hover 상태 유지)
536
+
537
+ if (draggingRef.current) return;
538
+ var mouseOffset = helpers.validateEvent(event, context$1, controller);
539
+ if (!mouseOffset) return;
540
+ var hoveredItem = findData(mouseOffset);
541
+ var prevHovered = hoveredItemRef.current;
542
+ if (prevHovered === hoveredItem) return;
543
+ setHovered(hoveredItem);
544
+ if (prevHovered) onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
545
+
546
+ if (hoveredItem) {
547
+ var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
548
+
549
+ var payload = tslib.__assign(tslib.__assign({}, hoveredItem), {
550
+ boundingBox: boundingBox || undefined
551
+ });
552
+
553
+ onMouseOver === null || onMouseOver === void 0 ? void 0 : onMouseOver(payload);
554
+ }
555
+ }; // 마우스가 맵 영역을 벗어날 때 hover 상태 초기화
556
+
557
+
558
+ var handleMouseLeave = function () {
559
+ if (disableInteractionRef.current) return;
560
+ var prevHovered = hoveredItemRef.current;
561
+ if (!prevHovered) return;
562
+ hoveredItemRef.current = null;
563
+ controller.setMapCursor('grab');
564
+
565
+ if (topStageZIndex !== undefined) {
566
+ // Base Layer는 모든 마커를 포함하므로 hover 상태 변경 시 재렌더링 불필요
567
+ // Event Layer는 hover 스타일과 선택된 항목을 렌더링하므로 업데이트 필요
568
+ doRenderEvent();
569
+ doRenderTop();
570
+ } else if (renderEvent) {
571
+ // renderEvent가 있을 때는 Event Layer만 업데이트
572
+ // topStageZIndex가 없으면 Base Layer는 정적이므로 재렌더링 불필요 (성능 우선)
573
+ // hover 효과 제거는 Event Layer에서만 처리하면 됨
574
+ doRenderEvent();
575
+ }
576
+
577
+ onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
578
+ }; // DOM 초기화
579
+
580
+
581
+ React.useEffect(function () {
582
+ divElement.style.width = 'fit-content'; // Top Layer용 div도 초기화 (topStageZIndex가 설정된 경우)
583
+
584
+ if (topStageZIndex !== undefined) {
585
+ topDivElement.style.width = 'fit-content';
586
+ }
587
+
588
+ return function () {
589
+ if (!markerRef.current) return;
590
+ controller.clearDrawable(markerRef.current);
591
+ markerRef.current = undefined;
592
+ };
593
+ }, []); // 마커 생성/업데이트
594
+
595
+ React.useEffect(function () {
596
+ if (!options) return;
597
+ var bounds = controller.getCurrBounds();
598
+
599
+ var markerOptions = tslib.__assign({
600
+ position: bounds.nw
601
+ }, options);
602
+
603
+ if (markerRef.current) {
604
+ controller.updateMarker(markerRef.current, markerOptions);
605
+ } else {
606
+ markerRef.current = new MapDrawables.Marker(markerOptions);
607
+ markerRef.current.element = divElement;
608
+ controller.createMarker(markerRef.current);
609
+
610
+ if (divElement.parentElement) {
611
+ divElement.parentElement.style.pointerEvents = 'none';
612
+ }
613
+
614
+ if (options.zIndex !== undefined) {
615
+ controller.setMarkerZIndex(markerRef.current, options.zIndex);
616
+ }
617
+ }
618
+ }, [options]); // Konva 초기화 및 이벤트 리스너 등록
619
+
620
+ React.useEffect(function () {
621
+ var mapDiv = controller.mapDivElement;
622
+ var stage = new Konva__default["default"].Stage({
623
+ container: containerRef.current,
624
+ height: mapDiv.offsetHeight,
625
+ width: mapDiv.offsetWidth
626
+ });
627
+ stageRef.current = stage;
628
+ var baseLayer = new Konva__default["default"].Layer({
629
+ listening: false
630
+ });
631
+ var eventLayer = new Konva__default["default"].Layer({
632
+ listening: false
633
+ });
634
+ baseLayerRef.current = baseLayer;
635
+ eventLayerRef.current = eventLayer;
636
+ stage.add(baseLayer);
637
+ stage.add(eventLayer);
638
+ updateViewport(); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
639
+
640
+ var resizeRafId = null;
641
+ var resizeObserver = new ResizeObserver(function () {
642
+ if (resizeRafId !== null) {
643
+ cancelAnimationFrame(resizeRafId);
644
+ }
645
+
646
+ resizeRafId = requestAnimationFrame(function () {
647
+ stage.width(mapDiv.offsetWidth);
648
+ stage.height(mapDiv.offsetHeight);
649
+ sharedMarkerCache.clear();
650
+ boundingBoxCacheRef.current.clear();
651
+ updateViewport();
652
+ renderAllImmediate();
653
+ resizeRafId = null;
654
+ });
655
+ });
656
+ resizeObserver.observe(mapDiv);
657
+ controller.addEventListener('IDLE', handleIdle);
658
+ controller.addEventListener('ZOOMSTART', handleZoomStart);
659
+ controller.addEventListener('ZOOM_CHANGED', handleZoomEnd);
660
+ controller.addEventListener('CENTER_CHANGED', handleCenterChanged);
661
+ controller.addEventListener('CLICK', handleClick);
662
+ controller.addEventListener('MOUSEMOVE', handleMouseMove);
663
+ controller.addEventListener('DRAGSTART', handleDragStart);
664
+ controller.addEventListener('DRAGEND', handleDragEnd);
665
+ mapDiv.addEventListener('mouseleave', handleMouseLeave);
666
+ renderAllImmediate(); // Context 사용 시 컴포넌트 등록
667
+
668
+ var componentInstance = null;
669
+
670
+ if (context$1) {
671
+ // context를 통한 onMouseOver 호출 시에도 boundingBox를 포함하도록 래핑
672
+ var wrappedOnMouseOver = onMouseOver ? function (payload) {
673
+ var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
674
+
675
+ var enhancedPayload = tslib.__assign(tslib.__assign({}, payload), {
676
+ boundingBox: boundingBox || undefined
677
+ });
678
+
679
+ onMouseOver(enhancedPayload);
680
+ } : undefined;
681
+ componentInstance = {
682
+ findData: findData,
683
+ getSelectedIds: function () {
684
+ return selectedIdsRef.current;
685
+ },
686
+ handleLocalClick: handleLocalClick,
687
+ hitTest: function (offset) {
688
+ return findData(offset) !== null;
689
+ },
690
+ isInteractionDisabled: function () {
691
+ return disableInteractionRef.current;
692
+ },
693
+ onClick: onClick,
694
+ onMouseOut: onMouseOut,
695
+ onMouseOver: wrappedOnMouseOver,
696
+ setHovered: setHovered,
697
+ zIndex: currentZIndex
698
+ };
699
+ context$1.registerComponent(componentInstance);
700
+ }
701
+
702
+ return function () {
703
+ if (resizeRafId !== null) {
704
+ cancelAnimationFrame(resizeRafId);
705
+ }
706
+
707
+ resizeObserver.disconnect();
708
+ controller.removeEventListener('IDLE', handleIdle);
709
+ controller.removeEventListener('ZOOMSTART', handleZoomStart);
710
+ controller.removeEventListener('ZOOM_CHANGED', handleZoomEnd);
711
+ controller.removeEventListener('CENTER_CHANGED', handleCenterChanged);
712
+ controller.removeEventListener('CLICK', handleClick);
713
+ controller.removeEventListener('MOUSEMOVE', handleMouseMove);
714
+ controller.removeEventListener('DRAGSTART', handleDragStart);
715
+ controller.removeEventListener('DRAGEND', handleDragEnd);
716
+ mapDiv.removeEventListener('mouseleave', handleMouseLeave);
717
+
718
+ if (context$1 && componentInstance) {
719
+ context$1.unregisterComponent(componentInstance);
720
+ }
721
+
722
+ baseLayer.destroyChildren();
723
+ eventLayer.destroyChildren();
724
+ stage.destroy(); // 공유 캐시는 cleanup 시 clear하지 않음 (다른 레이어가 사용 중일 수 있음)
725
+
726
+ boundingBoxCacheRef.current.clear();
727
+ spatialIndexRef.current.clear();
728
+ };
729
+ }, []); // disableInteraction 동기화
730
+
731
+ React.useEffect(function () {
732
+ disableInteractionRef.current = disableInteraction;
733
+ }, [disableInteraction]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
734
+
735
+ React.useEffect(function () {
736
+ if (topStageZIndex === undefined) return;
737
+ if (!topContainerRef.current) return;
738
+ var mapDiv = controller.mapDivElement; // Top Layer용 div 요소 설정
739
+
740
+ topDivElement.style.width = 'fit-content';
741
+ var bounds = controller.getCurrBounds();
742
+
743
+ var topMarkerOptions = tslib.__assign({
744
+ position: bounds.nw,
745
+ zIndex: topStageZIndex
746
+ }, options); // Top Layer용 Marker 생성 (zIndex: topStageZIndex로 DOM 마커보다 위에 위치)
747
+
748
+
749
+ var topMarker = new MapDrawables.Marker(topMarkerOptions);
750
+ topMarker.element = topDivElement;
751
+ controller.createMarker(topMarker);
752
+ topMarkerRef.current = topMarker;
753
+
754
+ if (topDivElement.parentElement) {
755
+ topDivElement.parentElement.style.pointerEvents = 'none';
756
+ } // Top Layer Marker의 zIndex 명시적으로 설정
757
+
758
+
759
+ controller.setMarkerZIndex(topMarker, topStageZIndex); // Top Layer용 Konva Stage 생성
760
+
761
+ var topStage = new Konva__default["default"].Stage({
762
+ container: topContainerRef.current,
763
+ height: mapDiv.offsetHeight,
764
+ width: mapDiv.offsetWidth
765
+ });
766
+ topStageRef.current = topStage;
767
+ var topLayer = new Konva__default["default"].Layer({
768
+ listening: false
769
+ });
770
+ topLayerRef.current = topLayer;
771
+ topStage.add(topLayer); // ResizeObserver: 맵 크기 변경 감지 (RAF로 debounce)
772
+
773
+ var topResizeRafId = null;
774
+ var topResizeObserver = new ResizeObserver(function () {
775
+ if (topResizeRafId !== null) {
776
+ cancelAnimationFrame(topResizeRafId);
777
+ }
778
+
779
+ topResizeRafId = requestAnimationFrame(function () {
780
+ topStage.width(mapDiv.offsetWidth);
781
+ topStage.height(mapDiv.offsetHeight);
782
+ doRenderTop();
783
+ topResizeRafId = null;
784
+ });
785
+ });
786
+ topResizeObserver.observe(mapDiv); // topMarker position 업데이트 함수
787
+
788
+ var updateTopMarkerPosition = function () {
789
+ if (topMarkerRef.current && markerRef.current) {
790
+ var currentBounds = controller.getCurrBounds();
791
+
792
+ var updatedOptions = tslib.__assign(tslib.__assign({}, options), {
793
+ position: currentBounds.nw,
794
+ zIndex: topStageZIndex
795
+ });
796
+
797
+ controller.updateMarker(topMarkerRef.current, updatedOptions); // zIndex 명시적으로 설정
798
+
799
+ controller.setMarkerZIndex(topMarkerRef.current, topStageZIndex);
800
+ }
801
+ }; // 지도 이벤트 핸들러 등록 (topStage 업데이트용)
802
+
803
+
804
+ var handleTopIdle = function () {
805
+ // 드래그 완료 후 topMarker의 position을 메인 marker와 동일하게 업데이트
806
+ updateTopMarkerPosition(); // topStage 크기 업데이트
807
+
808
+ if (topStageRef.current) {
809
+ topStageRef.current.width(mapDiv.offsetWidth);
810
+ topStageRef.current.height(mapDiv.offsetHeight);
811
+ } // 드래그 완료 후 transform은 handleIdle에서 제거되므로 여기서는 동기화만
812
+ // (handleIdle이 먼저 실행되어 transform을 제거한 후, 여기서 position 업데이트)
813
+
814
+
815
+ if (topContainerRef.current && containerRef.current) {
816
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
817
+ }
818
+
819
+ doRenderTop();
820
+ };
821
+
822
+ var handleTopZoomStart = function () {
823
+ // 메인 stage의 transform을 topStage에도 동기화
824
+ if (topContainerRef.current && containerRef.current) {
825
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
826
+ }
827
+
828
+ doRenderTop();
829
+ };
830
+
831
+ var handleTopZoomEnd = function () {
832
+ // 메인 stage의 transform을 topStage에도 동기화
833
+ if (topContainerRef.current && containerRef.current) {
834
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
835
+ }
836
+
837
+ doRenderTop();
838
+ };
839
+
840
+ var handleTopCenterChanged = function () {
841
+ // 드래그 중에는 transform만 동기화 (position 업데이트는 드래그 완료 후에만)
842
+ // 드래그 중에 position을 업데이트하면 transform과 충돌하여 반대 방향으로 이동하는 버그 발생
843
+ if (!draggingRef.current) {
844
+ // 드래그가 아닐 때만 topMarker의 position을 업데이트
845
+ updateTopMarkerPosition();
846
+ } // topStage 크기 업데이트
847
+
848
+
849
+ if (topStageRef.current) {
850
+ topStageRef.current.width(mapDiv.offsetWidth);
851
+ topStageRef.current.height(mapDiv.offsetHeight);
852
+ } // 메인 stage의 transform을 topStage에도 동기화 (드래그 중 필수)
853
+
854
+
855
+ if (topContainerRef.current && containerRef.current) {
856
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
857
+ }
858
+
859
+ doRenderTop();
860
+ };
861
+
862
+ controller.addEventListener('IDLE', handleTopIdle);
863
+ controller.addEventListener('ZOOMSTART', handleTopZoomStart);
864
+ controller.addEventListener('ZOOM_CHANGED', handleTopZoomEnd);
865
+ controller.addEventListener('CENTER_CHANGED', handleTopCenterChanged);
866
+ doRenderTop();
867
+ return function () {
868
+ if (topResizeRafId !== null) {
869
+ cancelAnimationFrame(topResizeRafId);
870
+ }
871
+
872
+ topResizeObserver.disconnect();
873
+ controller.removeEventListener('IDLE', handleTopIdle);
874
+ controller.removeEventListener('ZOOMSTART', handleTopZoomStart);
875
+ controller.removeEventListener('ZOOM_CHANGED', handleTopZoomEnd);
876
+ controller.removeEventListener('CENTER_CHANGED', handleTopCenterChanged);
877
+
878
+ if (topLayerRef.current) {
879
+ topLayerRef.current.destroyChildren();
880
+ }
881
+
882
+ if (topStageRef.current) {
883
+ topStageRef.current.destroy();
884
+ }
885
+
886
+ if (topMarkerRef.current) {
887
+ controller.clearDrawable(topMarkerRef.current);
888
+ topMarkerRef.current = undefined;
889
+ }
890
+ };
891
+ }, [topStageZIndex, renderEvent, options]); // 외부 selectedItems 동기화
892
+
893
+ React.useEffect(function () {
894
+ if (!stageRef.current) return; // externalSelectedItems가 있으면 selectedItem은 무시 (공존 불가)
895
+
896
+ if (externalSelectedItems !== undefined) {
897
+ selectedItemRef.current = undefined;
898
+ hooks.syncExternalSelectedItems(externalSelectedItems, selectedIdsRef, selectedItemsMapRef);
899
+ } // 선택 상태 변경은 Event Layer에서만 처리 (Base Layer는 정적이므로 재렌더링 불필요)
900
+
901
+
902
+ doRenderEvent();
903
+
904
+ if (topStageZIndex !== undefined) {
905
+ doRenderTop();
906
+ }
907
+ }, [externalSelectedItems]); // 외부 selectedItem 변경 시 Event Layer 리렌더링
908
+
909
+ React.useEffect(function () {
910
+ if (!stageRef.current) return; // externalSelectedItem이 있으면 selectedItems는 무시 (공존 불가)
911
+
912
+ if (externalSelectedItem !== undefined) {
913
+ selectedIdsRef.current.clear();
914
+ selectedItemsMapRef.current.clear();
915
+ selectedItemRef.current = externalSelectedItem;
916
+ } else if (externalSelectedItems === undefined) {
917
+ // 둘 다 없으면 selectedItemRef만 업데이트 (내부 클릭으로 선택한 항목은 유지)
918
+ selectedItemRef.current = externalSelectedItem;
919
+ }
920
+
921
+ doRenderEvent();
922
+
923
+ if (topStageZIndex !== undefined) {
924
+ doRenderTop();
925
+ }
926
+ }, [externalSelectedItem, externalSelectedItems]); // 데이터 변경 시 렌더링 (캐시 정리 및 선택 상태 동기화)
927
+
928
+ React.useEffect(function () {
929
+ if (!stageRef.current) return;
930
+ dataRef.current = data;
931
+
932
+ if (containerRef.current) {
933
+ containerRef.current.style.transform = '';
934
+ }
935
+
936
+ prevCenterOffsetRef.current = null;
937
+ accumTranslateRef.current = {
938
+ x: 0,
939
+ y: 0
940
+ };
941
+ sharedMarkerCache.clear();
942
+ boundingBoxCacheRef.current.clear();
943
+ selectedItemsMapRef.current = hooks.syncSelectedItems(data, selectedIdsRef.current, selectedItemsMapRef.current);
944
+ renderAllImmediate();
945
+ }, [data]);
946
+ return React__default["default"].createElement(React__default["default"].Fragment, null, reactDom.createPortal(React__default["default"].createElement("div", {
947
+ ref: containerRef,
948
+ style: {
949
+ height: '100%',
950
+ position: 'absolute',
951
+ width: '100%'
952
+ }
953
+ }), divElement), topStageZIndex !== undefined && reactDom.createPortal(React__default["default"].createElement("div", {
954
+ ref: topContainerRef,
955
+ style: {
956
+ height: '100%',
957
+ position: 'absolute',
958
+ width: '100%'
959
+ }
960
+ }), topDivElement));
961
+ };
962
+
963
+ exports.CanvasProvider = context.CanvasProvider;
964
+ exports.QueueCache = performance.QueueCache;
965
+ exports.SpatialHashGrid = performance.SpatialHashGrid;
966
+ Object.defineProperty(exports, 'CanvasDataType', {
967
+ enumerable: true,
968
+ get: function () { return types.CanvasDataType; }
969
+ });
970
+ Object.defineProperty(exports, 'RenderSource', {
971
+ enumerable: true,
972
+ get: function () { return types.RenderSource; }
973
+ });
974
+ exports["default"] = CanvasMarkerLayer;