@mint-ui/map 1.2.0-test.65 → 1.2.0-test.66

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.
package/dist/index.es.js CHANGED
@@ -3951,32 +3951,26 @@ var CanvasMarkerLayer = function (props) {
3951
3951
 
3952
3952
  var _d = hasRenderEvent && 'renderEvent' in props ? props : {
3953
3953
  disableInteraction: false,
3954
- enableMultiSelect: false,
3955
3954
  onClick: undefined,
3956
3955
  onMouseOut: undefined,
3957
3956
  onMouseOver: undefined,
3958
3957
  renderEvent: undefined,
3959
3958
  selectedItem: undefined,
3960
3959
  selectedItems: undefined,
3961
- topOnHover: false,
3962
3960
  topStageZIndex: undefined
3963
3961
  },
3964
3962
  _e = _d.disableInteraction,
3965
3963
  disableInteraction = _e === void 0 ? false : _e,
3966
- _f = _d.enableMultiSelect,
3967
- enableMultiSelect = _f === void 0 ? false : _f,
3968
3964
  onClick = _d.onClick,
3969
3965
  onMouseOut = _d.onMouseOut,
3970
3966
  onMouseOver = _d.onMouseOver,
3971
3967
  renderEvent = _d.renderEvent,
3972
3968
  externalSelectedItem = _d.selectedItem,
3973
3969
  externalSelectedItems = _d.selectedItems,
3974
- rawTopStageZIndex = _d.topStageZIndex,
3975
- _g = _d.topOnHover,
3976
- topOnHover = _g === void 0 ? false : _g; // topOnHover가 false이거나 없으면 topStageZIndex를 사용하지 못하도록 제한
3970
+ rawTopStageZIndex = _d.topStageZIndex; // topStageZIndex가 있으면 hover 최상단 표시 활성화, 없으면 비활성화 (성능 우선)
3977
3971
 
3978
3972
 
3979
- var topStageZIndex = topOnHover && rawTopStageZIndex !== undefined ? rawTopStageZIndex : undefined;
3973
+ var topStageZIndex = rawTopStageZIndex;
3980
3974
  var controller = useMintMapController();
3981
3975
  var context = useCanvasContext();
3982
3976
  var currentZIndex = options.zIndex !== undefined ? options.zIndex : 0; // DOM Refs
@@ -4086,44 +4080,24 @@ var CanvasMarkerLayer = function (props) {
4086
4080
 
4087
4081
  var visibleItems = enableViewportCullingRef.current ? dataRef.current.filter(function (item) {
4088
4082
  return isInViewport$1(item);
4089
- }) : dataRef.current; // topStageZIndex가 설정되고 topOnHover가 true인 경우 hover된 항목은 Top Layer에서 처리
4090
- // topOnHover 옵션: hover된 항목을 나중에 그려서 최상위에 표시
4083
+ }) : dataRef.current; // topStageZIndex가 설정된 경우 hover된 항목은 Top Layer에서 처리
4091
4084
 
4092
- if (topStageZIndex !== undefined && topOnHover && hovered) {
4085
+ if (topStageZIndex !== undefined && hovered) {
4093
4086
  visibleItems = visibleItems.filter(function (item) {
4094
4087
  return item.id !== hovered.id;
4095
4088
  });
4096
- } else if (topOnHover && !renderEvent && hovered) {
4097
- visibleItems = visibleItems.filter(function (item) {
4098
- return item.id !== hovered.id;
4099
- });
4100
- } // 일반 항목들 먼저 렌더링
4101
- // topOnHover가 false이고 renderEvent가 있으면 선택된 항목도 Base Layer에서 렌더링
4102
- // (Event Layer에서 선택된 항목을 렌더링하지 않으므로)
4103
- // topOnHover가 true이거나 renderEvent가 없으면 선택된 항목은 Base Layer에서 스킵됨
4089
+ } // Base Layer는 기본 마커만 렌더링 (성능 최적화)
4090
+ // hover/selected는 Event Layer에서 덧그리므로 Base Layer에서는 제외
4104
4091
 
4105
4092
 
