@363045841yyt/klinechart-core 0.7.3 → 0.7.5

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 (247) hide show
  1. package/README.md +201 -201
  2. package/README.zh-CN.md +201 -201
  3. package/dist/controllers/index.d.ts +1 -0
  4. package/dist/controllers/index.d.ts.map +1 -1
  5. package/dist/controllers/index.js +1 -0
  6. package/dist/controllers/index.js.map +1 -1
  7. package/dist/engine/chart.d.ts +11 -19
  8. package/dist/engine/chart.d.ts.map +1 -1
  9. package/dist/engine/chart.js +92 -109
  10. package/dist/engine/chart.js.map +1 -1
  11. package/dist/engine/renderers/Indicator/indicatorData.d.ts +1 -0
  12. package/dist/engine/renderers/Indicator/indicatorData.d.ts.map +1 -1
  13. package/dist/engine/renderers/Indicator/indicatorData.js +1 -1
  14. package/dist/engine/renderers/Indicator/indicatorData.js.map +1 -1
  15. package/dist/engine/renderers/webgl/candleSurface.js +47 -47
  16. package/dist/engine/subPaneManager.d.ts +4 -0
  17. package/dist/engine/subPaneManager.d.ts.map +1 -1
  18. package/dist/engine/subPaneManager.js +13 -0
  19. package/dist/engine/subPaneManager.js.map +1 -1
  20. package/dist/version.d.ts +1 -1
  21. package/dist/version.d.ts.map +1 -1
  22. package/dist/version.js +1 -2
  23. package/dist/version.js.map +1 -1
  24. package/package.json +129 -122
  25. package/src/__tests__/signal.test.ts +124 -124
  26. package/src/config/chartSettings.ts +66 -66
  27. package/src/controllers/__tests__/drawing.test.ts +214 -214
  28. package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
  29. package/src/controllers/__tests__/toolbar.test.ts +225 -225
  30. package/src/controllers/createChartController.ts +665 -665
  31. package/src/controllers/createDrawingController.ts +96 -96
  32. package/src/controllers/createIndicatorSelectorController.ts +307 -307
  33. package/src/controllers/createToolbarController.ts +146 -146
  34. package/src/controllers/index.ts +20 -19
  35. package/src/controllers/types.ts +284 -284
  36. package/src/engine/__tests__/chart.dpr.test.ts +401 -401
  37. package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
  38. package/src/engine/chart-store.ts +121 -121
  39. package/src/engine/chart.d.ts +617 -617
  40. package/src/engine/chart.ts +2803 -2815
  41. package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
  42. package/src/engine/controller/interaction.ts +722 -722
  43. package/src/engine/controller/markerInteraction.ts +130 -130
  44. package/src/engine/controller/pinchTracker.ts +82 -82
  45. package/src/engine/controller/tooltipPosition.ts +48 -48
  46. package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
  47. package/src/engine/draw/pixelAlign.ts +259 -259
  48. package/src/engine/drawing/index.ts +655 -655
  49. package/src/engine/drawing/interaction.ts +842 -842
  50. package/src/engine/drawing/plugin.ts +343 -343
  51. package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
  52. package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
  53. package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
  54. package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
  55. package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
  56. package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
  57. package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
  58. package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
  59. package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
  60. package/src/engine/indicators/__tests__/atr.test.ts +153 -153
  61. package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
  62. package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
  63. package/src/engine/indicators/__tests__/dema.test.ts +73 -73
  64. package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
  65. package/src/engine/indicators/__tests__/hma.test.ts +73 -73
  66. package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
  67. package/src/engine/indicators/__tests__/kama.test.ts +80 -80
  68. package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
  69. package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
  70. package/src/engine/indicators/__tests__/roc.test.ts +68 -68
  71. package/src/engine/indicators/__tests__/sar.test.ts +86 -86
  72. package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
  73. package/src/engine/indicators/__tests__/soa.test.ts +533 -533
  74. package/src/engine/indicators/__tests__/structure.test.ts +110 -110
  75. package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
  76. package/src/engine/indicators/__tests__/tema.test.ts +68 -68
  77. package/src/engine/indicators/__tests__/trix.test.ts +70 -70
  78. package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
  79. package/src/engine/indicators/__tests__/volume.test.ts +115 -115
  80. package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
  81. package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
  82. package/src/engine/indicators/__tests__/wma.test.ts +112 -112
  83. package/src/engine/indicators/__tests__/zones.test.ts +95 -95
  84. package/src/engine/indicators/atrState.ts +27 -27
  85. package/src/engine/indicators/bollState.ts +51 -51
  86. package/src/engine/indicators/calculators.ts +2593 -2593
  87. package/src/engine/indicators/cciState.ts +25 -25
  88. package/src/engine/indicators/chaikinVolState.ts +32 -32
  89. package/src/engine/indicators/cmfState.ts +27 -27
  90. package/src/engine/indicators/demaState.ts +27 -27
  91. package/src/engine/indicators/donchianState.ts +43 -43
  92. package/src/engine/indicators/eneState.ts +43 -43
  93. package/src/engine/indicators/expmaState.ts +43 -43
  94. package/src/engine/indicators/fastkState.ts +25 -25
  95. package/src/engine/indicators/fibState.ts +41 -41
  96. package/src/engine/indicators/hmaState.ts +27 -27
  97. package/src/engine/indicators/hvState.ts +28 -28
  98. package/src/engine/indicators/ichimokuState.ts +70 -70
  99. package/src/engine/indicators/indicator.worker.ts +169 -169
  100. package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
  101. package/src/engine/indicators/indicatorMetadata.ts +110 -110
  102. package/src/engine/indicators/indicatorRegistry.ts +106 -106
  103. package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
  104. package/src/engine/indicators/kamaState.ts +34 -34
  105. package/src/engine/indicators/keltnerState.ts +49 -49
  106. package/src/engine/indicators/kstState.ts +42 -42
  107. package/src/engine/indicators/maState.ts +36 -36
  108. package/src/engine/indicators/macdState.ts +76 -76
  109. package/src/engine/indicators/mfiState.ts +27 -27
  110. package/src/engine/indicators/momState.ts +25 -25
  111. package/src/engine/indicators/obvState.ts +25 -25
  112. package/src/engine/indicators/parkinsonState.ts +28 -28
  113. package/src/engine/indicators/pivotState.ts +51 -51
  114. package/src/engine/indicators/pvtState.ts +25 -25
  115. package/src/engine/indicators/rocState.ts +27 -27
  116. package/src/engine/indicators/rsiState.ts +65 -65
  117. package/src/engine/indicators/sarState.ts +41 -41
  118. package/src/engine/indicators/scheduler.ts +1205 -1205
  119. package/src/engine/indicators/soa.ts +352 -352
  120. package/src/engine/indicators/stateComposer.ts +1262 -1262
  121. package/src/engine/indicators/stochState.ts +26 -26
  122. package/src/engine/indicators/structureState.ts +69 -69
  123. package/src/engine/indicators/supertrendState.ts +37 -37
  124. package/src/engine/indicators/temaState.ts +27 -27
  125. package/src/engine/indicators/trixState.ts +35 -35
  126. package/src/engine/indicators/vmaState.ts +27 -27
  127. package/src/engine/indicators/volumeProfileState.ts +63 -63
  128. package/src/engine/indicators/vwapState.ts +29 -29
  129. package/src/engine/indicators/wmaState.ts +27 -27
  130. package/src/engine/indicators/wmsrState.ts +25 -25
  131. package/src/engine/indicators/workerProtocol.ts +613 -613
  132. package/src/engine/indicators/zonesState.ts +47 -47
  133. package/src/engine/layout/pane.ts +161 -161
  134. package/src/engine/marker/registry.ts +265 -265
  135. package/src/engine/paneRenderer.ts +169 -169
  136. package/src/engine/renderers/Indicator/atr.ts +237 -237
  137. package/src/engine/renderers/Indicator/boll.ts +317 -317
  138. package/src/engine/renderers/Indicator/cci.ts +275 -275
  139. package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
  140. package/src/engine/renderers/Indicator/cmf.ts +137 -137
  141. package/src/engine/renderers/Indicator/dema.ts +136 -136
  142. package/src/engine/renderers/Indicator/donchian.ts +137 -137
  143. package/src/engine/renderers/Indicator/ene.ts +271 -271
  144. package/src/engine/renderers/Indicator/expma.ts +197 -197
  145. package/src/engine/renderers/Indicator/fastk.ts +316 -316
  146. package/src/engine/renderers/Indicator/fib.ts +141 -141
  147. package/src/engine/renderers/Indicator/hma.ts +136 -136
  148. package/src/engine/renderers/Indicator/hv.ts +124 -124
  149. package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
  150. package/src/engine/renderers/Indicator/index.ts +241 -241
  151. package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
  152. package/src/engine/renderers/Indicator/kama.ts +136 -136
  153. package/src/engine/renderers/Indicator/keltner.ts +137 -137
  154. package/src/engine/renderers/Indicator/kst.ts +302 -302
  155. package/src/engine/renderers/Indicator/ma.ts +200 -200
  156. package/src/engine/renderers/Indicator/macd.ts +477 -477
  157. package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
  158. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
  159. package/src/engine/renderers/Indicator/mfi.ts +142 -142
  160. package/src/engine/renderers/Indicator/mom.ts +311 -311
  161. package/src/engine/renderers/Indicator/obv.ts +123 -123
  162. package/src/engine/renderers/Indicator/parkinson.ts +124 -124
  163. package/src/engine/renderers/Indicator/pivot.ts +131 -131
  164. package/src/engine/renderers/Indicator/pvt.ts +123 -123
  165. package/src/engine/renderers/Indicator/roc.ts +143 -143
  166. package/src/engine/renderers/Indicator/rsi.ts +390 -390
  167. package/src/engine/renderers/Indicator/sar.ts +113 -113
  168. package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
  169. package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
  170. package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
  171. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
  172. package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
  173. package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
  174. package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
  175. package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
  176. package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
  177. package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
  178. package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
  179. package/src/engine/renderers/Indicator/stoch.ts +359 -359
  180. package/src/engine/renderers/Indicator/structure.ts +126 -126
  181. package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
  182. package/src/engine/renderers/Indicator/supertrend.ts +115 -115
  183. package/src/engine/renderers/Indicator/tema.ts +136 -136
  184. package/src/engine/renderers/Indicator/trix.ts +158 -158
  185. package/src/engine/renderers/Indicator/vma.ts +124 -124
  186. package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
  187. package/src/engine/renderers/Indicator/vwap.ts +123 -123
  188. package/src/engine/renderers/Indicator/wma.ts +136 -136
  189. package/src/engine/renderers/Indicator/wmsr.ts +328 -328
  190. package/src/engine/renderers/Indicator/zones.ts +104 -104
  191. package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
  192. package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
  193. package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
  194. package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
  195. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
  196. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
  197. package/src/engine/renderers/candle.ts +459 -459
  198. package/src/engine/renderers/crosshair.ts +69 -69
  199. package/src/engine/renderers/customMarkers.ts +162 -162
  200. package/src/engine/renderers/extremaMarkers.ts +246 -246
  201. package/src/engine/renderers/gridLines.ts +90 -90
  202. package/src/engine/renderers/lastPrice.ts +97 -97
  203. package/src/engine/renderers/paneTitle.ts +136 -136
  204. package/src/engine/renderers/subVolume.ts +236 -236
  205. package/src/engine/renderers/timeAxis.ts +121 -121
  206. package/src/engine/renderers/webgl/candleSurface.ts +955 -955
  207. package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
  208. package/src/engine/renderers/yAxis.ts +105 -105
  209. package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
  210. package/src/engine/scale/logFormula.ts +130 -130
  211. package/src/engine/scale/price.ts +39 -39
  212. package/src/engine/scale/priceScale.ts +264 -264
  213. package/src/engine/subPaneManager.ts +442 -427
  214. package/src/engine/theme/colors.ts +642 -642
  215. package/src/engine/theme/fonts.ts +20 -20
  216. package/src/engine/utils/klineConfig.ts +49 -49
  217. package/src/engine/utils/tickCount.ts +11 -11
  218. package/src/engine/utils/tickPosition.ts +214 -214
  219. package/src/engine/utils/zoom.ts +83 -83
  220. package/src/engine/viewport/viewport.ts +67 -67
  221. package/src/index.ts +3 -3
  222. package/src/plugin/ConfigManager.ts +93 -93
  223. package/src/plugin/EventBus.ts +77 -77
  224. package/src/plugin/HookSystem.ts +106 -106
  225. package/src/plugin/PluginHost.ts +243 -243
  226. package/src/plugin/PluginRegistry.ts +92 -92
  227. package/src/plugin/StateStore.ts +73 -73
  228. package/src/plugin/index.ts +19 -19
  229. package/src/plugin/rendererPluginManager.ts +368 -368
  230. package/src/plugin/stateKeys.ts +8 -8
  231. package/src/plugin/types.ts +526 -526
  232. package/src/reactivity/index.ts +2 -2
  233. package/src/reactivity/signal.ts +119 -119
  234. package/src/semantic/controller.ts +251 -251
  235. package/src/semantic/drawShape.ts +260 -260
  236. package/src/semantic/index.ts +28 -28
  237. package/src/semantic/schema.json +256 -256
  238. package/src/semantic/types.ts +251 -251
  239. package/src/semantic/validator.ts +349 -349
  240. package/src/types/kLine.ts +13 -13
  241. package/src/types/price.ts +56 -56
  242. package/src/types/volumePrice.ts +33 -33
  243. package/src/utils/dateFormat.ts +208 -208
  244. package/src/utils/kLineDraw/axis.ts +562 -562
  245. package/src/utils/priceToY.ts +34 -34
  246. package/src/utils/volumePrice.ts +202 -202
  247. 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