evui 3.4.155 → 3.4.157

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/evui.umd.js CHANGED
@@ -371,6 +371,81 @@ if(content.locals) module.exports = content.locals;
371
371
  var add = __webpack_require__("499e").default
372
372
  var update = add("5a9ac64a", content, true, {"sourceMap":false,"shadowMode":false});
373
373
 
374
+ /***/ }),
375
+
376
+ /***/ "10d1":
377
+ /***/ (function(module, exports, __webpack_require__) {
378
+
379
+ "use strict";
380
+
381
+ var global = __webpack_require__("da84");
382
+ var redefineAll = __webpack_require__("e2cc");
383
+ var InternalMetadataModule = __webpack_require__("f183");
384
+ var collection = __webpack_require__("6d61");
385
+ var collectionWeak = __webpack_require__("acac");
386
+ var isObject = __webpack_require__("861d");
387
+ var enforceIternalState = __webpack_require__("69f3").enforce;
388
+ var NATIVE_WEAK_MAP = __webpack_require__("7f9a");
389
+
390
+ var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
391
+ var isExtensible = Object.isExtensible;
392
+ var InternalWeakMap;
393
+
394
+ var wrapper = function (init) {
395
+ return function WeakMap() {
396
+ return init(this, arguments.length ? arguments[0] : undefined);
397
+ };
398
+ };
399
+
400
+ // `WeakMap` constructor
401
+ // https://tc39.github.io/ecma262/#sec-weakmap-constructor
402
+ var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);
403
+
404
+ // IE11 WeakMap frozen keys fix
405
+ // We can't use feature detection because it crash some old IE builds
406
+ // https://github.com/zloirock/core-js/issues/485
407
+ if (NATIVE_WEAK_MAP && IS_IE11) {
408
+ InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
409
+ InternalMetadataModule.REQUIRED = true;
410
+ var WeakMapPrototype = $WeakMap.prototype;
411
+ var nativeDelete = WeakMapPrototype['delete'];
412
+ var nativeHas = WeakMapPrototype.has;
413
+ var nativeGet = WeakMapPrototype.get;
414
+ var nativeSet = WeakMapPrototype.set;
415
+ redefineAll(WeakMapPrototype, {
416
+ 'delete': function (key) {
417
+ if (isObject(key) && !isExtensible(key)) {
418
+ var state = enforceIternalState(this);
419
+ if (!state.frozen) state.frozen = new InternalWeakMap();
420
+ return nativeDelete.call(this, key) || state.frozen['delete'](key);
421
+ } return nativeDelete.call(this, key);
422
+ },
423
+ has: function has(key) {
424
+ if (isObject(key) && !isExtensible(key)) {
425
+ var state = enforceIternalState(this);
426
+ if (!state.frozen) state.frozen = new InternalWeakMap();
427
+ return nativeHas.call(this, key) || state.frozen.has(key);
428
+ } return nativeHas.call(this, key);
429
+ },
430
+ get: function get(key) {
431
+ if (isObject(key) && !isExtensible(key)) {
432
+ var state = enforceIternalState(this);
433
+ if (!state.frozen) state.frozen = new InternalWeakMap();
434
+ return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);
435
+ } return nativeGet.call(this, key);
436
+ },
437
+ set: function set(key, value) {
438
+ if (isObject(key) && !isExtensible(key)) {
439
+ var state = enforceIternalState(this);
440
+ if (!state.frozen) state.frozen = new InternalWeakMap();
441
+ nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);
442
+ } else nativeSet.call(this, key, value);
443
+ return this;
444
+ }
445
+ });
446
+ }
447
+
448
+
374
449
  /***/ }),
375
450
 
376
451
  /***/ "1148":
@@ -11244,7 +11319,7 @@ $({ target: 'Number', stat: true }, {
11244
11319
  /***/ "9224":
11245
11320
  /***/ (function(module) {
11246
11321
 
11247
- module.exports = JSON.parse("{\"a\":\"3.4.155\"}");
11322
+ module.exports = JSON.parse("{\"a\":\"3.4.157\"}");
11248
11323
 
11249
11324
  /***/ }),
11250
11325
 
@@ -13085,6 +13160,135 @@ $({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {
13085
13160
  });
13086
13161
 
13087
13162
 
13163
+ /***/ }),
13164
+
13165
+ /***/ "acac":
13166
+ /***/ (function(module, exports, __webpack_require__) {
13167
+
13168
+ "use strict";
13169
+
13170
+ var redefineAll = __webpack_require__("e2cc");
13171
+ var getWeakData = __webpack_require__("f183").getWeakData;
13172
+ var anObject = __webpack_require__("825a");
13173
+ var isObject = __webpack_require__("861d");
13174
+ var anInstance = __webpack_require__("19aa");
13175
+ var iterate = __webpack_require__("2266");
13176
+ var ArrayIterationModule = __webpack_require__("b727");
13177
+ var $has = __webpack_require__("5135");
13178
+ var InternalStateModule = __webpack_require__("69f3");
13179
+
13180
+ var setInternalState = InternalStateModule.set;
13181
+ var internalStateGetterFor = InternalStateModule.getterFor;
13182
+ var find = ArrayIterationModule.find;
13183
+ var findIndex = ArrayIterationModule.findIndex;
13184
+ var id = 0;
13185
+
13186
+ // fallback for uncaught frozen keys
13187
+ var uncaughtFrozenStore = function (store) {
13188
+ return store.frozen || (store.frozen = new UncaughtFrozenStore());
13189
+ };
13190
+
13191
+ var UncaughtFrozenStore = function () {
13192
+ this.entries = [];
13193
+ };
13194
+
13195
+ var findUncaughtFrozen = function (store, key) {
13196
+ return find(store.entries, function (it) {
13197
+ return it[0] === key;
13198
+ });
13199
+ };
13200
+
13201
+ UncaughtFrozenStore.prototype = {
13202
+ get: function (key) {
13203
+ var entry = findUncaughtFrozen(this, key);
13204
+ if (entry) return entry[1];
13205
+ },
13206
+ has: function (key) {
13207
+ return !!findUncaughtFrozen(this, key);
13208
+ },
13209
+ set: function (key, value) {
13210
+ var entry = findUncaughtFrozen(this, key);
13211
+ if (entry) entry[1] = value;
13212
+ else this.entries.push([key, value]);
13213
+ },
13214
+ 'delete': function (key) {
13215
+ var index = findIndex(this.entries, function (it) {
13216
+ return it[0] === key;
13217
+ });
13218
+ if (~index) this.entries.splice(index, 1);
13219
+ return !!~index;
13220
+ }
13221
+ };
13222
+
13223
+ module.exports = {
13224
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
13225
+ var C = wrapper(function (that, iterable) {
13226
+ anInstance(that, C, CONSTRUCTOR_NAME);
13227
+ setInternalState(that, {
13228
+ type: CONSTRUCTOR_NAME,
13229
+ id: id++,
13230
+ frozen: undefined
13231
+ });
13232
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
13233
+ });
13234
+
13235
+ var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
13236
+
13237
+ var define = function (that, key, value) {
13238
+ var state = getInternalState(that);
13239
+ var data = getWeakData(anObject(key), true);
13240
+ if (data === true) uncaughtFrozenStore(state).set(key, value);
13241
+ else data[state.id] = value;
13242
+ return that;
13243
+ };
13244
+
13245
+ redefineAll(C.prototype, {
13246
+ // 23.3.3.2 WeakMap.prototype.delete(key)
13247
+ // 23.4.3.3 WeakSet.prototype.delete(value)
13248
+ 'delete': function (key) {
13249
+ var state = getInternalState(this);
13250
+ if (!isObject(key)) return false;
13251
+ var data = getWeakData(key);
13252
+ if (data === true) return uncaughtFrozenStore(state)['delete'](key);
13253
+ return data && $has(data, state.id) && delete data[state.id];
13254
+ },
13255
+ // 23.3.3.4 WeakMap.prototype.has(key)
13256
+ // 23.4.3.4 WeakSet.prototype.has(value)
13257
+ has: function has(key) {
13258
+ var state = getInternalState(this);
13259
+ if (!isObject(key)) return false;
13260
+ var data = getWeakData(key);
13261
+ if (data === true) return uncaughtFrozenStore(state).has(key);
13262
+ return data && $has(data, state.id);
13263
+ }
13264
+ });
13265
+
13266
+ redefineAll(C.prototype, IS_MAP ? {
13267
+ // 23.3.3.3 WeakMap.prototype.get(key)
13268
+ get: function get(key) {
13269
+ var state = getInternalState(this);
13270
+ if (isObject(key)) {
13271
+ var data = getWeakData(key);
13272
+ if (data === true) return uncaughtFrozenStore(state).get(key);
13273
+ return data ? data[state.id] : undefined;
13274
+ }
13275
+ },
13276
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
13277
+ set: function set(key, value) {
13278
+ return define(this, key, value);
13279
+ }
13280
+ } : {
13281
+ // 23.4.3.1 WeakSet.prototype.add(value)
13282
+ add: function add(value) {
13283
+ return define(this, value, true);
13284
+ }
13285
+ });
13286
+
13287
+ return C;
13288
+ }
13289
+ };
13290
+
13291
+
13088
13292
  /***/ }),
