@visactor/vrender-components 0.21.0-vstory.2 → 0.21.1-alpha.0

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 (120) hide show
  1. package/cjs/axis/type.d.ts +2 -2
  2. package/cjs/axis/type.js.map +1 -1
  3. package/cjs/core/base.d.ts +0 -1
  4. package/cjs/core/base.js +3 -3
  5. package/cjs/core/base.js.map +1 -1
  6. package/cjs/data-zoom/type.d.ts +1 -1
  7. package/cjs/data-zoom/type.js.map +1 -1
  8. package/cjs/index.d.ts +1 -2
  9. package/cjs/index.js +2 -2
  10. package/cjs/index.js.map +1 -1
  11. package/cjs/interface.d.ts +1 -2
  12. package/cjs/interface.js.map +1 -1
  13. package/cjs/label/arc.js +1 -1
  14. package/cjs/label/arc.js.map +1 -1
  15. package/cjs/label/base.js +20 -10
  16. package/cjs/label/base.js.map +1 -1
  17. package/cjs/label/overlap/place.d.ts +6 -1
  18. package/cjs/label/overlap/place.js +4 -4
  19. package/cjs/label/overlap/place.js.map +1 -1
  20. package/cjs/label/overlap/shiftY.d.ts +10 -4
  21. package/cjs/label/overlap/shiftY.js +103 -27
  22. package/cjs/label/overlap/shiftY.js.map +1 -1
  23. package/cjs/legend/color/type.d.ts +2 -2
  24. package/cjs/legend/color/type.js.map +1 -1
  25. package/cjs/legend/discrete/discrete.d.ts +7 -0
  26. package/cjs/legend/discrete/discrete.js +106 -23
  27. package/cjs/legend/discrete/discrete.js.map +1 -1
  28. package/cjs/legend/discrete/type.d.ts +16 -4
  29. package/cjs/legend/discrete/type.js.map +1 -1
  30. package/cjs/marker/point.js +4 -2
  31. package/cjs/marker/point.js.map +1 -1
  32. package/cjs/marker/type.d.ts +2 -2
  33. package/cjs/marker/type.js.map +1 -1
  34. package/cjs/player/type/discrete-player.d.ts +3 -3
  35. package/cjs/player/type/discrete-player.js.map +1 -1
  36. package/cjs/player/type/index.d.ts +2 -2
  37. package/cjs/player/type/index.js.map +1 -1
  38. package/cjs/radio/radio.d.ts +2 -2
  39. package/cjs/radio/radio.js +1 -1
  40. package/cjs/radio/radio.js.map +1 -1
  41. package/cjs/scrollbar/index.d.ts +1 -0
  42. package/cjs/scrollbar/index.js +2 -1
  43. package/cjs/scrollbar/index.js.map +1 -1
  44. package/cjs/scrollbar/scrollbar-plugin.d.ts +18 -15
  45. package/cjs/scrollbar/scrollbar-plugin.js +109 -97
  46. package/cjs/scrollbar/scrollbar-plugin.js.map +1 -1
  47. package/cjs/timeline/type.js.map +1 -1
  48. package/dist/index.es.js +9544 -9394
  49. package/es/axis/type.d.ts +2 -2
  50. package/es/axis/type.js.map +1 -1
  51. package/es/core/base.d.ts +0 -1
  52. package/es/core/base.js +3 -4
  53. package/es/core/base.js.map +1 -1
  54. package/es/data-zoom/type.d.ts +1 -1
  55. package/es/data-zoom/type.js.map +1 -1
  56. package/es/index.d.ts +1 -2
  57. package/es/index.js +1 -3
  58. package/es/index.js.map +1 -1
  59. package/es/interface.d.ts +1 -2
  60. package/es/interface.js.map +1 -1
  61. package/es/label/arc.js +1 -1
  62. package/es/label/arc.js.map +1 -1
  63. package/es/label/base.js +20 -9
  64. package/es/label/base.js.map +1 -1
  65. package/es/label/overlap/place.d.ts +6 -1
  66. package/es/label/overlap/place.js +4 -4
  67. package/es/label/overlap/place.js.map +1 -1
  68. package/es/label/overlap/shiftY.d.ts +10 -4
  69. package/es/label/overlap/shiftY.js +99 -24
  70. package/es/label/overlap/shiftY.js.map +1 -1
  71. package/es/legend/color/type.d.ts +2 -2
  72. package/es/legend/color/type.js.map +1 -1
  73. package/es/legend/discrete/discrete.d.ts +7 -0
  74. package/es/legend/discrete/discrete.js +106 -24
  75. package/es/legend/discrete/discrete.js.map +1 -1
  76. package/es/legend/discrete/type.d.ts +16 -4
  77. package/es/legend/discrete/type.js.map +1 -1
  78. package/es/marker/point.js +4 -2
  79. package/es/marker/point.js.map +1 -1
  80. package/es/marker/type.d.ts +2 -2
  81. package/es/marker/type.js.map +1 -1
  82. package/es/player/type/discrete-player.d.ts +3 -3
  83. package/es/player/type/discrete-player.js.map +1 -1
  84. package/es/player/type/index.d.ts +2 -2
  85. package/es/player/type/index.js.map +1 -1
  86. package/es/radio/radio.d.ts +2 -2
  87. package/es/radio/radio.js +2 -2
  88. package/es/radio/radio.js.map +1 -1
  89. package/es/scrollbar/index.d.ts +1 -0
  90. package/es/scrollbar/index.js +2 -0
  91. package/es/scrollbar/index.js.map +1 -1
  92. package/es/scrollbar/scrollbar-plugin.d.ts +18 -15
  93. package/es/scrollbar/scrollbar-plugin.js +111 -94
  94. package/es/scrollbar/scrollbar-plugin.js.map +1 -1
  95. package/es/timeline/type.js.map +1 -1
  96. package/package.json +8 -7
  97. package/cjs/weather/index.d.ts +0 -1
  98. package/cjs/weather/index.js +0 -21
  99. package/cjs/weather/index.js.map +0 -1
  100. package/cjs/weather/register.d.ts +0 -1
  101. package/cjs/weather/register.js +0 -14
  102. package/cjs/weather/register.js.map +0 -1
  103. package/cjs/weather/type.d.ts +0 -24
  104. package/cjs/weather/type.js +0 -6
  105. package/cjs/weather/type.js.map +0 -1
  106. package/cjs/weather/weather-box.d.ts +0 -13
  107. package/cjs/weather/weather-box.js +0 -129
  108. package/cjs/weather/weather-box.js.map +0 -1
  109. package/es/weather/index.d.ts +0 -1
  110. package/es/weather/index.js +0 -2
  111. package/es/weather/index.js.map +0 -1
  112. package/es/weather/register.d.ts +0 -1
  113. package/es/weather/register.js +0 -6
  114. package/es/weather/register.js.map +0 -1
  115. package/es/weather/type.d.ts +0 -24
  116. package/es/weather/type.js +0 -2
  117. package/es/weather/type.js.map +0 -1
  118. package/es/weather/weather-box.d.ts +0 -13
  119. package/es/weather/weather-box.js +0 -127
  120. package/es/weather/weather-box.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":"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","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\n\nexport interface IShiftYOption {\n maxIterations?: number;\n maxError?: number;\n padding?: number;\n maxY?: number;\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption = {}) {\n const { maxIterations = 10, maxError = 0.1, padding = 1, maxY = Number.MAX_VALUE } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n const isIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n };\n\n const textInformation = new Map<IText, { y0: number; y: number; height: number; x1: number; x2: number }>();\n\n // y0 : 初始位置\n // y : 最终位置\n // height : 高度\n // x1, x2 : 左右边界\n const getY0 = (text: IText) => textInformation.get(text).y0;\n const getY = (text: IText) => textInformation.get(text).y;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const setY = (text: IText, y: number) => {\n textInformation.get(text).y = y;\n };\n\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n textInformation.set(text, { y0: y1, y: y1, height: y2 - y1, x1, x2 });\n }\n\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY(a) - getY(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y0 = getY(curText);\n const h0 = getHeight(curText);\n const y1 = getY(nextText);\n const delta = y1 - (y0 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n setY(curText, y0 - (padding - delta));\n } else if (y0 - newDelta < 0) {\n setY(nextText, y1 + (padding - delta));\n } else {\n setY(curText, y0 - newDelta);\n setY(nextText, y1 + newDelta);\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY(text) - getY0(text);\n text.setAttribute('y', finalY);\n }\n\n return texts;\n}\n"]}
