@damoqiongqiu/ice-chart 0.17.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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +530 -0
  3. package/dist/index.cjs +25 -0
  4. package/dist/index.mjs +25 -0
  5. package/dist/index.umd.js +25 -0
  6. package/dist/types/ICEChart.d.mts +330 -0
  7. package/dist/types/ICEChart.d.ts +330 -0
  8. package/dist/types/a11y.d.mts +85 -0
  9. package/dist/types/a11y.d.ts +85 -0
  10. package/dist/types/animation/motion.d.mts +11 -0
  11. package/dist/types/animation/motion.d.ts +11 -0
  12. package/dist/types/components/Axis.d.mts +60 -0
  13. package/dist/types/components/Axis.d.ts +60 -0
  14. package/dist/types/components/Brush.d.mts +19 -0
  15. package/dist/types/components/Brush.d.ts +19 -0
  16. package/dist/types/components/ChartComponent.d.mts +48 -0
  17. package/dist/types/components/ChartComponent.d.ts +48 -0
  18. package/dist/types/components/Crosshair.d.mts +40 -0
  19. package/dist/types/components/Crosshair.d.ts +40 -0
  20. package/dist/types/components/DataZoomSlider.d.mts +30 -0
  21. package/dist/types/components/DataZoomSlider.d.ts +30 -0
  22. package/dist/types/components/GridLines.d.mts +37 -0
  23. package/dist/types/components/GridLines.d.ts +37 -0
  24. package/dist/types/components/Highlight.d.mts +34 -0
  25. package/dist/types/components/Highlight.d.ts +34 -0
  26. package/dist/types/components/Legend.d.mts +26 -0
  27. package/dist/types/components/Legend.d.ts +26 -0
  28. package/dist/types/components/PlotArea.d.mts +21 -0
  29. package/dist/types/components/PlotArea.d.ts +21 -0
  30. package/dist/types/components/PolarGrid.d.mts +34 -0
  31. package/dist/types/components/PolarGrid.d.ts +34 -0
  32. package/dist/types/components/RadarGrid.d.mts +25 -0
  33. package/dist/types/components/RadarGrid.d.ts +25 -0
  34. package/dist/types/components/Title.d.mts +14 -0
  35. package/dist/types/components/Title.d.ts +14 -0
  36. package/dist/types/components/Tooltip.d.mts +48 -0
  37. package/dist/types/components/Tooltip.d.ts +48 -0
  38. package/dist/types/components/series/AreaSeries.d.mts +14 -0
  39. package/dist/types/components/series/AreaSeries.d.ts +14 -0
  40. package/dist/types/components/series/BarSeries.d.mts +39 -0
  41. package/dist/types/components/series/BarSeries.d.ts +39 -0
  42. package/dist/types/components/series/BoxplotSeries.d.mts +16 -0
  43. package/dist/types/components/series/BoxplotSeries.d.ts +16 -0
  44. package/dist/types/components/series/CandlestickSeries.d.mts +13 -0
  45. package/dist/types/components/series/CandlestickSeries.d.ts +13 -0
  46. package/dist/types/components/series/CurveSeriesBase.d.mts +58 -0
  47. package/dist/types/components/series/CurveSeriesBase.d.ts +58 -0
  48. package/dist/types/components/series/FunctionSeries.d.mts +22 -0
  49. package/dist/types/components/series/FunctionSeries.d.ts +22 -0
  50. package/dist/types/components/series/FunnelSeries.d.mts +38 -0
  51. package/dist/types/components/series/FunnelSeries.d.ts +38 -0
  52. package/dist/types/components/series/GaugeSeries.d.mts +45 -0
  53. package/dist/types/components/series/GaugeSeries.d.ts +45 -0
  54. package/dist/types/components/series/GraphSeries.d.mts +39 -0
  55. package/dist/types/components/series/GraphSeries.d.ts +39 -0
  56. package/dist/types/components/series/HeatmapSeries.d.mts +21 -0
  57. package/dist/types/components/series/HeatmapSeries.d.ts +21 -0
  58. package/dist/types/components/series/LineSeries.d.mts +31 -0
  59. package/dist/types/components/series/LineSeries.d.ts +31 -0
  60. package/dist/types/components/series/LiquidSeries.d.mts +55 -0
  61. package/dist/types/components/series/LiquidSeries.d.ts +55 -0
  62. package/dist/types/components/series/ParametricSeries.d.mts +30 -0
  63. package/dist/types/components/series/ParametricSeries.d.ts +30 -0
  64. package/dist/types/components/series/PieSeries.d.mts +44 -0
  65. package/dist/types/components/series/PieSeries.d.ts +44 -0
  66. package/dist/types/components/series/RadarSeries.d.mts +30 -0
  67. package/dist/types/components/series/RadarSeries.d.ts +30 -0
  68. package/dist/types/components/series/SankeySeries.d.mts +34 -0
  69. package/dist/types/components/series/SankeySeries.d.ts +34 -0
  70. package/dist/types/components/series/ScatterSeries.d.mts +11 -0
  71. package/dist/types/components/series/ScatterSeries.d.ts +11 -0
  72. package/dist/types/components/series/SeriesBase.d.mts +214 -0
  73. package/dist/types/components/series/SeriesBase.d.ts +214 -0
  74. package/dist/types/components/series/TreemapSeries.d.mts +48 -0
  75. package/dist/types/components/series/TreemapSeries.d.ts +48 -0
  76. package/dist/types/components/series/WaterfallSeries.d.mts +17 -0
  77. package/dist/types/components/series/WaterfallSeries.d.ts +17 -0
  78. package/dist/types/components/series/createSeries.d.mts +10 -0
  79. package/dist/types/components/series/createSeries.d.ts +10 -0
  80. package/dist/types/components/series/index.d.mts +29 -0
  81. package/dist/types/components/series/index.d.ts +29 -0
  82. package/dist/types/expr/diagnostics.d.mts +45 -0
  83. package/dist/types/expr/diagnostics.d.ts +45 -0
  84. package/dist/types/expr/expr.d.mts +44 -0
  85. package/dist/types/expr/expr.d.ts +44 -0
  86. package/dist/types/expr/sample.d.mts +34 -0
  87. package/dist/types/expr/sample.d.ts +34 -0
  88. package/dist/types/index.d.mts +80 -0
  89. package/dist/types/index.d.ts +80 -0
  90. package/dist/types/interaction/ChartLink.d.mts +16 -0
  91. package/dist/types/interaction/ChartLink.d.ts +16 -0
  92. package/dist/types/interaction/HitResolver.d.mts +44 -0
  93. package/dist/types/interaction/HitResolver.d.ts +44 -0
  94. package/dist/types/interaction/InteractionController.d.mts +147 -0
  95. package/dist/types/interaction/InteractionController.d.ts +147 -0
  96. package/dist/types/internal.d.mts +232 -0
  97. package/dist/types/internal.d.ts +232 -0
  98. package/dist/types/layout/force.d.mts +48 -0
  99. package/dist/types/layout/force.d.ts +48 -0
  100. package/dist/types/layout/layout.d.mts +9 -0
  101. package/dist/types/layout/layout.d.ts +9 -0
  102. package/dist/types/layout/sankey.d.mts +47 -0
  103. package/dist/types/layout/sankey.d.ts +47 -0
  104. package/dist/types/layout/treemap.d.mts +35 -0
  105. package/dist/types/layout/treemap.d.ts +35 -0
  106. package/dist/types/option/normalize.d.mts +68 -0
  107. package/dist/types/option/normalize.d.ts +68 -0
  108. package/dist/types/scale/BandScale.d.mts +36 -0
  109. package/dist/types/scale/BandScale.d.ts +36 -0
  110. package/dist/types/scale/LinearScale.d.mts +21 -0
  111. package/dist/types/scale/LinearScale.d.ts +21 -0
  112. package/dist/types/scale/LogScale.d.mts +24 -0
  113. package/dist/types/scale/LogScale.d.ts +24 -0
  114. package/dist/types/scale/Scale.d.mts +38 -0
  115. package/dist/types/scale/Scale.d.ts +38 -0
  116. package/dist/types/scale/TimeScale.d.mts +28 -0
  117. package/dist/types/scale/TimeScale.d.ts +28 -0
  118. package/dist/types/scale/format.d.mts +5 -0
  119. package/dist/types/scale/format.d.ts +5 -0
  120. package/dist/types/scale/index.d.mts +7 -0
  121. package/dist/types/scale/index.d.ts +7 -0
  122. package/dist/types/theme/chartTheme.d.mts +54 -0
  123. package/dist/types/theme/chartTheme.d.ts +54 -0
  124. package/dist/types/types.d.mts +689 -0
  125. package/dist/types/types.d.ts +689 -0
  126. package/dist/types/util/emitter.d.mts +11 -0
  127. package/dist/types/util/emitter.d.ts +11 -0
  128. package/dist/types/util/math.d.mts +14 -0
  129. package/dist/types/util/math.d.ts +14 -0
  130. package/dist/types/util/text.d.mts +10 -0
  131. package/dist/types/util/text.d.ts +10 -0
  132. package/package.json +100 -0
