@visactor/vrender-components 0.14.0-alpha.0 → 0.14.0-alpha.10

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 (159) hide show
  1. package/cjs/axis/base.d.ts +4 -2
  2. package/cjs/axis/base.js +9 -18
  3. package/cjs/axis/base.js.map +1 -1
  4. package/cjs/axis/circle.d.ts +3 -1
  5. package/cjs/axis/circle.js +7 -5
  6. package/cjs/axis/circle.js.map +1 -1
  7. package/cjs/axis/constant.d.ts +2 -1
  8. package/cjs/axis/constant.js +1 -1
  9. package/cjs/axis/constant.js.map +1 -1
  10. package/cjs/axis/line.d.ts +6 -2
  11. package/cjs/axis/line.js +70 -13
  12. package/cjs/axis/line.js.map +1 -1
  13. package/cjs/axis/overlap/auto-limit.js +1 -1
  14. package/cjs/axis/overlap/auto-limit.js.map +1 -1
  15. package/cjs/axis/overlap/auto-rotate.d.ts +2 -0
  16. package/cjs/axis/overlap/auto-rotate.js +2 -2
  17. package/cjs/axis/overlap/auto-rotate.js.map +1 -1
  18. package/cjs/axis/type.d.ts +11 -7
  19. package/cjs/axis/type.js.map +1 -1
  20. package/cjs/brush/brush.d.ts +3 -3
  21. package/cjs/brush/brush.js.map +1 -1
  22. package/cjs/data-zoom/config.d.ts +2 -0
  23. package/cjs/data-zoom/config.js +3 -1
  24. package/cjs/data-zoom/config.js.map +1 -1
  25. package/cjs/data-zoom/data-zoom.d.ts +2 -0
  26. package/cjs/data-zoom/data-zoom.js +21 -11
  27. package/cjs/data-zoom/data-zoom.js.map +1 -1
  28. package/cjs/data-zoom/type.d.ts +4 -3
  29. package/cjs/data-zoom/type.js.map +1 -1
  30. package/cjs/index.d.ts +1 -1
  31. package/cjs/index.js +1 -1
  32. package/cjs/index.js.map +1 -1
  33. package/cjs/label/base.d.ts +12 -11
  34. package/cjs/label/base.js +83 -62
  35. package/cjs/label/base.js.map +1 -1
  36. package/cjs/label/overlap/bitmap.d.ts +1 -1
  37. package/cjs/label/overlap/bitmap.js +2 -0
  38. package/cjs/label/overlap/bitmap.js.map +1 -1
  39. package/cjs/label/overlap/place.d.ts +8 -4
  40. package/cjs/label/overlap/place.js +14 -2
  41. package/cjs/label/overlap/place.js.map +1 -1
  42. package/cjs/label/rect.d.ts +5 -3
  43. package/cjs/label/rect.js.map +1 -1
  44. package/cjs/label/symbol.d.ts +5 -3
  45. package/cjs/label/symbol.js.map +1 -1
  46. package/cjs/label/type.d.ts +12 -7
  47. package/cjs/label/type.js.map +1 -1
  48. package/cjs/legend/discrete/discrete.js +2 -1
  49. package/cjs/legend/discrete/discrete.js.map +1 -1
  50. package/cjs/marker/type.d.ts +4 -5
  51. package/cjs/marker/type.js.map +1 -1
  52. package/cjs/player/continuous-player.d.ts +1 -2
  53. package/cjs/player/continuous-player.js +5 -5
  54. package/cjs/player/continuous-player.js.map +1 -1
  55. package/cjs/player/discrete-player.d.ts +1 -2
  56. package/cjs/player/discrete-player.js +4 -4
  57. package/cjs/player/discrete-player.js.map +1 -1
  58. package/cjs/poptip/contribution.js +1 -1
  59. package/cjs/poptip/contribution.js.map +1 -1
  60. package/cjs/poptip/poptip.js +10 -3
  61. package/cjs/poptip/poptip.js.map +1 -1
  62. package/cjs/scrollbar/scrollbar.js +4 -4
  63. package/cjs/scrollbar/scrollbar.js.map +1 -1
  64. package/cjs/segment/segment.js +4 -1
  65. package/cjs/segment/segment.js.map +1 -1
  66. package/cjs/segment/type.d.ts +1 -0
  67. package/cjs/segment/type.js.map +1 -1
  68. package/cjs/slider/slider.d.ts +1 -1
  69. package/cjs/slider/slider.js +8 -8
  70. package/cjs/slider/slider.js.map +1 -1
  71. package/cjs/tag/type.d.ts +3 -3
  72. package/cjs/tag/type.js.map +1 -1
  73. package/cjs/util/align.d.ts +2 -0
  74. package/cjs/util/align.js +60 -0
  75. package/cjs/util/align.js.map +1 -0
  76. package/cjs/util/common.d.ts +3 -1
  77. package/cjs/util/common.js +14 -2
  78. package/cjs/util/common.js.map +1 -1
  79. package/dist/index.js +442 -177
  80. package/dist/index.min.js +1 -1
  81. package/es/axis/base.d.ts +4 -2
  82. package/es/axis/base.js +10 -19
  83. package/es/axis/base.js.map +1 -1
  84. package/es/axis/circle.d.ts +3 -1
  85. package/es/axis/circle.js +7 -5
  86. package/es/axis/circle.js.map +1 -1
  87. package/es/axis/constant.d.ts +2 -1
  88. package/es/axis/constant.js +1 -1
  89. package/es/axis/constant.js.map +1 -1
  90. package/es/axis/line.d.ts +6 -2
  91. package/es/axis/line.js +73 -14
  92. package/es/axis/line.js.map +1 -1
  93. package/es/axis/overlap/auto-limit.js +1 -1
  94. package/es/axis/overlap/auto-limit.js.map +1 -1
  95. package/es/axis/overlap/auto-rotate.d.ts +2 -0
  96. package/es/axis/overlap/auto-rotate.js +2 -2
  97. package/es/axis/overlap/auto-rotate.js.map +1 -1
  98. package/es/axis/type.d.ts +11 -7
  99. package/es/axis/type.js.map +1 -1
  100. package/es/brush/brush.d.ts +3 -3
  101. package/es/brush/brush.js.map +1 -1
  102. package/es/data-zoom/config.d.ts +2 -0
  103. package/es/data-zoom/config.js +3 -1
  104. package/es/data-zoom/config.js.map +1 -1
  105. package/es/data-zoom/data-zoom.d.ts +2 -0
  106. package/es/data-zoom/data-zoom.js +22 -12
  107. package/es/data-zoom/data-zoom.js.map +1 -1
  108. package/es/data-zoom/type.d.ts +4 -3
  109. package/es/data-zoom/type.js.map +1 -1
  110. package/es/index.d.ts +1 -1
  111. package/es/index.js +1 -1
  112. package/es/index.js.map +1 -1
  113. package/es/label/base.d.ts +12 -11
  114. package/es/label/base.js +85 -65
  115. package/es/label/base.js.map +1 -1
  116. package/es/label/overlap/bitmap.d.ts +1 -1
  117. package/es/label/overlap/bitmap.js +2 -0
  118. package/es/label/overlap/bitmap.js.map +1 -1
  119. package/es/label/overlap/place.d.ts +8 -4
  120. package/es/label/overlap/place.js +11 -0
  121. package/es/label/overlap/place.js.map +1 -1
  122. package/es/label/rect.d.ts +5 -3
  123. package/es/label/rect.js.map +1 -1
  124. package/es/label/symbol.d.ts +5 -3
  125. package/es/label/symbol.js.map +1 -1
  126. package/es/label/type.d.ts +12 -7
  127. package/es/label/type.js.map +1 -1
  128. package/es/legend/discrete/discrete.js +1 -1
  129. package/es/legend/discrete/discrete.js.map +1 -1
  130. package/es/marker/type.d.ts +4 -5
  131. package/es/marker/type.js.map +1 -1
  132. package/es/player/continuous-player.d.ts +1 -2
  133. package/es/player/continuous-player.js +5 -5
  134. package/es/player/continuous-player.js.map +1 -1
  135. package/es/player/discrete-player.d.ts +1 -2
  136. package/es/player/discrete-player.js +5 -5
  137. package/es/player/discrete-player.js.map +1 -1
  138. package/es/poptip/contribution.js +1 -1
  139. package/es/poptip/contribution.js.map +1 -1
  140. package/es/poptip/poptip.js +11 -4
  141. package/es/poptip/poptip.js.map +1 -1
  142. package/es/scrollbar/scrollbar.js +5 -5
  143. package/es/scrollbar/scrollbar.js.map +1 -1
  144. package/es/segment/segment.js +4 -1
  145. package/es/segment/segment.js.map +1 -1
  146. package/es/segment/type.d.ts +1 -0
  147. package/es/segment/type.js.map +1 -1
  148. package/es/slider/slider.d.ts +1 -1
  149. package/es/slider/slider.js +9 -9
  150. package/es/slider/slider.js.map +1 -1
  151. package/es/tag/type.d.ts +3 -3
  152. package/es/tag/type.js.map +1 -1
  153. package/es/util/align.d.ts +2 -0
  154. package/es/util/align.js +54 -0
  155. package/es/util/align.js.map +1 -0
  156. package/es/util/common.d.ts +3 -1
  157. package/es/util/common.js +12 -0
  158. package/es/util/common.js.map +1 -1
  159. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -273,9 +273,9 @@