4106
- var baseSelectedIds = !topOnHover && renderEvent ? selectedIdsRef.current : new Set();
4107
4093
  renderBase({
4108
4094
  ctx: ctx,
4109
- hoveredItem: hovered,
4095
+ hoveredItem: null,
4110
4096
  items: visibleItems,
4111
- selectedIds: baseSelectedIds,
4097
+ selectedIds: new Set(),
4112
4098
  utils: renderUtils
4113
4099
  }); // topStageZIndex가 설정된 경우 hover된 항목은 Top Layer에서 처리하므로 여기서는 스킵
4114
- // hover된 항목을 마지막에 렌더링하여 최상위에 표시
4115
-
4116
- if (topStageZIndex === undefined && topOnHover && !renderEvent && hovered) {
4117
- if (!enableViewportCullingRef.current || isInViewport$1(hovered)) {
4118
- renderBase({
4119
- ctx: ctx,
4120
- hoveredItem: hovered,
4121
- items: [hovered],
4122
- selectedIds: selectedIdsRef.current,
4123
- utils: renderUtils
4124
- });
4125
- }
4126
- }
4100
+ // topStageZIndex가 없으면 성능 우선으로 Base Layer 재렌더링 안 함 (hover된 항목이 뒤편 마커 위로 올라갈 수 있음)
4127
4101
  }
4128
4102
  });
4129
4103
  layer.add(shape);