@@ -0,0 +1,30 @@
1
+ import { CurveSeriesBase } from './CurveSeriesBase.mjs';
2
+ import type { SeriesType } from '../../types.mjs';
3
+ import type { Rect } from '../../internal.mjs';
4
+ /**
5
+ * 参数曲线:`x = x(t), y = y(t)`。
6
+ *
7
+ * 李萨如曲线 `(sin(3t), cos(2t))`、螺线 `(t*cos(t), t*sin(t))`、心形线这类
8
+ * 「不是函数图像」的曲线都靠它。x 不单调,因此二分查找与「按 x 取最近点」都不适用,
9
+ * 命中一律走「离指针最近的锚点」。
10
+ *
11
+ * **极坐标简写**:写 `polarExpression: '1 + cos(3*t)'` 就是 `r = r(θ)`,
12
+ * 组件内部按 `x = r·cosθ, y = r·sinθ` 展开成同一条参数曲线 ——
13
+ * 玫瑰线 / 心形线 / 螺线这些经典极坐标图直接可用(配合 `aspect: 'equal'` 与 `polarGrid`)。
14
+ *
15
+ * y 轴数据域由 t 区间内的采样值决定;x 轴同理 —— 缩放会改变可视窗口,
16
+ * 但曲线本身固定(参数区间不变),这与函数绘图不同,符合直觉。
17
+ */
18
+ export declare class ParametricSeries extends CurveSeriesBase {
19
+ seriesType: SeriesType;
20
+ private cachedSources;
21
+ private samplerX;
22
+ private samplerY;
23
+ private samplerR;
24
+ constructor(...args: ConstructorParameters<typeof CurveSeriesBase>);
25
+ private samplersFor;
26
+ protected evaluateAt(parameter: number, params: Record<string, number>): [number, number];
27
+ protected parameterRange(_rect: Rect): [number, number];
28
+ protected baseSampleCount(): number;
29
+ protected sampleCurve(params: Record<string, number>, rect: Rect): Array<[number, number]>;
30
+ }
@@ -0,0 +1,30 @@
1
+ import { CurveSeriesBase } from './CurveSeriesBase';
2
+ import type { SeriesType } from '../../types';
3
+ import type { Rect } from '../../internal';
4
+ /**
5
+ * 参数曲线:`x = x(t), y = y(t)`。
6
+ *
7
+ * 李萨如曲线 `(sin(3t), cos(2t))`、螺线 `(t*cos(t), t*sin(t))`、心形线这类
8
+ * 「不是函数图像」的曲线都靠它。x 不单调,因此二分查找与「按 x 取最近点」都不适用,
9
+ * 命中一律走「离指针最近的锚点」。
10
+ *
11
+ * **极坐标简写**:写 `polarExpression: '1 + cos(3*t)'` 就是 `r = r(θ)`,
12
+ * 组件内部按 `x = r·cosθ, y = r·sinθ` 展开成同一条参数曲线 ——
13
+ * 玫瑰线 / 心形线 / 螺线这些经典极坐标图直接可用(配合 `aspect: 'equal'` 与 `polarGrid`)。
14
+ *
15
+ * y 轴数据域由 t 区间内的采样值决定;x 轴同理 —— 缩放会改变可视窗口,
16
+ * 但曲线本身固定(参数区间不变),这与函数绘图不同,符合直觉。
17
+ */
18
+ export declare class ParametricSeries extends CurveSeriesBase {
19
+ seriesType: SeriesType;
20
+ private cachedSources;
21
+ private samplerX;
22
+ private samplerY;
23
+ private samplerR;
24
+ constructor(...args: ConstructorParameters<typeof CurveSeriesBase>);
25
+ private samplersFor;
26
+ protected evaluateAt(parameter: number, params: Record<string, number>): [number, number];
27
+ protected parameterRange(_rect: Rect): [number, number];
28
+ protected baseSampleCount(): number;
29
+ protected sampleCurve(params: Record<string, number>, rect: Rect): Array<[number, number]>;
30
+ }
@@ -0,0 +1,44 @@
1
+ import { SeriesBase } from './SeriesBase.mjs';
2
+ import type { SeriesType } from '../../types.mjs';
3
+ import type { PolarLayout, Rect } from '../../internal.mjs';
4
+ export interface PolarSeriesCoord {
5
+ polar: PolarLayout;
6
+ /** 组件盒(极坐标外接正方形,图表坐标系)。 */
7
+ plot: Rect;
8
+ canvas: Rect;
9
+ }
10
+ /**
11
+ * 饼图 / 玫瑰图。
12
+ *
13
+ * 命中判定与渲染共用同一份扇形几何(`slices`:每个扇区的起止角与内外半径),
14
+ * 因此「画出来的扇形」与「点得到的扇形」必然一致 —— 与折线/柱形遵循同一条约定。
15
+ */
16
+ export declare class PieSeries extends SeriesBase {
17
+ seriesType: SeriesType;
18
+ polar: PolarSeriesCoord | null;
19
+ /** 每个扇区 [a0, a1, r0, r1],本地坐标空间。 */
20
+ private slices;
21
+ private pieCacheKey;
22
+ /** 图例切换扇区显隐时的起点几何(按下标对齐):隐藏一个扇区,其余扇区「挪过去」而不是跳过去。 */
23
+ private sliceFrom;
24
+ setCoord(coord: any): this;
25
+ setHiddenSlices(indexes: number[]): this;
26
+ /** 标签可能画到圆外,脏矩形要留出余量。 */
27
+ protected paintPad(): number;
28
+ private localCenter;
29
+ /** 扇区几何 + 质心像素(质心供高亮与提示框锚点使用)。 */
30
+ protected rebuildPixels(): void;
31
+ /**
32
+ * 显隐切换的过渡:从 `sliceFrom` 插值到新几何。
33
+ *
34
+ * 角度按**最短方向**走(跨 2π 的扇区不会绕一整圈),半径线性。
35
+ * 被隐藏的扇区因此是「收拢到 0 再消失」,其余扇区平滑挪到新位置。
36
+ */
37
+ private blendSliceMorph;
38
+ /** 扇形质心写进像素缓存(命中与高亮锚点共用的那一份几何)。 */
39
+ private writeCentroid;
40
+ hitTestIndex(localX: number, localY: number): number;
41
+ protected doRender(): void;
42
+ private fontSize;
43
+ private fontFamily;
44
+ }
@@ -0,0 +1,44 @@
1
+ import { SeriesBase } from './SeriesBase';
2
+ import type { SeriesType } from '../../types';
3
+ import type { PolarLayout, Rect } from '../../internal';
4
+ export interface PolarSeriesCoord {
5
+ polar: PolarLayout;
6
+ /** 组件盒(极坐标外接正方形,图表坐标系)。 */
7
+ plot: Rect;
8
+ canvas: Rect;
9
+ }
10
+ /**
11
+ * 饼图 / 玫瑰图。
12
+ *
13
+ * 命中判定与渲染共用同一份扇形几何(`slices`:每个扇区的起止角与内外半径),
14
+ * 因此「画出来的扇形」与「点得到的扇形」必然一致 —— 与折线/柱形遵循同一条约定。
15
+ */
16
+ export declare class PieSeries extends SeriesBase {
17
+ seriesType: SeriesType;
18
+ polar: PolarSeriesCoord | null;
19
+ /** 每个扇区 [a0, a1, r0, r1],本地坐标空间。 */
20
+ private slices;
21
+ private pieCacheKey;
22
+ /** 图例切换扇区显隐时的起点几何(按下标对齐):隐藏一个扇区,其余扇区「挪过去」而不是跳过去。 */
23
+ private sliceFrom;
24
+ setCoord(coord: any): this;
25
+ setHiddenSlices(indexes: number[]): this;
26
+ /** 标签可能画到圆外,脏矩形要留出余量。 */
27
+ protected paintPad(): number;
28
+ private localCenter;
29
+ /** 扇区几何 + 质心像素(质心供高亮与提示框锚点使用)。 */
30
+ protected rebuildPixels(): void;
31
+ /**
32
+ * 显隐切换的过渡:从 `sliceFrom` 插值到新几何。
33
+ *
34
+ * 角度按**最短方向**走(跨 2π 的扇区不会绕一整圈),半径线性。
35
+ * 被隐藏的扇区因此是「收拢到 0 再消失」,其余扇区平滑挪到新位置。
36
+ */
37
+ private blendSliceMorph;
38
+ /** 扇形质心写进像素缓存(命中与高亮锚点共用的那一份几何)。 */
39
+ private writeCentroid;
40
+ hitTestIndex(localX: number, localY: number): number;
41
+ protected doRender(): void;
42
+ private fontSize;
43
+ private fontFamily;
44
+ }
@@ -0,0 +1,30 @@
1
+ import { SeriesBase } from './SeriesBase.mjs';
2
+ import type { SeriesType } from '../../types.mjs';
3
+ import type { PolarLayout, Rect } from '../../internal.mjs';
4
+ export interface RadarSeriesCoord {
5
+ polar: PolarLayout;
6
+ plot: Rect;
7
+ canvas: Rect;
8
+ /** 每个指标轴的数据上限(用于把数值映射到半径)。 */
9
+ domains: Array<[number, number]>;
10
+ }
11
+ /**
12
+ * 雷达图:一个系列 = 一个多边形。
13
+ *
14
+ * 数据按指标顺序排列(`data: [80, 90, 70, 60, 85]` 对应 `radar.indicators` 的顺序)。
15
+ * 顶点几何同时用于绘制与命中判定:指针靠近某个顶点即命中该指标,
16
+ * 落在多边形内部时按角度取最近的指标。
17
+ */
18
+ export declare class RadarSeries extends SeriesBase {
19
+ seriesType: SeriesType;
20
+ radar: RadarSeriesCoord | null;
21
+ private radarCacheKey;
22
+ setCoord(coord: any): this;
23
+ protected paintPad(): number;
24
+ private localCenter;
25
+ /** 顶点像素(本地坐标)。 */
26
+ protected rebuildPixels(): void;
27
+ protected doRender(): void;
28
+ hitTestIndex(localX: number, localY: number): number;
29
+ private containsPointInPolygon;
30
+ }
@@ -0,0 +1,30 @@
1
+ import { SeriesBase } from './SeriesBase';
2
+ import type { SeriesType } from '../../types';
3
+ import type { PolarLayout, Rect } from '../../internal';
4
+ export interface RadarSeriesCoord {
5
+ polar: PolarLayout;
6
+ plot: Rect;
7
+ canvas: Rect;
8
+ /** 每个指标轴的数据上限(用于把数值映射到半径)。 */
9
+ domains: Array<[number, number]>;
10
+ }
11
+ /**
12
+ * 雷达图:一个系列 = 一个多边形。
13
+ *
14
+ * 数据按指标顺序排列(`data: [80, 90, 70, 60, 85]` 对应 `radar.indicators` 的顺序)。
15
+ * 顶点几何同时用于绘制与命中判定:指针靠近某个顶点即命中该指标,
16
+ * 落在多边形内部时按角度取最近的指标。
17
+ */
18
+ export declare class RadarSeries extends SeriesBase {
19
+ seriesType: SeriesType;
20
+ radar: RadarSeriesCoord | null;
21
+ private radarCacheKey;
22
+ setCoord(coord: any): this;
23
+ protected paintPad(): number;
24
+ private localCenter;
25
+ /** 顶点像素(本地坐标)。 */
26
+ protected rebuildPixels(): void;
27
+ protected doRender(): void;
28
+ hitTestIndex(localX: number, localY: number): number;
29
+ private containsPointInPolygon;
30
+ }
@@ -0,0 +1,34 @@
1
+ import { SeriesBase } from './SeriesBase.mjs';
2
+ import type { SeriesType } from '../../types.mjs';
3
+ import type { Rect } from '../../internal.mjs';
4
+ import { layoutSankey, type SankeyLayoutResult } from '../../layout/sankey.mjs';
5
+ import type { SankeyOption } from '../../types.mjs';
6
+ export interface SankeySeriesCoord {
7
+ plot: Rect;
8
+ canvas: Rect;
9
+ /** 图表坐标系下的布局结果。 */
10
+ layout: SankeyLayoutResult;
11
+ options: SankeyOption;
12
+ }
13
+ /**
14
+ * 桑基图:节点 + 连线(按流量定宽)。
15
+ *
16
+ * 布局由纯函数 `layoutSankey` 产出,本组件只负责绘制与命中:
17
+ * - 命中节点 → 节点下标;
18
+ * - 命中连线 → 节点数 + 连线下标(与 `series.points` 的排列一致)。
19
+ */
20
+ export declare class SankeySeries extends SeriesBase {
21
+ seriesType: SeriesType;
22
+ sankey: SankeySeriesCoord | null;
23
+ protected supportsSampling: boolean;
24
+ private sankeyCacheKey;
25
+ setCoord(coord: any): this;
26
+ protected paintPad(): number;
27
+ /** 节点中心 / 连线中点的像素(组件本地坐标)。 */
28
+ protected rebuildPixels(): void;
29
+ protected doRender(): void;
30
+ /** 带白色描边的文字:保证节点名压在连线上时依然清晰。 */
31
+ private fillLabelWithHalo;
32
+ hitTestIndex(localX: number, localY: number): number;
33
+ }
34
+ export { layoutSankey };
@@ -0,0 +1,34 @@
1
+ import { SeriesBase } from './SeriesBase';
2
+ import type { SeriesType } from '../../types';
3
+ import type { Rect } from '../../internal';
4
+ import { layoutSankey, type SankeyLayoutResult } from '../../layout/sankey';
5
+ import type { SankeyOption } from '../../types';
6
+ export interface SankeySeriesCoord {
7
+ plot: Rect;
8
+ canvas: Rect;
9
+ /** 图表坐标系下的布局结果。 */
10
+ layout: SankeyLayoutResult;
11
+ options: SankeyOption;
12
+ }
13
+ /**
14
+ * 桑基图:节点 + 连线(按流量定宽)。
15
+ *
16
+ * 布局由纯函数 `layoutSankey` 产出,本组件只负责绘制与命中:
17
+ * - 命中节点 → 节点下标;
18
+ * - 命中连线 → 节点数 + 连线下标(与 `series.points` 的排列一致)。
19
+ */
20
+ export declare class SankeySeries extends SeriesBase {
21
+ seriesType: SeriesType;
22
+ sankey: SankeySeriesCoord | null;
23
+ protected supportsSampling: boolean;
24
+ private sankeyCacheKey;
25
+ setCoord(coord: any): this;
26
+ protected paintPad(): number;
27
+ /** 节点中心 / 连线中点的像素(组件本地坐标)。 */
28
+ protected rebuildPixels(): void;
29
+ protected doRender(): void;
30
+ /** 带白色描边的文字:保证节点名压在连线上时依然清晰。 */
31
+ private fillLabelWithHalo;
32
+ hitTestIndex(localX: number, localY: number): number;
33
+ }
34
+ export { layoutSankey };
@@ -0,0 +1,11 @@
1
+ import { SeriesBase } from './SeriesBase.mjs';
2
+ import type { SeriesType } from '../../types.mjs';
3
+ /** 散点图:只画数据标记。 */
4
+ export declare class ScatterSeries extends SeriesBase {
5
+ seriesType: SeriesType;
6
+ /** 散点图的每个点都是图形本身,不参与降采样。 */
7
+ protected supportsSampling: boolean;
8
+ protected clipToBox: boolean;
9
+ protected doRender(): void;
10
+ hitTestIndex(localX: number, localY: number): number;
11
+ }
@@ -0,0 +1,11 @@
1
+ import { SeriesBase } from './SeriesBase';
2
+ import type { SeriesType } from '../../types';
3
+ /** 散点图:只画数据标记。 */
4
+ export declare class ScatterSeries extends SeriesBase {
5
+ seriesType: SeriesType;
6
+ /** 散点图的每个点都是图形本身,不参与降采样。 */
7
+ protected supportsSampling: boolean;
8
+ protected clipToBox: boolean;
9
+ protected doRender(): void;
10
+ hitTestIndex(localX: number, localY: number): number;
11
+ }
@@ -0,0 +1,214 @@
1
+ import { ChartComponent } from '../ChartComponent.mjs';
2
+ import type { ChartTheme, SeriesType } from '../../types.mjs';
3
+ import type { DataPoint, InternalSeries, Rect } from '../../internal.mjs';
4
+ import type { Scale } from '../../scale.mjs';
5
+ export interface SeriesCoord {
6
+ plot: Rect;
7
+ canvas: Rect;
8
+ xScale: Scale;
9
+ yScale: Scale;
10
+ /** 该系列绑定的 y 轴下标。 */
11
+ yAxisIndex?: number;
12
+ theme: ChartTheme;
13
+ }
14
+ export interface BarSlot {
15
+ index: number;
16
+ count: number;
17
+ }
18
+ /**
19
+ * 系列基类:数据 → 像素的缓存、动画插值、命中判定都收敛在这里。
20
+ *
21
+ * 三件事值得注意:
22
+ *
23
+ * 1. **像素缓存**:数据点的像素坐标只在数据 / 比例尺 / 尺寸变化时重算一次,
24
+ * render 与命中判定共用同一份缓存 —— 保证「画出来的样子」和「点得到的位置」必然一致。
25
+ *
26
+ * 2. **命中判定进引擎**:`containsLocalPoint` 由子类实现为「按数据语义判定」,
27
+ * 于是 `ice.hitTest()` / 引擎事件派发天然就能分辨「点在折线上」还是「点在空白处」,
28
+ * 不需要在图表外面再写一套坐标反查。
29
+ *
30
+ * 3. **动画走引擎的 AnimationManager**:`state.progress` 由引擎逐帧写入,
31
+ * 本组件按 progress 在「上一份数据的有效值」与「新数据」之间插值。
32
+ */
33
+ export declare abstract class SeriesBase extends ChartComponent {
34
+ abstract seriesType: SeriesType;
35
+ series: InternalSeries;
36
+ /** 图表主题(由 Chart 注入,供绘制标签 / 文本使用)。 */
37
+ chartTheme: ChartTheme | null;
38
+ /** 被隐藏的数据项下标(饼图扇区 / 漏斗阶段)。 */
39
+ hiddenSlices: number[];
40
+ coord: SeriesCoord | null;
41
+ /** 分组柱形的位置(由 Chart 计算)。 */
42
+ barSlot: BarSlot;
43
+ /** 每个点的像素坐标,2n 长度,[x0,y0,x1,y1,...];缺失点为 NaN。 */
44
+ protected pixels: Float64Array;
45
+ /** 每个点的有效数据值 [base, top],用于动画插值与柱形绘制。 */
46
+ protected effective: Float64Array;
47
+ /** 上一帧的有效值,作为动画起点。 */
48
+ protected fromEffective: Float64Array | null;
49
+ /** 实际参与绘制的点下标(降采样后可能少于总点数);null 表示全部点。 */
50
+ protected renderIndices: number[] | null;
51
+ /** 像素 x 是否单调递增(降采样与二分查找的前提)。 */
52
+ protected xMonotonic: boolean;
53
+ /** 第三维(气泡尺寸)的取值范围,映射到 symbolSizeRange。 */
54
+ protected sizeExtent: [number, number];
55
+ /** 每个数据项各自的动画进度(错峰入场用),0~1。 */
56
+ protected itemProgress: Float64Array;
57
+ /** 错峰比例:0 = 所有项同时动画。 */
58
+ protected stagger: number;
59
+ /** 当前动画阶段:enter 可以「画出来」,update 只能「动起来」。 */
60
+ protected animationKind: 'enter' | 'update';
61
+ /** 当前悬停的数据项(0 表示没有)。 */
62
+ hoverIndex: number | null;
63
+ private cacheKey;
64
+ /** 散点等「每个点都必须画」的系列不参与降采样。 */
65
+ protected supportsSampling: boolean;
66
+ /**
67
+ * 是否把绘制裁剪到组件盒(= 本场景的绘图区)。
68
+ *
69
+ * 直角坐标系列必须开:缩放后落在窗口外的数据点会被映射到很远的位置,
70
+ * 不裁剪就会一路画到 y 轴标签、图例甚至画布外面去(用户实测反馈的问题)。
71
+ * 折线要的是「被绘图区边缘裁掉」,而不是「在边界处断开」,所以只能靠 clip,不能靠过滤点。
72
+ */
73
+ protected clipToBox: boolean;
74
+ private localBoxScratch;
75
+ constructor(series: InternalSeries, props: {
76
+ left: number;
77
+ top: number;
78
+ width: number;
79
+ height: number;
80
+ zIndex?: number;
81
+ });
82
+ /** 组件本地盒向四周外扩,容纳线宽、标记与阴影。 */
83
+ protected __localBox(): number[];
84
+ protected paintPad(): number;
85
+ /**
86
+ * 数据点尺寸:三种来源按优先级解析。
87
+ * 1. `symbolSize` 是函数 → 交给调用方决定;
88
+ * 2. 数据项带第三维(气泡图的 `[x, y, size]`)→ 按 series 内的取值范围映射到 `symbolSizeRange`;
89
+ * 3. 固定数值 `symbolSize`。
90
+ */
91
+ symbolSizeAt(index: number): number;
92
+ /** 本系列的最大标记尺寸(脏矩形留白与命中容差要用)。 */
93
+ protected maxSymbolSize(): number;
94
+ setCoord(coord: SeriesCoord): this;
95
+ /** 设置被隐藏的数据项(图表层在每次同步时写入)。 */
96
+ setHiddenSlices(indexes: number[]): this;
97
+ /** 图表层在每次播放动画前注入该阶段的配置(错峰比例会存下来供逐项计算)。 */
98
+ setAnimationStage(stage: {
99
+ stagger?: number;
100
+ kind?: 'enter' | 'update';
101
+ } | null | undefined): this;
102
+ /** 是否正在播「入场」动画(用于「画出来」这类只在入场成立的动效)。 */
103
+ protected isEntering(): boolean;
104
+ /** 单个数据项的动画进度:把整体进度按「波浪」拆到每一项。 */
105
+ protected progressFor(index: number, total: number): number;
106
+ /** 每项进度的缓存(数据量变化时重建)。 */
107
+ protected computeItemProgress(): void;
108
+ /** 当前动画状态(测试与调试用;不参与序列化)。 */
109
+ getAnimationState(): {
110
+ progress: number;
111
+ kind: 'enter' | 'update';
112
+ stagger: number;
113
+ itemProgress: number[];
114
+ };
115
+ /**
116
+ * 设置/清除悬停项,并用引擎动画把 `highlightT` 从 0 推到 1(或反向)。
117
+ *
118
+ * 反馈动画由组件自己启动:它持有 `ice.animationManager`,不需要图表层代劳,
119
+ * 这样「悬停哪个图元」这件事就完全收敛在系列内部。
120
+ */
121
+ setHoverIndex(index: number | null): void;
122
+ /** 悬停反馈的进度(0~1)。 */
123
+ highlightT(): number;
124
+ /** 某个数据项当前的高亮强度:只有被悬停的那一项 > 0。 */
125
+ protected hoverBoost(index: number, amount?: number, t?: number): number;
126
+ /** 悬停叠加层的强度(0~1):只有被悬停的那一项 > 0。 */
127
+ protected hoverAlpha(index: number): number;
128
+ /**
129
+ * 在被悬停的矩形上叠一层「提亮 + 描边」。
130
+ *
131
+ * 刻意**只叠加、不改几何**:像热力图 / 树图 / K 线这种相邻图元紧挨着的类型,
132
+ * 改宽高会让命中区域与渲染区域分叉(指针停在边缘会来回抖),
133
+ * 叠加描边既能表达强调,又完全不动命中判定。
134
+ */
135
+ protected drawHoverOverlay(index: number, rect: Rect, options?: {
136
+ radius?: number;
137
+ fill?: string;
138
+ stroke?: string;
139
+ lineWidth?: number;
140
+ }): void;
141
+ /**
142
+ * 派生几何的缓存键。
143
+ *
144
+ * **必须**把参与动画的 state 字段一起放进来(progress / 阶段 / 错峰),
145
+ * 否则动画期间键不变、缓存命中,几何会冻结在动画开始的那一帧。
146
+ * 子类覆写 `rebuildPixels` 时用自己的几何参数组键,请一律走这个方法。
147
+ */
148
+ protected buildSeriesKey(parts: Array<any>): string;
149
+ /**
150
+ * 坐标系指纹:绘图区矩形 + 各比例尺的数据域。
151
+ *
152
+ * 子类自己拼键时最容易漏的就是数据域 —— 表面看不出来,实际后果是
153
+ * **像素缓存不失效**:缩放 / 平移 / 数据域过渡之后 `pixels` 还是旧位置,
154
+ * 「看得见的点」与「点得到的点」就此分叉(悬停高亮画在别处、命中判空)。
155
+ * 只在键里放域的**端点 + 长度**,因为这个函数动画期间每帧都会被调用,不能全量 join。
156
+ */
157
+ private coordKey;
158
+ /**
159
+ * 替换数据。`animate` 为真时,把当前有效值记为动画起点(首次进入时从 0 开始),
160
+ * 由 Chart 触发引擎动画把 state.progress 从 0 推到 1。
161
+ */
162
+ updateSeries(series: InternalSeries, animate: boolean, preserveAnimation?: boolean): this;
163
+ /** 与当前绘制一致的像素位置;缺失点返回 null。 */
164
+ pixelAt(index: number): [number, number] | null;
165
+ /** 数据点的像素矩形(柱形用)。 */
166
+ barRectAt(_index: number): Rect | null;
167
+ /** 命中判定:返回数据下标,-1 表示未命中。入参是组件本地像素坐标。 */
168
+ abstract hitTestIndex(localX: number, localY: number): number;
169
+ protected containsLocalPoint(localX: number, localY: number): boolean;
170
+ protected progress(): number;
171
+ /** 计算每个点的有效数据值(含动画插值)。 */
172
+ protected computeEffective(): void;
173
+ /** 数据 → 像素(带缓存)。 */
174
+ protected rebuildPixels(force?: boolean): void;
175
+ /**
176
+ * 计算实际绘制的点下标。
177
+ *
178
+ * 默认策略:点数超过「绘图区宽度 × 3」时用 LTTB 抽稀 —— 一个像素宽度画 3 个点已经过剩,
179
+ * 继续画只是白白光栅化。首尾点与极值点一定保留,所以看起来仍然「像原曲线」。
180
+ * 命中判定不受影响,它始终读全量像素缓存。
181
+ */
182
+ protected buildRenderIndices(n: number, plotWidth: number): number[] | null;
183
+ /** 实际参与绘制的点数。 */
184
+ protected renderCount(): number;
185
+ /** 第 k 个参与绘制的点对应的原始下标。 */
186
+ protected renderIndexAt(k: number): number;
187
+ /**
188
+ * 按 x 像素找最近的数据下标。
189
+ *
190
+ * 单调数据用二分查找(大点数下每次 mousemove 都是 O(n) 会直接掉帧),
191
+ * 非单调数据退化为线性扫描。
192
+ */
193
+ nearestIndexAtX(localX: number): number;
194
+ private buildCacheKey;
195
+ /** 遍历像素点,跳过缺失点形成的断点。 */
196
+ protected eachSegment(fn: (x0: number, y0: number, x1: number, y1: number, i: number) => void): void;
197
+ protected pointColor(_index: number): string;
198
+ protected lineWidthDevice(): number;
199
+ protected opacity(): number;
200
+ protected beginDraw(): void;
201
+ protected endDraw(): void;
202
+ protected drawSymbol(x: number, y: number, shape: string, size: number, fill: string, stroke: string): void;
203
+ protected pointByIndex(index: number): DataPoint | null;
204
+ }
205
+ /**
206
+ * LTTB(Largest Triangle Three Buckets)抽稀。
207
+ *
208
+ * 输入是渲染用的像素点集(x/y 交错,含 NaN 断点),返回保留下来的下标数组。
209
+ * 首点与末点一定保留;每个桶内取「与前后桶均值构成三角形面积最大」的点,
210
+ * 因此尖峰不会被抹平 —— 这正是它比等间隔抽样更适合行情/监控曲线的原因。
211
+ */
212
+ export declare function lttbIndices(pixels: Float64Array, n: number, threshold: number): number[];
213
+ /** 数据点第三维的取值范围(气泡尺寸映射用)。 */
214
+ export declare function computeSizeExtent(points: DataPoint[]): [number, number];