1
+ {"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":"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","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\nimport { isNumberClose } from '@visactor/vutils';\n\nexport interface IShiftYOption {\n labelling: (...args: any[]) => any;\n\n maxY?: number;\n globalShiftY?: {\n /**\n * 是否开启全局调整,开启后,所有文字会整体调整,否则只会按照 x 分组调整 top/bottom\n * @default true\n */\n enable?: boolean;\n /**\n * 最大迭代次数\n * @default 10\n */\n maxIterations?: number;\n /**\n * 最大误差\n * @default 0.1\n */\n maxError?: number;\n /**\n * 调整后 text 之间的 padding\n * @default 1\n */\n padding?: number;\n /**\n * 每个 text 最大被调整的次数\n * @default 1000\n */\n maxAttempts?: number;\n /**\n * 每个 text 调整的 y 坐标差值限制\n */\n deltaYTolerance?: number;\n };\n}\n\nconst isIntersect = (top: number, bottom: number) => {\n return Math.ceil(top) > Math.floor(bottom);\n};\n\nconst isXIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n};\n\nfunction getIntersectionLength(range1: number[], range2: number[]) {\n const [start1, end1] = range1;\n const [start2, end2] = range2;\n\n const start = Math.max(start1, start2);\n const end = Math.min(end1, end2);\n\n return Math.max(0, end - start);\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption) {\n const {\n maxY = Number.MAX_VALUE,\n labelling,\n globalShiftY = { enable: true, maxIterations: 10, maxError: 0.1, padding: 1 }\n } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n // 根据 x 坐标给 text 分组,存放信息到 map 中\n const xMap = new Map<{ start: number; end: number }, IText[]>();\n const textInformation = new Map<\n IText,\n {\n y1Initial: number;\n y1: number;\n y: number;\n y2: number;\n height: number;\n x1: number;\n x2: number;\n x: number;\n attempts: number;\n }\n >();\n\n const getY1Initial = (text: IText) => textInformation.get(text).y1Initial;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getY1 = (text: IText) => textInformation.get(text).y1;\n const getY = (text: IText) => textInformation.get(text).y;\n const getX = (text: IText) => textInformation.get(text).x;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const getAdjustAttempts = (text: IText) => textInformation.get(text).attempts;\n\n const setY1 = (text: IText, y: number) => {\n textInformation.get(text).y1 = y;\n };\n\n const setAdjustAttempts = (text: IText, attempts: number) => {\n textInformation.get(text).attempts = attempts;\n };\n\n function adjustPositionInOneGroup(texts: IText[]) {\n if (texts.length === 1) {\n return;\n }\n // 从最后一个 text 向前遍历,如果与前一个 text 相交,则尝试放到下方(需要判断和前一个 text 是否相交,若相交则不能放到下方)\n for (let i = texts.length - 1; i > 0; i--) {\n const curText = texts[i];\n const upperText = texts[i - 1];\n const lowerText = texts[i + 1];\n\n // 当前 text 和上面一个 text 相交\n if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) {\n const { y } = labelling(curText);\n // 挪动当前 text 后, 和下面一个 text 不相交\n if (!lowerText || !isIntersect(y + getHeight(curText) / 2, getY1(lowerText))) {\n if (y + getHeight(curText) / 2 <= maxY) {\n setY1(curText, getY1(curText) + y - getY(curText));\n }\n }\n }\n }\n }\n\n // 根据 x 坐标进行分组\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n const { x, y } = text.attribute;\n textInformation.set(text, { y1Initial: y1, y1, y2, y, height: y2 - y1, x1, x2, x, attempts: 0 });\n let hasRange = false;\n\n for (const [range, xGroupTexts] of xMap) {\n const { start, end } = range;\n // 1. x1,x2 在 start 和 end 范围内\n if (x1 >= start && x2 <= end) {\n xGroupTexts.push(text);\n hasRange = true;\n }\n // 2. x 坐标接近,相差在 5px 以内\n else if (isNumberClose(x, getX(xGroupTexts[0]), undefined, 5)) {\n // x 坐标相等,也纳入到一个分组中,并且要扩大分组 range\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n // 3. 与区间相交范围 > 50%\n else if (getIntersectionLength([start, end], [x1, x2]) / (end - start) > 0.5) {\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n\n if (hasRange) {\n break;\n }\n }\n\n if (!hasRange) {\n xMap.set({ start: x1, end: x2 }, [text]);\n }\n }\n\n // 对每个 x 坐标的 text 数组进行排序\n for (const xTexts of xMap.values()) {\n // 从上到下排序\n xTexts.sort((a, b) => getY1Initial(a) - getY1Initial(b));\n adjustPositionInOneGroup(xTexts);\n }\n\n // 整体调整一次 Y 坐标,进行散开\n if (globalShiftY.enable !== false) {\n const {\n maxIterations = 10,\n maxError = 0.1,\n padding = 1,\n maxAttempts = 1000,\n deltaYTolerance = Number.MAX_VALUE\n } = globalShiftY;\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY1(a) - getY1(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n if (getAdjustAttempts(curText) >= maxAttempts) {\n continue;\n }\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isXIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y1 = getY1(curText);\n const h0 = getHeight(curText);\n const nextY1 = getY1(nextText);\n const delta = nextY1 - (y1 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n const newY1 = y1 - (padding - delta);\n const curTextDelta = getY1Initial(curText) - newY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance) {\n setY1(curText, newY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n }\n } else if (y1 - newDelta < 0) {\n const newY1 = nextY1 + (padding - delta);\n const nextTextDelta = getY1Initial(nextText) - newY1;\n if (Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(nextText, newY1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n } else {\n const newCurY1 = y1 - newDelta;\n const curTextDelta = getY1Initial(curText) - newCurY1;\n const newNextY1 = nextY1 + newDelta;\n const nextTextDelta = getY1Initial(nextText) - newNextY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(curText, newCurY1);\n setY1(nextText, newNextY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY1(text) - getY1Initial(text);\n text.setAttribute('y', finalY);\n }\n\n const result = [];\n // 调整文字顺序,越靠前的越优先占据空间\n // texts 按照 x 进行排序,然后左右交替,保证首尾标签优先展示\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n let start = 0;\n let end = texts.length - 1;\n\n while (start <= end) {\n if (start === end) {\n result.push(texts[start]);\n } else {\n result.push(texts[start]);\n result.push(texts[end]);\n }\n start++;\n end--;\n }\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { SliderAttributes } from '../../slider/type';
2
- import { LegendBaseAttributes } from '../type';
1
+ import type { SliderAttributes } from '../../slider/type';
2
+ import type { LegendBaseAttributes } from '../type';
3
3
  export type ColorLegendAttributes = {
4
4
  colors: string[];
5
5
  } & Omit<SliderAttributes, 'step' | 'range'> & LegendBaseAttributes;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import { SliderAttributes } from '../../slider/type';\nimport { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
1
+ {"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { SliderAttributes } from '../../slider/type';\nimport type { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
@@ -1,3 +1,4 @@
1
+ import type { IGroup } from '@visactor/vrender-core';
1
2
  import { LegendBase } from '../base';
2
3
  import type { DiscreteLegendAttrs, LegendItemDatum } from './type';
3
4
  import type { ComponentOptions } from '../../interface';
@@ -12,6 +13,8 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
12
13
  private _pagerComponent;
13
14
  private _lastActiveItem;
14
15
  private _itemContext;
16
+ private _scrollMask;
17
+ private _scrollMaskContext;
15
18
  static defaultAttributes: Partial<DiscreteLegendAttrs>;
16
19
  constructor(attributes: DiscreteLegendAttrs, options?: ComponentOptions);
17
20
  render(): void;
@@ -29,6 +32,7 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
29
32
  currentPage: number;
30
33
  totalPage: number;
31
34
  isScrollbar: boolean;
35
+ clipContainer: IGroup;
32
36
  };
33
37
  protected _renderContent(): void;
34
38
  protected _bindEvents(): void;
@@ -37,10 +41,13 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
37
41
  private _createPager;
38
42
  private _createScrollbar;
39
43
  private _updatePositionOfPager;
44
+ private _computeScrollbarDelta;
40
45
  private _updatePositionOfScrollbar;
41
46
  private _bindEventsOfPager;
42
47
  private _renderPager;
43
48
  private _renderScrollbar;
49
+ private renderScrollMask;
50
+ private updateScrollMask;
44
51
  private _renderPagerComponent;
45
52
  private _onHover;
46
53
  private _onUnHover;
@@ -146,7 +146,8 @@ class DiscreteLegend extends base_1.LegendBase {
146
146
  items: legendItems,
147
147
  isHorizontal: isHorizontal,
148
148
  totalPage: 1 / 0,
149
- isScrollbar: pager && "scrollbar" === pager.type
149
+ isScrollbar: pager && "scrollbar" === pager.type,
150
+ clipContainer: void 0
150
151
  }, this._itemContext = this._renderItems();
151
152
  let pagerRendered = !1;
152
153
  this._itemContext.doWrap && autoPage && this._itemContext.pages > this._itemContext.maxPages && (pagerRendered = this._renderPagerComponent()),
@@ -157,8 +158,16 @@ class DiscreteLegend extends base_1.LegendBase {
157
158
  if (this.attribute.disableTriggerEvent) return;
158
159
  if (!this._itemsContainer) return;
159
160
  const {hover: hover = !0, select: select = !0} = this.attribute;
160
- hover && (this._itemsContainer.addEventListener("pointermove", this._onHover), this._itemsContainer.addEventListener("pointerleave", this._onUnHover)),
161
- select && this._itemsContainer.addEventListener("pointerdown", this._onClick);
161
+ if (hover) {
162
+ let trigger = "pointermove", triggerOff = "pointerleave";
163
+ (0, vutils_1.isObject)(hover) && (hover.trigger && (trigger = hover.trigger), hover.triggerOff && (triggerOff = hover.triggerOff)),
164
+ this._itemsContainer.addEventListener(trigger, this._onHover), this._itemsContainer.addEventListener(triggerOff, this._onUnHover);
165
+ }
166
+ if (select) {
167
+ let trigger = "pointerdown";
168
+ (0, vutils_1.isObject)(select) && select.trigger && (trigger = select.trigger),
169
+ this._itemsContainer.addEventListener(trigger, this._onClick);
170
+ }
162
171
  }
163
172
  _autoEllipsis(autoEllipsisStrategy, layoutWidth, labelShape, valueShape) {
164
173
  var _a, _b;
@@ -301,12 +310,12 @@ class DiscreteLegend extends base_1.LegendBase {
301
310
  direction: "horizontal",
302
311
  disableTriggerEvent: disableTriggerEvent,
303
312
  range: [ 0, .5 ],
304
- height: 12
313
+ height: !1 === compStyle.visible ? 0 : 12
305
314
  }, compStyle), {
306
315
  width: compSize
307
316
  })) : new scrollbar_1.ScrollBar(Object.assign(Object.assign({
308
317
  direction: "vertical",
309
- width: 12,
318
+ width: !1 === compStyle.visible ? 0 : 12,
310
319
  range: [ 0, .5 ]
311
320
  }, compStyle), {
312
321
  height: compSize,
@@ -331,9 +340,15 @@ class DiscreteLegend extends base_1.LegendBase {
331
340
  });
332
341
  }
333
342
  }
