@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,232 @@
1
+ import type { AxisOption, ChartOption, FunnelOption, GaugeOption, LiquidOption, GraphOption, LegendOption, RadarOption, SankeyOption, SeriesOption, SeriesType, TreemapOption, ChartTheme } from './types.mjs';
2
+ import type { Scale } from './scale.mjs';
3
+ /** 归一化后的数据点(数据域,不含像素)。 */
4
+ export interface DataPoint {
5
+ /** 系列内下标。 */
6
+ index: number;
7
+ /** x 原始值:类目轴为类目,数值轴为数字,时间轴为时间戳。 */
8
+ xValue: any;
9
+ /** y 数值;null 表示断点。 */
10
+ y: number | null;
11
+ /** 原始数据项。 */
12
+ raw: any;
13
+ /** 堆叠基线(未堆叠时为 0)。 */
14
+ base: number;
15
+ /** 堆叠顶端(未堆叠时等于 y)。 */
16
+ top: number;
17
+ /** 类目名 / 扇区名(饼图、类目轴对象数据的 name 字段)。 */
18
+ name?: string;
19
+ /** 该数据点自身的颜色(饼图的每个扇区各有一色)。 */
20
+ color?: string;
21
+ /** 第三维数值(气泡图的尺寸)。 */
22
+ size?: number;
23
+ /** K 线的 [open, close, low, high]。 */
24
+ ohlc?: [number, number, number, number];
25
+ /** 箱线图的 [min, Q1, median, Q3, max]。 */
26
+ boxplot?: [number, number, number, number, number];
27
+ }
28
+ /** 极坐标布局:圆心与半径(图表坐标系)。 */
29
+ export interface PolarLayout {
30
+ cx: number;
31
+ cy: number;
32
+ radius: number;
33
+ }
34
+ export interface InternalSeries {
35
+ id: string;
36
+ index: number;
37
+ type: SeriesType;
38
+ name: string;
39
+ color: string;
40
+ option: SeriesOption;
41
+ points: DataPoint[];
42
+ /** 数据里是否显式提供了 x(决定类目轴的类目来源)。 */
43
+ hasExplicitX: boolean;
44
+ /** 该系列是否被图例隐藏。 */
45
+ hidden: boolean;
46
+ /** 绑定的 y 轴下标。 */
47
+ axisIndex: number;
48
+ /**
49
+ * 数据域采样值(函数绘图用)。
50
+ *
51
+ * 函数图的 y 轴不该被 1/x 的尖峰拉到 ±2500,这里直接给出**稳健范围**,
52
+ * 由 buildYDomain 采纳;给了它就不再逐点取 y(点的 y 仍然是真值,供提示框使用)。
53
+ */
54
+ domainValues?: number[];
55
+ /**
56
+ * x 轴的取值集合(参数曲线用)。
57
+ *
58
+ * 参数曲线的 `xValue` 是参数 t,不是横坐标 —— x 轴数据域必须来自 `x(t)`,
59
+ * 否则坐标轴会按 t 的范围来画(李萨如曲线会整条错位)。
60
+ */
61
+ domainXValues?: number[];
62
+ /** 表达式编译失败时的原因(图表不崩,但要把错误暴露给表单 / 调用方)。 */
63
+ expressionError?: string;
64
+ /** 表达式诊断(语法 / 未定义变量 / 整段画不出来 / 输出恒定),交给表单去标红与提示。 */
65
+ expressionDiagnostics?: Array<{
66
+ code: string;
67
+ severity: 'error' | 'warning';
68
+ message: string;
69
+ position?: number;
70
+ }>;
71
+ }
72
+ export interface InternalAxis {
73
+ option: AxisOption;
74
+ type: 'linear' | 'category' | 'time' | 'log';
75
+ domain: any[];
76
+ scale: Scale | null;
77
+ /** 轴下标:x 轴恒为 0;y 轴对应 option.yAxis 数组下标。 */
78
+ index: number;
79
+ /** y 轴位置(x 轴为 left,不使用)。 */
80
+ position: 'left' | 'right';
81
+ }
82
+ export interface NormalizedOption {
83
+ /** 场景类型:直角坐标 / 极坐标(饼图)/ 雷达图 / 桑基图。 */
84
+ kind: 'cartesian' | 'polar' | 'radar' | 'sankey' | 'funnel' | 'gauge' | 'liquid' | 'treemap' | 'graph';
85
+ /**
86
+ * 直角坐标的排布方向。
87
+ * vertical:类目在 x 轴(普通柱状/折线);horizontal:类目在 y 轴(横向柱状,排行榜场景)。
88
+ */
89
+ orientation: 'vertical' | 'horizontal';
90
+ /** 雷达图配置(存在雷达系列时非空)。 */
91
+ radar: RadarOption | null;
92
+ /** 桑基图配置(存在桑基系列时非空)。 */
93
+ sankey: SankeyOption | null;
94
+ /** 漏斗图配置。 */
95
+ funnel: FunnelOption | null;
96
+ /** 仪表盘配置。 */
97
+ gauge: GaugeOption | null;
98
+ /** 水位图配置(kind === 'liquid' 时非空)。 */
99
+ liquid: LiquidOption | null;
100
+ /** 矩形树图配置。 */
101
+ treemap: TreemapOption | null;
102
+ /** 关系图配置。 */
103
+ graph: GraphOption | null;
104
+ /** 每个雷达指标轴的数据域。 */
105
+ radarDomains: Array<[number, number]>;
106
+ /** 合并默认值之后的原始 option(函数字段保留)。 */
107
+ option: ChartOption & {
108
+ legend: LegendOption;
109
+ margin: {
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
113
+ left: number;
114
+ };
115
+ };
116
+ theme: ChartTheme;
117
+ series: InternalSeries[];
118
+ xAxis: InternalAxis;
119
+ /** 全部 y 轴(yAxes[0] 是主 y 轴)。 */
120
+ yAxes: InternalAxis[];
121
+ /** 主 y 轴别名,等价于 yAxes[0]。 */
122
+ yAxis: InternalAxis;
123
+ /** 类目轴的类目列表(数值轴为空数组)。 */
124
+ categories: any[];
125
+ /** 参与渲染的系列(未被图例隐藏)。 */
126
+ visibleSeries: InternalSeries[];
127
+ hiddenIds: Record<string, boolean>;
128
+ /** 被隐藏的扇区,key 为 `seriesId#dataIndex`。 */
129
+ hiddenSlices: Record<string, boolean>;
130
+ }
131
+ export interface Rect {
132
+ x: number;
133
+ y: number;
134
+ width: number;
135
+ height: number;
136
+ }
137
+ export interface AxisLayout {
138
+ /** 刻度值。 */
139
+ ticks: any[];
140
+ /** 刻度标签文本。 */
141
+ labels: string[];
142
+ /** 该轴相对绘图区边缘外扩的像素距离(多轴时同侧的轴逐层外移)。 */
143
+ offset: number;
144
+ /** 刻度标签的最大宽度 / 高度(像素)。 */
145
+ labelWidth: number;
146
+ labelHeight: number;
147
+ /** 轴名称文本宽度 / 高度。 */
148
+ nameWidth: number;
149
+ nameHeight: number;
150
+ }
151
+ export interface ChartLayout {
152
+ canvas: Rect;
153
+ plot: Rect;
154
+ titleRect: Rect | null;
155
+ legendRect: Rect | null;
156
+ legend: LegendLayout | null;
157
+ title: TitleLayout | null;
158
+ /** 极坐标圆心与半径;直角坐标场景为 null。 */
159
+ polar: PolarLayout | null;
160
+ /** dataZoom 滑块占用的矩形;未启用时为 null。 */
161
+ slider: Rect | null;
162
+ xAxisLayout: AxisLayout;
163
+ /** 每个 y 轴的刻度布局,与 norm.yAxes 一一对应。 */
164
+ yAxes: AxisLayout[];
165
+ /** 主 y 轴的刻度布局(yAxes[0] 的别名)。 */
166
+ yAxisLayout: AxisLayout;
167
+ margin: {
168
+ top: number;
169
+ right: number;
170
+ bottom: number;
171
+ left: number;
172
+ };
173
+ }
174
+ export interface LegendItemLayout {
175
+ seriesId: string;
176
+ seriesIndex: number;
177
+ name: string;
178
+ color: string;
179
+ hidden: boolean;
180
+ /** 饼图图例项对应的数据下标(直角坐标场景为 undefined)。 */
181
+ dataIndex?: number;
182
+ /** 可点击区域。 */
183
+ x: number;
184
+ y: number;
185
+ width: number;
186
+ height: number;
187
+ }
188
+ export interface LegendLayout {
189
+ position: 'top' | 'bottom' | 'left' | 'right';
190
+ items: LegendItemLayout[];
191
+ }
192
+ export interface TitleLayout {
193
+ text: string;
194
+ subtext: string;
195
+ /** 文本锚点。 */
196
+ x: number;
197
+ y: number;
198
+ align: 'left' | 'center' | 'right';
199
+ textStyle: {
200
+ color: string;
201
+ fontSize: number;
202
+ fontWeight: string | number;
203
+ };
204
+ subtextStyle: {
205
+ color: string;
206
+ fontSize: number;
207
+ };
208
+ }
209
+ /** 活动数据项(悬停 / 选中 / 键盘导航的共用描述)。 */
210
+ export interface ActiveItem {
211
+ series: InternalSeries;
212
+ point: DataPoint;
213
+ /** 画布坐标(CSS 像素)。 */
214
+ screen: [number, number];
215
+ /** 图表坐标系内的像素位置(相对画布左上角)。 */
216
+ pixel: [number, number];
217
+ }
218
+ /** axis 触发器的悬停列:同一 x 上的所有系列数据点。 */
219
+ export interface ActiveColumn {
220
+ dataIndex: number;
221
+ xValue: any;
222
+ /** 图表坐标系内的 x 像素。 */
223
+ pixelX: number;
224
+ items: ActiveItem[];
225
+ }
226
+ export type HoverState = {
227
+ kind: 'item';
228
+ item: ActiveItem;
229
+ } | {
230
+ kind: 'axis';
231
+ column: ActiveColumn;
232
+ } | null;
@@ -0,0 +1,232 @@
1
+ import type { AxisOption, ChartOption, FunnelOption, GaugeOption, LiquidOption, GraphOption, LegendOption, RadarOption, SankeyOption, SeriesOption, SeriesType, TreemapOption, ChartTheme } from './types';
2
+ import type { Scale } from './scale';
3
+ /** 归一化后的数据点(数据域,不含像素)。 */
4
+ export interface DataPoint {
5
+ /** 系列内下标。 */
6
+ index: number;
7
+ /** x 原始值:类目轴为类目,数值轴为数字,时间轴为时间戳。 */
8
+ xValue: any;
9
+ /** y 数值;null 表示断点。 */
10
+ y: number | null;
11
+ /** 原始数据项。 */
12
+ raw: any;
13
+ /** 堆叠基线(未堆叠时为 0)。 */
14
+ base: number;
15
+ /** 堆叠顶端(未堆叠时等于 y)。 */
16
+ top: number;
17
+ /** 类目名 / 扇区名(饼图、类目轴对象数据的 name 字段)。 */
18
+ name?: string;
19
+ /** 该数据点自身的颜色(饼图的每个扇区各有一色)。 */
20
+ color?: string;
21
+ /** 第三维数值(气泡图的尺寸)。 */
22
+ size?: number;
23
+ /** K 线的 [open, close, low, high]。 */
24
+ ohlc?: [number, number, number, number];
25
+ /** 箱线图的 [min, Q1, median, Q3, max]。 */
26
+ boxplot?: [number, number, number, number, number];
27
+ }
28
+ /** 极坐标布局:圆心与半径(图表坐标系)。 */
29
+ export interface PolarLayout {
30
+ cx: number;
31
+ cy: number;
32
+ radius: number;
33
+ }
34
+ export interface InternalSeries {
35
+ id: string;
36
+ index: number;
37
+ type: SeriesType;
38
+ name: string;
39
+ color: string;
40
+ option: SeriesOption;
41
+ points: DataPoint[];
42
+ /** 数据里是否显式提供了 x(决定类目轴的类目来源)。 */
43
+ hasExplicitX: boolean;
44
+ /** 该系列是否被图例隐藏。 */
45
+ hidden: boolean;
46
+ /** 绑定的 y 轴下标。 */
47
+ axisIndex: number;
48
+ /**
49
+ * 数据域采样值(函数绘图用)。
50
+ *
51
+ * 函数图的 y 轴不该被 1/x 的尖峰拉到 ±2500,这里直接给出**稳健范围**,
52
+ * 由 buildYDomain 采纳;给了它就不再逐点取 y(点的 y 仍然是真值,供提示框使用)。
53
+ */
54
+ domainValues?: number[];
55
+ /**
56
+ * x 轴的取值集合(参数曲线用)。
57
+ *
58
+ * 参数曲线的 `xValue` 是参数 t,不是横坐标 —— x 轴数据域必须来自 `x(t)`,
59
+ * 否则坐标轴会按 t 的范围来画(李萨如曲线会整条错位)。
60
+ */
61
+ domainXValues?: number[];
62
+ /** 表达式编译失败时的原因(图表不崩,但要把错误暴露给表单 / 调用方)。 */
63
+ expressionError?: string;
64
+ /** 表达式诊断(语法 / 未定义变量 / 整段画不出来 / 输出恒定),交给表单去标红与提示。 */
65
+ expressionDiagnostics?: Array<{
66
+ code: string;
67
+ severity: 'error' | 'warning';
68
+ message: string;
69
+ position?: number;
70
+ }>;
71
+ }
72
+ export interface InternalAxis {
73
+ option: AxisOption;
74
+ type: 'linear' | 'category' | 'time' | 'log';
75
+ domain: any[];
76
+ scale: Scale | null;
77
+ /** 轴下标:x 轴恒为 0;y 轴对应 option.yAxis 数组下标。 */
78
+ index: number;
79
+ /** y 轴位置(x 轴为 left,不使用)。 */
80
+ position: 'left' | 'right';
81
+ }
82
+ export interface NormalizedOption {
83
+ /** 场景类型:直角坐标 / 极坐标(饼图)/ 雷达图 / 桑基图。 */
84
+ kind: 'cartesian' | 'polar' | 'radar' | 'sankey' | 'funnel' | 'gauge' | 'liquid' | 'treemap' | 'graph';
85
+ /**
86
+ * 直角坐标的排布方向。
87
+ * vertical:类目在 x 轴(普通柱状/折线);horizontal:类目在 y 轴(横向柱状,排行榜场景)。
88
+ */
89
+ orientation: 'vertical' | 'horizontal';
90
+ /** 雷达图配置(存在雷达系列时非空)。 */
91
+ radar: RadarOption | null;
92
+ /** 桑基图配置(存在桑基系列时非空)。 */
93
+ sankey: SankeyOption | null;
94
+ /** 漏斗图配置。 */
95
+ funnel: FunnelOption | null;
96
+ /** 仪表盘配置。 */
97
+ gauge: GaugeOption | null;
98
+ /** 水位图配置(kind === 'liquid' 时非空)。 */
99
+ liquid: LiquidOption | null;
100
+ /** 矩形树图配置。 */
101
+ treemap: TreemapOption | null;
102
+ /** 关系图配置。 */
103
+ graph: GraphOption | null;
104
+ /** 每个雷达指标轴的数据域。 */
105
+ radarDomains: Array<[number, number]>;
106
+ /** 合并默认值之后的原始 option(函数字段保留)。 */
107
+ option: ChartOption & {
108
+ legend: LegendOption;
109
+ margin: {
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
113
+ left: number;
114
+ };
115
+ };
116
+ theme: ChartTheme;
117
+ series: InternalSeries[];
118
+ xAxis: InternalAxis;
119
+ /** 全部 y 轴(yAxes[0] 是主 y 轴)。 */
120
+ yAxes: InternalAxis[];
121
+ /** 主 y 轴别名,等价于 yAxes[0]。 */
122
+ yAxis: InternalAxis;
123
+ /** 类目轴的类目列表(数值轴为空数组)。 */
124
+ categories: any[];
125
+ /** 参与渲染的系列(未被图例隐藏)。 */
126
+ visibleSeries: InternalSeries[];
127
+ hiddenIds: Record<string, boolean>;
128
+ /** 被隐藏的扇区,key 为 `seriesId#dataIndex`。 */
129
+ hiddenSlices: Record<string, boolean>;
130
+ }
131
+ export interface Rect {
132
+ x: number;
133
+ y: number;
134
+ width: number;
135
+ height: number;
136
+ }
137
+ export interface AxisLayout {
138
+ /** 刻度值。 */
139
+ ticks: any[];
140
+ /** 刻度标签文本。 */
141
+ labels: string[];
142
+ /** 该轴相对绘图区边缘外扩的像素距离(多轴时同侧的轴逐层外移)。 */
143
+ offset: number;
144
+ /** 刻度标签的最大宽度 / 高度(像素)。 */
145
+ labelWidth: number;
146
+ labelHeight: number;
147
+ /** 轴名称文本宽度 / 高度。 */
148
+ nameWidth: number;
149
+ nameHeight: number;
150
+ }
151
+ export interface ChartLayout {
152
+ canvas: Rect;
153
+ plot: Rect;
154
+ titleRect: Rect | null;
155
+ legendRect: Rect | null;
156
+ legend: LegendLayout | null;
157
+ title: TitleLayout | null;
158
+ /** 极坐标圆心与半径;直角坐标场景为 null。 */
159
+ polar: PolarLayout | null;
160
+ /** dataZoom 滑块占用的矩形;未启用时为 null。 */
161
+ slider: Rect | null;
162
+ xAxisLayout: AxisLayout;
163
+ /** 每个 y 轴的刻度布局,与 norm.yAxes 一一对应。 */
164
+ yAxes: AxisLayout[];
165
+ /** 主 y 轴的刻度布局(yAxes[0] 的别名)。 */
166
+ yAxisLayout: AxisLayout;
167
+ margin: {
168
+ top: number;
169
+ right: number;
170
+ bottom: number;
171
+ left: number;
172
+ };
173
+ }
174
+ export interface LegendItemLayout {
175
+ seriesId: string;
176
+ seriesIndex: number;
177
+ name: string;
178
+ color: string;
179
+ hidden: boolean;
180
+ /** 饼图图例项对应的数据下标(直角坐标场景为 undefined)。 */
181
+ dataIndex?: number;
182
+ /** 可点击区域。 */
183
+ x: number;
184
+ y: number;
185
+ width: number;
186
+ height: number;
187
+ }
188
+ export interface LegendLayout {
189
+ position: 'top' | 'bottom' | 'left' | 'right';
190
+ items: LegendItemLayout[];
191
+ }
192
+ export interface TitleLayout {
193
+ text: string;
194
+ subtext: string;
195
+ /** 文本锚点。 */
196
+ x: number;
197
+ y: number;
198
+ align: 'left' | 'center' | 'right';
199
+ textStyle: {
200
+ color: string;
201
+ fontSize: number;
202
+ fontWeight: string | number;
203
+ };
204
+ subtextStyle: {
205
+ color: string;
206
+ fontSize: number;
207
+ };
208
+ }
209
+ /** 活动数据项(悬停 / 选中 / 键盘导航的共用描述)。 */
210
+ export interface ActiveItem {
211
+ series: InternalSeries;
212
+ point: DataPoint;
213
+ /** 画布坐标(CSS 像素)。 */
214
+ screen: [number, number];
215
+ /** 图表坐标系内的像素位置(相对画布左上角)。 */
216
+ pixel: [number, number];
217
+ }
218
+ /** axis 触发器的悬停列:同一 x 上的所有系列数据点。 */
219
+ export interface ActiveColumn {
220
+ dataIndex: number;
221
+ xValue: any;
222
+ /** 图表坐标系内的 x 像素。 */
223
+ pixelX: number;
224
+ items: ActiveItem[];
225
+ }
226
+ export type HoverState = {
227
+ kind: 'item';
228
+ item: ActiveItem;
229
+ } | {
230
+ kind: 'axis';
231
+ column: ActiveColumn;
232
+ } | null;
@@ -0,0 +1,48 @@
1
+ import type { Rect } from '../internal.mjs';
2
+ import type { GraphLinkOption, GraphNodeOption, GraphOption } from '../types.mjs';
3
+ export interface ForceNodeLayout {
4
+ id: number;
5
+ name: string;
6
+ x: number;
7
+ y: number;
8
+ /** 力布局开始前的位置(环形铺开)——入场动画从它收敛到最终位置。 */
9
+ initialX: number;
10
+ initialY: number;
11
+ /** 由权重映射出的直径。 */
12
+ size: number;
13
+ value: number;
14
+ /** 度数(连了几条边),提示框与调试都用得上。 */
15
+ degree: number;
16
+ color: string;
17
+ category: string | number | undefined;
18
+ fixed: boolean;
19
+ }
20
+ export interface ForceLinkLayout {
21
+ id: number;
22
+ source: number;
23
+ target: number;
24
+ value: number;
25
+ width: number;
26
+ color: string;
27
+ }
28
+ export interface ForceLayoutResult {
29
+ nodes: ForceNodeLayout[];
30
+ links: ForceLinkLayout[];
31
+ }
32
+ /**
33
+ * 力导向布局(纯函数)。
34
+ *
35
+ * 与 sankey / treemap 一样,布局独立于渲染:输入节点与连线,输出坐标,
36
+ * 绘制与命中判定消费同一份结果。
37
+ *
38
+ * 三个力:
39
+ * - **斥力**(所有节点两两之间,∝ 1/d²)把节点推开;
40
+ * - **弹力**(沿连线,∝ d − edgeLength)把有关系的节点拉到理想距离;
41
+ * - **向心力**(∝ 中心 − 位置)防止孤立子图飘走。
42
+ *
43
+ * 初始位置用**环形均匀铺开**而不是随机:结果可复现,测试才能断言,
44
+ * 用户每次刷新看到的图也一致(随机初始位置会让同一份数据每次长得都不一样)。
45
+ */
46
+ export declare function forceLayout(nodes: GraphNodeOption[], links: GraphLinkOption[], rect: Rect, options?: GraphOption, palette?: string[]): ForceLayoutResult;
47
+ /** 顶点/连线的曲线控制点(绘制与命中判定共用)。 */
48
+ export declare function sampleGraphLink(link: ForceLinkLayout, nodes: ForceNodeLayout[], curve: boolean, samples?: number): Array<[number, number]>;
@@ -0,0 +1,48 @@
1
+ import type { Rect } from '../internal';
2
+ import type { GraphLinkOption, GraphNodeOption, GraphOption } from '../types';
3
+ export interface ForceNodeLayout {
4
+ id: number;
5
+ name: string;
6
+ x: number;
7
+ y: number;
8
+ /** 力布局开始前的位置(环形铺开)——入场动画从它收敛到最终位置。 */
9
+ initialX: number;
10
+ initialY: number;
11
+ /** 由权重映射出的直径。 */
12
+ size: number;
13
+ value: number;
14
+ /** 度数(连了几条边),提示框与调试都用得上。 */
15
+ degree: number;
16
+ color: string;
17
+ category: string | number | undefined;
18
+ fixed: boolean;
19
+ }
20
+ export interface ForceLinkLayout {
21
+ id: number;
22
+ source: number;
23
+ target: number;
24
+ value: number;
25
+ width: number;
26
+ color: string;
27
+ }
28
+ export interface ForceLayoutResult {
29
+ nodes: ForceNodeLayout[];
30
+ links: ForceLinkLayout[];
31
+ }
32
+ /**
33
+ * 力导向布局(纯函数)。
34
+ *
35
+ * 与 sankey / treemap 一样,布局独立于渲染:输入节点与连线,输出坐标,
36
+ * 绘制与命中判定消费同一份结果。
37
+ *
38
+ * 三个力:
39
+ * - **斥力**(所有节点两两之间,∝ 1/d²)把节点推开;
40
+ * - **弹力**(沿连线,∝ d − edgeLength)把有关系的节点拉到理想距离;
41
+ * - **向心力**(∝ 中心 − 位置)防止孤立子图飘走。
42
+ *
43
+ * 初始位置用**环形均匀铺开**而不是随机:结果可复现,测试才能断言,
44
+ * 用户每次刷新看到的图也一致(随机初始位置会让同一份数据每次长得都不一样)。
45
+ */
46
+ export declare function forceLayout(nodes: GraphNodeOption[], links: GraphLinkOption[], rect: Rect, options?: GraphOption, palette?: string[]): ForceLayoutResult;
47
+ /** 顶点/连线的曲线控制点(绘制与命中判定共用)。 */
48
+ export declare function sampleGraphLink(link: ForceLinkLayout, nodes: ForceNodeLayout[], curve: boolean, samples?: number): Array<[number, number]>;
@@ -0,0 +1,9 @@
1
+ import type { ChartLayout, NormalizedOption, Rect } from '../internal.mjs';
2
+ /**
3
+ * 计算图表布局(标题 / 图例 / 绘图区 / 坐标轴)。
4
+ *
5
+ * 顺序:先用「临时比例尺」拿刻度值(刻度只取决于数据域,与像素范围无关),
6
+ * 量出坐标轴占用的空间;再排标题与图例;最后推出绘图区矩形。
7
+ * 真正的比例尺由 Chart 拿到 plot rect 之后创建,保证刻度与布局严格一致。
8
+ */
9
+ export declare function computeLayout(norm: NormalizedOption, ctx: any, canvas: Rect): ChartLayout;
@@ -0,0 +1,9 @@
1
+ import type { ChartLayout, NormalizedOption, Rect } from '../internal';
2
+ /**
3
+ * 计算图表布局(标题 / 图例 / 绘图区 / 坐标轴)。
4
+ *
5
+ * 顺序:先用「临时比例尺」拿刻度值(刻度只取决于数据域,与像素范围无关),
6
+ * 量出坐标轴占用的空间;再排标题与图例;最后推出绘图区矩形。
7
+ * 真正的比例尺由 Chart 拿到 plot rect 之后创建,保证刻度与布局严格一致。
8
+ */
9
+ export declare function computeLayout(norm: NormalizedOption, ctx: any, canvas: Rect): ChartLayout;
@@ -0,0 +1,47 @@
1
+ import type { Rect } from '../internal.mjs';
2
+ import type { SankeyLinkOption, SankeyNodeOption, SankeyOption } from '../types.mjs';
3
+ export interface SankeyNodeLayout {
4
+ id: number;
5
+ name: string;
6
+ depth: number;
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ /** 节点总流量(入/出取大者)。 */
12
+ value: number;
13
+ color: string;
14
+ }
15
+ export interface SankeyLinkLayout {
16
+ id: number;
17
+ source: number;
18
+ target: number;
19
+ value: number;
20
+ /** 连线在源/目标处的厚度。 */
21
+ width: number;
22
+ /** 源端上沿 y。 */
23
+ sy: number;
24
+ /** 目标端上沿 y。 */
25
+ ty: number;
26
+ color: string;
27
+ }
28
+ export interface SankeyLayoutResult {
29
+ nodes: SankeyNodeLayout[];
30
+ links: SankeyLinkLayout[];
31
+ }
32
+ /**
33
+ * 桑基图布局(分层 + 纵向松弛)。
34
+ *
35
+ * 这里是 ice-chart 唯一一个「不是坐标系、而是图布局」的模块,因此刻意做成**纯函数**:
36
+ * 输入节点/连线与可用矩形,输出每个节点的矩形与每条连线的厚度/端点,
37
+ * 渲染与命中判定都消费同一份结果(和饼图扇形几何的处理方式一致)。
38
+ *
39
+ * 算法(简化版 d3-sankey):
40
+ * 1. 按最长路径给节点分层(有环时用 Kahn 拓扑,环上的节点退化为同层);
41
+ * 2. 每层先均匀铺开,再按邻居位置做几轮加权松弛,最后按顺序打包,保证不重叠;
42
+ * 3. 连线厚度 = 流量 × 端点节点「流量→像素」比例(取两端较小值),
43
+ * 并依次堆叠在节点的出入侧,保证同侧连线不重叠。
44
+ */
45
+ export declare function layoutSankey(nodes: SankeyNodeOption[], links: SankeyLinkOption[], rect: Rect, options?: SankeyOption, palette?: string[]): SankeyLayoutResult;
46
+ /** 连线中心线的采样点(命中判定与绘制共用)。 */
47
+ export declare function sampleLinkPath(link: SankeyLinkLayout, sourceX: number, targetX: number, yOffset?: number, samples?: number): Array<[number, number]>;
@@ -0,0 +1,47 @@
1
+ import type { Rect } from '../internal';
2
+ import type { SankeyLinkOption, SankeyNodeOption, SankeyOption } from '../types';
3
+ export interface SankeyNodeLayout {
4
+ id: number;
5
+ name: string;
6
+ depth: number;
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ /** 节点总流量(入/出取大者)。 */
12
+ value: number;
13
+ color: string;
14
+ }
15
+ export interface SankeyLinkLayout {
16
+ id: number;
17
+ source: number;
18
+ target: number;
19
+ value: number;
20
+ /** 连线在源/目标处的厚度。 */
21
+ width: number;
22
+ /** 源端上沿 y。 */
23
+ sy: number;
24
+ /** 目标端上沿 y。 */
25
+ ty: number;
26
+ color: string;
27
+ }
28
+ export interface SankeyLayoutResult {
29
+ nodes: SankeyNodeLayout[];
30
+ links: SankeyLinkLayout[];
31
+ }
32
+ /**
33
+ * 桑基图布局(分层 + 纵向松弛)。
34
+ *
35
+ * 这里是 ice-chart 唯一一个「不是坐标系、而是图布局」的模块,因此刻意做成**纯函数**:
36
+ * 输入节点/连线与可用矩形,输出每个节点的矩形与每条连线的厚度/端点,
37
+ * 渲染与命中判定都消费同一份结果(和饼图扇形几何的处理方式一致)。
38
+ *
39
+ * 算法(简化版 d3-sankey):
40
+ * 1. 按最长路径给节点分层(有环时用 Kahn 拓扑,环上的节点退化为同层);
41
+ * 2. 每层先均匀铺开,再按邻居位置做几轮加权松弛,最后按顺序打包,保证不重叠;
42
+ * 3. 连线厚度 = 流量 × 端点节点「流量→像素」比例(取两端较小值),
43
+ * 并依次堆叠在节点的出入侧,保证同侧连线不重叠。
44
+ */
45
+ export declare function layoutSankey(nodes: SankeyNodeOption[], links: SankeyLinkOption[], rect: Rect, options?: SankeyOption, palette?: string[]): SankeyLayoutResult;
46
+ /** 连线中心线的采样点(命中判定与绘制共用)。 */
47
+ export declare function sampleLinkPath(link: SankeyLinkLayout, sourceX: number, targetX: number, yOffset?: number, samples?: number): Array<[number, number]>;