@363045841yyt/klinechart-core 0.7.3 → 0.7.5-alpha.2

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 (231) hide show
  1. package/README.md +201 -201
  2. package/README.zh-CN.md +201 -201
  3. package/dist/engine/renderers/webgl/candleSurface.js +47 -47
  4. package/dist/version.d.ts +1 -1
  5. package/dist/version.d.ts.map +1 -1
  6. package/dist/version.js +1 -2
  7. package/dist/version.js.map +1 -1
  8. package/package.json +129 -122
  9. package/src/__tests__/signal.test.ts +124 -124
  10. package/src/config/chartSettings.ts +66 -66
  11. package/src/controllers/__tests__/drawing.test.ts +214 -214
  12. package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
  13. package/src/controllers/__tests__/toolbar.test.ts +225 -225
  14. package/src/controllers/createChartController.ts +665 -665
  15. package/src/controllers/createDrawingController.ts +96 -96
  16. package/src/controllers/createIndicatorSelectorController.ts +307 -307
  17. package/src/controllers/createToolbarController.ts +146 -146
  18. package/src/controllers/index.ts +19 -19
  19. package/src/controllers/types.ts +284 -284
  20. package/src/engine/__tests__/chart.dpr.test.ts +401 -401
  21. package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
  22. package/src/engine/chart-store.ts +121 -121
  23. package/src/engine/chart.d.ts +617 -617
  24. package/src/engine/chart.ts +2815 -2815
  25. package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
  26. package/src/engine/controller/interaction.ts +722 -722
  27. package/src/engine/controller/markerInteraction.ts +130 -130
  28. package/src/engine/controller/pinchTracker.ts +82 -82
  29. package/src/engine/controller/tooltipPosition.ts +48 -48
  30. package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
  31. package/src/engine/draw/pixelAlign.ts +259 -259
  32. package/src/engine/drawing/index.ts +655 -655
  33. package/src/engine/drawing/interaction.ts +842 -842
  34. package/src/engine/drawing/plugin.ts +343 -343
  35. package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
  36. package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
  37. package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
  38. package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
  39. package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
  40. package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
  41. package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
  42. package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
  43. package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
  44. package/src/engine/indicators/__tests__/atr.test.ts +153 -153
  45. package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
  46. package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
  47. package/src/engine/indicators/__tests__/dema.test.ts +73 -73
  48. package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
  49. package/src/engine/indicators/__tests__/hma.test.ts +73 -73
  50. package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
  51. package/src/engine/indicators/__tests__/kama.test.ts +80 -80
  52. package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
  53. package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
  54. package/src/engine/indicators/__tests__/roc.test.ts +68 -68
  55. package/src/engine/indicators/__tests__/sar.test.ts +86 -86
  56. package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
  57. package/src/engine/indicators/__tests__/soa.test.ts +533 -533
  58. package/src/engine/indicators/__tests__/structure.test.ts +110 -110
  59. package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
  60. package/src/engine/indicators/__tests__/tema.test.ts +68 -68
  61. package/src/engine/indicators/__tests__/trix.test.ts +70 -70
  62. package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
  63. package/src/engine/indicators/__tests__/volume.test.ts +115 -115
  64. package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
  65. package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
  66. package/src/engine/indicators/__tests__/wma.test.ts +112 -112
  67. package/src/engine/indicators/__tests__/zones.test.ts +95 -95
  68. package/src/engine/indicators/atrState.ts +27 -27
  69. package/src/engine/indicators/bollState.ts +51 -51
  70. package/src/engine/indicators/calculators.ts +2593 -2593
  71. package/src/engine/indicators/cciState.ts +25 -25
  72. package/src/engine/indicators/chaikinVolState.ts +32 -32
  73. package/src/engine/indicators/cmfState.ts +27 -27
  74. package/src/engine/indicators/demaState.ts +27 -27
  75. package/src/engine/indicators/donchianState.ts +43 -43
  76. package/src/engine/indicators/eneState.ts +43 -43
  77. package/src/engine/indicators/expmaState.ts +43 -43
  78. package/src/engine/indicators/fastkState.ts +25 -25
  79. package/src/engine/indicators/fibState.ts +41 -41
  80. package/src/engine/indicators/hmaState.ts +27 -27
  81. package/src/engine/indicators/hvState.ts +28 -28
  82. package/src/engine/indicators/ichimokuState.ts +70 -70
  83. package/src/engine/indicators/indicator.worker.ts +169 -169
  84. package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
  85. package/src/engine/indicators/indicatorMetadata.ts +110 -110
  86. package/src/engine/indicators/indicatorRegistry.ts +106 -106
  87. package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
  88. package/src/engine/indicators/kamaState.ts +34 -34
  89. package/src/engine/indicators/keltnerState.ts +49 -49
  90. package/src/engine/indicators/kstState.ts +42 -42
  91. package/src/engine/indicators/maState.ts +36 -36
  92. package/src/engine/indicators/macdState.ts +76 -76
  93. package/src/engine/indicators/mfiState.ts +27 -27
  94. package/src/engine/indicators/momState.ts +25 -25
  95. package/src/engine/indicators/obvState.ts +25 -25
  96. package/src/engine/indicators/parkinsonState.ts +28 -28
  97. package/src/engine/indicators/pivotState.ts +51 -51
  98. package/src/engine/indicators/pvtState.ts +25 -25
  99. package/src/engine/indicators/rocState.ts +27 -27
  100. package/src/engine/indicators/rsiState.ts +65 -65
  101. package/src/engine/indicators/sarState.ts +41 -41
  102. package/src/engine/indicators/scheduler.ts +1205 -1205
  103. package/src/engine/indicators/soa.ts +352 -352
  104. package/src/engine/indicators/stateComposer.ts +1262 -1262
  105. package/src/engine/indicators/stochState.ts +26 -26
  106. package/src/engine/indicators/structureState.ts +69 -69
  107. package/src/engine/indicators/supertrendState.ts +37 -37
  108. package/src/engine/indicators/temaState.ts +27 -27
  109. package/src/engine/indicators/trixState.ts +35 -35
  110. package/src/engine/indicators/vmaState.ts +27 -27
  111. package/src/engine/indicators/volumeProfileState.ts +63 -63
  112. package/src/engine/indicators/vwapState.ts +29 -29
  113. package/src/engine/indicators/wmaState.ts +27 -27
  114. package/src/engine/indicators/wmsrState.ts +25 -25
  115. package/src/engine/indicators/workerProtocol.ts +613 -613
  116. package/src/engine/indicators/zonesState.ts +47 -47
  117. package/src/engine/layout/pane.ts +161 -161
  118. package/src/engine/marker/registry.ts +265 -265
  119. package/src/engine/paneRenderer.ts +169 -169
  120. package/src/engine/renderers/Indicator/atr.ts +237 -237
  121. package/src/engine/renderers/Indicator/boll.ts +317 -317
  122. package/src/engine/renderers/Indicator/cci.ts +275 -275
  123. package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
  124. package/src/engine/renderers/Indicator/cmf.ts +137 -137
  125. package/src/engine/renderers/Indicator/dema.ts +136 -136
  126. package/src/engine/renderers/Indicator/donchian.ts +137 -137
  127. package/src/engine/renderers/Indicator/ene.ts +271 -271
  128. package/src/engine/renderers/Indicator/expma.ts +197 -197
  129. package/src/engine/renderers/Indicator/fastk.ts +316 -316
  130. package/src/engine/renderers/Indicator/fib.ts +141 -141
  131. package/src/engine/renderers/Indicator/hma.ts +136 -136
  132. package/src/engine/renderers/Indicator/hv.ts +124 -124
  133. package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
  134. package/src/engine/renderers/Indicator/index.ts +241 -241
  135. package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
  136. package/src/engine/renderers/Indicator/kama.ts +136 -136
  137. package/src/engine/renderers/Indicator/keltner.ts +137 -137
  138. package/src/engine/renderers/Indicator/kst.ts +302 -302
  139. package/src/engine/renderers/Indicator/ma.ts +200 -200
  140. package/src/engine/renderers/Indicator/macd.ts +477 -477
  141. package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
  142. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
  143. package/src/engine/renderers/Indicator/mfi.ts +142 -142
  144. package/src/engine/renderers/Indicator/mom.ts +311 -311
  145. package/src/engine/renderers/Indicator/obv.ts +123 -123
  146. package/src/engine/renderers/Indicator/parkinson.ts +124 -124
  147. package/src/engine/renderers/Indicator/pivot.ts +131 -131
  148. package/src/engine/renderers/Indicator/pvt.ts +123 -123
  149. package/src/engine/renderers/Indicator/roc.ts +143 -143
  150. package/src/engine/renderers/Indicator/rsi.ts +390 -390
  151. package/src/engine/renderers/Indicator/sar.ts +113 -113
  152. package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
  153. package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
  154. package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
  155. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
  156. package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
  157. package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
  158. package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
  159. package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
  160. package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
  161. package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
  162. package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
  163. package/src/engine/renderers/Indicator/stoch.ts +359 -359
  164. package/src/engine/renderers/Indicator/structure.ts +126 -126
  165. package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
  166. package/src/engine/renderers/Indicator/supertrend.ts +115 -115
  167. package/src/engine/renderers/Indicator/tema.ts +136 -136
  168. package/src/engine/renderers/Indicator/trix.ts +158 -158
  169. package/src/engine/renderers/Indicator/vma.ts +124 -124
  170. package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
  171. package/src/engine/renderers/Indicator/vwap.ts +123 -123
  172. package/src/engine/renderers/Indicator/wma.ts +136 -136
  173. package/src/engine/renderers/Indicator/wmsr.ts +328 -328
  174. package/src/engine/renderers/Indicator/zones.ts +104 -104
  175. package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
  176. package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
  177. package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
  178. package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
  179. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
  180. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
  181. package/src/engine/renderers/candle.ts +459 -459
  182. package/src/engine/renderers/crosshair.ts +69 -69
  183. package/src/engine/renderers/customMarkers.ts +162 -162
  184. package/src/engine/renderers/extremaMarkers.ts +246 -246
  185. package/src/engine/renderers/gridLines.ts +90 -90
  186. package/src/engine/renderers/lastPrice.ts +97 -97
  187. package/src/engine/renderers/paneTitle.ts +136 -136
  188. package/src/engine/renderers/subVolume.ts +236 -236
  189. package/src/engine/renderers/timeAxis.ts +121 -121
  190. package/src/engine/renderers/webgl/candleSurface.ts +955 -955
  191. package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
  192. package/src/engine/renderers/yAxis.ts +105 -105
  193. package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
  194. package/src/engine/scale/logFormula.ts +130 -130
  195. package/src/engine/scale/price.ts +39 -39
  196. package/src/engine/scale/priceScale.ts +264 -264
  197. package/src/engine/subPaneManager.ts +427 -427
  198. package/src/engine/theme/colors.ts +642 -642
  199. package/src/engine/theme/fonts.ts +20 -20
  200. package/src/engine/utils/klineConfig.ts +49 -49
  201. package/src/engine/utils/tickCount.ts +11 -11
  202. package/src/engine/utils/tickPosition.ts +214 -214
  203. package/src/engine/utils/zoom.ts +83 -83
  204. package/src/engine/viewport/viewport.ts +67 -67
  205. package/src/index.ts +3 -3
  206. package/src/plugin/ConfigManager.ts +93 -93
  207. package/src/plugin/EventBus.ts +77 -77
  208. package/src/plugin/HookSystem.ts +106 -106
  209. package/src/plugin/PluginHost.ts +243 -243
  210. package/src/plugin/PluginRegistry.ts +92 -92
  211. package/src/plugin/StateStore.ts +73 -73
  212. package/src/plugin/index.ts +19 -19
  213. package/src/plugin/rendererPluginManager.ts +368 -368
  214. package/src/plugin/stateKeys.ts +8 -8
  215. package/src/plugin/types.ts +526 -526
  216. package/src/reactivity/index.ts +2 -2
  217. package/src/reactivity/signal.ts +119 -119
  218. package/src/semantic/controller.ts +251 -251
  219. package/src/semantic/drawShape.ts +260 -260
  220. package/src/semantic/index.ts +28 -28
  221. package/src/semantic/schema.json +256 -256
  222. package/src/semantic/types.ts +251 -251
  223. package/src/semantic/validator.ts +349 -349
  224. package/src/types/kLine.ts +13 -13
  225. package/src/types/price.ts +56 -56
  226. package/src/types/volumePrice.ts +33 -33
  227. package/src/utils/dateFormat.ts +208 -208
  228. package/src/utils/kLineDraw/axis.ts +562 -562
  229. package/src/utils/priceToY.ts +34 -34
  230. package/src/utils/volumePrice.ts +202 -202
  231. package/src/version.ts +1 -1