273
273
  e.stopPropagation();
274
274
  const { direction } = this.attribute;
275
275
  this._prePos = direction === 'horizontal' ? e.clientX : e.clientY;
276
- if (vrender.vglobal.env === 'browser') {
277
- vrender.vglobal.addEventListener('pointermove', this._onSliderPointerMove);
278
- vrender.vglobal.addEventListener('pointerup', this._onSliderPointerUp);
276
+ if (vrender.global.env === 'browser') {
277
+ vrender.global.addEventListener('pointermove', this._onSliderPointerMove);
278
+ vrender.global.addEventListener('pointerup', this._onSliderPointerUp);
279
279
  }
280
280
  else {
281
281
  this._slider.addEventListener('pointermove', this._onSliderPointerMove);
@@ -306,9 +306,9 @@
306
306
  };
307
307
  _onSliderPointerUp = (e) => {
308
308
  e.preventDefault();
309
- if (vrender.vglobal.env === 'browser') {
310
- vrender.vglobal.removeEventListener('pointermove', this._onSliderPointerMove);
311
- vrender.vglobal.removeEventListener('pointerup', this._onSliderPointerUp);
309
+ if (vrender.global.env === 'browser') {
310
+ vrender.global.removeEventListener('pointermove', this._onSliderPointerMove);
311
+ vrender.global.removeEventListener('pointerup', this._onSliderPointerUp);
312
312
  }
313
313
  else {
314
314
  this._slider.removeEventListener('pointermove', this._onSliderPointerMove);
@@ -341,6 +341,26 @@
341
341
  }
342
342
  return obj.visible !== false;
343
343
  };
344
+ function getMarksByName(root, name) {
345
+ if (!name) {
346
+ return [];
347
+ }
348
+ const group = root.find(node => node.name === name, true);
349
+ if (!group) {
350
+ return [];
351
+ }
352
+ return group.getChildren();
353
+ }
354
+ function getNoneGroupMarksByName(root, name) {
355
+ if (!name) {
356
+ return [];
357
+ }
358
+ const group = root.find(node => node.name === name, true);
359
+ if (!group) {
360
+ return [];
361
+ }
362
+ return group.findAll(node => node.type !== 'group', true);
363
+ }
344
364
 
345
365
  const defaultAlternativeColors = ['#ffffff', '#000000'];
346
366
  function labelSmartInvert(foregroundColorOrigin, backgroundColorOrogin, textType, contrastRatiosThreshold, alternativeColors) {
@@ -751,8 +771,10 @@
751
771
  ? [this.stage.width, this.stage.height]
752
772
  : undefined;
753
773
  const layout = position === 'auto';
754
- for (let i = 0; i < this.positionList.length; i++) {
755
- const p = layout ? this.positionList[i] : position;
774
+ let minifyBBoxI;
775
+ let minifyBBoxSize = Infinity;
776
+ for (let i = 0; i < this.positionList.length + 1; i++) {
777
+ const p = layout ? this.positionList[i === this.positionList.length ? minifyBBoxI : i] : position;
756
778
  const { angle, offset, rectOffset } = this.getAngleAndOffset(p, popTipWidth, poptipHeight, vutils.isArray(spaceSize) ? spaceSize : [spaceSize, spaceSize - lineWidth]);
757
779
  if (vutils.isBoolean(bgVisible)) {
758
780
  const offsetX = (vutils.isArray(symbolSize) ? symbolSize[0] : symbolSize) / 4;
@@ -761,6 +783,8 @@
761
783
  visible: bgVisible && (contentVisible || titleVisible),
762
784
  x: offsetX,
763
785
  y: 0,
786
+ strokeBoundsBuffer: -1,
787
+ boundsPadding: -2,
764
788
  anchor: [0, 0],
765
789
  symbolType: 'arrow2Left',
766
790
  angle: angle,
@@ -779,7 +803,7 @@
779
803
  y: 0,
780
804
  width: popTipWidth,
781
805
  height: poptipHeight,
782
- zIndex: -10
806
+ zIndex: -8
783
807
  }, 'rect');
784
808
  if (!vutils.isEmpty(state?.panel)) {
785
809
  bgRect.states = state.panel;
@@ -795,6 +819,14 @@
795
819
  if (vutils.rectInsideAnotherRect(b, stageBounds, false)) {
796
820
  break;
797
821
  }
822
+ else {
823
+ const bbox = vutils.getRectIntersect(b, stageBounds, false);
824
+ const size = (bbox.x2 - bbox.x1) * (bbox.y2 - bbox.y1);
825
+ if (size < minifyBBoxSize) {
826
+ minifyBBoxSize = size;
827
+ minifyBBoxI = i;
828
+ }
829
+ }
798
830
  }
799
831
  else {
800
832
  break;
@@ -951,6 +983,7 @@
951
983
  x: matrix.e,
952
984
  y: matrix.f
953
985
  });
986
+ drawContext.stage.tryInitInteractiveLayer();
954
987
  const interactiveLayer = drawContext.stage.getLayer('_builtin_interactive');
955
988
  if (interactiveLayer) {
956
989
  interactiveLayer.add(this.poptipComponent);
@@ -1298,6 +1331,9 @@
1298
1331
  _clear(index >>> DIV, ~(1 << (index & MOD)));
1299
1332
  },
1300
1333
  getRange: ({ x1, y1, x2, y2 }) => {
1334
+ if (x2 < 0 || y2 < 0 || x1 > w || y1 > h) {
1335
+ return true;
1336
+ }
1301
1337
  let r = y2;
1302
1338
  let start;
1303
1339
  let end;
@@ -1330,6 +1366,9 @@
1330
1366
  return false;
1331
1367
  },
1332
1368
  setRange: ({ x1, y1, x2, y2 }) => {
1369
+ if (x2 < 0 || y2 < 0 || x1 > w || y1 > h) {
1370
+ return;
1371
+ }
1333
1372
  let start;
1334
1373
  let end;
1335
1374
  let indexStart;
@@ -1501,6 +1540,28 @@
1501
1540
  return DefaultPositions;
1502
1541
  }
1503
1542
  }
1543
+ function clampText(text, width, height) {
1544
+ const { x1, x2, y1, y2 } = text.AABBBounds;
1545
+ const minX = Math.min(x1, x2);
1546
+ const maxX = Math.max(x1, x2);
1547
+ const minY = Math.min(y1, y2);
1548
+ const maxY = Math.max(y1, y2);
1549
+ let dx = 0;
1550
+ let dy = 0;
1551
+ if (minX < 0 && maxX - minX <= width) {
1552
+ dx = -minX;
1553
+ }
1554
+ else if (maxX > width && minX - (maxX - width) >= 0) {
1555
+ dx = width - maxX;
1556
+ }
1557
+ if (minY < 0 && maxY - minY <= height) {
1558
+ dy = -minY;
1559
+ }
1560
+ else if (maxY > height && minY - (maxY - height) >= 0) {
1561
+ dy = height - maxY;
1562
+ }
1563
+ return { dx, dy };
1564
+ }
1504
1565
 
1505
1566
  const fadeIn = (textAttribute = {}) => {
1506
1567
  return {
@@ -1551,17 +1612,37 @@
1551
1612
  setBitmapTool(bmpTool) {
1552
1613
  this._bmpTool = bmpTool;
1553
1614
  }
1554
- _relationMap;
1555
- _prevRelationMap;
1556
- _textMap;
1615
+ _graphicToText;
1616
+ _idToGraphic;
1557
1617
  onAfterLabelOverlap;
1558
1618
  _lastHover;
1559
1619
  _lastSelect;
1560
1620
  _enableAnimation;
1561
1621
  render() {
1562
- const currentBaseMarks = this._checkMarks();
1563
- const labels = this.layout(currentBaseMarks);
1564
- this._smartInvert(labels);
1622
+ this._prepare();
1623
+ const { overlap, smartInvert, dataFilter, customLayoutFunc, customOverlapFunc } = this.attribute;
1624
+ let data = this.attribute.data;
1625
+ if (vutils.isFunction(dataFilter)) {
1626
+ data = dataFilter(data);
1627
+ }
1628
+ let labels;
1629
+ if (vutils.isFunction(customLayoutFunc)) {
1630
+ labels = customLayoutFunc(data, (d) => this._idToGraphic.get(d.id));
1631
+ }
1632
+ else {
1633
+ labels = this.layout(data);
1634
+ if (vutils.isFunction(customOverlapFunc)) {
1635
+ labels = customOverlapFunc(labels, (d) => this._idToGraphic.get(d.id));
1636
+ }
1637
+ else {
1638
+ if (overlap !== false) {
1639
+ labels = this._overlapping(labels);
1640
+ }
1641
+ }
1642
+ }
1643
+ if (smartInvert !== false) {
1644
+ this._smartInvert(labels);
1645
+ }
1565
1646
  this._renderLabels(labels);
1566
1647
  }
1567
1648
  _bindEvent(target) {
@@ -1638,67 +1719,66 @@
1638
1719
  this._setStates(text);
1639
1720
  return text;
1640
1721
  }
1641
- _checkMarks() {
1642
- const baseMarks = this.getBaseMarks();
1722
+ _prepare() {
1723
+ const baseMarks = getMarksByName(this.getRootNode(), this.attribute.baseMarkGroupName);
1643
1724
  const currentBaseMarks = [];
1644
1725
  baseMarks.forEach(mark => {
1645
1726
  if (mark.releaseStatus !== 'willRelease') {
1646
1727
  currentBaseMarks.push(mark);
1647
1728
  }
1648
1729
  });
1649
- this._prevRelationMap = new Map(this._relationMap);
1650
- this._relationMap?.clear();
1651
- return currentBaseMarks;
1652
- }
1653
- layout(currentMarks) {
1654
- const { textStyle, position, offset } = this.attribute;
1655
- let { data } = this.attribute;
1656
- if (vutils.isFunction(data)) {
1657
- data = data({});
1730
+ this._idToGraphic?.clear();
1731
+ this._baseMarks = currentBaseMarks;
1732
+ if (!currentBaseMarks || currentBaseMarks.length === 0) {
1733
+ return;
1658
1734
  }
1735
+ const { data } = this.attribute;
1659
1736
  if (!data || data.length === 0) {
1660
- return [];
1737
+ return;
1661
1738
  }
1662
- let labels = [];
1663
- if (vutils.isFunction(this.attribute.sort) && currentMarks && currentMarks.length) {
1664
- currentMarks = currentMarks.sort(this.attribute.sort);
1739
+ if (!this._idToGraphic) {
1740
+ this._idToGraphic = new Map();
1665
1741
  }
1666
- if (!this._relationMap) {
1667
- this._relationMap = new Map();
1742
+ for (let i = 0; i < currentBaseMarks.length; i++) {
1743
+ const textData = data[i];
1744
+ const baseMark = currentBaseMarks[i];
1745
+ if (textData && baseMark) {
1746
+ if (!vutils.isValid(textData.id)) {
1747
+ textData.id = `vrender-component-${this.name}-${i}`;
1748
+ }
1749
+ this._idToGraphic.set(textData.id, baseMark);
1750
+ }
1668
1751
  }
1752
+ }
1753
+ layout(data = []) {
1754
+ const { textStyle = {}, position, offset } = this.attribute;
1755
+ const labels = [];
1669
1756
  for (let i = 0; i < data.length; i++) {
1670
1757
  const textData = data[i];
1671
- const baseMark = currentMarks?.[i];
1758
+ const baseMark = this._idToGraphic.get(textData.id);
1672
1759
  const labelAttribute = {
1673
1760
  ...textStyle,
1674
- ...textData,
1675
- _relatedIndex: i
1761
+ ...textData
1676
1762
  };
1677
- this._relationMap.set(i, baseMark);
1678
- if (textData) {
1679
- const text = vrender.createText(labelAttribute);
1680
- text.update();
1681
- const textBounds = this.getGraphicBounds(text);
1682
- const graphicBounds = this.getGraphicBounds(baseMark, { x: textData.x, y: textData.y });
1683
- const textAttributes = this.labeling(textBounds, graphicBounds, vutils.isFunction(position) ? position(textData) : position, offset);
1684
- if (!textAttributes) {
1685
- continue;
1686
- }
1687
- labelAttribute.x = textAttributes.x;
1688
- labelAttribute.y = textAttributes.y;
1689
- labels.push(labelAttribute);
1763
+ const text = this._createLabelText(labelAttribute);
1764
+ const textBounds = this.getGraphicBounds(text);
1765
+ const graphicBounds = this.getGraphicBounds(baseMark, { x: textData.x, y: textData.y });
1766
+ const textLocation = this.labeling(textBounds, graphicBounds, vutils.isFunction(position) ? position(textData) : position, offset);
1767
+ if (!textLocation) {
1768
+ continue;
1690
1769
  }
1691
- }
1692
- this._baseMarks = currentMarks;
1693
- if (this.attribute.overlap !== false) {
1694
- labels = this.overlapping(labels, this.attribute.overlap);
1770
+ labelAttribute.x = textLocation.x;
1771
+ labelAttribute.y = textLocation.y;
1772
+ text.setAttributes(textLocation);
1773
+ labels.push(text);
1695
1774
  }
1696
1775
  return labels;
1697
1776
  }
1698
- overlapping(labels, option = {}) {
1777
+ _overlapping(labels) {
1699
1778
  if (labels.length === 0) {
1700
1779
  return [];
1701
1780
  }
1781
+ const option = this.attribute.overlap;
1702
1782
  const result = [];
1703
1783
  const baseMarkGroup = this.getBaseMarkGroup();
1704
1784
  const size = option.size ?? {
@@ -1708,7 +1788,7 @@
1708
1788
  if (size.width === 0 || size.height === 0) {
1709
1789
  return labels;
1710
1790
  }
1711
- const { avoidBaseMark, strategy = [], hideOnHit = true, clampForce = true } = option;
1791
+ const { avoidBaseMark, strategy = [], hideOnHit = true, clampForce = true, avoidMarks = [] } = option;
1712
1792
  const bmpTool = this._bmpTool || bitmapTool(size.width, size.height);
1713
1793
  const bitmap = this._bitmap || bmpTool.bitmap();
1714
1794
  const checkBounds = strategy.some(s => s.type === 'bound');
@@ -1717,22 +1797,34 @@
1717
1797
  mark.AABBBounds && bitmap.setRange(boundToRange(bmpTool, mark.AABBBounds, true));
1718
1798
  });
1719
1799
  }
1800
+ if (avoidMarks.length > 0) {
1801
+ avoidMarks.forEach(avoid => {
1802
+ if (vutils.isString(avoid)) {
1803
+ getNoneGroupMarksByName(this.getRootNode(), avoid).forEach(avoidMark => {
1804
+ avoidMark.AABBBounds && bitmap.setRange(boundToRange(bmpTool, avoidMark.AABBBounds, true));
1805
+ });
1806
+ }
1807
+ else if (avoid.AABBBounds) {
1808
+ bitmap.setRange(boundToRange(bmpTool, avoid.AABBBounds, true));
1809
+ }
1810
+ });
1811
+ }
1720
1812
  for (let i = 0; i < labels.length; i++) {
1721
1813
  if (labels[i].visible === false) {
1722
1814
  continue;
1723
1815
  }
1724
- const text = vrender.createText(labels[i]);
1725
- const baseMark = this._baseMarks?.[i];
1816
+ const text = labels[i];
1817
+ const baseMark = this._idToGraphic.get(text.attribute.id);
1726
1818
  text.update();
1727
1819
  if (canPlace(bmpTool, bitmap, text.AABBBounds, clampForce)) {
1728
1820
  if (!checkBounds) {
1729
1821
  bitmap.setRange(boundToRange(bmpTool, text.AABBBounds, true));
1730
- result.push({ ...text.attribute });
1822
+ result.push(text);
1731
1823
  continue;
1732
1824
  }
1733
1825
  if (checkBounds && baseMark?.AABBBounds && canPlaceInside(text.AABBBounds, baseMark?.AABBBounds)) {
1734
1826
  bitmap.setRange(boundToRange(bmpTool, text.AABBBounds, true));
1735
- result.push({ ...text.attribute });
1827
+ result.push(text);
1736
1828
  continue;
1737
1829
  }
1738
1830
  }
@@ -1740,28 +1832,33 @@
1740
1832
  for (let j = 0; j < strategy.length; j++) {
1741
1833
  hasPlace = place(bmpTool, bitmap, strategy[j], this.attribute, text, this.getGraphicBounds(baseMark, labels[i]), this.labeling);
1742
1834
  if (hasPlace !== false) {
1743
- result.push({
1744
- ...text.attribute,
1745
- x: hasPlace.x,
1746
- y: hasPlace.y
1747
- });
1835
+ text.setAttributes({ x: hasPlace.x, y: hasPlace.y });
1836
+ result.push(text);
1748
1837
  break;
1749
1838
  }
1750
1839
  }
1751
- !hasPlace && !hideOnHit && result.push({ ...text.attribute });
1840
+ if (!hasPlace && clampForce) {
1841
+ const { dx = 0, dy = 0 } = clampText(text, bmpTool.width, bmpTool.height);
1842
+ if (!(dx === 0 && dy === 0) &&
1843
+ canPlace(bmpTool, bitmap, {
1844
+ x1: text.AABBBounds.x1 + dx,
1845
+ x2: text.AABBBounds.x2 + dx,
1846
+ y1: text.AABBBounds.y1 + dy,
1847
+ y2: text.AABBBounds.y2 + dy
1848
+ })) {
1849
+ text.setAttributes({ x: text.attribute.x + dx, y: text.attribute.y + dy });
1850
+ bitmap.setRange(boundToRange(bmpTool, text.AABBBounds, true));
1851
+ result.push(text);
1852
+ continue;
1853
+ }
1854
+ }
1855
+ !hasPlace && !hideOnHit && result.push(text);
1752
1856
  }
1753
1857
  if (vutils.isFunction(this.onAfterLabelOverlap)) {
1754
1858
  this.onAfterLabelOverlap(bitmap);
1755
1859
  }
1756
1860
  return result;
1757
1861
  }
1758
- getBaseMarks() {
1759
- const baseMarkGroup = this.getBaseMarkGroup();
1760
- if (!baseMarkGroup) {
1761
- return;
1762
- }
1763
- return baseMarkGroup.getChildren();
1764
- }
1765
1862
  getBaseMarkGroup() {
1766
1863
  const { baseMarkGroupName } = this.attribute;
1767
1864
  if (!baseMarkGroupName) {
@@ -1786,17 +1883,16 @@
1786
1883
  const easing = animationConfig.easing ?? DefaultLabelAnimation.easing;
1787
1884
  const delay = animationConfig.delay ?? 0;
1788
1885
  const currentTextMap = new Map();
1789
- const prevTextMap = this._textMap || new Map();
1886
+ const prevTextMap = this._graphicToText || new Map();
1790
1887
  const texts = [];
1791
- labels.forEach((label, index) => {
1792
- const text = this._createLabelText(label);
1793
- const relatedGraphic = this._relationMap.get(label._relatedIndex);
1888
+ labels.forEach((text, index) => {
1889
+ const relatedGraphic = this._idToGraphic.get(text.attribute.id);
1794
1890
  const state = prevTextMap?.get(relatedGraphic) ? 'update' : 'enter';
1795
1891
  if (state === 'enter') {
1796
1892
  texts.push(text);
1797
1893
  currentTextMap.set(relatedGraphic, text);
1798
1894
  if (!disableAnimation && relatedGraphic) {
1799
- const { from, to } = getAnimationAttributes(label, 'fadeIn');
1895
+ const { from, to } = getAnimationAttributes(text.attribute, 'fadeIn');
1800
1896
  this.add(text);
1801
1897
  relatedGraphic.onAnimateBind = () => {
1802
1898
  text.setAttributes(from);
@@ -1846,7 +1942,7 @@
1846
1942
  });
1847
1943
  }
1848
1944
  });
1849
- this._textMap = currentTextMap;
1945
+ this._graphicToText = currentTextMap;
1850
1946
  }
1851
1947
  _afterRelatedGraphicAttributeUpdate(text, texts, index, relatedGraphic, { mode, duration, easing, to, delay }) {
1852
1948
  const listener = (event) => {
@@ -1897,30 +1993,34 @@
1897
1993
  return listener;
1898
1994
  }
1899
1995
  _smartInvert(labels) {
1900
- if (this.attribute.smartInvert === false) {
1901
- return;
1902
- }
1996
+ const option = (this.attribute.smartInvert || {});
1997
+ const { textType, contrastRatiosThreshold, alternativeColors } = option;
1903
1998
  for (let i = 0; i < labels.length; i++) {
1904
- const label = labels?.[i];
1999
+ const label = labels[i];
1905
2000
  if (!label) {
1906
2001
  continue;
1907
2002
  }
1908
- const isInside = canPlaceInside(vrender.createText(label).AABBBounds, this._relationMap.get(label._relatedIndex)?.AABBBounds);
1909
- if (label.stroke && label.lineWidth > 0) {
1910
- label.fill = labelSmartInvert(label.fill, label.stroke, this.attribute.smartInvert?.textType, this.attribute.smartInvert?.contrastRatiosThreshold, this.attribute.smartInvert?.alternativeColors);
2003
+ const baseMark = this._idToGraphic.get(label.attribute.id);
2004
+ const isInside = canPlaceInside(label.AABBBounds, baseMark?.AABBBounds);
2005
+ if (label.attribute.stroke && label.attribute.lineWidth > 0) {
2006
+ label.setAttributes({
2007
+ fill: labelSmartInvert(label.attribute.fill, label.attribute.stroke, textType, contrastRatiosThreshold, alternativeColors)
2008
+ });
1911
2009
  }
1912
2010
  else if (isInside) {
1913
- const baseMark = this._relationMap.get(label._relatedIndex);
1914
2011
  const backgroundColor = baseMark.attribute.fill;
1915
- const foregroundColor = label.fill;
1916
- label.fill = labelSmartInvert(foregroundColor, backgroundColor, this.attribute.smartInvert?.textType, this.attribute.smartInvert?.contrastRatiosThreshold, this.attribute.smartInvert?.alternativeColors);
2012
+ const foregroundColor = label.attribute.fill;
2013
+ label.setAttributes({
2014
+ fill: labelSmartInvert(foregroundColor, backgroundColor, textType, contrastRatiosThreshold, alternativeColors)
2015
+ });
1917
2016
  }
1918
- else if (label.lineWidth > 0) {
1919
- const baseMark = this._relationMap.get(label._relatedIndex);
1920
- label.stroke = baseMark.attribute.fill;
1921
- const backgroundColor = label.stroke;
1922
- const foregroundColor = label.fill;
1923
- label.fill = labelSmartInvert(foregroundColor, backgroundColor, this.attribute.smartInvert?.textType, this.attribute.smartInvert?.contrastRatiosThreshold, this.attribute.smartInvert?.alternativeColors);
2017
+ else if (label.attribute.lineWidth > 0) {
2018
+ const backgroundColor = label.attribute.stroke;
2019
+ const foregroundColor = label.attribute.fill;
2020
+ label.setAttributes({
2021
+ stroke: baseMark.attribute.fill,
2022
+ fill: labelSmartInvert(foregroundColor, backgroundColor, textType, contrastRatiosThreshold, alternativeColors)
2023
+ });
1924
2024
  }
1925
2025
  }
1926
2026
  }
@@ -2375,6 +2475,7 @@
2375
2475
  },
2376
2476
  startSymbol: {
2377
2477
  visible: false,
2478
+ autoRotate: true,
2378
2479
  symbolType: 'triangle',
2379
2480
  size: 12,
2380
2481
  refX: 0,
@@ -2387,6 +2488,7 @@
2387
2488
  },
2388
2489
  endSymbol: {
2389
2490
  visible: false,
2491
+ autoRotate: true,
2390
2492
  symbolType: 'triangle',
2391
2493
  size: 12,
2392
2494
  refX: 0,
@@ -2458,6 +2560,7 @@
2458
2560
  this.add(line);
2459
2561
  }
2460
2562
  renderSymbol(attribute, dim) {
2563
+ const { autoRotate = true } = attribute;
2461
2564
  let symbol;
2462
2565
  if (attribute?.visible) {
2463
2566
  const startAngle = this._startAngle;
@@ -2486,7 +2589,7 @@
2486
2589
  ...position,
2487
2590
  symbolType: symbolType,
2488
2591
  size,
2489
- angle: rotate + refAngle,
2592
+ angle: autoRotate ? rotate + refAngle : 0,
2490
2593
  strokeBoundsBuffer: 0,
2491
2594
  ...style
2492
2595
  });
@@ -2522,6 +2625,7 @@
2522
2625
  AXIS_ELEMENT_NAME["gridRegion"] = "axis-grid-region";
2523
2626
  AXIS_ELEMENT_NAME["line"] = "axis-line";
2524
2627
  AXIS_ELEMENT_NAME["background"] = "axis-background";
2628
+ AXIS_ELEMENT_NAME["axisLabelBackground"] = "axis-label-background";
2525
2629
  })(exports.AXIS_ELEMENT_NAME || (exports.AXIS_ELEMENT_NAME = {}));
2526
2630
  exports.AxisStateValue = void 0;
2527
2631
  (function (AxisStateValue) {
@@ -2704,7 +2808,7 @@
2704
2808
  }
2705
2809
  };
2706
2810
  _renderInner(container) {
2707
- const { title, label, tick, line, grid, items, panel } = this.attribute;
2811
+ const { title, label, tick, line, grid, items } = this.attribute;
2708
2812
  const axisContainer = vrender.createGroup({ x: 0, y: 0, zIndex: 1 });
2709
2813
  axisContainer.name = exports.AXIS_ELEMENT_NAME.axisContainer;
2710
2814
  axisContainer.id = this._getNodeId('container');
@@ -2728,7 +2832,9 @@
2728
2832
  items.forEach((axisItems, layer) => {
2729
2833
  const layerLabelGroup = this.renderLabels(labelGroup, axisItems, layer);
2730
2834
  const labels = layerLabelGroup.getChildren();
2731
- this.handleLabelsOverlap(labels, axisItems, layer, items.length);
2835
+ this.beforeLabelsOverlap(labels, axisItems, layerLabelGroup, layer, items.length);
2836
+ this.handleLabelsOverlap(labels, axisItems, layerLabelGroup, layer, items.length);
2837
+ this.afterLabelsOverlap(labels, axisItems, layerLabelGroup, layer, items.length);
2732
2838
  });
2733
2839
  }
2734
2840
  if (grid?.visible) {
@@ -2738,22 +2844,6 @@
2738
2844
  if (title?.visible) {
2739
2845
  this.renderTitle(axisContainer);
2740
2846
  }
2741
- if (panel && panel.visible) {
2742
- const axisContainerBounds = axisContainer.AABBBounds;
2743
- const bgRect = vrender.createRect({
2744
- x: axisContainerBounds.x1,
2745
- y: axisContainerBounds.y1,
2746
- width: axisContainerBounds.width(),
2747
- height: axisContainerBounds.height(),
2748
- ...panel.style
2749
- });
2750
- bgRect.name = exports.AXIS_ELEMENT_NAME.background;
2751
- bgRect.id = this._getNodeId('background');
2752
- if (!vutils.isEmpty(panel.state)) {
2753
- bgRect.states = vutils.merge({}, DEFAULT_STATES$2, panel.state);
2754
- }
2755
- axisContainer.insertBefore(bgRect, axisContainer.firstChild);
2756
- }
2757
2847
  }
2758
2848
  renderTicks(container) {
2759
2849
  const tickLineItems = this.getTickLineItems();
@@ -2768,7 +2858,7 @@
2768
2858
  line.name = exports.AXIS_ELEMENT_NAME.tick;
2769
2859
  line.id = this._getNodeId(item.id);
2770
2860
  if (vutils.isEmpty(this.attribute.tick?.state)) {
2771
- line.states = null;
2861
+ line.states = DEFAULT_STATES$2;
2772
2862
  }
2773
2863
  else {
2774
2864
  const data = this.data[index];
@@ -2794,7 +2884,7 @@
2794
2884
  line.name = exports.AXIS_ELEMENT_NAME.subTick;
2795
2885
  line.id = this._getNodeId(`${index}`);
2796
2886
  if (vutils.isEmpty(subTick.state)) {
2797
- line.states = null;
2887
+ line.states = DEFAULT_STATES$2;
2798
2888
  }
2799
2889
  else {
2800
2890
  const subTickLineState = vutils.merge({}, DEFAULT_STATES$2, subTick.state);
@@ -2831,7 +2921,7 @@
2831
2921
  text.name = exports.AXIS_ELEMENT_NAME.label;
2832
2922
  text.id = this._getNodeId(`layer${layer}-label-${item.id}`);
2833
2923
  if (vutils.isEmpty(this.attribute.label?.state)) {
2834
- text.states = null;
2924
+ text.states = DEFAULT_STATES$2;
2835
2925
  }
2836
2926
  else {
2837
2927
  const labelState = vutils.merge({}, DEFAULT_STATES$2, this.attribute.label.state);
@@ -3280,7 +3370,7 @@
3280
3370
  ? orient === 'top' || orient === 'bottom'
3281
3371
  ? null
3282
3372
  : limitLength
3283
- : limitLength / Math.sin(label.attribute.angle);
3373
+ : Math.abs(limitLength / Math.sin(label.attribute.angle));
3284
3374
  label.setAttributes({
3285
3375
  maxLineWidth: limitLabelLength,
3286
3376
  ellipsis
@@ -3288,6 +3378,67 @@
3288
3378
  });
3289
3379
  }
3290
3380
 
3381
+ function alignAxisLabels(labels, start, containerSize, orient, align) {
3382
+ if (orient === 'right' || orient === 'left') {
3383
+ if (align === 'left') {
3384
+ const flag = orient === 'right' ? 0 : -1;
3385
+ labels.forEach(label => {
3386
+ label.setAttributes({
3387
+ x: start + containerSize * flag,
3388
+ textAlign: 'left'
3389
+ });
3390
+ });
3391
+ }
3392
+ else if (align === 'right') {
3393
+ const flag = orient === 'right' ? 1 : 0;
3394
+ labels.forEach(label => {
3395
+ label.setAttributes({
3396
+ x: start + containerSize * flag,
3397
+ textAlign: 'right'
3398
+ });
3399
+ });
3400
+ }
3401
+ else if (align === 'center') {
3402
+ const flag = orient === 'right' ? 1 : -1;
3403
+ labels.forEach(label => {
3404
+ label.setAttributes({
3405
+ x: start + containerSize * 0.5 * flag,
3406
+ textAlign: 'center'
3407
+ });
3408
+ });
3409
+ }
3410
+ }
3411
+ else if (orient === 'bottom' || orient === 'top') {
3412
+ if (align === 'top') {
3413
+ const flag = orient === 'bottom' ? 0 : -1;
3414
+ labels.forEach(label => {
3415
+ label.setAttributes({
3416
+ y: start + containerSize * flag,
3417
+ textBaseline: 'top'
3418
+ });
3419
+ });
3420
+ }
3421
+ else if (align === 'bottom') {
3422
+ const flag = orient === 'bottom' ? 1 : 0;
3423
+ labels.forEach(label => {
3424
+ label.setAttributes({
3425
+ y: start + containerSize * flag,
3426
+ textBaseline: 'bottom'
3427
+ });
3428
+ });
3429
+ }
3430
+ else if (align === 'middle') {
3431
+ const flag = orient === 'bottom' ? 1 : -1;
3432
+ labels.forEach(label => {
3433
+ label.setAttributes({
3434
+ y: start + containerSize * 0.5 * flag,
3435
+ textBaseline: 'middle'
3436
+ });
3437
+ });
3438
+ }
3439
+ }
3440
+ }
3441
+
3291
3442
  function getCirclePoints(center, count, radius, startAngle, endAngle) {
3292
3443
  const points = [];
3293
3444
  const range = endAngle - startAngle;
@@ -3305,6 +3456,25 @@
3305
3456
  this.setMode(mode);
3306
3457
  }
3307
3458
  }
3459
+ _renderInner(container) {
3460
+ super._renderInner(container);
3461
+ const { panel } = this.attribute;
3462
+ if (panel && panel.visible) {
3463
+ const axisContainer = this.axisContainer;
3464
+ const axisContainerBounds = axisContainer.AABBBounds;
3465
+ const bgRect = vrender.createRect({
3466
+ x: axisContainerBounds.x1,
3467
+ y: axisContainerBounds.y1,
3468
+ width: axisContainerBounds.width(),
3469
+ height: axisContainerBounds.height(),
3470
+ ...panel.style
3471
+ });
3472
+ bgRect.name = exports.AXIS_ELEMENT_NAME.background;
3473
+ bgRect.id = this._getNodeId('background');
3474
+ bgRect.states = vutils.merge({}, DEFAULT_STATES$1, panel.state ?? {});
3475
+ axisContainer.insertBefore(bgRect, axisContainer.firstChild);
3476
+ }
3477
+ }
3308
3478
  renderLine(container) {
3309
3479
  const { start, end, line } = this.attribute;
3310
3480
  const { startSymbol, endSymbol, style, breakRange, breakShape, breakShapeStyle, state, ...restLineAttrs } = line;
@@ -3469,13 +3639,11 @@
3469
3639
  textBaseline,
3470
3640
  ...textStyle
3471
3641
  },
3472
- state: vutils.isEmpty(state)
3473
- ? null
3474
- : {
3475
- text: state.text,
3476
- shape: state.shape,
3477
- panel: state.background
3478
- }
3642
+ state: {
3643
+ text: vutils.merge({}, DEFAULT_STATES$1, state?.text),
3644
+ shape: vutils.merge({}, DEFAULT_STATES$1, state?.shape),
3645
+ panel: vutils.merge({}, DEFAULT_STATES$1, state?.background)
3646
+ }
3479
3647
  };
3480
3648
  attrs.angle = angle;
3481
3649
  if (shape && shape.visible) {
@@ -3612,24 +3780,21 @@
3612
3780
  }
3613
3781
  return base;
3614
3782
  }
3615
- handleLabelsOverlap(labelShapes, labelData, layer, layerCount) {
3616
- if (vutils.isEmpty(labelShapes)) {
3617
- return;
3783
+ beforeLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
3784
+ const orient = this.attribute.orient;
3785
+ if (orient === 'left' || orient === 'right') {
3786
+ rotateYAxis(orient, labelShapes);
3618
3787
  }
3619
- const { verticalLimitSize, label, title, line, tick, orient } = this.attribute;
3620
- const labelSpace = label.space ?? 4;
3621
- let limitLength = verticalLimitSize;
3622
- let titleHeight = 0;
3623
- let titleSpacing = 0;
3624
- const axisLineWidth = line?.visible ? line.style.lineWidth ?? 1 : 0;
3625
- const tickLength = tick?.visible ? tick.length ?? 4 : 0;
3626
- if (title?.visible) {
3627
- titleHeight = measureTextSize(title.text, title.textStyle).height;
3628
- titleSpacing = title.space;
3788
+ else if (orient === 'bottom' || orient === 'top') {
3789
+ rotateXAxis(orient, labelShapes);
3629
3790
  }
3630
- if (limitLength) {
3631
- limitLength = (limitLength - labelSpace - titleSpacing - titleHeight - axisLineWidth - tickLength) / layerCount;
3791
+ }
3792
+ handleLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
3793
+ if (vutils.isEmpty(labelShapes)) {
3794
+ return;
3632
3795
  }
3796
+ const { verticalLimitSize, label, orient } = this.attribute;
3797
+ const limitLength = this._getAxisLabelLimitLength(verticalLimitSize, layerCount);
3633
3798
  const { layoutFunc, autoRotate: autoRotate$1, autoRotateAngle, autoLimit: autoLimit$1, limitEllipsis, autoHide: autoHide$1, autoHideMethod, autoHideSeparation } = label;
3634
3799
  if (vutils.isFunction(layoutFunc)) {
3635
3800
  layoutFunc(labelShapes, labelData, layer, this);
@@ -3657,6 +3822,79 @@
3657
3822
  }
3658
3823
  }
3659
3824
  }
3825
+ afterLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
3826
+ const { verticalLimitSize, orient } = this.attribute;
3827
+ const isHorizontal = orient === 'bottom' || orient === 'top';
3828
+ const axisLabelContainerBounds = labelContainer.AABBBounds;
3829
+ let axisLabelContainerSize = isHorizontal ? axisLabelContainerBounds.height() : axisLabelContainerBounds.width();
3830
+ const { verticalMinSize } = this.attribute;
3831
+ if (vutils.isValidNumber(verticalMinSize) && (!vutils.isValidNumber(verticalLimitSize) || verticalMinSize <= verticalLimitSize)) {
3832
+ const minSize = this._getAxisLabelLimitLength(verticalMinSize, layerCount);
3833
+ axisLabelContainerSize = Math.max(axisLabelContainerSize, minSize);
3834
+ let x;
3835
+ let y;
3836
+ if (orient === 'left') {
3837
+ x = axisLabelContainerBounds.x2 - axisLabelContainerSize;
3838
+ y = axisLabelContainerBounds.y1;
3839
+ }
3840
+ else if (orient === 'right') {
3841
+ x = axisLabelContainerBounds.x1;
3842
+ y = axisLabelContainerBounds.y1;
3843
+ }
3844
+ else if (orient === 'top') {
3845
+ x = axisLabelContainerBounds.x1;
3846
+ y = axisLabelContainerBounds.y2 - axisLabelContainerSize;
3847
+ }
3848
+ else if (orient === 'bottom') {
3849
+ x = axisLabelContainerBounds.x1;
3850
+ y = axisLabelContainerBounds.y1;
3851
+ }
3852
+ const bgRect = vrender.createRect({
3853
+ x,
3854
+ y,
3855
+ width: isHorizontal ? axisLabelContainerBounds.width() : axisLabelContainerSize,
3856
+ height: isHorizontal ? axisLabelContainerSize : axisLabelContainerBounds.height(),
3857
+ pickable: false
3858
+ });
3859
+ bgRect.name = exports.AXIS_ELEMENT_NAME.axisLabelBackground;
3860
+ bgRect.id = this._getNodeId('axis-label-background');
3861
+ labelContainer.insertBefore(bgRect, labelContainer.firstChild);
3862
+ }
3863
+ if (vutils.isValid(this.attribute.label.containerAlign)) {
3864
+ let start;
3865
+ if (orient === 'left') {
3866
+ start = axisLabelContainerBounds.x2;
3867
+ }
3868
+ else if (orient === 'right') {
3869
+ start = axisLabelContainerBounds.x1;
3870
+ }
3871
+ else if (orient === 'top') {
3872
+ start = axisLabelContainerBounds.y2;
3873
+ }
3874
+ else if (orient === 'bottom') {
3875
+ start = axisLabelContainerBounds.y1;
3876
+ }
3877
+ alignAxisLabels(labelShapes, start, axisLabelContainerSize, orient, this.attribute.label.containerAlign);
3878
+ }
3879
+ }
3880
+ _getAxisLabelLimitLength(limitSize, layerCount) {
3881
+ const { label, title, line, tick } = this.attribute;
3882
+ const labelSpace = label.space ?? 4;
3883
+ let limitLength = limitSize;
3884
+ let titleHeight = 0;
3885
+ let titleSpacing = 0;
3886
+ const axisLineWidth = line?.visible ? line.style.lineWidth ?? 1 : 0;
3887
+ const tickLength = tick?.visible ? tick.length ?? 4 : 0;
3888
+ if (title?.visible) {
3889
+ titleHeight = measureTextSize(title.text, title.textStyle).height;
3890
+ const padding = vutils.normalizePadding(title.padding);
3891
+ titleSpacing = title.space + padding[0] + padding[2];
3892
+ }
3893
+ if (limitLength) {
3894
+ limitLength = (limitLength - labelSpace - titleSpacing - titleHeight - axisLineWidth - tickLength) / layerCount;
3895
+ }
3896
+ return limitLength;
3897
+ }
3660
3898
  }
3661
3899
 
3662
3900
  class CircleAxis extends AxisBase {
@@ -3753,13 +3991,11 @@
3753
3991
  textAlign: 'center',
3754
3992
  ...textStyle
3755
3993
  },
3756
- state: vutils.isEmpty(state)
3757
- ? null
3758
- : {
3759
- text: state.text,
3760
- shape: state.shape,
3761
- panel: state.background
3762
- }
3994
+ state: {
3995
+ text: vutils.merge({}, DEFAULT_STATES$1, state?.text),
3996
+ shape: vutils.merge({}, DEFAULT_STATES$1, state?.shape),
3997
+ panel: vutils.merge({}, DEFAULT_STATES$1, state?.background)
3998
+ }
3763
3999
  };
3764
4000
  const { angle } = restAttrs;
3765
4001
  attrs.angle = angle;
@@ -3911,7 +4147,13 @@
3911
4147
  }
3912
4148
  return base;
3913
4149
  }
3914
- handleLabelsOverlap(labelShapes, labelData, layer, layerCount) {
4150
+ beforeLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
4151
+ return;
4152
+ }
4153
+ handleLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
4154
+ return;
4155
+ }
4156
+ afterLabelsOverlap(labelShapes, labelData, labelContainer, layer, layerCount) {
3915
4157
  return;
3916
4158
  }
3917
4159
  }
@@ -4124,7 +4366,7 @@
4124
4366
  }
4125
4367
  },
4126
4368
  middleHandlerStyle: {
4127
- visible: false,
4369
+ visible: true,
4128
4370
  background: {
4129
4371
  size: 8,
4130
4372
  style: {
@@ -4142,12 +4384,14 @@
4142
4384
  }
4143
4385
  },
4144
4386
  startHandlerStyle: {
4387
+ visible: true,
4145
4388
  symbolType: 'M -0.0544 0.25 C -0.0742 0.25 -0.0901 0.234 -0.0901 0.2143 L -0.0901 -0.1786 C -0.0901 -0.1983 -0.0742 -0.2143 -0.0544 -0.2143 L -0.0187 -0.2143 L -0.0187 -0.5 L 0.017 -0.5 L 0.017 -0.2143 L 0.0527 -0.2143 C 0.0724 -0.2143 0.0884 -0.1983 0.0884 -0.1786 L 0.0884 0.2143 C 0.0884 0.234 0.0724 0.25 0.0527 0.25 L 0.017 0.25 L 0.017 0.5 L -0.0187 0.5 L -0.0187 0.25 L -0.0544 0.25 Z M -0.0187 -0.1429 L -0.0544 -0.1429 L -0.0544 0.1786 L -0.0187 0.1786 L -0.0187 -0.1429 Z M 0.0527 -0.1429 L 0.017 -0.1429 L 0.017 0.1786 L 0.0527 0.1786 L 0.0527 -0.1429 Z',
4146
4389
  fill: 'white',
4147
4390
  stroke: '#B0C8F9',
4148
4391
  lineWidth: 0.5
4149
4392
  },
4150
4393
  endHandlerStyle: {
4394
+ visible: true,
4151
4395
  symbolType: 'M -0.0544 0.25 C -0.0742 0.25 -0.0901 0.234 -0.0901 0.2143 L -0.0901 -0.1786 C -0.0901 -0.1983 -0.0742 -0.2143 -0.0544 -0.2143 L -0.0187 -0.2143 L -0.0187 -0.5 L 0.017 -0.5 L 0.017 -0.2143 L 0.0527 -0.2143 C 0.0724 -0.2143 0.0884 -0.1983 0.0884 -0.1786 L 0.0884 0.2143 C 0.0884 0.234 0.0724 0.25 0.0527 0.25 L 0.017 0.25 L 0.017 0.5 L -0.0187 0.5 L -0.0187 0.25 L -0.0544 0.25 Z M -0.0187 -0.1429 L -0.0544 -0.1429 L -0.0544 0.1786 L -0.0187 0.1786 L -0.0187 -0.1429 Z M 0.0527 -0.1429 L 0.017 -0.1429 L 0.017 0.1786 L 0.0527 0.1786 L 0.0527 -0.1429 Z',
4152
4396
  fill: 'white',
4153
4397
  stroke: '#B0C8F9',
@@ -4219,7 +4463,7 @@
4219
4463
  _layoutAttrFromConfig;
4220
4464
  constructor(attributes) {
4221
4465
  super(vutils.merge({}, DataZoom.defaultAttributes, attributes));
4222
- const { start, end, size, orient, showDetail, position, previewData, previewCallbackX, previewCallbackY, previewCallbackX1, previewCallbackY1 } = this.attribute;
4466
+ const { start, end, size, orient, showDetail, position, previewData, previewCallbackX, previewCallbackY, previewCallbackX1, previewCallbackY1, updateStateCallback } = this.attribute;
4223
4467
  const { width, height } = size;
4224
4468
  start && (this.state.start = start);
4225
4469
  end && (this.state.end = end);
@@ -4240,6 +4484,7 @@
4240
4484
  vutils.isFunction(previewCallbackY) && (this._previewCallbackY = previewCallbackY);
4241
4485
  vutils.isFunction(previewCallbackX1) && (this._previewCallbackX1 = previewCallbackX1);
4242
4486
  vutils.isFunction(previewCallbackY1) && (this._previewCallbackY1 = previewCallbackY1);
4487
+ vutils.isFunction(updateStateCallback) && (this._updateStateCallback = updateStateCallback);
4243
4488
  }
4244
4489
  bindEvents() {
4245
4490
  const { showDetail, brushSelect } = this.attribute;
@@ -4268,9 +4513,9 @@
4268
4513
  if (this._selectedPreviewGroup) {
4269
4514
  this._selectedPreviewGroup.addEventListener('pointerdown', (e) => this._onHandlerPointerDown(e, selectedTag));
4270
4515
  }
4271
- if (vrender.vglobal.env === 'browser') {
4272
- vrender.vglobal.addEventListener('pointermove', this._onHandlerPointerMove.bind(this));
4273
- vrender.vglobal.addEventListener('pointerup', this._onHandlerPointerUp.bind(this));
4516
+ if (vrender.global.env === 'browser') {
4517
+ vrender.global.addEventListener('pointermove', this._onHandlerPointerMove.bind(this));
4518
+ vrender.global.addEventListener('pointerup', this._onHandlerPointerUp.bind(this));
4274
4519
  }
4275
4520
  this.addEventListener('pointermove', this._onHandlerPointerMove);
4276
4521
  this.addEventListener('pointerup', this._onHandlerPointerUp);
@@ -4514,7 +4759,7 @@
4514
4759
  if (this._layoutAttrFromConfig) {
4515
4760
  return this._layoutAttrFromConfig;
4516
4761
  }
4517
- const { position: positionConfig, size, orient, middleHandlerStyle } = this.attribute;
4762
+ const { position: positionConfig, size, orient, middleHandlerStyle, startHandlerStyle, endHandlerStyle } = this.attribute;
4518
4763
  const { width: widthConfig, height: heightConfig } = size;
4519
4764
  const middleHandlerSize = middleHandlerStyle?.background?.size ?? 10;
4520
4765
  let width;
@@ -4543,6 +4788,24 @@
4543
4788
  height = heightConfig;
4544
4789
  position = positionConfig;
4545
4790
  }
4791
+ const startHandlerSize = startHandlerStyle?.size ?? (this._isHorizontal ? height : width);
4792
+ const endHandlerSize = endHandlerStyle?.size ?? (this._isHorizontal ? height : width);
4793
+ if (startHandlerStyle?.visible) {
4794
+ if (this._isHorizontal) {
4795
+ width -= (startHandlerSize + endHandlerSize) / 2;
4796
+ position = {
4797
+ x: position.x + startHandlerSize / 2,
4798
+ y: position.y
4799
+ };
4800
+ }
4801
+ else {
4802
+ height -= (startHandlerSize + endHandlerSize) / 2;
4803
+ position = {
4804
+ x: position.x,
4805
+ y: position.y + startHandlerSize
4806
+ };
4807
+ }
4808
+ }
4546
4809
  this._layoutAttrFromConfig = {
4547
4810
  position,
4548
4811
  width,
@@ -4797,10 +5060,9 @@
4797
5060
  else {
4798
5061
  this._selectedPreviewArea = this._selectedPreviewGroup.createOrUpdateChild('selectedPreviewArea', { curveType: 'basis' }, 'area');
4799
5062
  }
4800
- const { position, size, selectedBackgroundChartStyle } = this.attribute;
4801
- const { width, height } = size;
5063
+ const { selectedBackgroundChartStyle } = this.attribute;
4802
5064
  const { start, end } = this.state;
4803
- this.computeBasePoints();
5065
+ const { position, width, height } = this.getLayoutAttrFromConfig();
4804
5066
  this._selectedPreviewGroupClip.setAttributes({
4805
5067
  x: this._isHorizontal ? position.x + start * width : position.x,
4806
5068
  y: this._isHorizontal ? position.y : position.y + start * height,
@@ -4850,6 +5112,7 @@
4850
5112
  this.state.end = end;
4851
5113
  if (startAttr !== this.state.start || endAttr !== this.state.end) {
4852
5114
  this.setAttributes({ start, end });
5115
+ this._updateStateCallback && this._updateStateCallback(start, end);
4853
5116
  }
4854
5117
  }
4855
5118
  }
@@ -6233,7 +6496,9 @@
6233
6496
  const innerGroupBounds = innerGroup.AABBBounds;
6234
6497
  const innerGroupWidth = innerGroupBounds.width();
6235
6498
  const innerGroupHeight = innerGroupBounds.height();
6236
- const itemGroupWidth = this._itemWidthByUser || innerGroupWidth + parsedPadding[1] + parsedPadding[3];
6499
+ const itemGroupWidth = vutils.isValid(this.attribute.item.width)
6500
+ ? this.attribute.item.width
6501
+ : innerGroupWidth + parsedPadding[1] + parsedPadding[3];
6237
6502
  const itemGroupHeight = this._itemHeightByUser || innerGroupHeight + parsedPadding[0] + parsedPadding[2];
6238
6503
  itemGroup.attribute.width = itemGroupWidth;
6239
6504
  itemGroup.attribute.height = itemGroupHeight;
@@ -6925,9 +7190,9 @@
6925
7190
  e.stopPropagation();
6926
7191
  this._currentHandler = e.target;
6927
7192
  this._prePos = this._isHorizontal ? e.clientX : e.clientY;
6928
- if (vrender.vglobal.env === 'browser') {
6929
- vrender.vglobal.addEventListener('pointermove', this._onHandlerPointerMove);
6930
- vrender.vglobal.addEventListener('pointerup', this._onHandlerPointerUp);
7193
+ if (vrender.global.env === 'browser') {
7194
+ vrender.global.addEventListener('pointermove', this._onHandlerPointerMove);
7195
+ vrender.global.addEventListener('pointerup', this._onHandlerPointerUp);
6931
7196
  }
6932
7197
  else {
6933
7198
  this._currentHandler.addEventListener('pointermove', this._onHandlerPointerMove);
@@ -6969,9 +7234,9 @@
6969
7234
  _onHandlerPointerUp = (e) => {
6970
7235
  e.preventDefault();
6971
7236
  this._currentHandler = null;
6972
- if (vrender.vglobal.env === 'browser') {
6973
- vrender.vglobal.removeEventListener('pointermove', this._onHandlerPointerMove);
6974
- vrender.vglobal.removeEventListener('pointerup', this._onHandlerPointerUp);
7237
+ if (vrender.global.env === 'browser') {
7238
+ vrender.global.removeEventListener('pointermove', this._onHandlerPointerMove);
7239
+ vrender.global.removeEventListener('pointerup', this._onHandlerPointerUp);
6975
7240
  }
6976
7241
  else {
6977
7242
  const currentTarget = e.target;
@@ -6983,9 +7248,9 @@
6983
7248
  _onTrackPointerdown = (e) => {
6984
7249
  e.stopPropagation();
6985
7250
  this._prePos = this._isHorizontal ? e.clientX : e.clientY;
6986
- if (vrender.vglobal.env === 'browser') {
6987
- vrender.vglobal.addEventListener('pointermove', this._onTrackPointerMove);
6988
- vrender.vglobal.addEventListener('pointerup', this._onTrackPointerUp);
7251
+ if (vrender.global.env === 'browser') {
7252
+ vrender.global.addEventListener('pointermove', this._onTrackPointerMove);
7253
+ vrender.global.addEventListener('pointerup', this._onTrackPointerUp);
6989
7254
  }
6990
7255
  else {
6991
7256
  this._track.addEventListener('pointermove', this._onTrackPointerMove);
@@ -7037,9 +7302,9 @@
7037
7302
  };
7038
7303
  _onTrackPointerUp = (e) => {
7039
7304
  e.preventDefault();
7040
- if (vrender.vglobal.env === 'browser') {
7041
- vrender.vglobal.removeEventListener('pointermove', this._onTrackPointerMove);
7042
- vrender.vglobal.removeEventListener('pointerup', this._onTrackPointerUp);
7305
+ if (vrender.global.env === 'browser') {
7306
+ vrender.global.removeEventListener('pointermove', this._onTrackPointerMove);
7307
+ vrender.global.removeEventListener('pointerup', this._onTrackPointerUp);
7043
7308
  }
7044
7309
  else {
7045
7310
  this._track.removeEventListener('pointermove', this._onTrackPointerMove);
@@ -8580,7 +8845,7 @@
8580
8845
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnPlay);
8581
8846
  this._isReachEnd = false;
8582
8847
  this._tickTime = Date.now();
8583
- this._rafId = vrender.vglobal.getRequestAnimationFrame()(this._play.bind(this, true));
8848
+ this._rafId = vrender.global.getRequestAnimationFrame()(this._play.bind(this, true));
8584
8849
  };
8585
8850
  _play = (isFirstPlay) => {
8586
8851
  const now = Date.now();
@@ -8603,7 +8868,7 @@
8603
8868
  (this._direction === 'reverse' && this._dataIndex <= this._minIndex)) {
8604
8869
  this._isReachEnd = true;
8605
8870
  }
8606
- this._rafId = vrender.vglobal.getRequestAnimationFrame()(this._play.bind(this, false));
8871
+ this._rafId = vrender.global.getRequestAnimationFrame()(this._play.bind(this, false));
8607
8872
  };
8608
8873
  _updateDataIndex = (dataIndex) => {
8609
8874
  this._dataIndex = dataIndex;
@@ -8612,7 +8877,7 @@
8612
8877
  _playEnd = () => {
8613
8878
  this._isPlaying = false;
8614
8879
  this._controller.togglePlay();
8615
- vrender.vglobal.getCancelAnimationFrame()(this._rafId);
8880
+ vrender.global.getCancelAnimationFrame()(this._rafId);
8616
8881
  this._activeIndex = -1;
8617
8882
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnEnd);
8618
8883
  };
@@ -8621,7 +8886,7 @@
8621
8886
  return;
8622
8887
  }
8623
8888
  this._isPlaying = false;
8624
- vrender.vglobal.getCancelAnimationFrame()(this._rafId);
8889
+ vrender.global.getCancelAnimationFrame()(this._rafId);
8625
8890
  this._controller.togglePlay();
8626
8891
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnPause);
8627
8892
  };
@@ -8732,7 +8997,7 @@
8732
8997
  }
8733
8998
  this._startTime = Date.now() - this._elapsed;
8734
8999
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnPlay);
8735
- this._rafId = vrender.vglobal.getRequestAnimationFrame()(this._play.bind(this));
9000
+ this._rafId = vrender.global.getRequestAnimationFrame()(this._play.bind(this));
8736
9001
  };
8737
9002
  _play = () => {
8738
9003
  this._elapsed = Date.now() - this._startTime;
@@ -8742,11 +9007,11 @@
8742
9007
  this._playEnd();
8743
9008
  return;
8744
9009
  }
8745
- this._rafId = vrender.vglobal.getRequestAnimationFrame()(this._play.bind(this));
9010
+ this._rafId = vrender.global.getRequestAnimationFrame()(this._play.bind(this));
8746
9011
  };
8747
9012
  _playEnd = () => {
8748
9013
  this._isPlaying = false;
8749
- vrender.vglobal.getCancelAnimationFrame()(this._rafId);
9014
+ vrender.global.getCancelAnimationFrame()(this._rafId);
8750
9015
  this._controller.togglePlay();
8751
9016
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnEnd);
8752
9017
  };
@@ -8756,7 +9021,7 @@
8756
9021
  }
8757
9022
  this._isPlaying = false;
8758
9023
  this._elapsed = Date.now() - this._startTime;
8759
- vrender.vglobal.getCancelAnimationFrame()(this._rafId);
9024
+ vrender.global.getCancelAnimationFrame()(this._rafId);
8760
9025
  this._controller.togglePlay();
8761
9026
  this.dispatchCustomEvent(exports.PlayerEventEnum.OnPause);
8762
9027
  };
@@ -9501,7 +9766,7 @@
9501
9766
  }
9502
9767
  }
9503
9768
 
9504
- const version = "0.14.0-alpha.0";
9769
+ const version = "0.14.0-alpha.10";
9505
9770
 
9506
9771
  exports.AbstractComponent = AbstractComponent;
9507
9772
  exports.BasePlayer = BasePlayer;