13089
13293
 
13090
13294
  /***/ "ad6d":
@@ -22283,9 +22487,9 @@ var _Set_Set = _getNative(_root["a" /* default */], 'Set');
22283
22487
 
22284
22488
 
22285
22489
  /* Built-in method references that are verified to be native. */
22286
- var WeakMap = _getNative(_root["a" /* default */], 'WeakMap');
22490
+ var _WeakMap_WeakMap = _getNative(_root["a" /* default */], 'WeakMap');
22287
22491
 
22288
- /* harmony default export */ var _WeakMap = (WeakMap);
22492
+ /* harmony default export */ var _WeakMap = (_WeakMap_WeakMap);
22289
22493
 
22290
22494
  // CONCATENATED MODULE: ./node_modules/lodash-es/_getTag.js
22291
22495
 
@@ -38946,6 +39150,30 @@ var textMeasureCtx = textMeasureCanvas.getContext('2d');
38946
39150
  }
38947
39151
 
38948
39152
  return "".concat(color, "80");
39153
+ },
39154
+
39155
+ /**
39156
+ * 클릭 좌표(cx, cy)에서 데이터 포인트까지의 거리²를 반환한다.
39157
+ * w/h 가 있으면 박스 외벽까지의 거리(내부면 0), 없으면 포인트까지의 유클리드 거리².
39158
+ * @param {object} data - 데이터 포인트 (xp, yp, w?, h?)
39159
+ * @param {number} cx - 클릭 x 좌표
39160
+ * @param {number} cy - 클릭 y 좌표
39161
+ * @returns {number}
39162
+ */
39163
+ calcBoxDistance: function calcBoxDistance(data, cx, cy) {
39164
+ if (data.w !== null && data.w !== undefined && data.h !== null && data.h !== undefined) {
39165
+ var sx = data.xp;
39166
+ var sy = data.yp;
39167
+ var xMin = Math.min(sx, sx + data.w);
39168
+ var xMax = Math.max(sx, sx + data.w);
39169
+ var yMin = Math.min(sy, sy + data.h);
39170
+ var yMax = Math.max(sy, sy + data.h);
39171
+ var dx = Math.max(0, xMin - cx, cx - xMax);
39172
+ var dy = Math.max(0, yMin - cy, cy - yMax);
39173
+ return dx * dx + dy * dy;
39174
+ }
39175
+
39176
+ return Math.pow(data.xp - cx, 2) + Math.pow(data.yp - cy, 2);
38949
39177
  }
38950
39178
  });
38951
39179
  // CONCATENATED MODULE: ./src/components/chart/model/model.store.js
@@ -38972,6 +39200,8 @@ var textMeasureCtx = textMeasureCanvas.getContext('2d');
38972
39200
 
38973
39201
 
38974
39202
 
39203
+
39204
+
38975
39205
 
38976
39206
 
38977
39207
 
@@ -39911,7 +40141,7 @@ var modules = {
39911
40141
  return null;
39912
40142
  }
39913
40143
 
39914
- itemPosition = [this.getItemByPosition([dataInfo.xp, dataInfo.yp], useApproximate, dataIndex, true)];
40144
+ itemPosition = [this.getHitItemByPosition([dataInfo.xp, dataInfo.yp], useApproximate, dataIndex, true)];
39915
40145
  } else {
39916
40146
  var seriesList = Object.entries(this.seriesList);
39917
40147
  var firShowSeriesID;
@@ -39936,7 +40166,7 @@ var modules = {
39936
40166
  return null;
39937
40167
  }
39938
40168
 
39939
- return _this7.getItemByPosition([(_dataInfo$xp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.xp) !== null && _dataInfo$xp !== void 0 ? _dataInfo$xp : 0, (_dataInfo$yp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.yp) !== null && _dataInfo$yp !== void 0 ? _dataInfo$yp : 0], useApproximate, idx, true);
40169
+ return _this7.getHitItemByPosition([(_dataInfo$xp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.xp) !== null && _dataInfo$xp !== void 0 ? _dataInfo$xp : 0, (_dataInfo$yp = dataInfo === null || dataInfo === void 0 ? void 0 : dataInfo.yp) !== null && _dataInfo$yp !== void 0 ? _dataInfo$yp : 0], useApproximate, idx, true);
39940
40170
  });
39941
40171
  }
39942
40172
 
@@ -39960,30 +40190,110 @@ var modules = {
39960
40190
  },
39961
40191
 
39962
40192
  /**
39963
- * Find graph item by position x and y
40193
+ * Find the hit item at the given position (x, y).
40194
+ *
40195
+ * 선택 우선순위:
40196
+ * 1. directHit (bar 박스 내부 클릭) — 가장 가까운 것
40197
+ * 2. hit (line 포인트 근접 등) — 가장 가까운 것
40198
+ * 3. hit 없으면 클릭 좌표에 가장 가까운 시리즈로 fallback (distance 기반)
40199
+ *
39964
40200
  * @param {array} offset position x and y
39965
40201
  * @param {boolean} useApproximate if it's true. it'll look for closed item on mouse position
39966
40202
  * @param {number} dataIndex selected data index
39967
40203
  * @param {boolean} useSelectLabelOrItem used to display select label/item at tooltip location
40204
+ * @param {boolean} disableNullLabelSnap true 이면 all-null 라벨도 그대로 반환 (click/dblclick 용)
39968
40205
  *
39969
- * @returns {object} clicked item information
40206
+ * @returns {object} hit item information
39970
40207
  */