@@ -4147,64 +4121,45 @@ var CanvasMarkerLayer = function (props) {
4147
4121
  sceneFunc: function (konvaContext) {
4148
4122
  var ctx = konvaContext;
4149
4123
  var selectedItems = mapValuesToArray(selectedItemsMapRef.current);
4150
- var hovered = hoveredItemRef.current; // topStageZIndex가 설정되고 topOnHover가 true이면 hover된 항목은 Top Layer에서 처리
4124
+ var hovered = hoveredItemRef.current; // selectedItem이 있으면 selectedItems 배열에 포함 (renderMarkerEvent가 selectedItems만 사용하므로)
4125
+
4126
+ if (selectedItemRef.current) {
4127
+ // selectedItem이 이미 selectedItems에 포함되어 있지 않으면 추가
4128
+ var selectedItemId_1 = selectedItemRef.current.id;
4129
+
4130
+ if (!selectedItems.some(function (item) {
4131
+ return item.id === selectedItemId_1;
4132
+ })) {
4133
+ selectedItems = __spreadArray(__spreadArray([], selectedItems, true), [selectedItemRef.current], false);
4134
+ }
4135
+ } // topStageZIndex가 설정된 경우 hover된 항목은 Top Layer에서 처리
4151
4136
  // event 레이어에서는 hover된 항목을 완전히 제외하고 선택된 항목만 렌더링
4152
4137
 
4153
- if (topStageZIndex !== undefined && topOnHover && hovered) {
4154
- // hover된 항목을 제외한 선택된 항목들
4155
- var selectedItemsWithoutHovered = selectedItems.filter(function (item) {
4138
+
4139
+ if (topStageZIndex !== undefined && hovered) {
4140
+ // hover된 항목을 제외한 선택된 항목들 (성능 최적화: 필요할 때만 필터링)
4141
+ var selectedItemsWithoutHovered = selectedItems.length > 0 ? selectedItems.filter(function (item) {
4156
4142
  return item.id !== hovered.id;
4157
- }); // 선택된 항목만 그리기 (hover된 항목은 Top Layer에서 처리)
4143
+ }) : selectedItems; // 선택된 항목만 그리기 (hover된 항목은 Top Layer에서 처리)
4158
4144
 
4159
4145
  renderEvent({
4160
4146
  ctx: ctx,
4161
4147
  hoveredItem: null,
4162
4148
  selectedItem: selectedItemRef.current,
4163
4149
  selectedItems: selectedItemsWithoutHovered,
4164
- topOnHover: topOnHover,
4150
+ topOnHover: true,
4165
4151
  utils: renderUtils
4166
4152
  });
4167
- } else if (topOnHover && hovered) {
4168
- renderEvent({
4169
- ctx: ctx,
4170
- hoveredItem: null,
4171
- selectedItem: selectedItemRef.current,
4172
- selectedItems: selectedItems.filter(function (item) {
4173
- return item.id !== hovered.id;
4174
- }),
4175
- topOnHover: topOnHover,
4176
- utils: renderUtils
4177
- });
4178
-
4179
- if (!enableViewportCullingRef.current || isInViewport$1(hovered)) {
4180
- var hoveredIsSelected = selectedItems.some(function (item) {
4181
- return item.id === hovered.id;
4182
- });
4183
- var hoverSelectedItems = hoveredIsSelected ? [hovered] : [];
4184
- renderEvent({
4185
- ctx: ctx,
4186
- hoveredItem: hovered,
4187
- selectedItem: selectedItemRef.current,
4188
- selectedItems: hoverSelectedItems,
4189
- topOnHover: topOnHover,
4190
- utils: renderUtils
4191
- });
4192
- }
4193
4153
  } else {
4194
- // topOnHoverfalse일 때는 hover된 항목을 나중에 그리지 않음
4195
- // 하지만 hover 스타일은 적용해야 하므로, hover된 항목이 selectedItems 포함되어 있지 않으면 추가
4196
- // renderEvent 함수에 topOnHover 정보를 전달하여,
4197
- // renderEvent 함수 내부에서 topOnHover가 false일 때는 hover된 항목을 마지막에 그리지 않도록 함
4198
- var hoveredIsSelected = hovered ? selectedItems.some(function (item) {
4199
- return item.id === hovered.id;
4200
- }) : false;
4201
- var finalSelectedItems = hovered && !hoveredIsSelected && !topOnHover ? __spreadArray(__spreadArray([], selectedItems, true), [hovered], false) : selectedItems;
4154
+ // topStageZIndex없으면 hover된 항목을 selectedItems에 추가하지 않음 (성능 우선)
4155
+ // renderEvent 함수가 hoveredItem을 별도로 처리하므로, selectedItems 그대로 전달
4156
+ // 이렇게 하면 hover 변경 시 선택된 항목들을 다시 그리지 않고 hover된 항목만 업데이트됨
4202
4157
  renderEvent({
4203
4158
  ctx: ctx,
4204
4159
  hoveredItem: hovered,
4205
4160
  selectedItem: selectedItemRef.current,
4206
- selectedItems: finalSelectedItems,
4207
- topOnHover: topOnHover,
4161
+ selectedItems: selectedItems,
4162
+ topOnHover: false,
4208
4163
  utils: renderUtils
4209
4164
  });
4210
4165
  }
@@ -4220,7 +4175,7 @@ var CanvasMarkerLayer = function (props) {
4220
4175
  var doRenderTop = function () {
4221
4176
  var stage = topStageRef.current;
4222
4177
  var layer = topLayerRef.current;
4223
- if (!stage || !layer || topStageZIndex === undefined || !topOnHover) return;
4178
+ if (!stage || !layer || topStageZIndex === undefined) return;
4224
4179
  var hovered = hoveredItemRef.current;
4225
4180
  var shape = layer.findOne('.top-render-shape'); // hover된 항목이 없으면 shape 제거
4226
4181
 
@@ -4248,6 +4203,8 @@ var CanvasMarkerLayer = function (props) {
4248
4203
 
4249
4204
 
4250
4205
  shape.sceneFunc(function (konvaContext) {
4206
+ var _a;
4207
+
4251
4208
  var ctx = konvaContext;
4252
4209
  var currentHovered = hoveredItemRef.current; // hover된 항목이 없으면 아무것도 그리지 않음
4253
4210
 
@@ -4257,10 +4214,11 @@ var CanvasMarkerLayer = function (props) {
4257
4214
  return;
4258
4215
  }
4259
4216
 
4260
- var selectedItems = mapValuesToArray(selectedItemsMapRef.current);
4217
+ var selectedItems = mapValuesToArray(selectedItemsMapRef.current); // selectedItem이 있으면 hover된 항목이 선택되었는지 확인
4218
+
4261
4219
  var hoveredIsSelected = selectedItems.some(function (item) {
4262
4220
  return item.id === currentHovered.id;
4263
- }); // Top Layer에서는 hover된 마커만 hover 스타일로 그리기
4221
+ }) || ((_a = selectedItemRef.current) === null || _a === void 0 ? void 0 : _a.id) === currentHovered.id; // Top Layer에서는 hover된 마커만 hover 스타일로 그리기
4264
4222
  // renderEvent가 있으면: base는 그리지 않고 event만 그리기 (hover 스타일 적용)
4265
4223
  // renderEvent가 없으면: base를 hover 스타일로 그리기
4266
4224
 
@@ -4272,7 +4230,7 @@ var CanvasMarkerLayer = function (props) {
4272
4230
  hoveredItem: currentHovered,
4273
4231
  selectedItem: selectedItemRef.current,
4274
4232
  selectedItems: hoverSelectedItems,
4275
- topOnHover: topOnHover,
4233
+ topOnHover: true,
4276
4234
  utils: renderUtils
4277
4235
  });
4278
4236
  } else {
@@ -4303,13 +4261,13 @@ var CanvasMarkerLayer = function (props) {
4303
4261
  topContainerRef.current.style.transform = containerRef.current.style.transform || '';
4304
4262
  }
4305
4263
 
4306
- if (topStageZIndex !== undefined && topOnHover) {
4264
+ if (topStageZIndex !== undefined) {
4307
4265
  doRenderTop();
4308
4266
  }
4309
4267
  }; // 지도 이벤트 핸들러 생성
4310
4268
 
4311
4269
 
4312
- var _h = createMapEventHandlers({
4270
+ var _f = createMapEventHandlers({
4313
4271
  accumTranslateRef: accumTranslateRef,
4314
4272
  boundingBoxCacheRef: boundingBoxCacheRef,
4315
4273
  containerRef: containerRef,
@@ -4320,12 +4278,30 @@ var CanvasMarkerLayer = function (props) {
4320
4278
  prevCenterOffsetRef: prevCenterOffsetRef,
4321
4279
  renderAllImmediate: renderAllImmediate
4322
4280
  }),
4323
- handleIdle = _h.handleIdle,
4324
- handleZoomStart = _h.handleZoomStart,
4325
- handleZoomEnd = _h.handleZoomEnd,
4326
- handleCenterChanged = _h.handleCenterChanged,
4327
- handleDragStartShared = _h.handleDragStart,
4328
- handleDragEndShared = _h.handleDragEnd;
4281
+ handleIdleShared = _f.handleIdle,
4282
+ handleZoomStart = _f.handleZoomStart,
4283
+ handleZoomEnd = _f.handleZoomEnd,
4284
+ handleCenterChangedShared = _f.handleCenterChanged,
4285
+ handleDragStartShared = _f.handleDragStart,
4286
+ handleDragEndShared = _f.handleDragEnd; // handleIdle 래핑: topStage transform 제거 추가
4287
+
4288
+
4289
+ var handleIdle = function () {
4290
+ handleIdleShared(); // 드래그 완료 시 topStage의 transform도 제거 (메인 stage와 동기화)
4291
+
4292
+ if (topStageZIndex !== undefined && topContainerRef.current) {
4293
+ topContainerRef.current.style.transform = '';
4294
+ }
4295
+ }; // handleCenterChanged 래핑: topStage transform 동기화 추가
4296
+
4297
+
4298
+ var handleCenterChanged = function () {
4299
+ handleCenterChangedShared(); // 드래그 중 메인 stage의 transform을 topStage에도 동기화 (반대 방향 이동 방지)
4300
+
4301
+ if (topStageZIndex !== undefined && topContainerRef.current && containerRef.current) {
4302
+ topContainerRef.current.style.transform = containerRef.current.style.transform || '';
4303
+ }
4304
+ };
4329
4305
 
4330
4306
  var handleDragStart = function () {
4331
4307
  handleDragStartShared(); // 드래그 시작 시점의 hover 상태 저장
@@ -4353,8 +4329,8 @@ var CanvasMarkerLayer = function (props) {
4353
4329
 
4354
4330
 
4355
4331
  var findData = function (offset) {
4356
- // topOnHover 옵션이 켜져 있으면 hover된 항목을 최우선으로 확인
4357
- if (topOnHover && hoveredItemRef.current) {
4332
+ // topStageZIndex가 설정되어 있으면 hover된 항목을 최우선으로 확인
4333
+ if (topStageZIndex !== undefined && hoveredItemRef.current) {
4358
4334
  var hovered = hoveredItemRef.current;
4359
4335
 
4360
4336
  if (isPointInMarkerData(offset, hovered, getOrComputeMarkerOffset)) {
@@ -4391,57 +4367,40 @@ var CanvasMarkerLayer = function (props) {
4391
4367
  controller.setMapCursor(hoveredData ? 'pointer' : 'grab');
4392
4368
  }
4393
4369
 
4394
- if (topStageZIndex !== undefined && topOnHover) {
4395
- // topStageZIndex가 설정되고 topOnHover가 true인 경우 Top Layer에서 hover된 항목 렌더링
4396
- // base 레이어와 event 레이어도 업데이트 (hover 항목 제외)
4397
- doRenderBase();
4370
+ if (topStageZIndex !== undefined) {
4371
+ // topStageZIndex가 설정된 경우 Top Layer에서 hover된 항목 렌더링
4372
+ // Base Layer는 hover 상태 변경 시 재렌더링 불필요 (sceneFunc 내에서 hover 항목 제외 처리)
4373
+ // Event Layer는 선택된 항목만 렌더링하므로 업데이트 필요
4398
4374
  doRenderEvent();
4399
4375
  doRenderTop();
4400
4376
  } else if (renderEvent) {
4401
- // renderEvent가 있을 때는 Event Layer 업데이트
4402
- // topOnHoverfalse일 때는 Base Layer에서도 hover 스타일을 적용해야 하므로 Base Layer도 업데이트
4403
- if (!topOnHover) {
4404
- doRenderBase();
4405
- }
4406
-
4377
+ // renderEvent가 있을 때는 Event Layer 업데이트
4378
+ // topStageZIndex없으면 Base Layer 정적이므로 재렌더링 불필요 (성능 우선)
4379
+ // hover 효과는 Event Layer에서만 처리하면 됨
4407
4380
  doRenderEvent();
4408
- } else if (topOnHover) {
4409
- doRenderBase();
4410
4381
  }
4411
- }; // 클릭 처리: 선택 상태 업데이트
4382
+ }; // 클릭 처리: 선택 상태 업데이트 (단일 선택만 지원)
4412
4383
 
4413
4384
 
4414
4385
  var handleLocalClick = function (clickedData) {
4415
- if (enableMultiSelect) {
4416
- var newSelected = new Set(selectedIdsRef.current);
4386
+ var newSelected = new Set();
4417
4387
 
4418
- if (newSelected.has(clickedData.id)) {
4419
- newSelected.delete(clickedData.id);
4420
- selectedItemsMapRef.current.delete(clickedData.id);
4421
- } else {
4422
- newSelected.add(clickedData.id);
4423
- selectedItemsMapRef.current.set(clickedData.id, clickedData);
4424
- }
4388
+ if (!selectedIdsRef.current.has(clickedData.id)) {
4389
+ newSelected.add(clickedData.id);
4390
+ selectedItemsMapRef.current.clear();
4391
+ selectedItemsMapRef.current.set(clickedData.id, clickedData); // externalSelectedItem이 있을 때를 대비해 selectedItemRef도 업데이트
4425
4392
 
4426
- selectedIdsRef.current = newSelected;
4393
+ selectedItemRef.current = clickedData;
4427
4394
  } else {
4428
- var newSelected = new Set();
4429
-
4430
- if (!selectedIdsRef.current.has(clickedData.id)) {
4431
- newSelected.add(clickedData.id);
4432
- selectedItemsMapRef.current.clear();
4433
- selectedItemsMapRef.current.set(clickedData.id, clickedData);
4434
- } else {
4435
- selectedItemsMapRef.current.clear();
4436
- }
4437
-
4438
- selectedIdsRef.current = newSelected;
4395
+ selectedItemsMapRef.current.clear();
4396
+ selectedItemRef.current = null;
4439
4397
  }
4440
4398
 
4441
- doRenderBase();
4399
+ selectedIdsRef.current = newSelected; // 선택 상태 변경은 Event Layer에서만 처리 (Base Layer는 정적이므로 재렌더링 불필요)
4400
+
4442
4401
  doRenderEvent();
4443
4402
 
4444
- if (topStageZIndex !== undefined && topOnHover) {
4403
+ if (topStageZIndex !== undefined) {
4445
4404
  doRenderTop();
4446
4405
  }
4447
4406
  }; // 클릭 이벤트 핸들러
@@ -4505,18 +4464,15 @@ var CanvasMarkerLayer = function (props) {
4505
4464
  hoveredItemRef.current = null;
4506
4465
  controller.setMapCursor('grab');
4507
4466
 
4508
- if (topStageZIndex !== undefined && topOnHover) {
4509
- // base 레이어와 event 레이어도 업데이트 (hover 항목 다시 표시)
4510
- doRenderBase();
4467
+ if (topStageZIndex !== undefined) {
4468
+ // Base Layer는 hover 상태 변경 시 재렌더링 불필요 (sceneFunc 내에서 hover 항목 제외 처리)
4469
+ // Event Layer는 선택된 항목만 렌더링하므로 업데이트 필요
4511
4470
  doRenderEvent();
4512
4471
  doRenderTop();
4513
4472
  } else if (renderEvent) {
4514
- // renderEvent가 있을 때는 Event Layer 업데이트
4515
- // topOnHoverfalse일 때는 Base Layer에서도 hover 스타일을 제거해야 하므로 Base Layer도 업데이트
4516
- if (!topOnHover) {
4517
- doRenderBase();
4518
- }
4519
-
4473
+ // renderEvent가 있을 때는 Event Layer 업데이트
4474
+ // topStageZIndex없으면 Base Layer 정적이므로 재렌더링 불필요 (성능 우선)
4475
+ // hover 효과 제거는 Event Layer에서만 처리하면 됨
4520
4476
  doRenderEvent();
4521
4477
  }
4522
4478
 
@@ -4525,9 +4481,9 @@ var CanvasMarkerLayer = function (props) {
4525
4481
 
4526
4482
 
4527
4483
  useEffect(function () {
4528
- divElement.style.width = 'fit-content'; // Top Layer용 div도 초기화 (topStageZIndex가 설정되고 topOnHover가 true인 경우)
4484
+ divElement.style.width = 'fit-content'; // Top Layer용 div도 초기화 (topStageZIndex가 설정된 경우)
4529
4485
 
4530
- if (topStageZIndex !== undefined && topOnHover) {
4486
+ if (topStageZIndex !== undefined) {
4531
4487
  topDivElement.style.width = 'fit-content';
4532
4488
  }
4533
4489
 
@@ -4713,10 +4669,10 @@ var CanvasMarkerLayer = function (props) {
4713
4669
 
4714
4670
  renderAllImmediate();
4715
4671
  }
4716
- }, [enableViewportCulling]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정되고 topOnHover가 true인 경우)
4672
+ }, [enableViewportCulling]); // Top Layer용 별도 캔버스 DOM 생성 (topStageZIndex가 설정된 경우)
4717
4673
 
4718
4674
  useEffect(function () {
4719
- if (topStageZIndex === undefined || !topOnHover) return;
4675
+ if (topStageZIndex === undefined) return;
4720
4676
  if (!topContainerRef.current) return;
4721
4677
  var mapDiv = controller.mapDivElement; // Top Layer용 div 요소 설정
4722
4678
 
@@ -4785,13 +4741,14 @@ var CanvasMarkerLayer = function (props) {
4785
4741
 
4786
4742
 
4787
4743
  var handleTopIdle = function () {
4788
- // topMarker의 position을 메인 marker와 동일하게 업데이트
4744
+ // 드래그 완료 후 topMarker의 position을 메인 marker와 동일하게 업데이트
4789
4745
  updateTopMarkerPosition(); // topStage 크기 업데이트
4790
4746
 
4791
4747
  if (topStageRef.current) {
4792
4748
  topStageRef.current.width(mapDiv.offsetWidth);
4793
4749
  topStageRef.current.height(mapDiv.offsetHeight);
4794
- } // 메인 stage의 transform topStage에도 동기화
4750
+ } // 드래그 완료 transform handleIdle에서 제거되므로 여기서는 동기화만
4751
+ // (handleIdle이 먼저 실행되어 transform을 제거한 후, 여기서 position 업데이트)
4795
4752
 
4796
4753
 
4797
4754
  if (topContainerRef.current && containerRef.current) {
@@ -4820,13 +4777,18 @@ var CanvasMarkerLayer = function (props) {
4820
4777
  };
4821
4778
 
4822
4779
  var handleTopCenterChanged = function () {
4823
- // topMarker의 position 메인 marker와 동일하게 업데이트
4824
- updateTopMarkerPosition(); // topStage 크기 업데이트
4780
+ // 드래그 중에는 transform만 동기화 (position 업데이트는 드래그 완료 후에만)
4781
+ // 드래그 중에 position을 업데이트하면 transform과 충돌하여 반대 방향으로 이동하는 버그 발생
4782
+ if (!draggingRef.current) {
4783
+ // 드래그가 아닐 때만 topMarker의 position을 업데이트
4784
+ updateTopMarkerPosition();
4785
+ } // topStage 크기 업데이트
4786
+
4825
4787
 
4826
4788
  if (topStageRef.current) {
4827
4789
  topStageRef.current.width(mapDiv.offsetWidth);
4828
4790
  topStageRef.current.height(mapDiv.offsetHeight);
4829
- } // 메인 stage의 transform을 topStage에도 동기화
4791
+ } // 메인 stage의 transform을 topStage에도 동기화 (드래그 중 필수)
4830
4792
 
4831
4793
 
4832
4794
  if (topContainerRef.current && containerRef.current) {
@@ -4868,25 +4830,39 @@ var CanvasMarkerLayer = function (props) {
4868
4830
  }, [topStageZIndex, renderEvent, options]); // 외부 selectedItems 동기화
4869
4831
 
4870
4832
  useEffect(function () {
4871
- if (!stageRef.current) return;
4872
- syncExternalSelectedItems(externalSelectedItems, selectedIdsRef, selectedItemsMapRef);
4873
- doRenderBase();
4833
+ if (!stageRef.current) return; // externalSelectedItems가 있으면 selectedItem은 무시 (공존 불가)
4834
+
4835
+ if (externalSelectedItems !== undefined) {
4836
+ selectedItemRef.current = undefined;
4837
+ syncExternalSelectedItems(externalSelectedItems, selectedIdsRef, selectedItemsMapRef);
4838
+ } // 선택 상태 변경은 Event Layer에서만 처리 (Base Layer는 정적이므로 재렌더링 불필요)
4839
+
4840
+
4874
4841
  doRenderEvent();
4875
4842
 
4876
- if (topStageZIndex !== undefined && topOnHover) {
4843
+ if (topStageZIndex !== undefined) {
4877
4844
  doRenderTop();
4878
4845
  }
4879
4846
  }, [externalSelectedItems]); // 외부 selectedItem 변경 시 Event Layer 리렌더링
4880
4847
 
4881
4848
  useEffect(function () {
4882
- if (!stageRef.current) return;
4883
- selectedItemRef.current = externalSelectedItem;
4849
+ if (!stageRef.current) return; // externalSelectedItem이 있으면 selectedItems는 무시 (공존 불가)
4850
+
4851
+ if (externalSelectedItem !== undefined) {
4852
+ selectedIdsRef.current.clear();
4853
+ selectedItemsMapRef.current.clear();
4854
+ selectedItemRef.current = externalSelectedItem;
4855
+ } else if (externalSelectedItems === undefined) {
4856
+ // 둘 다 없으면 selectedItemRef만 업데이트 (내부 클릭으로 선택한 항목은 유지)
4857
+ selectedItemRef.current = externalSelectedItem;
4858
+ }
4859
+
4884
4860
  doRenderEvent();
4885
4861
 
4886
- if (topStageZIndex !== undefined && topOnHover) {
4862
+ if (topStageZIndex !== undefined) {
4887
4863
  doRenderTop();
4888
4864
  }
4889
- }, [externalSelectedItem]); // 데이터 변경 시 렌더링 (캐시 정리 및 선택 상태 동기화)
4865
+ }, [externalSelectedItem, externalSelectedItems]); // 데이터 변경 시 렌더링 (캐시 정리 및 선택 상태 동기화)
4890
4866
 
4891
4867
  useEffect(function () {
4892
4868
  if (!stageRef.current) return;