343
+ _computeScrollbarDelta() {
344
+ const {isHorizontal: isHorizontal, clipContainer: clipContainer} = this._itemContext, itemContainerBounds = this._itemsContainer.AABBBounds, clipContainerBounds = clipContainer.AABBBounds;
345
+ let delta, innerViewSize;
346
+ return isHorizontal ? (innerViewSize = clipContainerBounds.width(), delta = innerViewSize / itemContainerBounds.width()) : (innerViewSize = clipContainerBounds.height(),
347
+ delta = innerViewSize / itemContainerBounds.height()), delta;
348
+ }
334
349
  _updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY) {
335
- const {currentPage: currentPage, totalPage: totalPage, isHorizontal: isHorizontal} = this._itemContext;
336
- this._pagerComponent.setScrollRange([ (currentPage - 1) / totalPage, currentPage / totalPage ]),
350
+ const {isHorizontal: isHorizontal, currentPage: currentPage, totalPage: totalPage} = this._itemContext, start = (currentPage - 1) / totalPage;
351
+ this._pagerComponent.setScrollRange([ start, start + this._computeScrollbarDelta() ]),
337
352
  isHorizontal ? this._pagerComponent.setAttributes({
338
353
  x: 0,
339
354
  y: renderStartY + contentHeight
@@ -346,20 +361,32 @@ class DiscreteLegend extends base_1.LegendBase {
346
361
  const pager = this.attribute.pager || {}, {animation: animation = !0, animationDuration: animationDuration = 450, animationEasing: animationEasing = "quadIn"} = pager, pageParser = this._itemContext.isScrollbar ? e => {
347
362
  const {value: value} = e.detail;
348
363
  let newPage;
349
- return 0 === value[0] ? newPage = 1 : 1 === value[1] ? newPage = this._itemContext.totalPage : (newPage = value[0] * this._itemContext.totalPage,
350
- pager.scrollByPosition ? newPage += 1 : newPage = Math.floor(newPage) + 1), newPage;
364
+ return newPage = 0 === value[0] ? 1 : 1 === value[1] ? this._itemContext.totalPage : value[0] * this._itemContext.totalPage + 1,
365
+ newPage;
351
366
  } : e => e.detail.current, onScroll = e => {
352
367
  const scrollComponent = this._pagerComponent, preScrollRange = scrollComponent.getScrollRange(), {direction: direction} = scrollComponent.attribute, {width: width, height: height} = scrollComponent.getSliderRenderBounds(), currentScrollValue = "vertical" === direction ? e.deltaY / height : e.deltaX / width;
353
- scrollComponent.setScrollRange([ preScrollRange[0] + currentScrollValue, preScrollRange[1] + currentScrollValue ], !0);
368
+ scrollComponent.setScrollRange([ preScrollRange[0] + currentScrollValue, preScrollRange[1] + currentScrollValue ], !0),
369
+ this.updateScrollMask();
354
370
  }, onPaging = e => {
355
371
  const newPage = pageParser(e);
356
372
  if (newPage !== this._itemContext.currentPage) {
357
373
  if (this._itemContext.currentPage = newPage, this._itemContext && this._itemContext.startIndex < this._itemContext.items.length) {
358
374
  this._renderItems();
359
375
  const newTotalPage = Math.ceil(this._itemContext.pages / this._itemContext.maxPages);
360
- this._itemContext.totalPage = newTotalPage, this._pagerComponent.setScrollRange([ (newPage - 1) / newTotalPage, newPage / newTotalPage ]);
376
+ if (this._itemContext.totalPage = newTotalPage, this._itemContext.isScrollbar && this._pagerComponent) {
377
+ const newDelta = this._computeScrollbarDelta(), [start] = this._pagerComponent.getScrollRange();
378
+ this._pagerComponent.setScrollRange([ start, start + newDelta ]);
379
+ }
361
380
  }
362
- animation ? this._itemsContainer.animate().to({
381
+ if (this._itemContext.isScrollbar) {
382
+ const [start] = this._pagerComponent.getScrollRange();
383
+ let containerSize;
384
+ containerSize = this._itemContext.isHorizontal ? this._itemsContainer.AABBBounds.width() : this._itemsContainer.AABBBounds.height();
385
+ const startOffset = containerSize * start;
386
+ this.updateScrollMask(), animation ? this._itemsContainer.animate().to({
387
+ [channel]: -startOffset
388
+ }, animationDuration, animationEasing) : this._itemsContainer.setAttribute(channel, -startOffset);
389
+ } else animation ? this._itemsContainer.animate().to({
363
390
  [channel]: -(newPage - 1) * pageSize
364
391
  }, animationDuration, animationEasing) : this._itemsContainer.setAttribute(channel, -(newPage - 1) * pageSize);
365
392
  }
@@ -416,18 +443,20 @@ class DiscreteLegend extends base_1.LegendBase {
416
443
  clip: !0,
417
444
  pickable: !1
418
445
  });
419
- return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._bindEventsOfPager(isHorizontal ? compHeight + spaceRow : compWidth + spaceCol, isHorizontal ? "y" : "x"),
446
+ return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._itemContext.clipContainer = clipGroup,
447
+ this._bindEventsOfPager(isHorizontal ? compHeight + spaceRow : compWidth + spaceCol, isHorizontal ? "y" : "x"),
420
448
  !0;
421
449
  }
422
450
  _renderScrollbar() {
451
+ var _a;
423
452
  const renderStartY = this._title ? this._title.AABBBounds.height() + (0, vutils_1.get)(this.attribute, "title.space", 8) : 0, {maxWidth: maxWidth, item: item = {}, pager: pager = {}} = this.attribute, {spaceCol: spaceCol = constant_1.DEFAULT_ITEM_SPACE_COL, spaceRow: spaceRow = constant_1.DEFAULT_ITEM_SPACE_ROW} = item, itemsContainer = this._itemsContainer, {space: pagerSpace = constant_1.DEFAULT_PAGER_SPACE, defaultCurrent: defaultCurrent = 1} = pager, compStyle = __rest(pager, [ "space", "defaultCurrent" ]), {isHorizontal: isHorizontal} = this._itemContext, maxHeight = this._contentMaxHeight;
424
- let comp, compSize = 0, contentWidth = 0, contentHeight = 0, startY = 0, pages = 1;
425
- if (isHorizontal) compSize = maxWidth, contentWidth = maxWidth, contentHeight = this._itemHeight,
426
- comp = this._createScrollbar(compStyle, compSize), this._pagerComponent = comp,
427
- this._innerView.add(comp), this._updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY); else {
428
- if (compSize = maxHeight, comp = this._createScrollbar(compStyle, compSize), this._pagerComponent = comp,
429
- this._innerView.add(comp), contentHeight = maxHeight - renderStartY, contentWidth = this._itemMaxWidth,
430
- contentHeight <= 0) return this._innerView.removeChild(comp), !1;
453
+ let comp, contentWidth = 0, contentHeight = 0, startY = 0, pages = 1;
454
+ if (isHorizontal) contentWidth = maxWidth, contentHeight = this._itemHeight, comp = this._createScrollbar(compStyle, contentWidth),
455
+ this._pagerComponent = comp, this._innerView.add(comp); else {
456
+ if (contentHeight = maxHeight - renderStartY, contentWidth = this._itemMaxWidth,
457
+ comp = this._createScrollbar(compStyle, contentHeight), this._pagerComponent = comp,
458
+ this._innerView.add(comp), contentHeight <= 0) return this._innerView.removeChild(comp),
459
+ !1;
431
460
  const items = itemsContainer.getChildren(), itemsHeightArr = items.map((item => item.attribute.height));
432
461
  if (1 === itemsHeightArr.length || itemsHeightArr.every((entry => entry === itemsHeightArr[0]))) {
433
462
  const itemHeight = itemsHeightArr[0], maxContentHeight = contentHeight, pageItemsCount = Math.floor(maxContentHeight / (spaceRow + itemHeight));
@@ -438,9 +467,15 @@ class DiscreteLegend extends base_1.LegendBase {
438
467
  prePages !== pages && index === itemsContainer.getChildren().length - 1 && startY - contentHeight >= 1 / 3 * height && (contentHeight = preStartY + height,
439
468
  pages -= 1);
440
469
  }));
441
- this._itemContext.totalPage = pages, this._itemContext.pages = pages, this._updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY);
470
+ this._itemContext.totalPage = pages, this._itemContext.pages = pages;
471
+ }
472
+ if (defaultCurrent > 1) if (isHorizontal) {
473
+ const maxOffset = this._itemsContainer.AABBBounds.width() - contentWidth;
474
+ itemsContainer.setAttribute("x", -Math.min((defaultCurrent - 1) * (contentWidth + spaceCol), maxOffset));
475
+ } else {
476
+ const maxOffset = this._itemsContainer.AABBBounds.height() - contentHeight;
477
+ itemsContainer.setAttribute("y", -Math.min((defaultCurrent - 1) * (contentHeight + spaceRow), maxOffset));
442
478
  }
443
- defaultCurrent > 1 && (isHorizontal ? itemsContainer.setAttribute("x", -(defaultCurrent - 1) * (contentWidth + spaceCol)) : itemsContainer.setAttribute("y", -(defaultCurrent - 1) * (contentHeight + spaceRow)));
444
479
  const clipGroup = vrender_core_1.graphicCreator.group({
445
480
  x: 0,
446
481
  y: renderStartY,
@@ -449,9 +484,57 @@ class DiscreteLegend extends base_1.LegendBase {
449
484
  clip: !0,
450
485
  pickable: !1
451
486
  });
452
- return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._bindEventsOfPager(isHorizontal ? contentWidth : contentHeight, isHorizontal ? "x" : "y"),
487
+ return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._itemContext.clipContainer = clipGroup,
488
+ this._updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY), (null === (_a = pager.scrollMask) || void 0 === _a ? void 0 : _a.visible) && this.renderScrollMask(clipGroup),
489
+ this._bindEventsOfPager(isHorizontal ? contentWidth : contentHeight, isHorizontal ? "x" : "y"),
453
490
  !0;
454
491
  }
492
+ renderScrollMask(clipGroup) {
493
+ const {scrollMask: scrollMask = {}} = this.attribute.pager, {visible: visible = !0, gradientLength: gradientLength = 16, gradientStops: gradientStops} = scrollMask;
494
+ if (!visible || !gradientStops) return;
495
+ const width = clipGroup.AABBBounds.width(), height = clipGroup.AABBBounds.height(), totalLength = this._itemContext.isHorizontal ? width : height, startStops = gradientStops.map((stop => ({
496
+ offset: gradientLength * stop.offset / totalLength,
497
+ color: stop.color
498
+ }))), endStops = gradientStops.map((stop => ({
499
+ offset: (totalLength - gradientLength * stop.offset) / totalLength,
500
+ color: stop.color
501
+ }))), mask = vrender_core_1.graphicCreator.rect({
502
+ x: 0,
503
+ y: 0,
504
+ width: width,
505
+ height: height
506
+ });
507
+ this._scrollMask = mask, this._scrollMaskContext = {
508
+ startStops: startStops,
509
+ endStops: endStops
510
+ }, this.updateScrollMask(), clipGroup.add(mask);
511
+ }
512
+ updateScrollMask() {
513
+ if (!this._scrollMask || !this._pagerComponent) return;
514
+ if (!this._itemContext.isScrollbar) return;
515
+ const [start, end] = this._pagerComponent.getScrollRange(), stops = [];
516
+ (0, vutils_1.isNumberClose)((0, vutils_1.clamp)(end, 0, 1), 1) || stops.push(...this._scrollMaskContext.endStops),
517
+ (0, vutils_1.isNumberClose)((0, vutils_1.clamp)(start, 0, 1), 0) || stops.push(...this._scrollMaskContext.startStops),
518
+ stops.length && (this._itemContext.isHorizontal ? this._scrollMask.setAttributes({
519
+ fill: {
520
+ gradient: "linear",
521
+ x0: 0,
522
+ y0: 0,
523
+ x1: 1,
524
+ y1: 0,
525
+ stops: stops
526
+ }
527
+ }) : this._scrollMask.setAttributes({
528
+ fill: {
529
+ gradient: "linear",
530
+ x0: 0,
531
+ y0: 0,
532
+ x1: 0,
533
+ y1: 1,
534
+ stops: stops
535
+ }
536
+ }));
537
+ }
455
538
  _renderPagerComponent() {
456
539
  return this._itemContext.isScrollbar ? this._renderScrollbar() : this._renderPager(),
457
540
  !0;