@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.
- package/LICENSE +21 -0
- package/README.md +530 -0
- package/dist/index.cjs +25 -0
- package/dist/index.mjs +25 -0
- package/dist/index.umd.js +25 -0
- package/dist/types/ICEChart.d.mts +330 -0
- package/dist/types/ICEChart.d.ts +330 -0
- package/dist/types/a11y.d.mts +85 -0
- package/dist/types/a11y.d.ts +85 -0
- package/dist/types/animation/motion.d.mts +11 -0
- package/dist/types/animation/motion.d.ts +11 -0
- package/dist/types/components/Axis.d.mts +60 -0
- package/dist/types/components/Axis.d.ts +60 -0
- package/dist/types/components/Brush.d.mts +19 -0
- package/dist/types/components/Brush.d.ts +19 -0
- package/dist/types/components/ChartComponent.d.mts +48 -0
- package/dist/types/components/ChartComponent.d.ts +48 -0
- package/dist/types/components/Crosshair.d.mts +40 -0
- package/dist/types/components/Crosshair.d.ts +40 -0
- package/dist/types/components/DataZoomSlider.d.mts +30 -0
- package/dist/types/components/DataZoomSlider.d.ts +30 -0
- package/dist/types/components/GridLines.d.mts +37 -0
- package/dist/types/components/GridLines.d.ts +37 -0
- package/dist/types/components/Highlight.d.mts +34 -0
- package/dist/types/components/Highlight.d.ts +34 -0
- package/dist/types/components/Legend.d.mts +26 -0
- package/dist/types/components/Legend.d.ts +26 -0
- package/dist/types/components/PlotArea.d.mts +21 -0
- package/dist/types/components/PlotArea.d.ts +21 -0
- package/dist/types/components/PolarGrid.d.mts +34 -0
- package/dist/types/components/PolarGrid.d.ts +34 -0
- package/dist/types/components/RadarGrid.d.mts +25 -0
- package/dist/types/components/RadarGrid.d.ts +25 -0
- package/dist/types/components/Title.d.mts +14 -0
- package/dist/types/components/Title.d.ts +14 -0
- package/dist/types/components/Tooltip.d.mts +48 -0
- package/dist/types/components/Tooltip.d.ts +48 -0
- package/dist/types/components/series/AreaSeries.d.mts +14 -0
- package/dist/types/components/series/AreaSeries.d.ts +14 -0
- package/dist/types/components/series/BarSeries.d.mts +39 -0
- package/dist/types/components/series/BarSeries.d.ts +39 -0
- package/dist/types/components/series/BoxplotSeries.d.mts +16 -0
- package/dist/types/components/series/BoxplotSeries.d.ts +16 -0
- package/dist/types/components/series/CandlestickSeries.d.mts +13 -0
- package/dist/types/components/series/CandlestickSeries.d.ts +13 -0
- package/dist/types/components/series/CurveSeriesBase.d.mts +58 -0
- package/dist/types/components/series/CurveSeriesBase.d.ts +58 -0
- package/dist/types/components/series/FunctionSeries.d.mts +22 -0
- package/dist/types/components/series/FunctionSeries.d.ts +22 -0
- package/dist/types/components/series/FunnelSeries.d.mts +38 -0
- package/dist/types/components/series/FunnelSeries.d.ts +38 -0
- package/dist/types/components/series/GaugeSeries.d.mts +45 -0
- package/dist/types/components/series/GaugeSeries.d.ts +45 -0
- package/dist/types/components/series/GraphSeries.d.mts +39 -0
- package/dist/types/components/series/GraphSeries.d.ts +39 -0
- package/dist/types/components/series/HeatmapSeries.d.mts +21 -0
- package/dist/types/components/series/HeatmapSeries.d.ts +21 -0
- package/dist/types/components/series/LineSeries.d.mts +31 -0
- package/dist/types/components/series/LineSeries.d.ts +31 -0
- package/dist/types/components/series/LiquidSeries.d.mts +55 -0
- package/dist/types/components/series/LiquidSeries.d.ts +55 -0
- package/dist/types/components/series/ParametricSeries.d.mts +30 -0
- package/dist/types/components/series/ParametricSeries.d.ts +30 -0
- package/dist/types/components/series/PieSeries.d.mts +44 -0
- package/dist/types/components/series/PieSeries.d.ts +44 -0
- package/dist/types/components/series/RadarSeries.d.mts +30 -0
- package/dist/types/components/series/RadarSeries.d.ts +30 -0
- package/dist/types/components/series/SankeySeries.d.mts +34 -0
- package/dist/types/components/series/SankeySeries.d.ts +34 -0
- package/dist/types/components/series/ScatterSeries.d.mts +11 -0
- package/dist/types/components/series/ScatterSeries.d.ts +11 -0
- package/dist/types/components/series/SeriesBase.d.mts +214 -0
- package/dist/types/components/series/SeriesBase.d.ts +214 -0
- package/dist/types/components/series/TreemapSeries.d.mts +48 -0
- package/dist/types/components/series/TreemapSeries.d.ts +48 -0
- package/dist/types/components/series/WaterfallSeries.d.mts +17 -0
- package/dist/types/components/series/WaterfallSeries.d.ts +17 -0
- package/dist/types/components/series/createSeries.d.mts +10 -0
- package/dist/types/components/series/createSeries.d.ts +10 -0
- package/dist/types/components/series/index.d.mts +29 -0
- package/dist/types/components/series/index.d.ts +29 -0
- package/dist/types/expr/diagnostics.d.mts +45 -0
- package/dist/types/expr/diagnostics.d.ts +45 -0
- package/dist/types/expr/expr.d.mts +44 -0
- package/dist/types/expr/expr.d.ts +44 -0
- package/dist/types/expr/sample.d.mts +34 -0
- package/dist/types/expr/sample.d.ts +34 -0
- package/dist/types/index.d.mts +80 -0
- package/dist/types/index.d.ts +80 -0
- package/dist/types/interaction/ChartLink.d.mts +16 -0
- package/dist/types/interaction/ChartLink.d.ts +16 -0
- package/dist/types/interaction/HitResolver.d.mts +44 -0
- package/dist/types/interaction/HitResolver.d.ts +44 -0
- package/dist/types/interaction/InteractionController.d.mts +147 -0
- package/dist/types/interaction/InteractionController.d.ts +147 -0
- package/dist/types/internal.d.mts +232 -0
- package/dist/types/internal.d.ts +232 -0
- package/dist/types/layout/force.d.mts +48 -0
- package/dist/types/layout/force.d.ts +48 -0
- package/dist/types/layout/layout.d.mts +9 -0
- package/dist/types/layout/layout.d.ts +9 -0
- package/dist/types/layout/sankey.d.mts +47 -0
- package/dist/types/layout/sankey.d.ts +47 -0
- package/dist/types/layout/treemap.d.mts +35 -0
- package/dist/types/layout/treemap.d.ts +35 -0
- package/dist/types/option/normalize.d.mts +68 -0
- package/dist/types/option/normalize.d.ts +68 -0
- package/dist/types/scale/BandScale.d.mts +36 -0
- package/dist/types/scale/BandScale.d.ts +36 -0
- package/dist/types/scale/LinearScale.d.mts +21 -0
- package/dist/types/scale/LinearScale.d.ts +21 -0
- package/dist/types/scale/LogScale.d.mts +24 -0
- package/dist/types/scale/LogScale.d.ts +24 -0
- package/dist/types/scale/Scale.d.mts +38 -0
- package/dist/types/scale/Scale.d.ts +38 -0
- package/dist/types/scale/TimeScale.d.mts +28 -0
- package/dist/types/scale/TimeScale.d.ts +28 -0
- package/dist/types/scale/format.d.mts +5 -0
- package/dist/types/scale/format.d.ts +5 -0
- package/dist/types/scale/index.d.mts +7 -0
- package/dist/types/scale/index.d.ts +7 -0
- package/dist/types/theme/chartTheme.d.mts +54 -0
- package/dist/types/theme/chartTheme.d.ts +54 -0
- package/dist/types/types.d.mts +689 -0
- package/dist/types/types.d.ts +689 -0
- package/dist/types/util/emitter.d.mts +11 -0
- package/dist/types/util/emitter.d.ts +11 -0
- package/dist/types/util/math.d.mts +14 -0
- package/dist/types/util/math.d.ts +14 -0
- package/dist/types/util/text.d.mts +10 -0
- package/dist/types/util/text.d.ts +10 -0
- package/package.json +100 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ChartLayout, NormalizedOption } from './internal.mjs';
|
|
2
|
+
import type { SeriesType } from './types.mjs';
|
|
3
|
+
/** 可访问数据表:屏幕阅读器可以直接读的一张表。 */
|
|
4
|
+
export interface DataTable {
|
|
5
|
+
caption: string;
|
|
6
|
+
columns: string[];
|
|
7
|
+
rows: string[][];
|
|
8
|
+
}
|
|
9
|
+
/** 虚拟数据节点:把「一个数据点」暴露成可聚焦节点所需的全部信息。 */
|
|
10
|
+
export interface A11yDataNode {
|
|
11
|
+
id: string;
|
|
12
|
+
role: 'graphic';
|
|
13
|
+
label: string;
|
|
14
|
+
seriesId: string;
|
|
15
|
+
seriesName: string;
|
|
16
|
+
dataIndex: number;
|
|
17
|
+
value: number | null;
|
|
18
|
+
/** 屏幕坐标盒(CSS 像素),应用层可直接做 DOM 镜像定位。 */
|
|
19
|
+
box: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
focusable: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** a11y 构建只依赖图表的这几项能力(避免与 ICEChart 循环依赖)。 */
|
|
28
|
+
export interface A11yChartLike {
|
|
29
|
+
ice: any;
|
|
30
|
+
norm: NormalizedOption;
|
|
31
|
+
layout: ChartLayout;
|
|
32
|
+
controller: any;
|
|
33
|
+
formatAxisValue(axis: 'x' | 'y', value: any): string;
|
|
34
|
+
}
|
|
35
|
+
export interface A11yTreeOptions {
|
|
36
|
+
/** 每个系列最多展开多少个数据节点,默认 200(避免把几万个点塞进无障碍树)。 */
|
|
37
|
+
maxDataNodesPerSeries?: number;
|
|
38
|
+
}
|
|
39
|
+
/** 图表标题(无障碍名也用它)。 */
|
|
40
|
+
export declare function chartTitle(norm: NormalizedOption): string;
|
|
41
|
+
/**
|
|
42
|
+
* 生成数据表。
|
|
43
|
+
*
|
|
44
|
+
* - 直角坐标:每行一个 x 位置,每列一个系列;
|
|
45
|
+
* - 饼图:每行一个扇区(名称 / 数值 / 占比);
|
|
46
|
+
* - 雷达图:每行一个指标,每列一个系列。
|
|
47
|
+
*
|
|
48
|
+
* 只统计**可见**系列与扇区,与画面严格一致 —— 图例隐藏的系列不该被读出来。
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildDataTable(chart: A11yChartLike): DataTable;
|
|
51
|
+
/**
|
|
52
|
+
* 生成虚拟数据节点:让应用层可以做「逐数据点」的 DOM 镜像与焦点环。
|
|
53
|
+
*
|
|
54
|
+
* 默认每个系列最多 200 个节点(整体数据表已经能表达全部数据,逐点节点是为了
|
|
55
|
+
* 键盘在数据点之间移动),可用 maxDataNodesPerSeries 调整。
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildDataNodes(chart: A11yChartLike, options?: A11yTreeOptions): A11yDataNode[];
|
|
58
|
+
/** 视觉隐藏但可被屏幕阅读器读取的样式。 */
|
|
59
|
+
export declare const VISUALLY_HIDDEN_STYLE: string;
|
|
60
|
+
/**
|
|
61
|
+
* 无障碍镜像:在 canvas 旁挂一张视觉隐藏的数据表 + 一个 aria-live 播报区。
|
|
62
|
+
*
|
|
63
|
+
* 为什么必须做:canvas 内容对屏幕阅读器完全不可见(引擎的 a11y 原语也只产出快照,
|
|
64
|
+
* 由应用层决定 DOM 结构)。ice-chart 选择把「数据表 + 当前悬停点播报」这一层直接做掉,
|
|
65
|
+
* 因为它对图表是通用语义;更细的交互镜像仍可由应用层基于 getA11yTree() 自行构建。
|
|
66
|
+
*/
|
|
67
|
+
export declare class A11yMirror {
|
|
68
|
+
private chart;
|
|
69
|
+
private wrapper;
|
|
70
|
+
private live;
|
|
71
|
+
private tableEl;
|
|
72
|
+
private hoverHandler;
|
|
73
|
+
private static seq;
|
|
74
|
+
constructor(chart: any);
|
|
75
|
+
get attached(): boolean;
|
|
76
|
+
get element(): any;
|
|
77
|
+
attach(): boolean;
|
|
78
|
+
detach(): void;
|
|
79
|
+
/** 用当前数据重建表格(数据或图例变化后调用)。 */
|
|
80
|
+
refresh(): void;
|
|
81
|
+
/** 播报一段文本(悬停 / 键盘导航时用)。 */
|
|
82
|
+
announce(text: string): void;
|
|
83
|
+
}
|
|
84
|
+
/** 系列类型 → 无障碍角色建议(供应用层构建镜像时参考)。 */
|
|
85
|
+
export declare const SERIES_ROLE_HINT: Record<SeriesType, string>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ChartLayout, NormalizedOption } from './internal';
|
|
2
|
+
import type { SeriesType } from './types';
|
|
3
|
+
/** 可访问数据表:屏幕阅读器可以直接读的一张表。 */
|
|
4
|
+
export interface DataTable {
|
|
5
|
+
caption: string;
|
|
6
|
+
columns: string[];
|
|
7
|
+
rows: string[][];
|
|
8
|
+
}
|
|
9
|
+
/** 虚拟数据节点:把「一个数据点」暴露成可聚焦节点所需的全部信息。 */
|
|
10
|
+
export interface A11yDataNode {
|
|
11
|
+
id: string;
|
|
12
|
+
role: 'graphic';
|
|
13
|
+
label: string;
|
|
14
|
+
seriesId: string;
|
|
15
|
+
seriesName: string;
|
|
16
|
+
dataIndex: number;
|
|
17
|
+
value: number | null;
|
|
18
|
+
/** 屏幕坐标盒(CSS 像素),应用层可直接做 DOM 镜像定位。 */
|
|
19
|
+
box: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
focusable: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** a11y 构建只依赖图表的这几项能力(避免与 ICEChart 循环依赖)。 */
|
|
28
|
+
export interface A11yChartLike {
|
|
29
|
+
ice: any;
|
|
30
|
+
norm: NormalizedOption;
|
|
31
|
+
layout: ChartLayout;
|
|
32
|
+
controller: any;
|
|
33
|
+
formatAxisValue(axis: 'x' | 'y', value: any): string;
|
|
34
|
+
}
|
|
35
|
+
export interface A11yTreeOptions {
|
|
36
|
+
/** 每个系列最多展开多少个数据节点,默认 200(避免把几万个点塞进无障碍树)。 */
|
|
37
|
+
maxDataNodesPerSeries?: number;
|
|
38
|
+
}
|
|
39
|
+
/** 图表标题(无障碍名也用它)。 */
|
|
40
|
+
export declare function chartTitle(norm: NormalizedOption): string;
|
|
41
|
+
/**
|
|
42
|
+
* 生成数据表。
|
|
43
|
+
*
|
|
44
|
+
* - 直角坐标:每行一个 x 位置,每列一个系列;
|
|
45
|
+
* - 饼图:每行一个扇区(名称 / 数值 / 占比);
|
|
46
|
+
* - 雷达图:每行一个指标,每列一个系列。
|
|
47
|
+
*
|
|
48
|
+
* 只统计**可见**系列与扇区,与画面严格一致 —— 图例隐藏的系列不该被读出来。
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildDataTable(chart: A11yChartLike): DataTable;
|
|
51
|
+
/**
|
|
52
|
+
* 生成虚拟数据节点:让应用层可以做「逐数据点」的 DOM 镜像与焦点环。
|
|
53
|
+
*
|
|
54
|
+
* 默认每个系列最多 200 个节点(整体数据表已经能表达全部数据,逐点节点是为了
|
|
55
|
+
* 键盘在数据点之间移动),可用 maxDataNodesPerSeries 调整。
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildDataNodes(chart: A11yChartLike, options?: A11yTreeOptions): A11yDataNode[];
|
|
58
|
+
/** 视觉隐藏但可被屏幕阅读器读取的样式。 */
|
|
59
|
+
export declare const VISUALLY_HIDDEN_STYLE: string;
|
|
60
|
+
/**
|
|
61
|
+
* 无障碍镜像:在 canvas 旁挂一张视觉隐藏的数据表 + 一个 aria-live 播报区。
|
|
62
|
+
*
|
|
63
|
+
* 为什么必须做:canvas 内容对屏幕阅读器完全不可见(引擎的 a11y 原语也只产出快照,
|
|
64
|
+
* 由应用层决定 DOM 结构)。ice-chart 选择把「数据表 + 当前悬停点播报」这一层直接做掉,
|
|
65
|
+
* 因为它对图表是通用语义;更细的交互镜像仍可由应用层基于 getA11yTree() 自行构建。
|
|
66
|
+
*/
|
|
67
|
+
export declare class A11yMirror {
|
|
68
|
+
private chart;
|
|
69
|
+
private wrapper;
|
|
70
|
+
private live;
|
|
71
|
+
private tableEl;
|
|
72
|
+
private hoverHandler;
|
|
73
|
+
private static seq;
|
|
74
|
+
constructor(chart: any);
|
|
75
|
+
get attached(): boolean;
|
|
76
|
+
get element(): any;
|
|
77
|
+
attach(): boolean;
|
|
78
|
+
detach(): void;
|
|
79
|
+
/** 用当前数据重建表格(数据或图例变化后调用)。 */
|
|
80
|
+
refresh(): void;
|
|
81
|
+
/** 播报一段文本(悬停 / 键盘导航时用)。 */
|
|
82
|
+
announce(text: string): void;
|
|
83
|
+
}
|
|
84
|
+
/** 系列类型 → 无障碍角色建议(供应用层构建镜像时参考)。 */
|
|
85
|
+
export declare const SERIES_ROLE_HINT: Record<SeriesType, string>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全局动效偏好。
|
|
3
|
+
*
|
|
4
|
+
* 放在独立模块里(而不是 ICEChart)是为了让**组件**也能读到它 ——
|
|
5
|
+
* 悬停反馈这类动画由组件自己启动,如果组件反向 import ICEChart 就会形成循环依赖。
|
|
6
|
+
*/
|
|
7
|
+
export type MotionPreference = 'auto' | 'instant' | 'full';
|
|
8
|
+
export declare function setMotionPreference(preference: MotionPreference): void;
|
|
9
|
+
export declare function getMotionPreference(): MotionPreference;
|
|
10
|
+
/** 当前是否应该播放动画(无障碍:尊重系统的「减少动态效果」)。 */
|
|
11
|
+
export declare function shouldAnimate(): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全局动效偏好。
|
|
3
|
+
*
|
|
4
|
+
* 放在独立模块里(而不是 ICEChart)是为了让**组件**也能读到它 ——
|
|
5
|
+
* 悬停反馈这类动画由组件自己启动,如果组件反向 import ICEChart 就会形成循环依赖。
|
|
6
|
+
*/
|
|
7
|
+
export type MotionPreference = 'auto' | 'instant' | 'full';
|
|
8
|
+
export declare function setMotionPreference(preference: MotionPreference): void;
|
|
9
|
+
export declare function getMotionPreference(): MotionPreference;
|
|
10
|
+
/** 当前是否应该播放动画(无障碍:尊重系统的「减少动态效果」)。 */
|
|
11
|
+
export declare function shouldAnimate(): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent.mjs';
|
|
2
|
+
import type { ChartTheme } from '../types.mjs';
|
|
3
|
+
import type { ChartLayout, InternalAxis } from '../internal.mjs';
|
|
4
|
+
/** 刻度平滑过渡时长:缩放 / 平移 / 数据更新时,标签滑动到新位置而不是瞬间跳。 */
|
|
5
|
+
export declare const AXIS_MORPH_DURATION = 240;
|
|
6
|
+
/**
|
|
7
|
+
* 坐标轴(x / y 共用一套绘制逻辑)。
|
|
8
|
+
*
|
|
9
|
+
* 轴组件拥有整块画布作为盒,绘制时直接用图表坐标系(左上角原点),
|
|
10
|
+
* 因此刻度标签、轴名称可以自然画到绘图区之外,不需要扩展包围盒。
|
|
11
|
+
*
|
|
12
|
+
* 多 y 轴支持:`axisIndex` 决定读哪个轴的刻度,`position` + `layout.offset`
|
|
13
|
+
* 决定轴线画在绘图区左侧还是右侧、以及同侧多轴时向外偏移多少。
|
|
14
|
+
*/
|
|
15
|
+
export declare class Axis extends ChartComponent {
|
|
16
|
+
orientation: 'x' | 'y';
|
|
17
|
+
/** y 轴下标(对应 norm.yAxes);x 轴恒为 0。 */
|
|
18
|
+
axisIndex: number;
|
|
19
|
+
position: 'left' | 'right';
|
|
20
|
+
axis: InternalAxis | null;
|
|
21
|
+
layout: ChartLayout | null;
|
|
22
|
+
theme: ChartTheme | null;
|
|
23
|
+
/** 上一次同步的刻度(含像素位置),用于检测变化并作为过渡起点。 */
|
|
24
|
+
private lastTicks;
|
|
25
|
+
private morphFrom;
|
|
26
|
+
constructor(props: {
|
|
27
|
+
orientation: 'x' | 'y';
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
zIndex?: number;
|
|
31
|
+
axisIndex?: number;
|
|
32
|
+
position?: 'left' | 'right';
|
|
33
|
+
});
|
|
34
|
+
/** y 轴轴线的 x 坐标(含同侧多层偏移)。 */
|
|
35
|
+
private edgeX;
|
|
36
|
+
private axisLayoutOf;
|
|
37
|
+
/** 当前刻度 + 目标位置 + 标签(抽稀规则与绘制时完全一致,两边共用这一份)。 */
|
|
38
|
+
private tickEntries;
|
|
39
|
+
/** 过渡进度(0~1);没有动画时恒为 1。 */
|
|
40
|
+
private morphProgress;
|
|
41
|
+
/** 每个刻度「此刻画在哪」:过渡中会取中间位置。 */
|
|
42
|
+
private renderedPositions;
|
|
43
|
+
/**
|
|
44
|
+
* 同步刻度并(在必要时)启动一次平滑过渡。
|
|
45
|
+
*
|
|
46
|
+
* 由 ICEChart 在 `layout` / `axis` 赋值之后调用。判断完全基于「刻度集合有没有变」,
|
|
47
|
+
* 所以缩放、平移、数据更新、图例切换、resize 都能自动覆盖,不需要调用方传意图。
|
|
48
|
+
*
|
|
49
|
+
* 过渡中的再次变化从**当前渲染位置**接着走(等价于指数平滑),
|
|
50
|
+
* 连续滚轮缩放时不会出现「每次事件都从旧位置重新跳」的抖动。
|
|
51
|
+
*/
|
|
52
|
+
syncTicks(): void;
|
|
53
|
+
/** 某个刻度当前的渲染位置(过渡中间态)。测试 / 审计用。 */
|
|
54
|
+
renderedTickPos(value: any): number | null;
|
|
55
|
+
/** 位置是否还在过渡中(测试 / 审计用)。 */
|
|
56
|
+
morphing(): boolean;
|
|
57
|
+
private drawTick;
|
|
58
|
+
private drawTickLabel;
|
|
59
|
+
protected doRender(): void;
|
|
60
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent';
|
|
2
|
+
import type { ChartTheme } from '../types';
|
|
3
|
+
import type { ChartLayout, InternalAxis } from '../internal';
|
|
4
|
+
/** 刻度平滑过渡时长:缩放 / 平移 / 数据更新时,标签滑动到新位置而不是瞬间跳。 */
|
|
5
|
+
export declare const AXIS_MORPH_DURATION = 240;
|
|
6
|
+
/**
|
|
7
|
+
* 坐标轴(x / y 共用一套绘制逻辑)。
|
|
8
|
+
*
|
|
9
|
+
* 轴组件拥有整块画布作为盒,绘制时直接用图表坐标系(左上角原点),
|
|
10
|
+
* 因此刻度标签、轴名称可以自然画到绘图区之外,不需要扩展包围盒。
|
|
11
|
+
*
|
|
12
|
+
* 多 y 轴支持:`axisIndex` 决定读哪个轴的刻度,`position` + `layout.offset`
|
|
13
|
+
* 决定轴线画在绘图区左侧还是右侧、以及同侧多轴时向外偏移多少。
|
|
14
|
+
*/
|
|
15
|
+
export declare class Axis extends ChartComponent {
|
|
16
|
+
orientation: 'x' | 'y';
|
|
17
|
+
/** y 轴下标(对应 norm.yAxes);x 轴恒为 0。 */
|
|
18
|
+
axisIndex: number;
|
|
19
|
+
position: 'left' | 'right';
|
|
20
|
+
axis: InternalAxis | null;
|
|
21
|
+
layout: ChartLayout | null;
|
|
22
|
+
theme: ChartTheme | null;
|
|
23
|
+
/** 上一次同步的刻度(含像素位置),用于检测变化并作为过渡起点。 */
|
|
24
|
+
private lastTicks;
|
|
25
|
+
private morphFrom;
|
|
26
|
+
constructor(props: {
|
|
27
|
+
orientation: 'x' | 'y';
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
zIndex?: number;
|
|
31
|
+
axisIndex?: number;
|
|
32
|
+
position?: 'left' | 'right';
|
|
33
|
+
});
|
|
34
|
+
/** y 轴轴线的 x 坐标(含同侧多层偏移)。 */
|
|
35
|
+
private edgeX;
|
|
36
|
+
private axisLayoutOf;
|
|
37
|
+
/** 当前刻度 + 目标位置 + 标签(抽稀规则与绘制时完全一致,两边共用这一份)。 */
|
|
38
|
+
private tickEntries;
|
|
39
|
+
/** 过渡进度(0~1);没有动画时恒为 1。 */
|
|
40
|
+
private morphProgress;
|
|
41
|
+
/** 每个刻度「此刻画在哪」:过渡中会取中间位置。 */
|
|
42
|
+
private renderedPositions;
|
|
43
|
+
/**
|
|
44
|
+
* 同步刻度并(在必要时)启动一次平滑过渡。
|
|
45
|
+
*
|
|
46
|
+
* 由 ICEChart 在 `layout` / `axis` 赋值之后调用。判断完全基于「刻度集合有没有变」,
|
|
47
|
+
* 所以缩放、平移、数据更新、图例切换、resize 都能自动覆盖,不需要调用方传意图。
|
|
48
|
+
*
|
|
49
|
+
* 过渡中的再次变化从**当前渲染位置**接着走(等价于指数平滑),
|
|
50
|
+
* 连续滚轮缩放时不会出现「每次事件都从旧位置重新跳」的抖动。
|
|
51
|
+
*/
|
|
52
|
+
syncTicks(): void;
|
|
53
|
+
/** 某个刻度当前的渲染位置(过渡中间态)。测试 / 审计用。 */
|
|
54
|
+
renderedTickPos(value: any): number | null;
|
|
55
|
+
/** 位置是否还在过渡中(测试 / 审计用)。 */
|
|
56
|
+
morphing(): boolean;
|
|
57
|
+
private drawTick;
|
|
58
|
+
private drawTickLabel;
|
|
59
|
+
protected doRender(): void;
|
|
60
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent.mjs';
|
|
2
|
+
import type { ChartTheme } from '../types.mjs';
|
|
3
|
+
import type { Rect } from '../internal.mjs';
|
|
4
|
+
/** 刷选框。拖拽期间由交互层每帧更新 rect(图表坐标系)。 */
|
|
5
|
+
export declare class Brush extends ChartComponent {
|
|
6
|
+
theme: ChartTheme | null;
|
|
7
|
+
rect: Rect | null;
|
|
8
|
+
color: {
|
|
9
|
+
fill: string;
|
|
10
|
+
stroke: string;
|
|
11
|
+
} | null;
|
|
12
|
+
constructor(props: {
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
zIndex?: number;
|
|
16
|
+
});
|
|
17
|
+
setRect(rect: Rect | null): this;
|
|
18
|
+
protected doRender(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent';
|
|
2
|
+
import type { ChartTheme } from '../types';
|
|
3
|
+
import type { Rect } from '../internal';
|
|
4
|
+
/** 刷选框。拖拽期间由交互层每帧更新 rect(图表坐标系)。 */
|
|
5
|
+
export declare class Brush extends ChartComponent {
|
|
6
|
+
theme: ChartTheme | null;
|
|
7
|
+
rect: Rect | null;
|
|
8
|
+
color: {
|
|
9
|
+
fill: string;
|
|
10
|
+
stroke: string;
|
|
11
|
+
} | null;
|
|
12
|
+
constructor(props: {
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
zIndex?: number;
|
|
16
|
+
});
|
|
17
|
+
setRect(rect: Rect | null): this;
|
|
18
|
+
protected doRender(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ICEComponent } from 'ice-render';
|
|
2
|
+
export interface ChartComponentProps {
|
|
3
|
+
left?: number;
|
|
4
|
+
top?: number;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
zIndex?: number;
|
|
8
|
+
interactive?: boolean;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* ice-chart 所有组件的基类。
|
|
13
|
+
*
|
|
14
|
+
* 与引擎默认组件有三处差异:
|
|
15
|
+
* 1. origin 用 'top-left',图表内部统一按「左上角为原点」的笛卡尔直觉坐标绘制与命中;
|
|
16
|
+
* 2. draggable / transformable / linkable 一律关闭 —— 图表图元不是编辑器图元;
|
|
17
|
+
* 3. keyboardEvtHandler 覆写为空 —— 引擎默认用方向键移动组件,这对图表是灾难
|
|
18
|
+
* (按一下方向键整条折线平移 2px)。键盘导航由交互层统一接管。
|
|
19
|
+
*/
|
|
20
|
+
export declare class ChartComponent extends ICEComponent {
|
|
21
|
+
private loopRegistered;
|
|
22
|
+
constructor(props?: ChartComponentProps);
|
|
23
|
+
/** 图表组件不响应引擎默认的键盘移动。 */
|
|
24
|
+
protected keyboardEvtHandler(): void;
|
|
25
|
+
/** 左上角原点的盒式命中判定。 */
|
|
26
|
+
protected containsLocalPoint(localX: number, localY: number): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 一个「设备像素」在当前 ctx 变换下对应的本地长度。
|
|
29
|
+
* 用于把 1px 轴线 / 边框画清晰(视口缩放与 HiDPI 下都不发虚)。
|
|
30
|
+
*/
|
|
31
|
+
protected unit(): number;
|
|
32
|
+
/** 把坐标对齐到设备像素中心,保证 1px 线不发虚。 */
|
|
33
|
+
protected snap(value: number): number;
|
|
34
|
+
/** 标记自身需要重绘,并唤醒渲染器。 */
|
|
35
|
+
markDirty(): this;
|
|
36
|
+
/**
|
|
37
|
+
* 让组件「持续重绘」:给引擎挂一个 100ms 循环动画。
|
|
38
|
+
*
|
|
39
|
+
* 这正是引擎蚂蚁线(lineDashFlow)的做法 —— 动画值本身没意义,
|
|
40
|
+
* 作用是每帧 setState → 标脏 → 重绘;真正的动效(如虚线相位)用 Date.now() 算。
|
|
41
|
+
* 注意:持续重绘会让脏矩形局部重绘失去意义,只在确实需要「一直动」时用,且要能停。
|
|
42
|
+
*/
|
|
43
|
+
protected keepAnimating(): void;
|
|
44
|
+
/** 停止持续重绘。 */
|
|
45
|
+
protected stopAnimating(): void;
|
|
46
|
+
/** 统一的字体设置。 */
|
|
47
|
+
protected setFont(fontSize: number, fontFamily: string, weight?: string | number): void;
|
|
48
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ICEComponent } from 'ice-render';
|
|
2
|
+
export interface ChartComponentProps {
|
|
3
|
+
left?: number;
|
|
4
|
+
top?: number;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
zIndex?: number;
|
|
8
|
+
interactive?: boolean;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* ice-chart 所有组件的基类。
|
|
13
|
+
*
|
|
14
|
+
* 与引擎默认组件有三处差异:
|
|
15
|
+
* 1. origin 用 'top-left',图表内部统一按「左上角为原点」的笛卡尔直觉坐标绘制与命中;
|
|
16
|
+
* 2. draggable / transformable / linkable 一律关闭 —— 图表图元不是编辑器图元;
|
|
17
|
+
* 3. keyboardEvtHandler 覆写为空 —— 引擎默认用方向键移动组件,这对图表是灾难
|
|
18
|
+
* (按一下方向键整条折线平移 2px)。键盘导航由交互层统一接管。
|
|
19
|
+
*/
|
|
20
|
+
export declare class ChartComponent extends ICEComponent {
|
|
21
|
+
private loopRegistered;
|
|
22
|
+
constructor(props?: ChartComponentProps);
|
|
23
|
+
/** 图表组件不响应引擎默认的键盘移动。 */
|
|
24
|
+
protected keyboardEvtHandler(): void;
|
|
25
|
+
/** 左上角原点的盒式命中判定。 */
|
|
26
|
+
protected containsLocalPoint(localX: number, localY: number): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 一个「设备像素」在当前 ctx 变换下对应的本地长度。
|
|
29
|
+
* 用于把 1px 轴线 / 边框画清晰(视口缩放与 HiDPI 下都不发虚)。
|
|
30
|
+
*/
|
|
31
|
+
protected unit(): number;
|
|
32
|
+
/** 把坐标对齐到设备像素中心,保证 1px 线不发虚。 */
|
|
33
|
+
protected snap(value: number): number;
|
|
34
|
+
/** 标记自身需要重绘,并唤醒渲染器。 */
|
|
35
|
+
markDirty(): this;
|
|
36
|
+
/**
|
|
37
|
+
* 让组件「持续重绘」:给引擎挂一个 100ms 循环动画。
|
|
38
|
+
*
|
|
39
|
+
* 这正是引擎蚂蚁线(lineDashFlow)的做法 —— 动画值本身没意义,
|
|
40
|
+
* 作用是每帧 setState → 标脏 → 重绘;真正的动效(如虚线相位)用 Date.now() 算。
|
|
41
|
+
* 注意:持续重绘会让脏矩形局部重绘失去意义,只在确实需要「一直动」时用,且要能停。
|
|
42
|
+
*/
|
|
43
|
+
protected keepAnimating(): void;
|
|
44
|
+
/** 停止持续重绘。 */
|
|
45
|
+
protected stopAnimating(): void;
|
|
46
|
+
/** 统一的字体设置。 */
|
|
47
|
+
protected setFont(fontSize: number, fontFamily: string, weight?: string | number): void;
|
|
48
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent.mjs';
|
|
2
|
+
import type { ChartTheme, CrosshairOption } from '../types.mjs';
|
|
3
|
+
import type { ChartLayout } from '../internal.mjs';
|
|
4
|
+
/** 十字准星:跟随活动数据列的辅助线 + 坐标轴数值标签。 */
|
|
5
|
+
export declare class Crosshair extends ChartComponent {
|
|
6
|
+
layout: ChartLayout | null;
|
|
7
|
+
theme: ChartTheme | null;
|
|
8
|
+
option: CrosshairOption;
|
|
9
|
+
pixelX: number | null;
|
|
10
|
+
pixelY: number | null;
|
|
11
|
+
xLabel: string;
|
|
12
|
+
yLabel: string;
|
|
13
|
+
/** 最近一次绘制的轴数值标签矩形(图表坐标系),供外观审计 / 测试断言使用。 */
|
|
14
|
+
lastChipRects: Array<{
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
}>;
|
|
20
|
+
/** 换列时的跟随时长(毫秒):由图表按 `animation.update.duration` 下发。 */
|
|
21
|
+
followDuration: number;
|
|
22
|
+
constructor(props: {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
zIndex?: number;
|
|
26
|
+
});
|
|
27
|
+
show(pixelX: number | null, pixelY: number | null, xLabel: string, yLabel: string): this;
|
|
28
|
+
/** 绘制位置(可能是动画中的中间值);`pixelX/pixelY` 始终是目标值。 */
|
|
29
|
+
private drawnX;
|
|
30
|
+
private drawnY;
|
|
31
|
+
/**
|
|
32
|
+
* 准星平滑:每次悬停换列时从**当前位置**补间到新位置(而不是硬切)。
|
|
33
|
+
* 快速划过时会有轻微跟随感,这正是十字准星该有的手感。
|
|
34
|
+
*/
|
|
35
|
+
private animateAxis;
|
|
36
|
+
hide(): this;
|
|
37
|
+
private stopAxisAnimation;
|
|
38
|
+
protected doRender(): void;
|
|
39
|
+
private drawChip;
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent';
|
|
2
|
+
import type { ChartTheme, CrosshairOption } from '../types';
|
|
3
|
+
import type { ChartLayout } from '../internal';
|
|
4
|
+
/** 十字准星:跟随活动数据列的辅助线 + 坐标轴数值标签。 */
|
|
5
|
+
export declare class Crosshair extends ChartComponent {
|
|
6
|
+
layout: ChartLayout | null;
|
|
7
|
+
theme: ChartTheme | null;
|
|
8
|
+
option: CrosshairOption;
|
|
9
|
+
pixelX: number | null;
|
|
10
|
+
pixelY: number | null;
|
|
11
|
+
xLabel: string;
|
|
12
|
+
yLabel: string;
|
|
13
|
+
/** 最近一次绘制的轴数值标签矩形(图表坐标系),供外观审计 / 测试断言使用。 */
|
|
14
|
+
lastChipRects: Array<{
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
}>;
|
|
20
|
+
/** 换列时的跟随时长(毫秒):由图表按 `animation.update.duration` 下发。 */
|
|
21
|
+
followDuration: number;
|
|
22
|
+
constructor(props: {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
zIndex?: number;
|
|
26
|
+
});
|
|
27
|
+
show(pixelX: number | null, pixelY: number | null, xLabel: string, yLabel: string): this;
|
|
28
|
+
/** 绘制位置(可能是动画中的中间值);`pixelX/pixelY` 始终是目标值。 */
|
|
29
|
+
private drawnX;
|
|
30
|
+
private drawnY;
|
|
31
|
+
/**
|
|
32
|
+
* 准星平滑:每次悬停换列时从**当前位置**补间到新位置(而不是硬切)。
|
|
33
|
+
* 快速划过时会有轻微跟随感,这正是十字准星该有的手感。
|
|
34
|
+
*/
|
|
35
|
+
private animateAxis;
|
|
36
|
+
hide(): this;
|
|
37
|
+
private stopAxisAnimation;
|
|
38
|
+
protected doRender(): void;
|
|
39
|
+
private drawChip;
|
|
40
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent.mjs';
|
|
2
|
+
import type { ChartTheme } from '../types.mjs';
|
|
3
|
+
export type SliderPart = 'start' | 'end' | 'window' | 'track';
|
|
4
|
+
/**
|
|
5
|
+
* dataZoom 滑块。
|
|
6
|
+
*
|
|
7
|
+
* 组件只关心「0~1 的窗口比例」:把比例换算成数据域是图表层的职责
|
|
8
|
+
* (类目轴按索引窗口、数值/时间轴按线性插值),因此这个组件对坐标系一无所知。
|
|
9
|
+
*/
|
|
10
|
+
export declare class DataZoomSlider extends ChartComponent {
|
|
11
|
+
theme: ChartTheme | null;
|
|
12
|
+
/** 窗口比例(0~1)。 */
|
|
13
|
+
start: number;
|
|
14
|
+
end: number;
|
|
15
|
+
activePart: SliderPart | null;
|
|
16
|
+
private handleWidth;
|
|
17
|
+
constructor(props: {
|
|
18
|
+
left?: number;
|
|
19
|
+
top?: number;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
zIndex?: number;
|
|
23
|
+
});
|
|
24
|
+
setWindow(start: number, end: number): this;
|
|
25
|
+
setActive(part: SliderPart | null): this;
|
|
26
|
+
/** 指针落在滑块的哪一部分。 */
|
|
27
|
+
hitPart(localX: number, localY: number): SliderPart | null;
|
|
28
|
+
fractionAt(localX: number): number;
|
|
29
|
+
protected doRender(): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent';
|
|
2
|
+
import type { ChartTheme } from '../types';
|
|
3
|
+
export type SliderPart = 'start' | 'end' | 'window' | 'track';
|
|
4
|
+
/**
|
|
5
|
+
* dataZoom 滑块。
|
|
6
|
+
*
|
|
7
|
+
* 组件只关心「0~1 的窗口比例」:把比例换算成数据域是图表层的职责
|
|
8
|
+
* (类目轴按索引窗口、数值/时间轴按线性插值),因此这个组件对坐标系一无所知。
|
|
9
|
+
*/
|
|
10
|
+
export declare class DataZoomSlider extends ChartComponent {
|
|
11
|
+
theme: ChartTheme | null;
|
|
12
|
+
/** 窗口比例(0~1)。 */
|
|
13
|
+
start: number;
|
|
14
|
+
end: number;
|
|
15
|
+
activePart: SliderPart | null;
|
|
16
|
+
private handleWidth;
|
|
17
|
+
constructor(props: {
|
|
18
|
+
left?: number;
|
|
19
|
+
top?: number;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
zIndex?: number;
|
|
23
|
+
});
|
|
24
|
+
setWindow(start: number, end: number): this;
|
|
25
|
+
setActive(part: SliderPart | null): this;
|
|
26
|
+
/** 指针落在滑块的哪一部分。 */
|
|
27
|
+
hitPart(localX: number, localY: number): SliderPart | null;
|
|
28
|
+
fractionAt(localX: number): number;
|
|
29
|
+
protected doRender(): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ChartComponent } from './ChartComponent.mjs';
|
|
2
|
+
import type { ChartTheme, GridOption } from '../types.mjs';
|
|
3
|
+
import type { Rect } from '../internal.mjs';
|
|
4
|
+
import type { Scale } from '../scale.mjs';
|
|
5
|
+
/** 网格线。绘制在 series 之下,不参与命中测试。 */
|
|
6
|
+
export declare class GridLines extends ChartComponent {
|
|
7
|
+
xScale: Scale | null;
|
|
8
|
+
yScale: Scale | null;
|
|
9
|
+
/** 水平网格线:每个 y 轴一组(默认只有主轴画网格线)。 */
|
|
10
|
+
horizontal: Array<{
|
|
11
|
+
scale: Scale;
|
|
12
|
+
ticks: any[];
|
|
13
|
+
index?: number;
|
|
14
|
+
}>;
|
|
15
|
+
plot: Rect;
|
|
16
|
+
grid: GridOption;
|
|
17
|
+
theme: ChartTheme | null;
|
|
18
|
+
/** 坐标轴组件:网格线的位置**全部问坐标轴要**,保证过渡期间两者不脱节。 */
|
|
19
|
+
axisX: any;
|
|
20
|
+
axisYList: any[];
|
|
21
|
+
constructor(props: {
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
zIndex?: number;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* 由 ICEChart 在坐标轴同步之后调用。
|
|
28
|
+
*
|
|
29
|
+
* 网格线不自己算位置(位置全部读坐标轴的 `renderedTickPos`),但必须**每帧重绘**,
|
|
30
|
+
* 所以借一条与刻度同长的补间当「脏驱动」——否则标签在滑动、网格线却停在旧位置。
|
|
31
|
+
*/
|
|
32
|
+
syncTicks(): void;
|
|
33
|
+
/** 某个 y 轴刻度的当前渲染位置(过渡中取中间值)。 */
|
|
34
|
+
private yTickPos;
|
|
35
|
+
private xTickPos;
|
|
36
|
+
protected doRender(): void;
|
|
37
|
+
}
|