39971
- getItemByPosition: function getItemByPosition(offset) {
39972
- var _maxValue;
40208
+ getHitItemByPosition: function getHitItemByPosition(offset) {
40209
+ var _this8 = this,
40210
+ _ref4;
39973
40211
 
39974
40212
  var useApproximate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
39975
40213
  var dataIndex = arguments.length > 2 ? arguments[2] : undefined;
39976
40214
  var useSelectLabelOrItem = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
40215
+ var disableNullLabelSnap = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
39977
40216
  var seriesIDs = Object.keys(this.seriesList);
39978
40217
  var isHorizontal = !!this.options.horizontal;
39979
- var maxType = null;
39980
- var maxLabel = null;
39981
- var maxValuePos = null;
39982
- var maxValue = null;
39983
- var maxSeriesID = '';
40218
+
40219
+ var _offset = _slicedToArray(offset, 2),
40220
+ cx = _offset[0],
40221
+ cy = _offset[1]; // dataIndex 미지정 시 클릭 좌표에 가장 가까운 valid 라벨 인덱스 결정.
40222
+ // disableNullLabelSnap=true 이면 all-null 라벨도 후보로 인정.
40223
+
40224
+
40225
+ var resolvedDataIndex = dataIndex;
40226
+
40227
+ if (resolvedDataIndex === undefined && !useApproximate) {
40228
+ var refSeriesID = seriesIDs.find(function (sId) {
40229
+ var _s$data;
40230
+
40231
+ var s = _this8.seriesList[sId];
40232
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data = s.data) === null || _s$data === void 0 ? void 0 : _s$data.length) > 0;
40233
+ });
40234
+
40235
+ if (refSeriesID) {
40236
+ var refData = this.seriesList[refSeriesID].data;
40237
+ var clickPos = isHorizontal ? offset[1] : offset[0];
40238
+ var nearestDistance = Infinity;
40239
+ var nearestIndex = -1;
40240
+
40241
+ var _loop = function _loop(i) {
40242
+ var hasValidData = disableNullLabelSnap || seriesIDs.some(function (sId) {
40243
+ var _s$data2, _s$data2$i, _s$data3, _s$data3$i;
40244
+
40245
+ var s = _this8.seriesList[sId];
40246
+ return (s === null || s === void 0 ? void 0 : s.show) && ((_s$data2 = s.data) === null || _s$data2 === void 0 ? void 0 : (_s$data2$i = _s$data2[i]) === null || _s$data2$i === void 0 ? void 0 : _s$data2$i.o) !== null && ((_s$data3 = s.data) === null || _s$data3 === void 0 ? void 0 : (_s$data3$i = _s$data3[i]) === null || _s$data3$i === void 0 ? void 0 : _s$data3$i.o) !== undefined;
40247
+ });
40248
+ var p = refData[i];
40249
+
40250
+ if (hasValidData && p) {
40251
+ var labelPos;
40252
+
40253
+ if (isHorizontal) {
40254
+ labelPos = p.h ? p.yp + p.h / 2 : p.yp;
40255
+ } else {
40256
+ labelPos = p.w ? p.xp + p.w / 2 : p.xp;
40257
+ }
40258
+
40259
+ if (labelPos !== null && labelPos !== undefined) {
40260
+ var d = Math.abs(clickPos - labelPos);
40261
+
40262
+ if (d < nearestDistance) {
40263
+ nearestDistance = d;
40264
+ nearestIndex = i;
40265
+ }
40266
+ }
40267
+ }
40268
+ };
40269
+
40270
+ for (var i = 0; i < refData.length; i++) {
40271
+ _loop(i);
40272
+ }
40273
+
40274
+ if (nearestIndex !== -1) resolvedDataIndex = nearestIndex;
40275
+ }
40276
+ } // hit 기반 결과 (최우선)
40277
+
40278
+
40279
+ var hitType = null;
40280
+ var hitLabel = null;
40281
+ var hitValuePos = null;
40282
+ var hitValue = null;
40283
+ var hitSeriesID = '';
40284
+ var hitDataIndex = null;
40285
+ var hitDistance = Infinity;
40286
+ var hasDirectHit = false; // hit 없을 때 쓸 fallback — 값이 있는 시리즈 중 클릭 좌표에 가장 가까운 것.
40287
+
40288
+ var fallbackType = null;
40289
+ var fallbackLabel = null;
40290
+ var fallbackValuePos = null;
40291
+ var fallbackValue = null;
40292
+ var fallbackSeriesID = '';
40293
+ var fallbackDataIndex = null;
40294
+ var fallbackDistance = Infinity;
39984
40295
  var acc = 0;
39985
40296
  var useStack = false;
39986
- var maxIndex = null;
39987
40297
 
39988
40298
  for (var ix = 0; ix < seriesIDs.length; ix++) {
39989
40299
  var seriesID = seriesIDs[ix];
@@ -39991,18 +40301,19 @@ var modules = {
39991
40301
  var findFn = useApproximate ? series.findApproximateData : series.findGraphData;
39992
40302
 
39993
40303
  if (findFn) {
39994
- var item = findFn.call(series, offset, isHorizontal, dataIndex, useSelectLabelOrItem);
40304
+ var item = findFn.call(series, offset, isHorizontal, resolvedDataIndex, useSelectLabelOrItem);
39995
40305
  var data = item.data;
39996
40306
  var index = item.index;
39997
40307
 
39998
40308
  if (data) {
39999
40309
  if (helpers_util.isPieType(item.type)) {
40000
- maxLabel = seriesID;
40001
- maxSeriesID = seriesID;
40002
- maxValuePos = (data.ea - data.sa) / 2;
40003
- maxValue = data.o;
40004
- maxIndex = data.index;
40005
- maxType = item.type;
40310
+ // pie 차트는 hit detection 체계가 달라 기존 동작 유지 (단일 pie 시리즈가 일반적)
40311
+ hitType = item.type;
40312
+ hitLabel = seriesID;
40313
+ hitSeriesID = seriesID;
40314
+ hitValuePos = (data.ea - data.sa) / 2;
40315
+ hitValue = data.o;
40316
+ hitDataIndex = data.index;
40006
40317
  } else {
40007
40318
  var ldata = isHorizontal ? data.y : data.x;
40008
40319
  var lp = isHorizontal ? data.yp : data.xp;
@@ -40015,47 +40326,108 @@ var modules = {
40015
40326
  useStack = true;
40016
40327
  } else {
40017
40328
  acc += data.y;
40018
- }
40329
+ } // fallback 후보: 값이 있는 시리즈 중 거리가 가장 가까운 쪽.
40330
+ // 값이 null 인 시리즈는 제외.
40331
+
40332
+
40333
+ var hasMeaningfulValue = g !== null && g !== undefined && !Number.isNaN(g);
40334
+ var hasCoords = data.xp !== null && data.xp !== undefined && data.yp !== null && data.yp !== undefined;
40019
40335
 
40020
- if (maxType === 'bar' && useStack) {
40021
- if (item.hit) {
40022
- maxValue = g;
40023
- maxSeriesID = seriesID;
40024
- maxIndex = index;
40025
- maxLabel = ldata;
40026
- maxValuePos = lp;
40027
- maxType = series.type;
40336
+ if (hasMeaningfulValue && hasCoords) {
40337
+ var distance = helpers_util.calcBoxDistance(data, cx, cy);
40338
+
40339
+ if (fallbackSeriesID === '' || distance < fallbackDistance) {
40340
+ fallbackDistance = distance;
40341
+ fallbackType = series.type;
40342
+ fallbackLabel = ldata;
40343
+ fallbackValuePos = lp;
40344
+ fallbackValue = g;
40345
+ fallbackSeriesID = seriesID;
40346
+ fallbackDataIndex = index;
40347
+ }
40348
+ } else if (hasMeaningfulValue && fallbackSeriesID === '') {
40349
+ // 좌표 없는 예외 케이스 — 첫 후보로만 등록
40350
+ fallbackType = series.type;
40351
+ fallbackLabel = ldata;
40352
+ fallbackValuePos = lp;
40353
+ fallbackValue = g;
40354
+ fallbackSeriesID = seriesID;
40355
+ fallbackDataIndex = index;
40356
+ } // hit 기반 선택: item.hit이 true이고 유효한 좌표가 있을 때만 고려
40357
+
40358
+
40359
+ if (item.hit && data.xp !== undefined && data.yp !== undefined) {
40360
+ var _distance = Math.pow(data.xp - offset[0], 2) + Math.pow(data.yp - offset[1], 2);
40361
+
40362
+ if (item.directHit) {
40363
+ // 직접 박스 히트는 최우선. 여러 개이면 가장 가까운 것.
40364
+ if (!hasDirectHit || _distance < hitDistance) {
40365
+ hitDistance = _distance;
40366
+ hitType = series.type;
40367
+ hitLabel = ldata;
40368
+ hitValuePos = lp;
40369
+ hitValue = g;
40370
+ hitSeriesID = seriesID;
40371
+ hitDataIndex = index;
40372
+ }
40373
+
40374
+ hasDirectHit = true;
40375
+ } else if (!hasDirectHit) {
40376
+ // directHit가 없을 때만 일반 hit 거리 비교 참여
40377
+ // (라인 근접 히트가 박스 직접 히트를 이기지 못하도록)
40378
+ if (_distance < hitDistance) {
40379
+ hitDistance = _distance;
40380
+ hitType = series.type;
40381
+ hitLabel = ldata;
40382
+ hitValuePos = lp;
40383
+ hitValue = g;
40384
+ hitSeriesID = seriesID;
40385
+ hitDataIndex = index;
40386
+ }
40028
40387
  }
40029
- } else if (maxValue === null || maxValue <= g) {
40030
- maxValue = g;
40031
- maxSeriesID = seriesID;
40032
- maxLabel = ldata;
40033
- maxValuePos = lp;
40034
- maxIndex = index;
40035
- maxType = series.type;
40036
40388
  }
40037
40389
  }
40038
40390
  }
40039
40391
  }
40040
40392
  }
40393
+ } // all-null 라벨인 경우 label/dataIndex 만 채워 반환 (sId='', value=0).
40394
+
40395
+
40396
+ if (disableNullLabelSnap && hitSeriesID === '' && fallbackSeriesID === '' && resolvedDataIndex !== undefined && resolvedDataIndex >= 0) {
40397
+ var _this$seriesList$_ref;
40398
+
40399
+ var _refSeriesID = seriesIDs.find(function (sId) {
40400
+ var _s$data4;
40401
+
40402
+ var s = _this8.seriesList[sId];
40403
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data4 = s.data) === null || _s$data4 === void 0 ? void 0 : _s$data4.length) > 0;
40404
+ });
40405
+
40406
+ var refPoint = _refSeriesID ? (_this$seriesList$_ref = this.seriesList[_refSeriesID].data) === null || _this$seriesList$_ref === void 0 ? void 0 : _this$seriesList$_ref[resolvedDataIndex] : null;
40407
+
40408
+ if (refPoint) {
40409
+ fallbackLabel = isHorizontal ? refPoint.y : refPoint.x;
40410
+ fallbackDataIndex = resolvedDataIndex;
40411
+ }
40041
40412
  }