@@ -1,618 +1,618 @@
1
- import type { KLineData } from '@/types/price';
2
- import type { ChartSettings } from '@/config/chartSettings';
3
- import { type Signal } from '../../packages/core/src/reactivity/signal';
4
- import { type VisibleRange, UpdateLevel } from '@/core/layout/pane';
5
- import { InteractionController, type InteractionSnapshot } from '@/core/controller/interaction';
6
- export type { InteractionSnapshot };
7
- import { PaneRenderer } from '@/core/paneRenderer';
8
- import { MarkerManager, type CustomMarkerEntity } from './marker/registry';
9
- import { getPhysicalKLineConfig, calcKWidthPx } from '@/core/utils/klineConfig';
10
- import { IndicatorScheduler } from '@/core/indicators/scheduler';
11
- import { type SubPaneEntry } from '@/core/subPaneManager';
12
- import { type PluginHostImpl, type RendererPlugin, type RendererPluginWithHost, type PaneRole, type PaneCapabilities } from '@/plugin';
13
- import { type SubIndicatorType } from '@/core/renderers/Indicator';
14
- export { getPhysicalKLineConfig, calcKWidthPx };
15
- /**
16
- * 图表 DOM 元素引用
17
- * @property container 图表容器 div
18
- * @property canvasLayer Canvas 层容器 div(包含所有绘制 canvas)
19
- */
20
- /**
21
- * 图表 DOM 元素引用
22
- * @property container 图表容器 div
23
- * @property canvasLayer Canvas 层容器 div(包含所有绘制 canvas)
24
- * @property xAxisCanvas X 轴时间轴 canvas
25
- */
26
- export type ChartDom = {
27
- container: HTMLDivElement;
28
- canvasLayer: HTMLDivElement;
29
- rightAxisLayer: HTMLDivElement;
30
- xAxisCanvas: HTMLCanvasElement;
31
- };
32
- /**
33
- * Pane 面板配置
34
- * @property id Pane 标识符
35
- * @property ratio Pane 高度占比
36
- * @property visible 是否可见(默认 true)
37
- */
38
- export type PaneSpec = {
39
- id: string;
40
- ratio: number;
41
- visible?: boolean;
42
- minHeightPx?: number;
43
- role?: PaneRole;
44
- capabilities?: Partial<PaneCapabilities>;
45
- };
46
- export type PaneRendererDom = {
47
- mainCanvas: HTMLCanvasElement;
48
- overlayCanvas: HTMLCanvasElement;
49
- yAxisCanvas: HTMLCanvasElement;
50
- };
51
- export type ChartOptions = {
52
- /** K 线宽度(可选,由 zoomLevel 派生) */
53
- kWidth?: number;
54
- /** K 线间隙(可选,由 DPR 计算) */
55
- kGap?: number;
56
- yPaddingPx: number;
57
- rightAxisWidth: number;
58
- bottomAxisHeight: number;
59
- minKWidth: number;
60
- maxKWidth: number;
61
- panes: PaneSpec[];
62
- /** pane 之间的真实分隔空隙(逻辑像素) */
63
- paneGap?: number;
64
- /** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
65
- priceLabelWidth?: number;
66
- /** pane 最小高度(逻辑像素,默认 60) */
67
- defaultPaneMinHeightPx?: number;
68
- /**
69
- * 缩放级别数量(默认 10)
70
- * - 将 minKWidth ~ maxKWidth 划分为多少个离散级别
71
- * - 例如 10 表示有 10 个缩放级别(1-10)
72
- */
73
- zoomLevels?: number;
74
- /**
75
- * 初始缩放级别(1 ~ zoomLevels,默认 1)
76
- * 未指定时默认为最小级别
77
- */
78
- initialZoomLevel?: number;
79
- };
80
- /** K 线起始 x 坐标数组,positions[i] 表示第 i 根 K 线的起始 x 坐标(逻辑像素) */
81
- export type KLinePositions = number[];
82
- export type Viewport = {
83
- viewWidth: number;
84
- viewHeight: number;
85
- plotWidth: number;
86
- plotHeight: number;
87
- scrollLeft: number;
88
- dpr: number;
89
- };
90
- type ResolvedChartOptions = Omit<ChartOptions, 'kWidth' | 'kGap'> & {
91
- kWidth: number;
92
- kGap: number;
93
- };
94
- export declare class Chart {
95
- private dom;
96
- private opt;
97
- private _internalData;
98
- private raf;
99
- private pendingUpdateLevel;
100
- private _internalViewport;
101
- private paneRenderers;
102
- private markerManager;
103
- private drawingStore;
104
- readonly interaction: InteractionController;
105
- /** 插件宿主 */
106
- private pluginHost;
107
- /** 渲染器插件管理器 */
108
- private rendererPluginManager;
109
- /** 精确 DPR(来自 ResizeObserver 的 devicePixelContentBoxSize) */
110
- private preciseDpr;
111
- /** 统一监听容器尺寸与 DPR 变化 */
112
- private resizeObserver?;
113
- /** scroll 事件处理器引用(用于 cleanup) */
114
- private onScroll?;
115
- /** 最近一次观测到的容器尺寸 */
116
- private observedSize;
117
- /** 缓存的 scrollLeft(通过 scroll 事件同步,避免每帧读取 DOM 触发强制回流) */
118
- private cachedScrollLeft;
119
- /** overlay 上一帧是否有十字线(用于判断何时需要清除) */
120
- private overlayHadCrosshair;
121
- /** 用户设置配置(传递给渲染器) */
122
- private settings;
123
- /** pane ratio 状态(按 paneId 维护,sum=1 仅对可见 pane) */
124
- private _internalPaneRatios;
125
- /** 视口变化回调(供外部同步 DPR/尺寸) */
126
- private onViewportChange?;
127
- /** 共享 X 轴上下文缓存 */
128
- private xAxisCtx;
129
- /** Chart 级共享 WebGL canvas/context */
130
- private sharedWebGLSurface;
131
- /** pane 布局回流回调(Chart -> UI 单向) */
132
- private onPaneLayoutChange?;
133
- /** 数据变化回调(供外部同步 dataLength) */
134
- private onDataChange?;
135
- /** 当前缩放级别(1 ~ zoomLevelCount) */
136
- private currentZoomLevel;
137
- /** 缩放级别总数 */
138
- private readonly zoomLevelCount;
139
- /** 指标调度器(负责计算 MA 等指标并写入 StateStore)
140
- * TODO: 阶段5迁移为插件注册,Scheduler 通过事件监听 data/viewport 变更,Chart 不直接持有
141
- */
142
- private indicatorScheduler;
143
- /** 上次可见范围(用于检测视口变化) */
144
- private lastVisibleRange;
145
- /** Overlay 帧复用的最近主渲染结果 */
146
- private cachedDrawFrame;
147
- /** 副图管理器 */
148
- private subPaneManager;
149
- /** 当前激活的主图指标列表(如 ['boll', 'ma']) */
150
- private activeMainIndicators;
151
- /** 主图指标参数配置 */
152
- private mainIndicatorParams;
153
- /**
154
- * 启用主图指标
155
- * @param indicatorId 指标ID
156
- * @param params 可选的指标参数
157
- * @returns 是否成功启用
158
- */
159
- enableMainIndicator(indicatorId: string, params?: Record<string, number | boolean | string>): boolean;
160
- /**
161
- * 禁用主图指标
162
- * @param indicatorId 指标ID
163
- * @returns 是否成功禁用
164
- */
165
- disableMainIndicator(indicatorId: string): boolean;
166
- /**
167
- * 切换主图指标启用状态
168
- * @param indicatorId 指标ID
169
- * @param enabled 是否启用
170
- */
171
- toggleMainIndicator(indicatorId: string, enabled: boolean): void;
172
- /**
173
- * 获取当前激活的主图指标列表
174
- * @returns 激活的指标ID数组
175
- */
176
- getActiveMainIndicators(): string[];
177
- /**
178
- * 检查主图指标是否激活
179
- * @param indicatorId 指标ID
180
- */
181
- isMainIndicatorActive(indicatorId: string): boolean;
182
- /**
183
- * 更新主图指标参数
184
- * @param indicatorId 指标ID
185
- * @param params 参数对象
186
- */
187
- updateMainIndicatorParams(indicatorId: string, params: Record<string, number | boolean | string>): void;
188
- /**
189
- * 获取主图指标参数
190
- * @param indicatorId 指标ID
191
- */
192
- getMainIndicatorParams(indicatorId: string): Record<string, number | boolean | string> | null;
193
- /**
194
- * 清除所有主图指标
195
- */
196
- clearMainIndicators(): void;
197
- /**
198
- * 启用主图指标渲染器(内部方法)
199
- */
200
- private enableMainIndicatorRenderer;
201
- /**
202
- * 禁用主图指标渲染器(内部方法)
203
- */
204
- private disableMainIndicatorRenderer;
205
- /**
206
- * 更新调度器配置(内部方法)
207
- */
208
- private updateIndicatorSchedulerConfig;
209
- /**
210
- * @deprecated 使用 enableMainIndicator/disableMainIndicator 替代
211
- */
212
- setActiveMainIndicators(indicators: string[]): void;
213
- /**
214
- * 创建图表实例
215
- * @param dom 由 Vue 组件传入的 DOM 句柄
216
- * @param opt 初始配置
217
- */
218
- constructor(dom: ChartDom, opt: ChartOptions);
219
- private initCoreRenderers;
220
- private initResizeObserver;
221
- private updateObservedMetrics;
222
- private getEffectiveDpr;
223
- getViewport(): Viewport | null;
224
- getCurrentDpr(): number;
225
- /** 获取缓存的 scrollLeft(避免读取 DOM 触发强制回流) */
226
- getCachedScrollLeft(): number;
227
- /** 获取插件宿主 */
228
- get plugin(): PluginHostImpl;
229
- /** 安装渲染器插件 */
230
- useRenderer(plugin: RendererPlugin | RendererPluginWithHost, config?: Record<string, unknown>): void;
231
- /** 移除渲染器插件 */
232
- removeRenderer(name: string): void;
233
- /** 获取渲染器插件 */
234
- getRenderer<T extends RendererPlugin = RendererPlugin>(name: string): T | undefined;
235
- /** 更新渲染器配置(自动重绘) */
236
- updateRendererConfig(name: string, config: Record<string, unknown>): void;
237
- /** 启用/禁用渲染器 */
238
- setRendererEnabled(name: string, enabled: boolean): void;
239
- /** 获取所有渲染器 */
240
- getAllRenderers(): RendererPlugin[];
241
- /** 更新用户设置(触发重绘) */
242
- updateSettings(settings: ChartSettings): void;
243
- /**
244
- * 绘制一帧
245
- * @param level 更新级别,决定渲染哪些层
246
- */
247
- draw(level?: UpdateLevel): void;
248
- private prepareFrameData;
249
- private renderPanes;
250
- private renderXAxis;
251
- /**
252
- * 应用渲染状态(由 Vue/Store 层在状态更新后调用)
253
- * Chart 不拥有业务 SSOT,只负责接收参数并渲染
254
- * 这是写入 opt.kWidth/kGap 和 currentZoomLevel 的唯一入口
255
- */
256
- applyRenderState(kWidth: number, kGap: number, zoomLevel?: number): void;
257
- /** 获取总缩放级别数 */
258
- getZoomLevelCount(): number;
259
- /** 注册视口变化回调 */
260
- setOnViewportChange(cb: (viewport: Viewport) => void): void;
261
- /** 注册 pane 布局回流回调 */
262
- setOnPaneLayoutChange(cb: (panes: PaneSpec[]) => void): void;
263
- /** 注册数据变化回调 */
264
- setOnDataChange(cb: (data: KLineData[]) => void): void;
265
- /** 获取所有 PaneRenderer */
266
- getPaneRenderers(): PaneRenderer[];
267
- /** 获取 MarkerManager(供 InteractionController 使用) */
268
- getMarkerManager(): MarkerManager;
269
- /** 更新自定义标记 */
270
- updateCustomMarkers(markers: CustomMarkerEntity[]): void;
271
- /** 清除自定义标记 */
272
- clearCustomMarkers(): void;
273
- /** 获取 ChartDom(供 InteractionController 使用) */
274
- getDom(): ChartDom;
275
- /** 获取当前 ChartOptions(返回内部当前快照) */
276
- getOption(): ResolvedChartOptions;
277
- /**
278
- * 计算 K 线起始 x 坐标数组,与 candle.ts 的像素对齐方式保持一致
279
- * @param range 可见 K 线索引范围
280
- * @returns x 坐标数组(逻辑像素,经过物理像素对齐)
281
- */
282
- calcKLinePositions(range: VisibleRange): KLinePositions;
283
- /**
284
- * 更新配置并触发布局/重绘
285
- * @param partial 部分配置项
286
- */
287
- updateOptions(partial: Partial<ChartOptions>): void;
288
- /** 更新 pane 布局配置
289
- * @param panes 新的 pane 配置数组
290
- *
291
- * 显式整盘替换:清空之前 user-resize 留下的 paneRatios 缓存,让 spec 中的 ratio
292
- * 真正生效。`addPane`/`upsertPane`/`removePaneDefinition` 走 `applyPaneLayoutSpecs`
293
- * 时仍保留 prev 值以记住用户拖拽过的高度——只有显式的 layout replacement 才重置。
294
- */
295
- updatePaneLayout(panes: PaneSpec[]): void;
296
- setPaneDefinitions(defs: PaneSpec[]): void;
297
- upsertPane(def: PaneSpec): void;
298
- removePaneDefinition(paneId: string): void;
299
- bindIndicatorToPane(paneId: string, indicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): void;
300
- /** 更新绘图对象 */
301
- setDrawings(drawings: import('@/plugin').DrawingObject[]): void;
302
- /** 更新选中的绘图 ID */
303
- setSelectedDrawingId(id: string | null): void;
304
- /** 获取当前 pane 布局快照(含 ratio) */
305
- getPaneLayoutSpecs(): PaneSpec[];
306
- private emitPaneLayoutChange;
307
- private applyPaneLayoutSpecs;
308
- /**
309
- * 调整相邻 pane 边界(支持连锁挤压)
310
- * @param upperPaneId 上方 pane ID(边界位于此 pane 与其下方邻居之间)
311
- * @param deltaY Y 方向位移(逻辑像素,正数表示边界向下,upper 增大;负数表示向上,upper 减小)
312
- */
313
- resizePaneBoundary(upperPaneId: string, deltaY: number): boolean;
314
- private resolvePaneRole;
315
- addPane(paneId: string): void;
316
- /**
317
- * 动态移除 pane
318
- * @param paneId pane 标识符
319
- */
320
- removePane(paneId: string): void;
321
- /**
322
- * 检查 pane 是否存在
323
- * @param paneId pane 标识符
324
- */
325
- hasPane(paneId: string): boolean;
326
- /**
327
- * 创建副图面板并注册指标渲染器
328
- * @param paneId 副图实例标识符(如 'RSI_0', 'MACD_0')
329
- * @param indicatorId 指标类型
330
- * @param params 指标参数
331
- * @returns 是否创建成功
332
- */
333
- createSubPane(paneId: string, indicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): boolean;
334
- /**
335
- * 移除副图面板及其渲染器
336
- * @param paneId 副图实例标识符
337
- */
338
- removeSubPane(paneId: string): void;
339
- /**
340
- * 替换副图的指标类型
341
- * @param paneId 副图实例标识符
342
- * @param newIndicatorId 新的指标类型
343
- * @param params 新指标参数
344
- */
345
- replaceSubPaneIndicator(paneId: string, newIndicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): void;
346
- /**
347
- * 更新副图指标参数
348
- * @param paneId 副图实例标识符
349
- * @param params 新参数
350
- */
351
- updateSubPaneParams(paneId: string, params: Record<string, unknown>): void;
352
- /**
353
- * 清除所有副图面板
354
- */
355
- clearSubPanes(): void;
356
- /**
357
- * 获取当前所有副图指标类型
358
- * @deprecated 使用 getSubPaneEntries 获取完整信息
359
- */
360
- getSubPaneIndicators(): SubIndicatorType[];
361
- /**
362
- * 获取所有副图条目
363
- */
364
- getSubPaneEntries(): SubPaneEntry[];
365
- /**
366
- * 根据 paneId 获取副图条目
367
- * @param paneId 副图实例标识符
368
- */
369
- getSubPaneEntry(paneId: string): SubPaneEntry | undefined;
370
- private getDefaultSubPaneParams;
371
- /** 副图渲染器名称前缀(保留向后兼容) */
372
- private static readonly SUB_PANE_PREFIX;
373
- /**
374
- * 平移价格轴(用于主图区域上下拖动)
375
- * @param paneId 目标 pane ID
376
- * @param deltaY Y轴像素偏移(正数向下拖动)
377
- */
378
- translatePrice(paneId: string, deltaY: number): void;
379
- /**
380
- * 重置价格轴垂直偏移
381
- * @param paneId 目标 pane ID
382
- */
383
- resetPriceOffset(paneId: string): void;
384
- /**
385
- * 缩放价格轴(用于右侧刻度栏上下拖动)
386
- * @param paneId 目标 pane ID
387
- * @param deltaY Y轴像素偏移(向上拖动放大,向下拖动缩小)
388
- */
389
- scalePrice(paneId: string, deltaY: number): void;
390
- /**
391
- * 更新数据并请求重绘
392
- * @param data K 线数据数组
393
- */
394
- updateData(data: KLineData[]): void;
395
- /** 获取当前数据源(供 renderers 和 interaction 使用) */
396
- getData(): KLineData[];
397
- /** 获取指标调度器(供外部控制器更新指标配置) */
398
- getIndicatorScheduler(): IndicatorScheduler;
399
- private getTrailingSlotCount;
400
- getLogicalSlotCount(): number;
401
- getTimestampAtLogicalIndex(index: number): number | null;
402
- /** 根据视口内 X 坐标反查逻辑索引(允许超出最后一根 K 线) */
403
- getLogicalIndexAtX(mouseX: number): number | null;
404
- /** 根据视口内 X 坐标反查数据索引(用于绘图落点) */
405
- getDataIndexAtX(mouseX: number): number | null;
406
- /** 获取内容总宽度(用于外部 scroll-content 撑开 scrollWidth) */
407
- getContentWidth(): number;
408
- /** 容器尺寸变化时调用 */
409
- resize(): void;
410
- /**
411
- * 请求下一帧重绘(RAF 合并,支持分层更新)
412
- * @param level 更新级别,默认为 All
413
- */
414
- scheduleDraw(level?: UpdateLevel): void;
415
- /** 销毁图表实例 */
416
- destroy(): Promise<void>;
417
- /** 初始化所有 pane */
418
- private initPanes;
419
- private syncPaneRatiosFromSpecs;
420
- private syncPaneRatiosToSpecs;
421
- private normalizeVisiblePaneRatios;
422
- private getPaneMinHeight;
423
- private computePaneHeightsByRatio;
424
- /** 计算每个 pane 的布局(top 和 height) */
425
- private layoutPanes;
426
- private computeViewport;
427
- private _viewportSignal;
428
- private _dataSignal;
429
- private _themeSignal;
430
- private _indicatorsSignal;
431
- private _subPanesSignal;
432
- private _drawingToolSignal;
433
- private _drawingsSignal;
434
- private _paneRatiosSignal;
435
- private _interactionSignal;
436
- /** 视口状态信号 */
437
- get viewport(): Signal<ViewportState>;
438
- /** 数据信号 */
439
- get data(): Signal<ReadonlyArray<KLineData>>;
440
- /** 主题信号 */
441
- get theme(): Signal<'light' | 'dark'>;
442
- /** 指标实例列表信号 */
443
- get indicators(): Signal<ReadonlyArray<IndicatorInstance>>;
444
- /** 子图信息信号 */
445
- get subPanes(): Signal<ReadonlyArray<SubPaneInfo>>;
446
- /** 当前绘图工具信号 */
447
- get drawingTool(): Signal<DrawingToolType | null>;
448
- /** 绘图对象列表信号 */
449
- get drawings(): Signal<ReadonlyArray<import('@/plugin').DrawingObject>>;
450
- /** 面板比例信号 */
451
- get paneRatios(): Signal<Readonly<Record<string, number>>>;
452
- /** 交互状态信号 */
453
- get interactionState(): Signal<InteractionSnapshot>;
454
- /**
455
- * 设置数据(高层 API)
456
- * 内部调用 updateData,并更新 data signal
457
- */
458
- setData(data: KLineData[]): void;
459
- /**
460
- * 追加数据(高层 API)
461
- * 合并现有数据并更新
462
- */
463
- appendData(newData: KLineData[]): void;
464
- /**
465
- * 设置主题(高层 API)
466
- */
467
- setTheme(theme: 'light' | 'dark'): void;
468
- /**
469
- * 缩放到指定级别(高层 API)
470
- * 计算并应用新的 render state,更新 viewport signal
471
- */
472
- zoomToLevel(level: number, anchorX?: number): void;
473
- /**
474
- * 放大(高层 API)
475
- */
476
- zoomIn(anchorX?: number): void;
477
- /**
478
- * 缩小(高层 API)
479
- */
480
- zoomOut(anchorX?: number): void;
481
- /**
482
- * 内部缩放实现
483
- * 使用 computeZoom 纯函数计算精确的 scrollLeft
484
- */
485
- private applyZoom;
486
- /**
487
- * 统一指针事件处理(零配置)
488
- * 自动判断区域并分发给 interaction controller
489
- *
490
- * @param e 指针事件
491
- * @param drawingController 可选的绘图控制器,如果提供,会优先让绘图控制器处理事件
492
- * @returns 是否被处理(如果 drawingController 处理了返回 true,否则返回 false)
493
- */
494
- handlePointerEvent(e: PointerEvent, drawingController?: {
495
- onPointerDown?: (e: PointerEvent, container: HTMLElement) => boolean;
496
- onPointerMove?: (e: PointerEvent, container: HTMLElement) => boolean;
497
- onPointerUp?: (e: PointerEvent, container: HTMLElement) => boolean;
498
- }): boolean;
499
- /**
500
- * 滚轮事件处理(高层 API)
501
- * 使用 computeZoom 计算精确的 scrollLeft,更新 viewport signal
502
- */
503
- handleWheelEvent(e: WheelEvent): void;
504
- /**
505
- * 滚动事件处理(高层 API)
506
- * 更新缓存的 scrollLeft 并触发交互 controller
507
- */
508
- handleScrollEvent(): void;
509
- /**
510
- * 双指捏合缩放处理(高层 API)
511
- * @param delta 缩放增量(+1 放大 / -1 缩小)
512
- * @param centerClientX 捏合中心在视口中的 X 坐标
513
- */
514
- handlePinchZoom(delta: number, centerClientX: number): void;
515
- /**
516
- * 更新 viewport signal(用于滚动事件,不更新 desiredScrollLeft)
517
- */
518
- private updateViewportSignal;
519
- /**
520
- * 添加指标(高层 API,显式指定 role)
521
- * @param definitionId 指标定义 ID(如 'MA', 'MACD')
522
- * @param role 'main' 主图指标 或 'sub' 副图指标
523
- * @param params 指标参数
524
- * @returns 实例 ID(成功)或 null(失败)
525
- */
526
- addIndicator(definitionId: string, role: 'main' | 'sub', params?: Record<string, unknown>): string | null;
527
- /**
528
- * 移除指标(高层 API)
529
- * @param instanceId 指标实例 ID
530
- * @returns 是否成功移除
531
- */
532
- removeIndicator(instanceId: string): boolean;
533
- /**
534
- * 更新指标参数(高层 API)
535
- * @param instanceId 指标实例 ID
536
- * @param params 新参数
537
- * @returns 是否成功更新
538
- */
539
- updateIndicatorParams(instanceId: string, params: Record<string, unknown>): boolean;
540
- /**
541
- * 重新排序指标(高层 API)
542
- * @param orderedInstanceIds 排序后的指标实例 ID 数组
543
- * @returns 是否成功
544
- */
545
- reorderIndicators(orderedInstanceIds: string[]): boolean;
546
- /**
547
- * 同步 indicators signal
548
- */
549
- private syncIndicatorsSignal;
550
- /**
551
- * 同步 sub panes signal
552
- */
553
- private syncSubPanesSignal;
554
- /**
555
- * 调整子图大小(高层 API)
556
- * @param paneId 面板 ID
557
- * @param deltaY 垂直偏移量
558
- * @returns 是否成功
559
- */
560
- resizeSubPane(paneId: string, deltaY: number): boolean;
561
- /**
562
- * 设置当前绘图工具(高层 API)
563
- * @param tool 工具类型或 null 取消选择
564
- */
565
- setDrawingTool(tool: DrawingToolType | null): void;
566
- /**
567
- * 移除绘图(高层 API)
568
- * @param drawingId 绘图 ID
569
- */
570
- removeDrawing(drawingId: string): void;
571
- /**
572
- * 清除所有绘图(高层 API)
573
- */
574
- clearDrawings(): void;
575
- /**
576
- * 更新设置(高层 API)
577
- * 代理到现有的 updateSettings
578
- */
579
- updateSettingsFacade(settings: Record<string, unknown>): void;
580
- /**
581
- * 更新选项(高层 API)
582
- * 代理到现有的 updateOptions
583
- */
584
- updateOptionsFacade(options: Partial<ChartOptions>): void;
585
- }
586
- export type ViewportState = {
587
- zoomLevel: number;
588
- plotWidth: number;
589
- plotHeight: number;
590
- dpr: number;
591
- visibleFrom: number;
592
- visibleTo: number;
593
- desiredScrollLeft: number | undefined;
594
- kWidth: number;
595
- kGap: number;
596
- };
597
- export type IndicatorRole = 'main' | 'sub';
598
- export interface IndicatorInstance {
599
- id: string;
600
- definitionId: string;
601
- label: string;
602
- name: string;
603
- role: IndicatorRole;
604
- paneId?: string;
605
- params: Record<string, unknown>;
606
- }
607
- export interface SubPaneInfo {
608
- paneId: string;
609
- indicatorId: string;
610
- params: Record<string, unknown>;
611
- ratio: number;
612
- }
613
- export type DrawingToolType = 'trendline' | 'horizontal' | 'fib' | 'rectangle' | 'arrow';
614
- export interface DrawingObject {
615
- id: string;
616
- type: DrawingToolType;
617
- }
1
+ import type { KLineData } from '@/types/price';
2
+ import type { ChartSettings } from '@/config/chartSettings';
3
+ import { type Signal } from '../../packages/core/src/reactivity/signal';
4
+ import { type VisibleRange, UpdateLevel } from '@/core/layout/pane';
5
+ import { InteractionController, type InteractionSnapshot } from '@/core/controller/interaction';
6
+ export type { InteractionSnapshot };
7
+ import { PaneRenderer } from '@/core/paneRenderer';
8
+ import { MarkerManager, type CustomMarkerEntity } from './marker/registry';
9
+ import { getPhysicalKLineConfig, calcKWidthPx } from '@/core/utils/klineConfig';
10
+ import { IndicatorScheduler } from '@/core/indicators/scheduler';
11
+ import { type SubPaneEntry } from '@/core/subPaneManager';
12
+ import { type PluginHostImpl, type RendererPlugin, type RendererPluginWithHost, type PaneRole, type PaneCapabilities } from '@/plugin';
13
+ import { type SubIndicatorType } from '@/core/renderers/Indicator';
14
+ export { getPhysicalKLineConfig, calcKWidthPx };
15
+ /**
16
+ * 图表 DOM 元素引用
17
+ * @property container 图表容器 div
18
+ * @property canvasLayer Canvas 层容器 div(包含所有绘制 canvas)
19
+ */
20
+ /**
21
+ * 图表 DOM 元素引用
22
+ * @property container 图表容器 div
23
+ * @property canvasLayer Canvas 层容器 div(包含所有绘制 canvas)
24
+ * @property xAxisCanvas X 轴时间轴 canvas
25
+ */
26
+ export type ChartDom = {
27
+ container: HTMLDivElement;
28
+ canvasLayer: HTMLDivElement;
29
+ rightAxisLayer: HTMLDivElement;
30
+ xAxisCanvas: HTMLCanvasElement;
31
+ };
32
+ /**
33
+ * Pane 面板配置
34
+ * @property id Pane 标识符
35
+ * @property ratio Pane 高度占比
36
+ * @property visible 是否可见(默认 true)
37
+ */
38
+ export type PaneSpec = {
39
+ id: string;
40
+ ratio: number;
41
+ visible?: boolean;
42
+ minHeightPx?: number;
43
+ role?: PaneRole;
44
+ capabilities?: Partial<PaneCapabilities>;
45
+ };
46
+ export type PaneRendererDom = {
47
+ mainCanvas: HTMLCanvasElement;
48
+ overlayCanvas: HTMLCanvasElement;
49
+ yAxisCanvas: HTMLCanvasElement;
50
+ };
51
+ export type ChartOptions = {
52
+ /** K 线宽度(可选,由 zoomLevel 派生) */
53
+ kWidth?: number;
54
+ /** K 线间隙(可选,由 DPR 计算) */
55
+ kGap?: number;
56
+ yPaddingPx: number;
57
+ rightAxisWidth: number;
58
+ bottomAxisHeight: number;
59
+ minKWidth: number;
60
+ maxKWidth: number;
61
+ panes: PaneSpec[];
62
+ /** pane 之间的真实分隔空隙(逻辑像素) */
63
+ paneGap?: number;
64
+ /** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
65
+ priceLabelWidth?: number;
66
+ /** pane 最小高度(逻辑像素,默认 60) */
67
+ defaultPaneMinHeightPx?: number;
68
+ /**
69
+ * 缩放级别数量(默认 10)
70
+ * - 将 minKWidth ~ maxKWidth 划分为多少个离散级别
71
+ * - 例如 10 表示有 10 个缩放级别(1-10)
72
+ */
73
+ zoomLevels?: number;
74
+ /**
75
+ * 初始缩放级别(1 ~ zoomLevels,默认 1)
76
+ * 未指定时默认为最小级别
77
+ */
78
+ initialZoomLevel?: number;
79
+ };
80
+ /** K 线起始 x 坐标数组,positions[i] 表示第 i 根 K 线的起始 x 坐标(逻辑像素) */
81
+ export type KLinePositions = number[];
82
+ export type Viewport = {
83
+ viewWidth: number;
84
+ viewHeight: number;
85
+ plotWidth: number;
86
+ plotHeight: number;
87
+ scrollLeft: number;
88
+ dpr: number;
89
+ };
90
+ type ResolvedChartOptions = Omit<ChartOptions, 'kWidth' | 'kGap'> & {
91
+ kWidth: number;
92
+ kGap: number;
93
+ };
94
+ export declare class Chart {
95
+ private dom;
96
+ private opt;
97
+ private _internalData;
98
+ private raf;
99
+ private pendingUpdateLevel;
100
+ private _internalViewport;
101
+ private paneRenderers;
102
+ private markerManager;
103
+ private drawingStore;
104
+ readonly interaction: InteractionController;
105
+ /** 插件宿主 */
106
+ private pluginHost;
107
+ /** 渲染器插件管理器 */
108
+ private rendererPluginManager;
109
+ /** 精确 DPR(来自 ResizeObserver 的 devicePixelContentBoxSize) */
110
+ private preciseDpr;
111
+ /** 统一监听容器尺寸与 DPR 变化 */
112
+ private resizeObserver?;
113
+ /** scroll 事件处理器引用(用于 cleanup) */
114
+ private onScroll?;
115
+ /** 最近一次观测到的容器尺寸 */
116
+ private observedSize;
117
+ /** 缓存的 scrollLeft(通过 scroll 事件同步,避免每帧读取 DOM 触发强制回流) */
118
+ private cachedScrollLeft;
119
+ /** overlay 上一帧是否有十字线(用于判断何时需要清除) */
120
+ private overlayHadCrosshair;
121
+ /** 用户设置配置(传递给渲染器) */
122
+ private settings;
123
+ /** pane ratio 状态(按 paneId 维护,sum=1 仅对可见 pane) */
124
+ private _internalPaneRatios;
125
+ /** 视口变化回调(供外部同步 DPR/尺寸) */
126
+ private onViewportChange?;
127
+ /** 共享 X 轴上下文缓存 */
128
+ private xAxisCtx;
129
+ /** Chart 级共享 WebGL canvas/context */
130
+ private sharedWebGLSurface;
131
+ /** pane 布局回流回调(Chart -> UI 单向) */
132
+ private onPaneLayoutChange?;
133
+ /** 数据变化回调(供外部同步 dataLength) */
134
+ private onDataChange?;
135
+ /** 当前缩放级别(1 ~ zoomLevelCount) */
136
+ private currentZoomLevel;
137
+ /** 缩放级别总数 */
138
+ private readonly zoomLevelCount;
139
+ /** 指标调度器(负责计算 MA 等指标并写入 StateStore)
140
+ * TODO: 阶段5迁移为插件注册,Scheduler 通过事件监听 data/viewport 变更,Chart 不直接持有
141
+ */
142
+ private indicatorScheduler;
143
+ /** 上次可见范围(用于检测视口变化) */
144
+ private lastVisibleRange;
145
+ /** Overlay 帧复用的最近主渲染结果 */
146
+ private cachedDrawFrame;
147
+ /** 副图管理器 */
148
+ private subPaneManager;
149
+ /** 当前激活的主图指标列表(如 ['boll', 'ma']) */
150
+ private activeMainIndicators;
151
+ /** 主图指标参数配置 */
152
+ private mainIndicatorParams;
153
+ /**
154
+ * 启用主图指标
155
+ * @param indicatorId 指标ID
156
+ * @param params 可选的指标参数
157
+ * @returns 是否成功启用
158
+ */
159
+ enableMainIndicator(indicatorId: string, params?: Record<string, number | boolean | string>): boolean;
160
+ /**
161
+ * 禁用主图指标
162
+ * @param indicatorId 指标ID
163
+ * @returns 是否成功禁用
164
+ */
165
+ disableMainIndicator(indicatorId: string): boolean;
166
+ /**
167
+ * 切换主图指标启用状态
168
+ * @param indicatorId 指标ID
169
+ * @param enabled 是否启用
170
+ */
171
+ toggleMainIndicator(indicatorId: string, enabled: boolean): void;
172
+ /**
173
+ * 获取当前激活的主图指标列表
174
+ * @returns 激活的指标ID数组
175
+ */
176
+ getActiveMainIndicators(): string[];
177
+ /**
178
+ * 检查主图指标是否激活
179
+ * @param indicatorId 指标ID
180
+ */
181
+ isMainIndicatorActive(indicatorId: string): boolean;
182
+ /**
183
+ * 更新主图指标参数
184
+ * @param indicatorId 指标ID
185
+ * @param params 参数对象
186
+ */
187
+ updateMainIndicatorParams(indicatorId: string, params: Record<string, number | boolean | string>): void;
188
+ /**
189
+ * 获取主图指标参数
190
+ * @param indicatorId 指标ID
191
+ */
192
+ getMainIndicatorParams(indicatorId: string): Record<string, number | boolean | string> | null;
193
+ /**
194
+ * 清除所有主图指标
195
+ */
196
+ clearMainIndicators(): void;
197
+ /**
198
+ * 启用主图指标渲染器(内部方法)
199
+ */
200
+ private enableMainIndicatorRenderer;
201
+ /**
202
+ * 禁用主图指标渲染器(内部方法)
203
+ */
204
+ private disableMainIndicatorRenderer;
205
+ /**
206
+ * 更新调度器配置(内部方法)
207
+ */
208
+ private updateIndicatorSchedulerConfig;
209
+ /**
210
+ * @deprecated 使用 enableMainIndicator/disableMainIndicator 替代
211
+ */
212
+ setActiveMainIndicators(indicators: string[]): void;
213
+ /**
214
+ * 创建图表实例
215
+ * @param dom 由 Vue 组件传入的 DOM 句柄
216
+ * @param opt 初始配置
217
+ */
218
+ constructor(dom: ChartDom, opt: ChartOptions);
219
+ private initCoreRenderers;
220
+ private initResizeObserver;
221
+ private updateObservedMetrics;
222
+ private getEffectiveDpr;
223
+ getViewport(): Viewport | null;
224
+ getCurrentDpr(): number;
225
+ /** 获取缓存的 scrollLeft(避免读取 DOM 触发强制回流) */
226
+ getCachedScrollLeft(): number;
227
+ /** 获取插件宿主 */
228
+ get plugin(): PluginHostImpl;
229
+ /** 安装渲染器插件 */
230
+ useRenderer(plugin: RendererPlugin | RendererPluginWithHost, config?: Record<string, unknown>): void;
231
+ /** 移除渲染器插件 */
232
+ removeRenderer(name: string): void;
233
+ /** 获取渲染器插件 */
234
+ getRenderer<T extends RendererPlugin = RendererPlugin>(name: string): T | undefined;
235
+ /** 更新渲染器配置(自动重绘) */
236
+ updateRendererConfig(name: string, config: Record<string, unknown>): void;
237
+ /** 启用/禁用渲染器 */
238
+ setRendererEnabled(name: string, enabled: boolean): void;
239
+ /** 获取所有渲染器 */
240
+ getAllRenderers(): RendererPlugin[];
241
+ /** 更新用户设置(触发重绘) */
242
+ updateSettings(settings: ChartSettings): void;
243
+ /**
244
+ * 绘制一帧
245
+ * @param level 更新级别,决定渲染哪些层
246
+ */
247
+ draw(level?: UpdateLevel): void;
248
+ private prepareFrameData;
249
+ private renderPanes;
250
+ private renderXAxis;
251
+ /**
252
+ * 应用渲染状态(由 Vue/Store 层在状态更新后调用)
253
+ * Chart 不拥有业务 SSOT,只负责接收参数并渲染
254
+ * 这是写入 opt.kWidth/kGap 和 currentZoomLevel 的唯一入口
255
+ */
256
+ applyRenderState(kWidth: number, kGap: number, zoomLevel?: number): void;
257
+ /** 获取总缩放级别数 */
258
+ getZoomLevelCount(): number;
259
+ /** 注册视口变化回调 */
260
+ setOnViewportChange(cb: (viewport: Viewport) => void): void;
261
+ /** 注册 pane 布局回流回调 */
262
+ setOnPaneLayoutChange(cb: (panes: PaneSpec[]) => void): void;
263
+ /** 注册数据变化回调 */
264
+ setOnDataChange(cb: (data: KLineData[]) => void): void;
265
+ /** 获取所有 PaneRenderer */
266
+ getPaneRenderers(): PaneRenderer[];
267
+ /** 获取 MarkerManager(供 InteractionController 使用) */
268
+ getMarkerManager(): MarkerManager;
269
+ /** 更新自定义标记 */
270
+ updateCustomMarkers(markers: CustomMarkerEntity[]): void;
271
+ /** 清除自定义标记 */
272
+ clearCustomMarkers(): void;
273
+ /** 获取 ChartDom(供 InteractionController 使用) */
274
+ getDom(): ChartDom;
275
+ /** 获取当前 ChartOptions(返回内部当前快照) */
276
+ getOption(): ResolvedChartOptions;
277
+ /**
278
+ * 计算 K 线起始 x 坐标数组,与 candle.ts 的像素对齐方式保持一致
279
+ * @param range 可见 K 线索引范围
280
+ * @returns x 坐标数组(逻辑像素,经过物理像素对齐)
281
+ */
282
+ calcKLinePositions(range: VisibleRange): KLinePositions;
283
+ /**
284
+ * 更新配置并触发布局/重绘
285
+ * @param partial 部分配置项
286
+ */
287
+ updateOptions(partial: Partial<ChartOptions>): void;
288
+ /** 更新 pane 布局配置
289
+ * @param panes 新的 pane 配置数组
290
+ *
291
+ * 显式整盘替换:清空之前 user-resize 留下的 paneRatios 缓存,让 spec 中的 ratio
292
+ * 真正生效。`addPane`/`upsertPane`/`removePaneDefinition` 走 `applyPaneLayoutSpecs`
293
+ * 时仍保留 prev 值以记住用户拖拽过的高度——只有显式的 layout replacement 才重置。
294
+ */
295
+ updatePaneLayout(panes: PaneSpec[]): void;
296
+ setPaneDefinitions(defs: PaneSpec[]): void;
297
+ upsertPane(def: PaneSpec): void;
298
+ removePaneDefinition(paneId: string): void;
299
+ bindIndicatorToPane(paneId: string, indicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): void;
300
+ /** 更新绘图对象 */
301
+ setDrawings(drawings: import('@/plugin').DrawingObject[]): void;
302
+ /** 更新选中的绘图 ID */
303
+ setSelectedDrawingId(id: string | null): void;
304
+ /** 获取当前 pane 布局快照(含 ratio) */
305
+ getPaneLayoutSpecs(): PaneSpec[];
306
+ private emitPaneLayoutChange;
307
+ private applyPaneLayoutSpecs;
308
+ /**
309
+ * 调整相邻 pane 边界(支持连锁挤压)
310
+ * @param upperPaneId 上方 pane ID(边界位于此 pane 与其下方邻居之间)
311
+ * @param deltaY Y 方向位移(逻辑像素,正数表示边界向下,upper 增大;负数表示向上,upper 减小)
312
+ */
313
+ resizePaneBoundary(upperPaneId: string, deltaY: number): boolean;
314
+ private resolvePaneRole;
315
+ addPane(paneId: string): void;
316
+ /**
317
+ * 动态移除 pane
318
+ * @param paneId pane 标识符
319
+ */
320
+ removePane(paneId: string): void;
321
+ /**
322
+ * 检查 pane 是否存在
323
+ * @param paneId pane 标识符
324
+ */
325
+ hasPane(paneId: string): boolean;
326
+ /**
327
+ * 创建副图面板并注册指标渲染器
328
+ * @param paneId 副图实例标识符(如 'RSI_0', 'MACD_0')
329
+ * @param indicatorId 指标类型
330
+ * @param params 指标参数
331
+ * @returns 是否创建成功
332
+ */
333
+ createSubPane(paneId: string, indicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): boolean;
334
+ /**
335
+ * 移除副图面板及其渲染器
336
+ * @param paneId 副图实例标识符
337
+ */
338
+ removeSubPane(paneId: string): void;
339
+ /**
340
+ * 替换副图的指标类型
341
+ * @param paneId 副图实例标识符
342
+ * @param newIndicatorId 新的指标类型
343
+ * @param params 新指标参数
344
+ */
345
+ replaceSubPaneIndicator(paneId: string, newIndicatorId: SubIndicatorType, params?: Record<string, number | boolean | string>): void;
346
+ /**
347
+ * 更新副图指标参数
348
+ * @param paneId 副图实例标识符
349
+ * @param params 新参数
350
+ */
351
+ updateSubPaneParams(paneId: string, params: Record<string, unknown>): void;
352
+ /**
353
+ * 清除所有副图面板
354
+ */
355
+ clearSubPanes(): void;
356
+ /**
357
+ * 获取当前所有副图指标类型
358
+ * @deprecated 使用 getSubPaneEntries 获取完整信息
359
+ */
360
+ getSubPaneIndicators(): SubIndicatorType[];
361
+ /**
362
+ * 获取所有副图条目
363
+ */
364
+ getSubPaneEntries(): SubPaneEntry[];
365
+ /**
366
+ * 根据 paneId 获取副图条目
367
+ * @param paneId 副图实例标识符
368
+ */
369
+ getSubPaneEntry(paneId: string): SubPaneEntry | undefined;
370
+ private getDefaultSubPaneParams;
371
+ /** 副图渲染器名称前缀(保留向后兼容) */
372
+ private static readonly SUB_PANE_PREFIX;
373
+ /**
374
+ * 平移价格轴(用于主图区域上下拖动)
375
+ * @param paneId 目标 pane ID
376
+ * @param deltaY Y轴像素偏移(正数向下拖动)
377
+ */
378
+ translatePrice(paneId: string, deltaY: number): void;
379
+ /**
380
+ * 重置价格轴垂直偏移
381
+ * @param paneId 目标 pane ID
382
+ */
383
+ resetPriceOffset(paneId: string): void;
384
+ /**
385
+ * 缩放价格轴(用于右侧刻度栏上下拖动)
386
+ * @param paneId 目标 pane ID
387
+ * @param deltaY Y轴像素偏移(向上拖动放大,向下拖动缩小)
388
+ */
389
+ scalePrice(paneId: string, deltaY: number): void;
390
+ /**
391
+ * 更新数据并请求重绘
392
+ * @param data K 线数据数组
393
+ */
394
+ updateData(data: KLineData[]): void;
395
+ /** 获取当前数据源(供 renderers 和 interaction 使用) */
396
+ getData(): KLineData[];
397
+ /** 获取指标调度器(供外部控制器更新指标配置) */
398
+ getIndicatorScheduler(): IndicatorScheduler;
399
+ private getTrailingSlotCount;
400
+ getLogicalSlotCount(): number;
401
+ getTimestampAtLogicalIndex(index: number): number | null;
402
+ /** 根据视口内 X 坐标反查逻辑索引(允许超出最后一根 K 线) */
403
+ getLogicalIndexAtX(mouseX: number): number | null;
404
+ /** 根据视口内 X 坐标反查数据索引(用于绘图落点) */
405
+ getDataIndexAtX(mouseX: number): number | null;
406
+ /** 获取内容总宽度(用于外部 scroll-content 撑开 scrollWidth) */
407
+ getContentWidth(): number;
408
+ /** 容器尺寸变化时调用 */
409
+ resize(): void;
410
+ /**
411
+ * 请求下一帧重绘(RAF 合并,支持分层更新)
412
+ * @param level 更新级别,默认为 All
413
+ */
414
+ scheduleDraw(level?: UpdateLevel): void;
415
+ /** 销毁图表实例 */
416
+ destroy(): Promise<void>;
417
+ /** 初始化所有 pane */
418
+ private initPanes;
419
+ private syncPaneRatiosFromSpecs;
420
+ private syncPaneRatiosToSpecs;
421
+ private normalizeVisiblePaneRatios;
422
+ private getPaneMinHeight;
423
+ private computePaneHeightsByRatio;
424
+ /** 计算每个 pane 的布局(top 和 height) */
425
+ private layoutPanes;
426
+ private computeViewport;
427
+ private _viewportSignal;
428
+ private _dataSignal;
429
+ private _themeSignal;
430
+ private _indicatorsSignal;
431
+ private _subPanesSignal;
432
+ private _drawingToolSignal;
433
+ private _drawingsSignal;
434
+ private _paneRatiosSignal;
435
+ private _interactionSignal;
436
+ /** 视口状态信号 */
437
+ get viewport(): Signal<ViewportState>;
438
+ /** 数据信号 */
439
+ get data(): Signal<ReadonlyArray<KLineData>>;
440
+ /** 主题信号 */
441
+ get theme(): Signal<'light' | 'dark'>;
442
+ /** 指标实例列表信号 */
443
+ get indicators(): Signal<ReadonlyArray<IndicatorInstance>>;
444
+ /** 子图信息信号 */
445
+ get subPanes(): Signal<ReadonlyArray<SubPaneInfo>>;
446
+ /** 当前绘图工具信号 */
447
+ get drawingTool(): Signal<DrawingToolType | null>;
448
+ /** 绘图对象列表信号 */
449
+ get drawings(): Signal<ReadonlyArray<import('@/plugin').DrawingObject>>;
450
+ /** 面板比例信号 */
451
+ get paneRatios(): Signal<Readonly<Record<string, number>>>;
452
+ /** 交互状态信号 */
453
+ get interactionState(): Signal<InteractionSnapshot>;
454
+ /**
455
+ * 设置数据(高层 API)
456
+ * 内部调用 updateData,并更新 data signal
457
+ */
458
+ setData(data: KLineData[]): void;
459
+ /**
460
+ * 追加数据(高层 API)
461
+ * 合并现有数据并更新
462
+ */
463
+ appendData(newData: KLineData[]): void;
464
+ /**
465
+ * 设置主题(高层 API)
466
+ */
467
+ setTheme(theme: 'light' | 'dark'): void;
468
+ /**
469
+ * 缩放到指定级别(高层 API)
470
+ * 计算并应用新的 render state,更新 viewport signal
471
+ */
472
+ zoomToLevel(level: number, anchorX?: number): void;
473
+ /**
474
+ * 放大(高层 API)
475
+ */
476
+ zoomIn(anchorX?: number): void;
477
+ /**
478
+ * 缩小(高层 API)
479
+ */
480
+ zoomOut(anchorX?: number): void;
481
+ /**
482
+ * 内部缩放实现
483
+ * 使用 computeZoom 纯函数计算精确的 scrollLeft
484
+ */
485
+ private applyZoom;
486
+ /**
487
+ * 统一指针事件处理(零配置)
488
+ * 自动判断区域并分发给 interaction controller
489
+ *
490
+ * @param e 指针事件
491
+ * @param drawingController 可选的绘图控制器,如果提供,会优先让绘图控制器处理事件
492
+ * @returns 是否被处理(如果 drawingController 处理了返回 true,否则返回 false)
493
+ */
494
+ handlePointerEvent(e: PointerEvent, drawingController?: {
495
+ onPointerDown?: (e: PointerEvent, container: HTMLElement) => boolean;
496
+ onPointerMove?: (e: PointerEvent, container: HTMLElement) => boolean;
497
+ onPointerUp?: (e: PointerEvent, container: HTMLElement) => boolean;
498
+ }): boolean;
499
+ /**
500
+ * 滚轮事件处理(高层 API)
501
+ * 使用 computeZoom 计算精确的 scrollLeft,更新 viewport signal
502
+ */
503
+ handleWheelEvent(e: WheelEvent): void;
504
+ /**
505
+ * 滚动事件处理(高层 API)
506
+ * 更新缓存的 scrollLeft 并触发交互 controller
507
+ */
508
+ handleScrollEvent(): void;
509
+ /**
510
+ * 双指捏合缩放处理(高层 API)
511
+ * @param delta 缩放增量(+1 放大 / -1 缩小)
512
+ * @param centerClientX 捏合中心在视口中的 X 坐标
513
+ */
514
+ handlePinchZoom(delta: number, centerClientX: number): void;
515
+ /**
516
+ * 更新 viewport signal(用于滚动事件,不更新 desiredScrollLeft)
517
+ */
518
+ private updateViewportSignal;
519
+ /**
520
+ * 添加指标(高层 API,显式指定 role)
521
+ * @param definitionId 指标定义 ID(如 'MA', 'MACD')
522
+ * @param role 'main' 主图指标 或 'sub' 副图指标
523
+ * @param params 指标参数
524
+ * @returns 实例 ID(成功)或 null(失败)
525
+ */
526
+ addIndicator(definitionId: string, role: 'main' | 'sub', params?: Record<string, unknown>): string | null;
527
+ /**
528
+ * 移除指标(高层 API)
529
+ * @param instanceId 指标实例 ID
530
+ * @returns 是否成功移除
531
+ */
532
+ removeIndicator(instanceId: string): boolean;
533
+ /**
534
+ * 更新指标参数(高层 API)
535
+ * @param instanceId 指标实例 ID
536
+ * @param params 新参数
537
+ * @returns 是否成功更新
538
+ */
539
+ updateIndicatorParams(instanceId: string, params: Record<string, unknown>): boolean;
540
+ /**
541
+ * 重新排序指标(高层 API)
542
+ * @param orderedInstanceIds 排序后的指标实例 ID 数组
543
+ * @returns 是否成功
544
+ */
545
+ reorderIndicators(orderedInstanceIds: string[]): boolean;
546
+ /**
547
+ * 同步 indicators signal
548
+ */
549
+ private syncIndicatorsSignal;
550
+ /**
551
+ * 同步 sub panes signal
552
+ */
553
+ private syncSubPanesSignal;
554
+ /**
555
+ * 调整子图大小(高层 API)
556
+ * @param paneId 面板 ID
557
+ * @param deltaY 垂直偏移量
558
+ * @returns 是否成功
559
+ */
560
+ resizeSubPane(paneId: string, deltaY: number): boolean;
561
+ /**
562
+ * 设置当前绘图工具(高层 API)
563
+ * @param tool 工具类型或 null 取消选择
564
+ */
565
+ setDrawingTool(tool: DrawingToolType | null): void;
566
+ /**
567
+ * 移除绘图(高层 API)
568
+ * @param drawingId 绘图 ID
569
+ */
570
+ removeDrawing(drawingId: string): void;
571
+ /**
572
+ * 清除所有绘图(高层 API)
573
+ */
574
+ clearDrawings(): void;
575
+ /**
576
+ * 更新设置(高层 API)
577
+ * 代理到现有的 updateSettings
578
+ */
579
+ updateSettingsFacade(settings: Record<string, unknown>): void;
580
+ /**
581
+ * 更新选项(高层 API)
582
+ * 代理到现有的 updateOptions
583
+ */
584
+ updateOptionsFacade(options: Partial<ChartOptions>): void;
585
+ }
586
+ export type ViewportState = {
587
+ zoomLevel: number;
588
+ plotWidth: number;
589
+ plotHeight: number;
590
+ dpr: number;
591
+ visibleFrom: number;
592
+ visibleTo: number;
593
+ desiredScrollLeft: number | undefined;
594
+ kWidth: number;
595
+ kGap: number;
596
+ };
597
+ export type IndicatorRole = 'main' | 'sub';
598
+ export interface IndicatorInstance {
599
+ id: string;
600
+ definitionId: string;
601
+ label: string;
602
+ name: string;
603
+ role: IndicatorRole;
604
+ paneId?: string;
605
+ params: Record<string, unknown>;
606
+ }
607
+ export interface SubPaneInfo {
608
+ paneId: string;
609
+ indicatorId: string;
610
+ params: Record<string, unknown>;
611
+ ratio: number;
612
+ }
613
+ export type DrawingToolType = 'trendline' | 'horizontal' | 'fib' | 'rectangle' | 'arrow';
614
+ export interface DrawingObject {
615
+ id: string;
616
+ type: DrawingToolType;
617
+ }
618
618
  //# sourceMappingURL=chart.d.ts.map