40042
40413
 
40414
+ var hasHit = hitSeriesID !== '';
40043
40415
  return {
40044
- type: maxType,
40045
- label: maxLabel,
40046
- pos: maxValuePos,
40047
- value: (_maxValue = maxValue) !== null && _maxValue !== void 0 ? _maxValue : 0,
40048
- sId: maxSeriesID,
40416
+ type: hasHit ? hitType : fallbackType,
40417
+ label: hasHit ? hitLabel : fallbackLabel,
40418
+ pos: hasHit ? hitValuePos : fallbackValuePos,
40419
+ value: (_ref4 = hasHit ? hitValue : fallbackValue) !== null && _ref4 !== void 0 ? _ref4 : 0,
40420
+ sId: hasHit ? hitSeriesID : fallbackSeriesID,
40049
40421
  acc: acc,
40050
40422
  useStack: useStack,
40051
- maxIndex: maxIndex
40423
+ dataIndex: hasHit ? hitDataIndex : fallbackDataIndex
40052
40424
  };
40053
40425
  },
40054
40426
 
40055
40427
  /**
40056
40428
  * @typedef {Object} LabelInfoResult
40057
40429
  * @property {number} labelIndex - 선택된 라벨의 인덱스
40058
- * @property {object} hitInfo - 해당 위치에서의 히트 정보 (getItemByPosition 반환값)
40430
+ * @property {object} hitInfo - 해당 위치에서의 히트 정보 (getHitItemByPosition 반환값)
40059
40431
  */
40060
40432
 
40061
40433
  /**
@@ -40068,9 +40440,9 @@ var modules = {
40068
40440
  getLabelInfoByPosition: function getLabelInfoByPosition(offset, targetAxis) {
40069
40441
  var _Object$values$sort$, _Object$values$sort$2, _scrollbarOpt, _scale, _scale$labels, _scale3, _scale3$labels;
40070
40442
 
40071
- var _offset = _slicedToArray(offset, 2),
40072
- x = _offset[0],
40073
- y = _offset[1];
40443
+ var _offset2 = _slicedToArray(offset, 2),
40444
+ x = _offset2[0],
40445
+ y = _offset2[1];
40074
40446
 
40075
40447
  var aPos = {
40076
40448
  x1: this.chartRect.x1 + this.labelOffset.left,
@@ -40080,9 +40452,9 @@ var modules = {
40080
40452
  };
40081
40453
  var seriesList = this.data.series;
40082
40454
  var pointSize = (_Object$values$sort$ = (_Object$values$sort$2 = Object.values(seriesList).sort(function (a, b) {
40083
- var _ref4, _b$pointSize;
40455
+ var _ref5, _b$pointSize;
40084
40456
 
40085
- return (_ref4 = (_b$pointSize = b.pointSize) !== null && _b$pointSize !== void 0 ? _b$pointSize : 0 - a.pointSize) !== null && _ref4 !== void 0 ? _ref4 : 0;
40457
+ return (_ref5 = (_b$pointSize = b.pointSize) !== null && _b$pointSize !== void 0 ? _b$pointSize : 0 - a.pointSize) !== null && _ref5 !== void 0 ? _ref5 : 0;
40086
40458
  })[0]) === null || _Object$values$sort$2 === void 0 ? void 0 : _Object$values$sort$2.pointSize) !== null && _Object$values$sort$ !== void 0 ? _Object$values$sort$ : 3; // default pointSize 3
40087
40459
 
40088
40460
  var _this$options = this.options,
@@ -40114,10 +40486,10 @@ var modules = {
40114
40486
  _scrollbarOpt2$interv = _scrollbarOpt2.interval,
40115
40487
  interval = _scrollbarOpt2$interv === void 0 ? 1 : _scrollbarOpt2$interv;
40116
40488
 
40117
- var _ref5 = range !== null && range !== void 0 ? range : [0, scale.labels.length],
40118
- _ref6 = _slicedToArray(_ref5, 2),
40119
- min = _ref6[0],
40120
- max = _ref6[1];
40489
+ var _ref6 = range !== null && range !== void 0 ? range : [0, scale.labels.length],
40490
+ _ref7 = _slicedToArray(_ref6, 2),
40491
+ min = _ref7[0],
40492
+ max = _ref7[1];
40121
40493
 
40122
40494
  var labelCount = Math.floor((+max - +min) / interval) + 1;
40123
40495
  var labelGap = (endPoint - startPoint) / labelCount;
@@ -40143,7 +40515,7 @@ var modules = {
40143
40515
 
40144
40516
  labelIndex = scale.labels.length > _index ? _index : -1;
40145
40517
  } else {
40146
- var _hitInfo$maxIndex;
40518
+ var _hitInfo$dataIndex;
40147
40519
 
40148
40520
  var offsetX;
40149
40521
  var dataIndex;
@@ -40158,8 +40530,8 @@ var modules = {
40158
40530
  offsetX = x;
40159
40531
  }
40160
40532
 
40161
- hitInfo = this.getItemByPosition([offsetX, y], selectLabel === null || selectLabel === void 0 ? void 0 : selectLabel.useApproximateValue, dataIndex, true);
40162
- labelIndex = (_hitInfo$maxIndex = hitInfo.maxIndex) !== null && _hitInfo$maxIndex !== void 0 ? _hitInfo$maxIndex : -1;
40533
+ hitInfo = this.getHitItemByPosition([offsetX, y], selectLabel === null || selectLabel === void 0 ? void 0 : selectLabel.useApproximateValue, dataIndex, true);
40534
+ labelIndex = (_hitInfo$dataIndex = hitInfo.dataIndex) !== null && _hitInfo$dataIndex !== void 0 ? _hitInfo$dataIndex : -1;
40163
40535
  }
40164
40536
 
40165
40537
  return {
@@ -40180,7 +40552,7 @@ var modules = {
40180
40552
  * @returns {MouseLabelValue} current mouse target label value
40181
40553
  */
40182
40554
  getCurMouseLabelVal: function getCurMouseLabelVal(targetAxis, offset, labelIndex) {
40183
- var _this8 = this;
40555
+ var _this9 = this;
40184
40556
 
40185
40557
  var _this$options2 = this.options,
40186
40558
  chartType = _this$options2.type,
@@ -40197,13 +40569,13 @@ var modules = {
40197
40569
  case 'bar':
40198
40570
  case 'line':
40199
40571
  {
40200
- result = horizontal && !isXAxis || !horizontal && isXAxis ? _this8.data.labels[labelIndex] : '';
40572
+ result = horizontal && !isXAxis || !horizontal && isXAxis ? _this9.data.labels[labelIndex] : '';
40201
40573
  break;
40202
40574
  }
40203
40575
 
40204
40576
  case 'heatMap':
40205
40577
  {
40206
- result = _this8.data.labels[targetAxisDirection][labelIndex];
40578
+ result = _this9.data.labels[targetAxisDirection][labelIndex];
40207
40579
  break;
40208
40580
  }
40209
40581
 
@@ -40217,19 +40589,19 @@ var modules = {
40217
40589
  var calLabelValUseMousePos = function calLabelValUseMousePos() {
40218
40590
  var result = '';
40219
40591
  var aPos = {
40220
- x1: _this8.chartRect.x1 + _this8.labelOffset.left,
40221
- x2: _this8.chartRect.x2 - _this8.labelOffset.right,
40222
- y1: _this8.chartRect.y1 + _this8.labelOffset.top,
40223
- y2: _this8.chartRect.y2 - _this8.labelOffset.bottom
40592
+ x1: _this9.chartRect.x1 + _this9.labelOffset.left,
40593
+ x2: _this9.chartRect.x2 - _this9.labelOffset.right,
40594
+ y1: _this9.chartRect.y1 + _this9.labelOffset.top,
40595
+ y2: _this9.chartRect.y2 - _this9.labelOffset.bottom
40224
40596
  };
40225
- var _this8$axesSteps$targ = _this8.axesSteps[targetAxisDirection][0],
40226
- steps = _this8$axesSteps$targ.steps,
40227
- labelValInterval = _this8$axesSteps$targ.interval,
40228
- graphMin = _this8$axesSteps$targ.graphMin;
40229
- var _this8$axesRange$targ = _this8.axesRange[targetAxisDirection][0].size,
40230
- labelWidth = _this8$axesRange$targ.width,
40231
- labelHeight = _this8$axesRange$targ.height;
40232
- var axes = isXAxis ? _this8.axesX : _this8.axesY;
40597
+ var _this9$axesSteps$targ = _this9.axesSteps[targetAxisDirection][0],
40598
+ steps = _this9$axesSteps$targ.steps,
40599
+ labelValInterval = _this9$axesSteps$targ.interval,
40600
+ graphMin = _this9$axesSteps$targ.graphMin;
40601
+ var _this9$axesRange$targ = _this9.axesRange[targetAxisDirection][0].size,
40602
+ labelWidth = _this9$axesRange$targ.width,
40603
+ labelHeight = _this9$axesRange$targ.height;
40604
+ var axes = isXAxis ? _this9.axesX : _this9.axesY;
40233
40605
  var axisStartPoint = aPos[axes[0].units.rectStart];
40234
40606
  var axisEndPoint = aPos[axes[0].units.rectEnd];
40235
40607
  var curMousePosInAxis = Math.abs(offset[isXAxis ? 0 : 1] - axisStartPoint);
@@ -40267,7 +40639,7 @@ var modules = {
40267
40639
  * @returns {object} min/max info for all of data
40268
40640
  */
40269
40641
  getStoreMinMax: function getStoreMinMax() {
40270
- var _this9 = this;
40642
+ var _this10 = this;
40271
40643
 
40272
40644
  var keys = Object.keys(this.seriesList);
40273
40645
  var isHorizontal = this.options.horizontal;
@@ -40285,7 +40657,7 @@ var modules = {
40285
40657
  if (keys.length) {
40286
40658
  return keys.reduce(function (acc, key) {
40287
40659
  var minmax = acc;
40288
- var series = _this9.seriesList[key];
40660
+ var series = _this10.seriesList[key];
40289
40661
  var smm = series.minMax;
40290
40662
  var axisX = series.xAxisIndex;
40291
40663
  var axisY = series.yAxisIndex;
@@ -42142,7 +42514,7 @@ var element_line_Line = /*#__PURE__*/function () {
42142
42514
  }, {
42143
42515
  key: "findGraphData",
42144
42516
  value: function findGraphData(offset, isHorizontal, dataIndex, useSelectLabelOrItem) {
42145
- var _item$data;
42517
+ var _this$pointSize, _item$data;
42146
42518
 
42147
42519
  var xp = offset[0];
42148
42520
  var yp = offset[1];
@@ -42154,7 +42526,23 @@ var element_line_Line = /*#__PURE__*/function () {
42154
42526
  var gdata = this.data.filter(function (data) {
42155
42527
  return !helpers_util.isNullOrUndefined(data.x);
42156
42528
  });
42157
- var isLinearInterpolation = this.useLinearInterpolation();
42529
+ var isLinearInterpolation = this.useLinearInterpolation(); // line 포인트 "정확 히트" 판정용 반경.
42530
+ // combo 차트에서 line 포인트 중심을 직격한 경우, 같은 좌표의 bar(directHit)보다
42531
+ // line이 우선되도록 item.directHit = true로 표시한다. 그 외(단순 Y축 근접)는 기존처럼 hit만.
42532
+ // 포인트 반지름에 기본 포인트 크기(LINE_OPTION.pointSize)만큼의 클릭 여유 마진을 더하고,
42533
+ // 시각적으로 하이라이트되는 포인트 반경(highlight.maxSize)을 최소 보장값으로 사용한다.
42534
+
42535
+ var directHitRadius = Math.max(((_this$pointSize = this.pointSize) !== null && _this$pointSize !== void 0 ? _this$pointSize : LINE_OPTION.pointSize) + LINE_OPTION.pointSize, LINE_OPTION.highlight.maxSize);
42536
+
42537
+ var isLinePointDirectHit = function isLinePointDirectHit(point) {
42538
+ if (!point || point.xp === undefined || point.yp === undefined) {
42539
+ return false;
42540
+ }
42541
+
42542
+ var dx = xp - point.xp;
42543
+ var dy = yp - point.yp;
42544
+ return dx * dx + dy * dy <= directHitRadius * directHitRadius;
42545
+ };
42158
42546
 
42159
42547
  if (gdata !== null && gdata !== void 0 && gdata.length) {
42160
42548
  if (typeof dataIndex === 'number' && this.show) {
@@ -42169,6 +42557,11 @@ var element_line_Line = /*#__PURE__*/function () {
42169
42557
  if (yDist <= directHitThreshold) {
42170
42558
  item.hit = true;
42171
42559
  }
42560
+
42561
+ if (isLinePointDirectHit(point)) {
42562
+ item.hit = true;
42563
+ item.directHit = true;
42564
+ }
42172
42565
  }
42173
42566
  } else if (typeof this.beforeFindItemIndex === 'number' && this.beforeFindItemIndex !== -1 && this.show && useSelectLabelOrItem) {
42174
42567
  item.data = gdata[this.beforeFindItemIndex];
@@ -42317,6 +42710,11 @@ var element_line_Line = /*#__PURE__*/function () {
42317
42710
  if (_yDist <= _directHitThreshold) {
42318
42711
  item.hit = true;
42319
42712
  }
42713
+
42714
+ if (isLinePointDirectHit(_point3)) {
42715
+ item.hit = true;
42716
+ item.directHit = true;
42717
+ }
42320
42718
  }
42321
42719
  }
42322
42720
  }
@@ -43257,7 +43655,10 @@ var element_bar_Bar = /*#__PURE__*/function () {
43257
43655
  if (barData[clampedIndex]) {
43258
43656
  item.data = barData[clampedIndex];
43259
43657
  item.index = clampedIndex;
43260
- item.hit = this.isPointInBar(offset, barData[clampedIndex]);
43658
+ item.hit = this.isPointInBar(offset, barData[clampedIndex]); // bar 박스 내부 클릭은 "직접 박스 히트"로 표시.
43659
+ // findHitItem에서 line 포인트 근접 히트보다 우선 선택되도록 하기 위함.
43660
+
43661
+ item.directHit = item.hit;
43261
43662
  }
43262
43663
 
43263
43664
  return item;
@@ -43314,7 +43715,9 @@ var element_bar_Bar = /*#__PURE__*/function () {
43314
43715
  if (inRange) {
43315
43716
  item.data = barData;
43316
43717
  item.index = barData.index;
43317
- item.hit = this.isPointInBar(offset, barData);
43718
+ item.hit = this.isPointInBar(offset, barData); // bar 박스 내부 클릭은 "직접 박스 히트"로 표시 (findHitItem 우선순위용).
43719
+
43720
+ item.directHit = item.hit;
43318
43721
  return item;
43319
43722
  }
43320
43723
 
@@ -46792,6 +47195,9 @@ var scale_logarithmic_LogarithmicScale = /*#__PURE__*/function (_Scale) {
46792
47195
  }(scale_scale);
46793
47196
 
46794
47197
  /* harmony default export */ var scale_logarithmic = (scale_logarithmic_LogarithmicScale);
47198
+ // EXTERNAL MODULE: ./node_modules/core-js/modules/es.weak-map.js
47199
+ var es_weak_map = __webpack_require__("10d1");
47200
+
46795
47201
  // CONCATENATED MODULE: ./src/components/chart/scale/scale.step.js
46796
47202
 
46797
47203
 
@@ -46811,6 +47217,16 @@ var scale_logarithmic_LogarithmicScale = /*#__PURE__*/function (_Scale) {
46811
47217
 
46812
47218
 
46813
47219
 
47220
+
47221
+
47222
+
47223
+
47224
+ /**
47225
+ * scrollbar 사용 시 스크롤마다 labels 전체를 재순회하지 않도록 결과를 캐시
47226
+ */
47227
+
47228
+ var stringMinMaxByLabels = new WeakMap();
47229
+
46814
47230
  var scale_step_StepScale = /*#__PURE__*/function (_Scale) {
46815
47231
  _inherits(StepScale, _Scale);
46816
47232
 
@@ -46826,21 +47242,43 @@ var scale_step_StepScale = /*#__PURE__*/function (_Scale) {
46826
47242
  return _this;
46827
47243
  }
46828
47244
  /**
46829
- * Calculate min/max value, label and size information for step scale
46830
- * @param {object} minMax min/max information (unused on step scale)
46831
- * @param {object} scrollbarOpt scroll bar option
46832
- * @param {object} chartRect chart size information
46833
- *
46834
- * @returns {object} min/max value and label
47245
+ * labels 배열의 문자열 min/max 반환
47246
+ * - alignToGridLine: 전달받은 minMax 그대로 사용
47247
+ * - scrollbar 사용: WeakMap 캐시를 통해 O(n) → O(1)로 단축
47248
+ * - 일반: 매번 getStringMinMax 계산
47249
+ * @param {object} minMax 축 min/max 정보 (alignToGridLine 시 사용)
47250
+ * @param {object} scrollbarOpt 스크롤바 옵션
47251
+ * @returns {{ min: string, max: string }}
46835
47252
  */
46836
47253
 
46837
47254
 
46838
47255
  _createClass(StepScale, [{
47256
+ key: "getStepMinMax",
47257
+ value: function getStepMinMax(minMax, scrollbarOpt) {
47258
+ if (this.labelStyle.alignToGridLine) return minMax;
47259
+ if (!(scrollbarOpt !== null && scrollbarOpt !== void 0 && scrollbarOpt.use)) return helpers_util.getStringMinMax(this.labels);
47260
+
47261
+ if (!stringMinMaxByLabels.has(this.labels)) {
47262
+ stringMinMaxByLabels.set(this.labels, helpers_util.getStringMinMax(this.labels));
47263
+ }
47264
+
47265
+ return stringMinMaxByLabels.get(this.labels);
47266
+ }
47267
+ /**
47268
+ * Calculate min/max value, label and size information for step scale
47269
+ * @param {object} minMax min/max information (unused on step scale)
47270
+ * @param {object} scrollbarOpt scroll bar option
47271
+ * @param {object} chartRect chart size information
47272
+ *
47273
+ * @returns {object} min/max value and label
47274
+ */
47275
+
47276
+ }, {
46839
47277
  key: "calculateScaleRange",
46840
47278
  value: function calculateScaleRange(minMax, scrollbarOpt, chartRect) {
46841
47279
  var _this$labelStyle$maxW, _this$labelStyle;
46842
47280
 
46843
- var stepMinMax = this.labelStyle.alignToGridLine ? minMax : helpers_util.getStringMinMax(this.labels);
47281
+ var stepMinMax = this.getStepMinMax(minMax, scrollbarOpt);
46844
47282
  var maxValue = stepMinMax.max;
46845
47283
  var minValue = stepMinMax.min;
46846
47284
  var minIndex = 0;
@@ -50305,9 +50743,18 @@ var plugins_scrollbar_module = {
50305
50743
  var isResetPosition = dir === 'x' ? (_this$options$axesX2 = this.options.axesX) === null || _this$options$axesX2 === void 0 ? void 0 : (_this$options$axesX2$ = _this$options$axesX2[0]) === null || _this$options$axesX2$ === void 0 ? void 0 : (_this$options$axesX2$2 = _this$options$axesX2$.scrollbar) === null || _this$options$axesX2$2 === void 0 ? void 0 : _this$options$axesX2$2.resetPosition : (_this$options$axesY2 = this.options.axesY) === null || _this$options$axesY2 === void 0 ? void 0 : (_this$options$axesY2$ = _this$options$axesY2[0]) === null || _this$options$axesY2$ === void 0 ? void 0 : (_this$options$axesY2$2 = _this$options$axesY2$.scrollbar) === null || _this$options$axesY2$2 === void 0 ? void 0 : _this$options$axesY2$2.resetPosition;
50306
50744
 
50307
50745
  if (isUpdateAxesRange) {
50308
- var _newOpt$5, _newOpt$5$range, _newOpt$6;
50746
+ var _newOpt$5;
50747
+
50748
+ var newOptRange = newOpt === null || newOpt === void 0 ? void 0 : (_newOpt$5 = newOpt[0]) === null || _newOpt$5 === void 0 ? void 0 : _newOpt$5.range;
50749
+ var currentRange = this.scrollbar[dir].range;
50309
50750
 
50310
- this.scrollbar[dir].range = newOpt !== null && newOpt !== void 0 && (_newOpt$5 = newOpt[0]) !== null && _newOpt$5 !== void 0 && (_newOpt$5$range = _newOpt$5.range) !== null && _newOpt$5$range !== void 0 && _newOpt$5$range.length ? _toConsumableArray(newOpt === null || newOpt === void 0 ? void 0 : (_newOpt$6 = newOpt[0]) === null || _newOpt$6 === void 0 ? void 0 : _newOpt$6.range) : null;
50751
+ if (!isResetPosition && newOptRange !== null && newOptRange !== void 0 && newOptRange.length && currentRange !== null && currentRange !== void 0 && currentRange.length) {
50752
+ // 리사이즈 등으로 range 크기만 변경된 경우, 현재 스크롤 위치(min)를 유지하고 크기만 조정
50753
+ var newSize = newOptRange[1] - newOptRange[0];
50754
+ this.scrollbar[dir].range = [currentRange[0], currentRange[0] + newSize];
50755
+ } else {
50756
+ this.scrollbar[dir].range = newOptRange !== null && newOptRange !== void 0 && newOptRange.length ? _toConsumableArray(newOptRange) : null;
50757
+ }
50311
50758
  }
50312
50759
 
50313
50760
  if (isResetPosition || updateData) {
@@ -51482,6 +51929,7 @@ function inRange_inRange(number, start, end) {
51482
51929
 
51483
51930
 
51484
51931
 
51932
+
51485
51933
 
51486
51934
 
51487
51935
  var plugins_interaction_modules = {
@@ -51695,10 +52143,12 @@ var plugins_interaction_modules = {
51695
52143
  }
51696
52144
 
51697
52145
  var setSelectedItemInfo = function setSelectedItemInfo() {
51698
- var hitInfo = _this.findHitItem(offset); // 실제 클릭된 아이템의 정보 추출 (hitId가 있으면 해당 아이템, 없으면 첫 번째 아이템)
52146
+ var _hitInfo$hitId;
51699
52147
 
52148
+ var hitInfo = _this.findHitItem(offset, true); // 실제 클릭된 아이템의 정보 추출 (hitId가 있으면 해당 아이템, 없으면 첫 번째 아이템)
51700
52149
 
51701
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52150
+
52151
+ var hitItemId = (_hitInfo$hitId = hitInfo.hitId) !== null && _hitInfo$hitId !== void 0 ? _hitInfo$hitId : Object.keys(hitInfo.items)[0];
51702
52152
  var hitItem = hitInfo.items[hitItemId];
51703
52153
 
51704
52154
  if (hitItem) {
@@ -51713,9 +52163,11 @@ var plugins_interaction_modules = {
51713
52163
  };
51714
52164
 
51715
52165
  var setSelectedLabelInfo = function setSelectedLabelInfo(targetAxis) {
51716
- var hitInfo = _this.findHitItem(offset);
52166
+ var _hitInfo$hitId2;
52167
+
52168
+ var hitInfo = _this.findHitItem(offset, true);
51717
52169
 
51718
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52170
+ var hitItemId = (_hitInfo$hitId2 = hitInfo.hitId) !== null && _hitInfo$hitId2 !== void 0 ? _hitInfo$hitId2 : Object.keys(hitInfo.items)[0];
51719
52171
  var hitItem = hitInfo.items[hitItemId];
51720
52172
 
51721
52173
  var _this$getLabelInfoByP = _this.getLabelInfoByPosition(offset, targetAxis),
@@ -51738,9 +52190,11 @@ var plugins_interaction_modules = {
51738
52190
  };
51739
52191
 
51740
52192
  var setSelectedSeriesInfo = function setSelectedSeriesInfo() {
51741
- var hitInfo = _this.findHitItem(offset);
52193
+ var _hitInfo$hitId3;
51742
52194
 
51743
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52195
+ var hitInfo = _this.findHitItem(offset, true);
52196
+
52197
+ var hitItemId = (_hitInfo$hitId3 = hitInfo.hitId) !== null && _hitInfo$hitId3 !== void 0 ? _hitInfo$hitId3 : Object.keys(hitInfo.items)[0];
51744
52198
  var hitItem = hitInfo.items[hitItemId];
51745
52199
 
51746
52200
  if (hitItemId !== null) {
@@ -51823,19 +52277,19 @@ var plugins_interaction_modules = {
51823
52277
  var useSelectSeries = (selectSeriesOpt === null || selectSeriesOpt === void 0 ? void 0 : selectSeriesOpt.use) && (selectSeriesOpt === null || selectSeriesOpt === void 0 ? void 0 : selectSeriesOpt.useClick);
51824
52278
 
51825
52279
  var setSelectedItemInfo = function setSelectedItemInfo() {
51826
- var hitInfo = _this.getItemByPosition(offset, false);
52280
+ var hitInfo = _this.getHitItemByPosition(offset, false, undefined, false, true);
51827
52281
 
51828
52282
  args.label = hitInfo.label;
51829
52283
  args.value = hitInfo.value;
51830
52284
  args.seriesId = hitInfo.sId;
51831
- args.dataIndex = hitInfo.maxIndex;
52285
+ args.dataIndex = hitInfo.dataIndex;
51832
52286
  args.acc = hitInfo.acc;
51833
52287
 
51834
52288
  if (hitInfo !== null && hitInfo !== void 0 && hitInfo.sId) {
51835
52289
  args.selected = {
51836
52290
  eventTarget: 'item',
51837
52291
  seriesId: _this.isDeselectItem(hitInfo) ? null : hitInfo.sId,
51838
- dataIndex: _this.isDeselectItem(hitInfo) ? null : hitInfo.maxIndex
52292
+ dataIndex: _this.isDeselectItem(hitInfo) ? null : hitInfo.dataIndex
51839
52293
  };
51840
52294
  }
51841
52295
  };
@@ -51863,9 +52317,11 @@ var plugins_interaction_modules = {
51863
52317
  };
51864
52318
 
51865
52319
  var setSelectedSeriesInfo = function setSelectedSeriesInfo() {
51866
- var hitInfo = _this.findHitItem(offset);
52320
+ var _hitInfo$hitId4;
52321
+
52322
+ var hitInfo = _this.findHitItem(offset, true);
51867
52323
 
51868
- var hitItemId = hitInfo.hitId || Object.keys(hitInfo.items)[0];
52324
+ var hitItemId = (_hitInfo$hitId4 = hitInfo.hitId) !== null && _hitInfo$hitId4 !== void 0 ? _hitInfo$hitId4 : Object.keys(hitInfo.items)[0];
51869
52325
  var hitItem = hitInfo.items[hitItemId];
51870
52326
 
51871
52327
  if (hitItemId !== null) {
@@ -52499,19 +52955,30 @@ var plugins_interaction_modules = {
52499
52955
  findHitItem: function findHitItem(offset) {
52500
52956
  var _this4 = this;
52501
52957
 
52958
+ var disableNullLabelSnap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
52502
52959
  var sIds = Object.keys(this.seriesList);
52503
52960
  var items = {};
52504
52961
  var isHorizontal = !!this.options.horizontal;
52505
52962
  var ctx = this.tooltipCtx;
52963
+
52964
+ var _offset = _slicedToArray(offset, 2),
52965
+ cx = _offset[0],
52966
+ cy = _offset[1];
52967
+
52506
52968
  var hitId = null;
52507
52969
  var maxs = '';
52508
52970
  var maxsw = 0;
52509
52971
  var maxv = '';
52510
52972
  var maxg = null;
52511
52973
  var maxSID = null;
52512
- var minDistance = Infinity; // 1. 먼저 공통으로 사용할 데이터 인덱스 결정
52974
+ var minDistance = Infinity; // directHit 하나라도 있으면 일반 hit 는 hitId 후보에서 배제.
52975
+
52976
+ var hasDirectHit = false; // hit 이 없을 때 거리 기반으로 선택할 fallback (기존 "첫 시리즈 고정" 대체).
52977
+
52978
+ var fallbackId = null;
52979
+ var fallbackDistance = Infinity; // 1. 먼저 공통으로 사용할 데이터 인덱스 결정
52513
52980
 
52514
- var targetDataIndex = this.findClosestDataIndex(offset, sIds);
52981
+ var targetDataIndex = this.findClosestDataIndex(offset, sIds, disableNullLabelSnap);
52515
52982
 
52516
52983
  if (targetDataIndex === -1 && !this.isNotUseIndicator()) {
52517
52984
  return {
@@ -52585,24 +53052,79 @@ var plugins_interaction_modules = {
52585
53052
  if (maxg === null || maxg <= gdata) {
52586
53053
  maxg = gdata;
52587
53054
  maxSID = sId;
52588
- } // 마우스 위치와의 거리 계산하여 가장 가까운 시리즈 선택
53055
+ } // hit 기반 선택: directHit 최우선, 일반 hit 는 directHit 없을 때만.
52589
53056
 
52590
53057
 
52591
53058
  if (item.hit && item.data.xp !== undefined && item.data.yp !== undefined) {
52592
53059
  var distance = Math.pow(item.data.xp - offset[0], 2) + Math.pow(item.data.yp - offset[1], 2);
52593
53060
 
52594
- if (distance < minDistance) {
53061
+ if (item.directHit) {
53062
+ if (!hasDirectHit || distance < minDistance) {
53063
+ minDistance = distance;
53064
+ hitId = sId;
53065
+ }
53066
+
53067
+ hasDirectHit = true;
53068
+ } else if (!hasDirectHit && distance < minDistance) {
52595
53069
  minDistance = distance;
52596
53070
  hitId = sId;
52597
53071
  }
53072
+ } // fallback 후보: hit 여부와 무관하게 거리가 가장 가까운 시리즈.
53073
+ // 참고: 이 블록은 outer `if (gdata !== null && gdata !== undefined)` 안에 있어서
53074
+ // 값이 null 인 시리즈는 items 수집 단계에서 이미 걸러진 상태. 별도 null 값 가드 불필요.
53075
+
53076
+
53077
+ if (item.data.xp !== undefined && item.data.yp !== undefined && item.data.xp !== null && item.data.yp !== null) {
53078
+ var fbDistance = helpers_util.calcBoxDistance(item.data, cx, cy);
53079
+
53080
+ if (fbDistance < fallbackDistance) {
53081
+ fallbackDistance = fbDistance;
53082
+ fallbackId = sId;
53083
+ }
52598
53084
  }
52599
53085
  }
52600
53086
  }
52601
53087
  }
53088
+ } // hit 없으면 거리 기반 fallback, 그것도 없으면 items 첫 키(항상 비어있을 가능성 방어).
53089
+
53090
+
53091
+ if (hitId === null) {
53092
+ hitId = fallbackId !== null ? fallbackId : Object.keys(items)[0];
53093
+ }
53094
+
53095
+ var maxHighlight = maxg !== null ? [maxSID, maxg] : null; // all-null 라벨인 경우 synthetic items[''] 로 label/index 만 채워 전달.
53096
+
53097
+ if (disableNullLabelSnap && Object.keys(items).length === 0 && targetDataIndex !== -1) {
53098
+ var _this$seriesList$refS;
53099
+
53100
+ var refSeriesID = sIds.find(function (sId) {
53101
+ var _s$data;
53102
+
53103
+ var s = _this4.seriesList[sId];
53104
+ return (s === null || s === void 0 ? void 0 : s.show) && (s === null || s === void 0 ? void 0 : (_s$data = s.data) === null || _s$data === void 0 ? void 0 : _s$data.length) > 0;
53105
+ });
53106
+ var refPoint = refSeriesID ? (_this$seriesList$refS = this.seriesList[refSeriesID].data) === null || _this$seriesList$refS === void 0 ? void 0 : _this$seriesList$refS[targetDataIndex] : null;
53107
+
53108
+ if (refPoint) {
53109
+ items[''] = {
53110
+ id: '',
53111
+ name: '',
53112
+ label: isHorizontal ? refPoint.y : refPoint.x,
53113
+ index: targetDataIndex,
53114
+ axis: {
53115
+ x: 0,
53116
+ y: 0
53117
+ },
53118
+ data: {
53119
+ o: undefined,
53120
+ x: refPoint.x,
53121
+ y: refPoint.y
53122
+ }
53123
+ };
53124
+ hitId = '';
53125
+ }
52602
53126
  }
52603
53127
 
52604
- hitId = hitId === null ? Object.keys(items)[0] : hitId;
52605
- var maxHighlight = maxg !== null ? [maxSID, maxg] : null;
52606
53128
  return {
52607
53129
  items: items,
52608
53130
  hitId: hitId,
@@ -52621,9 +53143,11 @@ var plugins_interaction_modules = {
52621
53143
  var _this5 = this,
52622
53144
  _this$seriesList$refe;
52623
53145
 
52624
- var _offset = _slicedToArray(offset, 2),
52625
- xp = _offset[0],
52626
- yp = _offset[1];
53146
+ var disableNullLabelSnap = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
53147
+
53148
+ var _offset2 = _slicedToArray(offset, 2),
53149
+ xp = _offset2[0],
53150
+ yp = _offset2[1];
52627
53151
 
52628
53152
  var isHorizontal = !!this.options.horizontal;
52629
53153
  var mousePos = isHorizontal ? yp : xp; // 데이터 있는 시리즈를 기준으로 라벨 위치 확인
@@ -52676,11 +53200,10 @@ var plugins_interaction_modules = {
52676
53200
  }
52677
53201
 
52678
53202
  var closestDistance = Infinity;
52679
- var closestIndex = -1; // 각 라벨에서 가장 가까운 것 찾기
53203
+ var closestIndex = -1; // 각 라벨에서 가장 가까운 것 찾기 (disableNullLabelSnap=true 면 all-null 라벨도 후보)
52680
53204
 
52681
53205
  var _loop = function _loop(_i) {
52682
- // 라벨에 유효한 데이터가 있는 시리즈가 하나 이상 있는지 확인
52683
- var hasValidData = sIds.some(function (sId) {
53206
+ var hasValidData = disableNullLabelSnap || sIds.some(function (sId) {
52684
53207
  var _series$data2, _series$data2$_i, _series$data3, _series$data3$_i;
52685
53208
 
52686
53209
  var series = _this5.seriesList[sId];
@@ -53287,7 +53810,7 @@ var plugins_interaction_modules = {
53287
53810
  isDeselectItem: function isDeselectItem(hitInfo) {
53288
53811
  var _this$defaultSelectIt, _this$defaultSelectIt2;
53289
53812
 
53290
- return this.options.selectItem.useDeselectItem && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.maxIndex) === ((_this$defaultSelectIt = this.defaultSelectItemInfo) === null || _this$defaultSelectIt === void 0 ? void 0 : _this$defaultSelectIt.dataIndex) && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.sId) === ((_this$defaultSelectIt2 = this.defaultSelectItemInfo) === null || _this$defaultSelectIt2 === void 0 ? void 0 : _this$defaultSelectIt2.seriesID) && !isNaN(hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.maxIndex);
53813
+ return this.options.selectItem.useDeselectItem && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.dataIndex) === ((_this$defaultSelectIt = this.defaultSelectItemInfo) === null || _this$defaultSelectIt === void 0 ? void 0 : _this$defaultSelectIt.dataIndex) && (hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.sId) === ((_this$defaultSelectIt2 = this.defaultSelectItemInfo) === null || _this$defaultSelectIt2 === void 0 ? void 0 : _this$defaultSelectIt2.seriesID) && !isNaN(hitInfo === null || hitInfo === void 0 ? void 0 : hitInfo.dataIndex);
53291
53814
  },
53292
53815
 
53293
53816
  /**
@@ -53296,9 +53819,9 @@ var plugins_interaction_modules = {
53296
53819
  * @returns {string}
53297
53820
  */
53298
53821
  getCurMouseLocation: function getCurMouseLocation(offset) {
53299
- var _offset2 = _slicedToArray(offset, 2),
53300
- offsetX = _offset2[0],
53301
- offsetY = _offset2[1];
53822
+ var _offset3 = _slicedToArray(offset, 2),
53823
+ offsetX = _offset3[0],
53824
+ offsetY = _offset3[1];
53302
53825
 
53303
53826
  var aPos = {
53304
53827
  x1: this.chartRect.x1 + this.labelOffset.left,
@@ -54961,7 +55484,7 @@ var element_tip_modules = {
54961
55484
 
54962
55485
  if (tipType === 'sel') {
54963
55486
  if (hitInfo && hitInfo.label !== null) {
54964
- lastTip.pos = type === 'bar' ? hitInfo.maxIndex : hitInfo.label;
55487
+ lastTip.pos = type === 'bar' ? hitInfo.dataIndex : hitInfo.label;
54965
55488
  ldata = lastTip.pos;
54966
55489
  } else if (lastTip.pos !== null) {
54967
55490
  ldata = lastTip.pos;
@@ -56060,10 +56583,10 @@ var chart_core_EvChart = /*#__PURE__*/function () {
56060
56583
  var lastHitInfo = this.lastHitInfo;
56061
56584
  var defaultSelectInfo = this.defaultSelectItemInfo;
56062
56585
 
56063
- if (lastHitInfo !== null && lastHitInfo !== void 0 && lastHitInfo.maxIndex || (lastHitInfo === null || lastHitInfo === void 0 ? void 0 : lastHitInfo.maxIndex) === 0) {
56586
+ if (lastHitInfo !== null && lastHitInfo !== void 0 && lastHitInfo.dataIndex || (lastHitInfo === null || lastHitInfo === void 0 ? void 0 : lastHitInfo.dataIndex) === 0) {
56064
56587
  _selectInfo = {
56065
56588
  seriesID: lastHitInfo.sId,
56066
- dataIndex: lastHitInfo.maxIndex
56589
+ dataIndex: lastHitInfo.dataIndex
56067
56590
  };
56068
56591
  } else if (defaultSelectInfo !== null && defaultSelectInfo !== void 0 && defaultSelectInfo.dataIndex || (defaultSelectInfo === null || defaultSelectInfo === void 0 ? void 0 : defaultSelectInfo.dataIndex) === 0) {
56069
56592
  _selectInfo = _objectSpread2({}, defaultSelectInfo);