@363045841yyt/klinechart-core 0.8.12 → 0.8.13-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1134) hide show
  1. package/README.md +18 -12
  2. package/README.zh-CN.md +18 -12
  3. package/dist/alerts/createAlertController.d.ts.map +1 -1
  4. package/dist/alerts/createAlertController.js +2 -6
  5. package/dist/alerts/createAlertController.js.map +1 -1
  6. package/dist/alerts/index.d.ts +1 -1
  7. package/dist/alerts/index.d.ts.map +1 -1
  8. package/dist/alerts/index.js +1 -1
  9. package/dist/alerts/index.js.map +1 -1
  10. package/dist/alerts/predicates.d.ts.map +1 -1
  11. package/dist/alerts/predicates.js +1 -4
  12. package/dist/alerts/predicates.js.map +1 -1
  13. package/dist/alerts/ruleSchema.d.ts.map +1 -1
  14. package/dist/alerts/ruleSchema.js +1 -1
  15. package/dist/alerts/ruleSchema.js.map +1 -1
  16. package/dist/alerts/types.d.ts.map +1 -1
  17. package/dist/chartTypes/heikinAshi.d.ts.map +1 -1
  18. package/dist/chartTypes/heikinAshi.js.map +1 -1
  19. package/dist/chartTypes/pointAndFigure.d.ts.map +1 -1
  20. package/dist/chartTypes/pointAndFigure.js.map +1 -1
  21. package/dist/chartTypes/rangeBars.d.ts.map +1 -1
  22. package/dist/chartTypes/rangeBars.js.map +1 -1
  23. package/dist/chartTypes/renko.d.ts.map +1 -1
  24. package/dist/chartTypes/renko.js.map +1 -1
  25. package/dist/chartTypes/types.d.ts.map +1 -1
  26. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -1
  27. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -1
  28. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -1
  29. package/dist/components/anchoredVwap/createAnchoredVwapController.js +6 -17
  30. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -1
  31. package/dist/components/anchoredVwap/index.d.ts.map +1 -1
  32. package/dist/components/anchoredVwap/types.d.ts.map +1 -1
  33. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -1
  34. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -1
  35. package/dist/components/crosshairSync/index.d.ts.map +1 -1
  36. package/dist/components/crosshairSync/index.js.map +1 -1
  37. package/dist/components/footprint/aggressor.d.ts.map +1 -1
  38. package/dist/components/footprint/aggressor.js.map +1 -1
  39. package/dist/components/footprint/createFootprintController.d.ts.map +1 -1
  40. package/dist/components/footprint/createFootprintController.js +2 -3
  41. package/dist/components/footprint/createFootprintController.js.map +1 -1
  42. package/dist/components/footprint/index.d.ts +2 -2
  43. package/dist/components/footprint/index.d.ts.map +1 -1
  44. package/dist/components/footprint/index.js +2 -2
  45. package/dist/components/footprint/index.js.map +1 -1
  46. package/dist/components/footprint/perBarStats.d.ts.map +1 -1
  47. package/dist/components/footprint/perBarStats.js.map +1 -1
  48. package/dist/components/footprint/types.d.ts.map +1 -1
  49. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -1
  50. package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -1
  51. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -1
  52. package/dist/components/mtfOverlay/createMtfController.js.map +1 -1
  53. package/dist/components/mtfOverlay/index.d.ts.map +1 -1
  54. package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -1
  55. package/dist/components/mtfOverlay/resampleBars.js.map +1 -1
  56. package/dist/components/mtfOverlay/types.d.ts.map +1 -1
  57. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -1
  58. package/dist/components/orderBookHeatmap/createHeatmapController.js +20 -3
  59. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -1
  60. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -1
  61. package/dist/components/orderBookHeatmap/createOrderBookState.js +1 -3
  62. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -1
  63. package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -1
  64. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -1
  65. package/dist/components/orderBookHeatmap/index.d.ts.map +1 -1
  66. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -1
  67. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -1
  68. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -1
  69. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -1
  70. package/dist/components/orderBookHeatmap/types.d.ts +10 -0
  71. package/dist/components/orderBookHeatmap/types.d.ts.map +1 -1
  72. package/dist/components/volumeProfile/binning.d.ts.map +1 -1
  73. package/dist/components/volumeProfile/binning.js.map +1 -1
  74. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -1
  75. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -1
  76. package/dist/components/volumeProfile/index.d.ts.map +1 -1
  77. package/dist/components/volumeProfile/poc.js.map +1 -1
  78. package/dist/components/volumeProfile/types.d.ts.map +1 -1
  79. package/dist/components/volumeProfile/valueArea.d.ts.map +1 -1
  80. package/dist/components/volumeProfile/valueArea.js.map +1 -1
  81. package/dist/config/chartSettings.d.ts.map +1 -1
  82. package/dist/config/chartSettings.js +56 -11
  83. package/dist/config/chartSettings.js.map +1 -1
  84. package/dist/controllers/createChartController.d.ts.map +1 -1
  85. package/dist/controllers/createChartController.js +33 -14
  86. package/dist/controllers/createChartController.js.map +1 -1
  87. package/dist/controllers/createDrawingController.d.ts.map +1 -1
  88. package/dist/controllers/createDrawingController.js.map +1 -1
  89. package/dist/controllers/createIndicatorSelectorController.d.ts.map +1 -1
  90. package/dist/controllers/createIndicatorSelectorController.js +1 -2
  91. package/dist/controllers/createIndicatorSelectorController.js.map +1 -1
  92. package/dist/controllers/createToolbarController.d.ts.map +1 -1
  93. package/dist/controllers/createToolbarController.js +1 -3
  94. package/dist/controllers/createToolbarController.js.map +1 -1
  95. package/dist/controllers/index.d.ts +7 -5
  96. package/dist/controllers/index.d.ts.map +1 -1
  97. package/dist/controllers/index.js +5 -3
  98. package/dist/controllers/index.js.map +1 -1
  99. package/dist/controllers/types.d.ts +24 -0
  100. package/dist/controllers/types.d.ts.map +1 -1
  101. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  102. package/dist/data-fetchers/baostock.js.map +1 -1
  103. package/dist/data-fetchers/binance.d.ts +33 -0
  104. package/dist/data-fetchers/binance.d.ts.map +1 -0
  105. package/dist/data-fetchers/binance.js +115 -0
  106. package/dist/data-fetchers/binance.js.map +1 -0
  107. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  108. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  109. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  110. package/dist/data-fetchers/dataBuffer.js +8 -5
  111. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  112. package/dist/data-fetchers/depthConnector.d.ts +47 -0
  113. package/dist/data-fetchers/depthConnector.d.ts.map +1 -0
  114. package/dist/data-fetchers/depthConnector.js +88 -0
  115. package/dist/data-fetchers/depthConnector.js.map +1 -0
  116. package/dist/data-fetchers/depthTypes.d.ts +52 -0
  117. package/dist/data-fetchers/depthTypes.d.ts.map +1 -0
  118. package/dist/data-fetchers/depthTypes.js +9 -0
  119. package/dist/data-fetchers/depthTypes.js.map +1 -0
  120. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  121. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  122. package/dist/data-fetchers/gotdx.js +13 -3
  123. package/dist/data-fetchers/gotdx.js.map +1 -1
  124. package/dist/data-fetchers/index.d.ts +4 -1
  125. package/dist/data-fetchers/index.d.ts.map +1 -1
  126. package/dist/data-fetchers/index.js +3 -1
  127. package/dist/data-fetchers/index.js.map +1 -1
  128. package/dist/data-fetchers/router.d.ts.map +1 -1
  129. package/dist/data-fetchers/router.js +1 -1
  130. package/dist/data-fetchers/router.js.map +1 -1
  131. package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -1
  132. package/dist/data-fetchers/timeShareBuffer.js.map +1 -1
  133. package/dist/data-fetchers/tradingview.js.map +1 -1
  134. package/dist/engine/chart.d.ts +6 -2
  135. package/dist/engine/chart.d.ts.map +1 -1
  136. package/dist/engine/chart.js +48 -14
  137. package/dist/engine/chart.js.map +1 -1
  138. package/dist/engine/controller/interaction.d.ts.map +1 -1
  139. package/dist/engine/controller/interaction.js +30 -9
  140. package/dist/engine/controller/interaction.js.map +1 -1
  141. package/dist/engine/controller/markerInteraction.d.ts.map +1 -1
  142. package/dist/engine/controller/markerInteraction.js.map +1 -1
  143. package/dist/engine/data/chartDataManager.d.ts +11 -1
  144. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  145. package/dist/engine/data/chartDataManager.js +71 -22
  146. package/dist/engine/data/chartDataManager.js.map +1 -1
  147. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  148. package/dist/engine/draw/pixelAlign.js.map +1 -1
  149. package/dist/engine/drawing/HitTester.d.ts.map +1 -1
  150. package/dist/engine/drawing/HitTester.js +3 -5
  151. package/dist/engine/drawing/HitTester.js.map +1 -1
  152. package/dist/engine/drawing/PreviewRenderer.d.ts.map +1 -1
  153. package/dist/engine/drawing/PreviewRenderer.js +25 -5
  154. package/dist/engine/drawing/PreviewRenderer.js.map +1 -1
  155. package/dist/engine/drawing/index.d.ts.map +1 -1
  156. package/dist/engine/drawing/index.js +88 -20
  157. package/dist/engine/drawing/index.js.map +1 -1
  158. package/dist/engine/drawing/interaction.d.ts.map +1 -1
  159. package/dist/engine/drawing/interaction.js.map +1 -1
  160. package/dist/engine/drawing/linearRegression.d.ts.map +1 -1
  161. package/dist/engine/drawing/linearRegression.js.map +1 -1
  162. package/dist/engine/drawing/plugin.d.ts.map +1 -1
  163. package/dist/engine/drawing/plugin.js +25 -10
  164. package/dist/engine/drawing/plugin.js.map +1 -1
  165. package/dist/engine/indicators/calculators/_shared.d.ts.map +1 -1
  166. package/dist/engine/indicators/calculators/_shared.js.map +1 -1
  167. package/dist/engine/indicators/calculators/bands.d.ts.map +1 -1
  168. package/dist/engine/indicators/calculators/bands.js +2 -2
  169. package/dist/engine/indicators/calculators/bands.js.map +1 -1
  170. package/dist/engine/indicators/calculators/index.d.ts +3 -3
  171. package/dist/engine/indicators/calculators/index.d.ts.map +1 -1
  172. package/dist/engine/indicators/calculators/index.js +2 -2
  173. package/dist/engine/indicators/calculators/index.js.map +1 -1
  174. package/dist/engine/indicators/calculators/movingAverages.d.ts.map +1 -1
  175. package/dist/engine/indicators/calculators/movingAverages.js.map +1 -1
  176. package/dist/engine/indicators/calculators/oscillators.d.ts.map +1 -1
  177. package/dist/engine/indicators/calculators/oscillators.js +3 -3
  178. package/dist/engine/indicators/calculators/oscillators.js.map +1 -1
  179. package/dist/engine/indicators/calculators/patterns.d.ts.map +1 -1
  180. package/dist/engine/indicators/calculators/patterns.js +3 -2
  181. package/dist/engine/indicators/calculators/patterns.js.map +1 -1
  182. package/dist/engine/indicators/calculators/volatility.d.ts.map +1 -1
  183. package/dist/engine/indicators/calculators/volatility.js +2 -2
  184. package/dist/engine/indicators/calculators/volatility.js.map +1 -1
  185. package/dist/engine/indicators/calculators/volume.d.ts.map +1 -1
  186. package/dist/engine/indicators/calculators/volume.js +1 -1
  187. package/dist/engine/indicators/calculators/volume.js.map +1 -1
  188. package/dist/engine/indicators/chartIndicatorManager.d.ts +7 -1
  189. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  190. package/dist/engine/indicators/chartIndicatorManager.js +44 -11
  191. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  192. package/dist/engine/indicators/indicator.worker.js +1 -1
  193. package/dist/engine/indicators/indicator.worker.js.map +1 -1
  194. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  195. package/dist/engine/indicators/indicatorDefinitionRegistry.js +16 -10
  196. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  197. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  198. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  199. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  200. package/dist/engine/indicators/indicatorRegistry.js +6 -3
  201. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  202. package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
  203. package/dist/engine/indicators/indicatorRuntime.js +8 -8
  204. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  205. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  206. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  207. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  208. package/dist/engine/indicators/scheduler.js +19 -15
  209. package/dist/engine/indicators/scheduler.js.map +1 -1
  210. package/dist/engine/indicators/soa.d.ts.map +1 -1
  211. package/dist/engine/indicators/soa.js +1 -3
  212. package/dist/engine/indicators/soa.js.map +1 -1
  213. package/dist/engine/indicators/state/atrState.d.ts.map +1 -1
  214. package/dist/engine/indicators/state/atrState.js.map +1 -1
  215. package/dist/engine/indicators/state/bollState.d.ts.map +1 -1
  216. package/dist/engine/indicators/state/bollState.js.map +1 -1
  217. package/dist/engine/indicators/state/cciState.d.ts.map +1 -1
  218. package/dist/engine/indicators/state/cciState.js.map +1 -1
  219. package/dist/engine/indicators/state/chaikinVolState.d.ts.map +1 -1
  220. package/dist/engine/indicators/state/chaikinVolState.js.map +1 -1
  221. package/dist/engine/indicators/state/cmfState.d.ts.map +1 -1
  222. package/dist/engine/indicators/state/cmfState.js.map +1 -1
  223. package/dist/engine/indicators/state/demaState.d.ts.map +1 -1
  224. package/dist/engine/indicators/state/demaState.js.map +1 -1
  225. package/dist/engine/indicators/state/donchianState.d.ts.map +1 -1
  226. package/dist/engine/indicators/state/donchianState.js.map +1 -1
  227. package/dist/engine/indicators/state/eneState.d.ts.map +1 -1
  228. package/dist/engine/indicators/state/eneState.js.map +1 -1
  229. package/dist/engine/indicators/state/expmaState.d.ts.map +1 -1
  230. package/dist/engine/indicators/state/expmaState.js.map +1 -1
  231. package/dist/engine/indicators/state/fastkState.d.ts.map +1 -1
  232. package/dist/engine/indicators/state/fastkState.js.map +1 -1
  233. package/dist/engine/indicators/state/fibState.d.ts.map +1 -1
  234. package/dist/engine/indicators/state/fibState.js.map +1 -1
  235. package/dist/engine/indicators/state/hmaState.d.ts.map +1 -1
  236. package/dist/engine/indicators/state/hmaState.js.map +1 -1
  237. package/dist/engine/indicators/state/hvState.d.ts.map +1 -1
  238. package/dist/engine/indicators/state/hvState.js +5 -1
  239. package/dist/engine/indicators/state/hvState.js.map +1 -1
  240. package/dist/engine/indicators/state/ichimokuState.d.ts.map +1 -1
  241. package/dist/engine/indicators/state/ichimokuState.js.map +1 -1
  242. package/dist/engine/indicators/state/kamaState.d.ts.map +1 -1
  243. package/dist/engine/indicators/state/kamaState.js.map +1 -1
  244. package/dist/engine/indicators/state/keltnerState.d.ts.map +1 -1
  245. package/dist/engine/indicators/state/keltnerState.js.map +1 -1
  246. package/dist/engine/indicators/state/kstState.d.ts.map +1 -1
  247. package/dist/engine/indicators/state/kstState.js.map +1 -1
  248. package/dist/engine/indicators/state/maState.d.ts.map +1 -1
  249. package/dist/engine/indicators/state/maState.js.map +1 -1
  250. package/dist/engine/indicators/state/mfiState.d.ts.map +1 -1
  251. package/dist/engine/indicators/state/mfiState.js.map +1 -1
  252. package/dist/engine/indicators/state/momState.d.ts.map +1 -1
  253. package/dist/engine/indicators/state/momState.js.map +1 -1
  254. package/dist/engine/indicators/state/obvState.d.ts.map +1 -1
  255. package/dist/engine/indicators/state/obvState.js.map +1 -1
  256. package/dist/engine/indicators/state/parkinsonState.d.ts.map +1 -1
  257. package/dist/engine/indicators/state/parkinsonState.js +5 -1
  258. package/dist/engine/indicators/state/parkinsonState.js.map +1 -1
  259. package/dist/engine/indicators/state/pivotState.d.ts.map +1 -1
  260. package/dist/engine/indicators/state/pivotState.js.map +1 -1
  261. package/dist/engine/indicators/state/pvtState.d.ts.map +1 -1
  262. package/dist/engine/indicators/state/pvtState.js.map +1 -1
  263. package/dist/engine/indicators/state/rocState.d.ts.map +1 -1
  264. package/dist/engine/indicators/state/rocState.js.map +1 -1
  265. package/dist/engine/indicators/state/rsiState.d.ts.map +1 -1
  266. package/dist/engine/indicators/state/rsiState.js.map +1 -1
  267. package/dist/engine/indicators/state/sarState.d.ts.map +1 -1
  268. package/dist/engine/indicators/state/sarState.js.map +1 -1
  269. package/dist/engine/indicators/state/stochState.d.ts.map +1 -1
  270. package/dist/engine/indicators/state/stochState.js.map +1 -1
  271. package/dist/engine/indicators/state/structureState.d.ts.map +1 -1
  272. package/dist/engine/indicators/state/structureState.js.map +1 -1
  273. package/dist/engine/indicators/state/supertrendState.d.ts.map +1 -1
  274. package/dist/engine/indicators/state/supertrendState.js.map +1 -1
  275. package/dist/engine/indicators/state/temaState.d.ts.map +1 -1
  276. package/dist/engine/indicators/state/temaState.js.map +1 -1
  277. package/dist/engine/indicators/state/trixState.d.ts.map +1 -1
  278. package/dist/engine/indicators/state/trixState.js.map +1 -1
  279. package/dist/engine/indicators/state/vmaState.d.ts.map +1 -1
  280. package/dist/engine/indicators/state/vmaState.js.map +1 -1
  281. package/dist/engine/indicators/state/volumeProfileState.d.ts.map +1 -1
  282. package/dist/engine/indicators/state/volumeProfileState.js.map +1 -1
  283. package/dist/engine/indicators/state/vwapState.d.ts.map +1 -1
  284. package/dist/engine/indicators/state/vwapState.js.map +1 -1
  285. package/dist/engine/indicators/state/wmaState.d.ts.map +1 -1
  286. package/dist/engine/indicators/state/wmaState.js.map +1 -1
  287. package/dist/engine/indicators/state/wmsrState.d.ts.map +1 -1
  288. package/dist/engine/indicators/state/wmsrState.js.map +1 -1
  289. package/dist/engine/indicators/state/zonesState.d.ts.map +1 -1
  290. package/dist/engine/indicators/state/zonesState.js.map +1 -1
  291. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  292. package/dist/engine/indicators/stateComposer.js +1 -1
  293. package/dist/engine/indicators/stateComposer.js.map +1 -1
  294. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  295. package/dist/engine/indicators/visibleStateComposers.js +9 -11
  296. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  297. package/dist/engine/indicators/workerProtocol.d.ts.map +1 -1
  298. package/dist/engine/indicators/workerProtocol.js.map +1 -1
  299. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  300. package/dist/engine/layout/chartPaneLayout.js +2 -5
  301. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  302. package/dist/engine/layout/pane.d.ts.map +1 -1
  303. package/dist/engine/layout/pane.js +3 -1
  304. package/dist/engine/layout/pane.js.map +1 -1
  305. package/dist/engine/marker/registry.d.ts.map +1 -1
  306. package/dist/engine/marker/registry.js +8 -6
  307. package/dist/engine/marker/registry.js.map +1 -1
  308. package/dist/engine/modes/kLineMode.d.ts.map +1 -1
  309. package/dist/engine/modes/kLineMode.js +2 -4
  310. package/dist/engine/modes/kLineMode.js.map +1 -1
  311. package/dist/engine/modes/timeShareMode.d.ts.map +1 -1
  312. package/dist/engine/modes/timeShareMode.js.map +1 -1
  313. package/dist/engine/modes/types.d.ts.map +1 -1
  314. package/dist/engine/paneRenderer.d.ts.map +1 -1
  315. package/dist/engine/paneRenderer.js.map +1 -1
  316. package/dist/engine/render/chartRenderer.d.ts +11 -2
  317. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  318. package/dist/engine/render/chartRenderer.js +204 -96
  319. package/dist/engine/render/chartRenderer.js.map +1 -1
  320. package/dist/engine/render/layers/candleLayer.d.ts +4 -0
  321. package/dist/engine/render/layers/candleLayer.d.ts.map +1 -0
  322. package/dist/engine/render/layers/candleLayer.js +7 -0
  323. package/dist/engine/render/layers/candleLayer.js.map +1 -0
  324. package/dist/engine/render/layers/comparisonLineLayer.d.ts +4 -0
  325. package/dist/engine/render/layers/comparisonLineLayer.d.ts.map +1 -0
  326. package/dist/engine/render/layers/comparisonLineLayer.js +7 -0
  327. package/dist/engine/render/layers/comparisonLineLayer.js.map +1 -0
  328. package/dist/engine/render/layers/crosshairLayer.d.ts +14 -0
  329. package/dist/engine/render/layers/crosshairLayer.d.ts.map +1 -0
  330. package/dist/engine/render/layers/crosshairLayer.js +6 -0
  331. package/dist/engine/render/layers/crosshairLayer.js.map +1 -0
  332. package/dist/engine/render/layers/customMarkersLayer.d.ts +4 -0
  333. package/dist/engine/render/layers/customMarkersLayer.d.ts.map +1 -0
  334. package/dist/engine/render/layers/customMarkersLayer.js +6 -0
  335. package/dist/engine/render/layers/customMarkersLayer.js.map +1 -0
  336. package/dist/engine/render/layers/extremaMarkersLayer.d.ts +4 -0
  337. package/dist/engine/render/layers/extremaMarkersLayer.d.ts.map +1 -0
  338. package/dist/engine/render/layers/extremaMarkersLayer.js +6 -0
  339. package/dist/engine/render/layers/extremaMarkersLayer.js.map +1 -0
  340. package/dist/engine/render/layers/gridLinesLayer.d.ts +4 -0
  341. package/dist/engine/render/layers/gridLinesLayer.d.ts.map +1 -0
  342. package/dist/engine/render/layers/gridLinesLayer.js +6 -0
  343. package/dist/engine/render/layers/gridLinesLayer.js.map +1 -0
  344. package/dist/engine/render/layers/lastPriceLabelLayer.d.ts +4 -0
  345. package/dist/engine/render/layers/lastPriceLabelLayer.d.ts.map +1 -0
  346. package/dist/engine/render/layers/lastPriceLabelLayer.js +6 -0
  347. package/dist/engine/render/layers/lastPriceLabelLayer.js.map +1 -0
  348. package/dist/engine/render/layers/lastPriceLineLayer.d.ts +4 -0
  349. package/dist/engine/render/layers/lastPriceLineLayer.d.ts.map +1 -0
  350. package/dist/engine/render/layers/lastPriceLineLayer.js +7 -0
  351. package/dist/engine/render/layers/lastPriceLineLayer.js.map +1 -0
  352. package/dist/engine/render/layers/leftYAxisLayer.d.ts +12 -0
  353. package/dist/engine/render/layers/leftYAxisLayer.d.ts.map +1 -0
  354. package/dist/engine/render/layers/leftYAxisLayer.js +6 -0
  355. package/dist/engine/render/layers/leftYAxisLayer.js.map +1 -0
  356. package/dist/engine/render/layers/mainIndicatorLegendLayer.d.ts +6 -0
  357. package/dist/engine/render/layers/mainIndicatorLegendLayer.d.ts.map +1 -0
  358. package/dist/engine/render/layers/mainIndicatorLegendLayer.js +13 -0
  359. package/dist/engine/render/layers/mainIndicatorLegendLayer.js.map +1 -0
  360. package/dist/engine/render/layers/yAxisLayer.d.ts +12 -0
  361. package/dist/engine/render/layers/yAxisLayer.d.ts.map +1 -0
  362. package/dist/engine/render/layers/yAxisLayer.js +6 -0
  363. package/dist/engine/render/layers/yAxisLayer.js.map +1 -0
  364. package/dist/engine/renderers/Indicator/atr.js +8 -3
  365. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  366. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  367. package/dist/engine/renderers/Indicator/boll.js +27 -6
  368. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  369. package/dist/engine/renderers/Indicator/cci.js +4 -4
  370. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  371. package/dist/engine/renderers/Indicator/chaikinVol.js +17 -5
  372. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  373. package/dist/engine/renderers/Indicator/cmf.js +13 -3
  374. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  375. package/dist/engine/renderers/Indicator/dema.js +16 -4
  376. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  377. package/dist/engine/renderers/Indicator/donchian.js +26 -7
  378. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  379. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  380. package/dist/engine/renderers/Indicator/ene.js +7 -3
  381. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  382. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  383. package/dist/engine/renderers/Indicator/expma.js +8 -5
  384. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  385. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  386. package/dist/engine/renderers/Indicator/fib.js +26 -7
  387. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  388. package/dist/engine/renderers/Indicator/hma.js +16 -4
  389. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  390. package/dist/engine/renderers/Indicator/hv.js +18 -4
  391. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  392. package/dist/engine/renderers/Indicator/ichimoku.js +52 -8
  393. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  394. package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
  395. package/dist/engine/renderers/Indicator/index.js.map +1 -1
  396. package/dist/engine/renderers/Indicator/indicatorCatalog.d.ts.map +1 -1
  397. package/dist/engine/renderers/Indicator/indicatorCatalog.js +661 -66
  398. package/dist/engine/renderers/Indicator/indicatorCatalog.js.map +1 -1
  399. package/dist/engine/renderers/Indicator/kama.js +16 -4
  400. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  401. package/dist/engine/renderers/Indicator/keltner.js +37 -7
  402. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  403. package/dist/engine/renderers/Indicator/kst.js +22 -5
  404. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  405. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  406. package/dist/engine/renderers/Indicator/ma.js +26 -10
  407. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  408. package/dist/engine/renderers/Indicator/macd.js +29 -10
  409. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  410. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  411. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +3 -2
  412. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  413. package/dist/engine/renderers/Indicator/mfi.js +13 -3
  414. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  415. package/dist/engine/renderers/Indicator/mom.js +1 -1
  416. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  417. package/dist/engine/renderers/Indicator/obv.js +12 -3
  418. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  419. package/dist/engine/renderers/Indicator/parkinson.js +21 -5
  420. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  421. package/dist/engine/renderers/Indicator/pivot.js +42 -6
  422. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  423. package/dist/engine/renderers/Indicator/pvt.js +12 -3
  424. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  425. package/dist/engine/renderers/Indicator/roc.js +13 -3
  426. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  427. package/dist/engine/renderers/Indicator/rsi.js +30 -16
  428. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  429. package/dist/engine/renderers/Indicator/sar.js +15 -8
  430. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  431. package/dist/engine/renderers/Indicator/scale/atr_scale.d.ts.map +1 -1
  432. package/dist/engine/renderers/Indicator/scale/atr_scale.js.map +1 -1
  433. package/dist/engine/renderers/Indicator/scale/cci_scale.d.ts.map +1 -1
  434. package/dist/engine/renderers/Indicator/scale/cci_scale.js.map +1 -1
  435. package/dist/engine/renderers/Indicator/scale/fastk_scale.d.ts.map +1 -1
  436. package/dist/engine/renderers/Indicator/scale/fastk_scale.js.map +1 -1
  437. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  438. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +1 -1
  439. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  440. package/dist/engine/renderers/Indicator/scale/kst_scale.d.ts.map +1 -1
  441. package/dist/engine/renderers/Indicator/scale/kst_scale.js.map +1 -1
  442. package/dist/engine/renderers/Indicator/scale/macd_scale.d.ts.map +1 -1
  443. package/dist/engine/renderers/Indicator/scale/macd_scale.js.map +1 -1
  444. package/dist/engine/renderers/Indicator/scale/mom_scale.d.ts.map +1 -1
  445. package/dist/engine/renderers/Indicator/scale/mom_scale.js.map +1 -1
  446. package/dist/engine/renderers/Indicator/scale/rsi_scale.d.ts.map +1 -1
  447. package/dist/engine/renderers/Indicator/scale/rsi_scale.js.map +1 -1
  448. package/dist/engine/renderers/Indicator/scale/stoch_scale.d.ts.map +1 -1
  449. package/dist/engine/renderers/Indicator/scale/stoch_scale.js.map +1 -1
  450. package/dist/engine/renderers/Indicator/scale/volume_scale.d.ts.map +1 -1
  451. package/dist/engine/renderers/Indicator/scale/volume_scale.js.map +1 -1
  452. package/dist/engine/renderers/Indicator/scale/wmsr_scale.d.ts.map +1 -1
  453. package/dist/engine/renderers/Indicator/scale/wmsr_scale.js.map +1 -1
  454. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -1
  455. package/dist/engine/renderers/Indicator/shared/dashedLines.js +2 -2
  456. package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -1
  457. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -1
  458. package/dist/engine/renderers/Indicator/shared/titleInfo.js +3 -1
  459. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -1
  460. package/dist/engine/renderers/Indicator/stoch.js +11 -2
  461. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  462. package/dist/engine/renderers/Indicator/structure.js +46 -8
  463. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  464. package/dist/engine/renderers/Indicator/supertrend.js +26 -8
  465. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  466. package/dist/engine/renderers/Indicator/tema.js +16 -4
  467. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  468. package/dist/engine/renderers/Indicator/trix.js +12 -3
  469. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  470. package/dist/engine/renderers/Indicator/vma.js +13 -3
  471. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  472. package/dist/engine/renderers/Indicator/volumeProfile.js +24 -7
  473. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  474. package/dist/engine/renderers/Indicator/vwap.js +12 -3
  475. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  476. package/dist/engine/renderers/Indicator/wma.js +16 -4
  477. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  478. package/dist/engine/renderers/Indicator/wmsr.js +3 -3
  479. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  480. package/dist/engine/renderers/Indicator/zones.js +31 -11
  481. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  482. package/dist/engine/renderers/candle.d.ts.map +1 -1
  483. package/dist/engine/renderers/candle.js +27 -21
  484. package/dist/engine/renderers/candle.js.map +1 -1
  485. package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
  486. package/dist/engine/renderers/comparisonLine.js +3 -1
  487. package/dist/engine/renderers/comparisonLine.js.map +1 -1
  488. package/dist/engine/renderers/crosshair.d.ts.map +1 -1
  489. package/dist/engine/renderers/crosshair.js.map +1 -1
  490. package/dist/engine/renderers/customMarkers.d.ts.map +1 -1
  491. package/dist/engine/renderers/customMarkers.js +2 -2
  492. package/dist/engine/renderers/customMarkers.js.map +1 -1
  493. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  494. package/dist/engine/renderers/extremaMarkers.js +6 -2
  495. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  496. package/dist/engine/renderers/gridLines.d.ts.map +1 -1
  497. package/dist/engine/renderers/gridLines.js.map +1 -1
  498. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  499. package/dist/engine/renderers/lastPrice.js +6 -2
  500. package/dist/engine/renderers/lastPrice.js.map +1 -1
  501. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
  502. package/dist/engine/renderers/leftYAxis.js +7 -3
  503. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  504. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  505. package/dist/engine/renderers/paneTitle.js.map +1 -1
  506. package/dist/engine/renderers/subVolume.js +8 -5
  507. package/dist/engine/renderers/subVolume.js.map +1 -1
  508. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  509. package/dist/engine/renderers/timeAxis.js.map +1 -1
  510. package/dist/engine/renderers/timeShare.d.ts.map +1 -1
  511. package/dist/engine/renderers/timeShare.js +2 -5
  512. package/dist/engine/renderers/timeShare.js.map +1 -1
  513. package/dist/engine/renderers/webgl/candleSurface.d.ts.map +1 -1
  514. package/dist/engine/renderers/webgl/candleSurface.js +13 -14
  515. package/dist/engine/renderers/webgl/candleSurface.js.map +1 -1
  516. package/dist/engine/renderers/webgl/sharedWebGLSurface.d.ts +20 -0
  517. package/dist/engine/renderers/webgl/sharedWebGLSurface.d.ts.map +1 -1
  518. package/dist/engine/renderers/webgl/sharedWebGLSurface.js.map +1 -1
  519. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  520. package/dist/engine/renderers/yAxis.js +1 -1
  521. package/dist/engine/renderers/yAxis.js.map +1 -1
  522. package/dist/engine/scale/logFormula.d.ts.map +1 -1
  523. package/dist/engine/scale/logFormula.js.map +1 -1
  524. package/dist/engine/scale/price.js.map +1 -1
  525. package/dist/engine/scale/priceScale.d.ts.map +1 -1
  526. package/dist/engine/scale/priceScale.js +1 -1
  527. package/dist/engine/scale/priceScale.js.map +1 -1
  528. package/dist/engine/subPaneManager.d.ts +11 -1
  529. package/dist/engine/subPaneManager.d.ts.map +1 -1
  530. package/dist/engine/subPaneManager.js +59 -6
  531. package/dist/engine/subPaneManager.js.map +1 -1
  532. package/dist/engine/theme/fonts.js.map +1 -1
  533. package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
  534. package/dist/engine/utils/chartZoomController.js.map +1 -1
  535. package/dist/engine/utils/klineConfig.js.map +1 -1
  536. package/dist/engine/utils/tickCount.js.map +1 -1
  537. package/dist/engine/utils/tickPosition.d.ts.map +1 -1
  538. package/dist/engine/utils/tickPosition.js.map +1 -1
  539. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  540. package/dist/engine/viewport/chartViewportManager.js +16 -13
  541. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  542. package/dist/engine/viewport/viewport.d.ts.map +1 -1
  543. package/dist/engine/viewport/viewport.js.map +1 -1
  544. package/dist/errors-help.d.ts.map +1 -1
  545. package/dist/errors-help.js +1 -0
  546. package/dist/errors-help.js.map +1 -1
  547. package/dist/errors.d.ts +1 -1
  548. package/dist/errors.d.ts.map +1 -1
  549. package/dist/errors.js.map +1 -1
  550. package/dist/index.d.ts +1 -1
  551. package/dist/index.d.ts.map +1 -1
  552. package/dist/index.js +1 -1
  553. package/dist/index.js.map +1 -1
  554. package/dist/indicators/alma.d.ts.map +1 -1
  555. package/dist/indicators/alma.js.map +1 -1
  556. package/dist/indicators/awesomeOscillator.d.ts.map +1 -1
  557. package/dist/indicators/awesomeOscillator.js.map +1 -1
  558. package/dist/indicators/dpo.d.ts.map +1 -1
  559. package/dist/indicators/dpo.js.map +1 -1
  560. package/dist/indicators/fisherTransform.d.ts.map +1 -1
  561. package/dist/indicators/fisherTransform.js.map +1 -1
  562. package/dist/indicators/frama.d.ts.map +1 -1
  563. package/dist/indicators/frama.js.map +1 -1
  564. package/dist/indicators/index.d.ts +4 -4
  565. package/dist/indicators/index.d.ts.map +1 -1
  566. package/dist/indicators/index.js +4 -4
  567. package/dist/indicators/index.js.map +1 -1
  568. package/dist/indicators/lsma.d.ts.map +1 -1
  569. package/dist/indicators/lsma.js.map +1 -1
  570. package/dist/indicators/schaffTrendCycle.d.ts.map +1 -1
  571. package/dist/indicators/schaffTrendCycle.js.map +1 -1
  572. package/dist/indicators/stochRSI.d.ts.map +1 -1
  573. package/dist/indicators/stochRSI.js.map +1 -1
  574. package/dist/indicators/t3.d.ts.map +1 -1
  575. package/dist/indicators/t3.js +1 -4
  576. package/dist/indicators/t3.js.map +1 -1
  577. package/dist/indicators/ultimateOscillator.d.ts.map +1 -1
  578. package/dist/indicators/ultimateOscillator.js.map +1 -1
  579. package/dist/indicators/vidya.d.ts.map +1 -1
  580. package/dist/indicators/vidya.js.map +1 -1
  581. package/dist/indicators/zlema.d.ts.map +1 -1
  582. package/dist/indicators/zlema.js.map +1 -1
  583. package/dist/input/gesture.d.ts.map +1 -1
  584. package/dist/input/gesture.js +2 -6
  585. package/dist/input/gesture.js.map +1 -1
  586. package/dist/input/index.d.ts.map +1 -1
  587. package/dist/input/index.js.map +1 -1
  588. package/dist/input/keyboard.d.ts.map +1 -1
  589. package/dist/input/keyboard.js.map +1 -1
  590. package/dist/mcp/chartBridge.d.ts.map +1 -1
  591. package/dist/mcp/chartBridge.js.map +1 -1
  592. package/dist/plugin/HookSystem.d.ts.map +1 -1
  593. package/dist/plugin/HookSystem.js.map +1 -1
  594. package/dist/plugin/PluginHost.d.ts.map +1 -1
  595. package/dist/plugin/PluginHost.js.map +1 -1
  596. package/dist/plugin/StateStore.js +1 -1
  597. package/dist/plugin/StateStore.js.map +1 -1
  598. package/dist/plugin/rendererPluginManager.d.ts.map +1 -1
  599. package/dist/plugin/rendererPluginManager.js.map +1 -1
  600. package/dist/plugin/types.d.ts.map +1 -1
  601. package/dist/plugin/types.js.map +1 -1
  602. package/dist/reactivity/signal.d.ts.map +1 -1
  603. package/dist/reactivity/signal.js.map +1 -1
  604. package/dist/render/Renderer.d.ts.map +1 -1
  605. package/dist/render/SurfaceBackend.d.ts.map +1 -1
  606. package/dist/render/createWebGLRenderer.d.ts +5 -0
  607. package/dist/render/createWebGLRenderer.d.ts.map +1 -0
  608. package/dist/render/createWebGLRenderer.js +233 -0
  609. package/dist/render/createWebGLRenderer.js.map +1 -0
  610. package/dist/render/createWebGLSurfaceBackend.d.ts +4 -0
  611. package/dist/render/createWebGLSurfaceBackend.d.ts.map +1 -0
  612. package/dist/render/createWebGLSurfaceBackend.js +37 -0
  613. package/dist/render/createWebGLSurfaceBackend.js.map +1 -0
  614. package/dist/render/index.d.ts +5 -6
  615. package/dist/render/index.d.ts.map +1 -1
  616. package/dist/render/index.js +4 -6
  617. package/dist/render/index.js.map +1 -1
  618. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -1
  619. package/dist/renderer-tier/detectRendererTier.js.map +1 -1
  620. package/dist/renderer-tier/index.d.ts.map +1 -1
  621. package/dist/renderer-tier/index.js.map +1 -1
  622. package/dist/renderer-tier/selectBackend.d.ts.map +1 -1
  623. package/dist/renderer-tier/selectBackend.js +1 -5
  624. package/dist/renderer-tier/selectBackend.js.map +1 -1
  625. package/dist/renderer-tier/types.d.ts.map +1 -1
  626. package/dist/renderer-tier/types.js.map +1 -1
  627. package/dist/replay/createReplayController.d.ts.map +1 -1
  628. package/dist/replay/createReplayController.js +3 -5
  629. package/dist/replay/createReplayController.js.map +1 -1
  630. package/dist/replay/index.d.ts +1 -1
  631. package/dist/replay/index.d.ts.map +1 -1
  632. package/dist/replay/index.js +1 -1
  633. package/dist/replay/index.js.map +1 -1
  634. package/dist/replay/timeline.d.ts.map +1 -1
  635. package/dist/replay/timeline.js.map +1 -1
  636. package/dist/replay/types.d.ts.map +1 -1
  637. package/dist/scale/anchoredZoom.d.ts.map +1 -1
  638. package/dist/scale/anchoredZoom.js.map +1 -1
  639. package/dist/scale/createPriceScale.d.ts.map +1 -1
  640. package/dist/scale/createPriceScale.js.map +1 -1
  641. package/dist/scale/createTimeScale.d.ts.map +1 -1
  642. package/dist/scale/createTimeScale.js.map +1 -1
  643. package/dist/scale/index.d.ts.map +1 -1
  644. package/dist/scale/index.js.map +1 -1
  645. package/dist/scale/originShift.d.ts.map +1 -1
  646. package/dist/scale/originShift.js.map +1 -1
  647. package/dist/scale/types.d.ts.map +1 -1
  648. package/dist/scene/createLayerFromPlugin.d.ts +4 -0
  649. package/dist/scene/createLayerFromPlugin.d.ts.map +1 -0
  650. package/dist/scene/createLayerFromPlugin.js +45 -0
  651. package/dist/scene/createLayerFromPlugin.js.map +1 -0
  652. package/dist/scene/createScene.d.ts.map +1 -1
  653. package/dist/scene/createScene.js +6 -3
  654. package/dist/scene/createScene.js.map +1 -1
  655. package/dist/scene/index.d.ts +4 -3
  656. package/dist/scene/index.d.ts.map +1 -1
  657. package/dist/scene/index.js +2 -1
  658. package/dist/scene/index.js.map +1 -1
  659. package/dist/scene/layerRegistry.d.ts.map +1 -1
  660. package/dist/scene/layerRegistry.js.map +1 -1
  661. package/dist/scene/types.d.ts +8 -3
  662. package/dist/scene/types.d.ts.map +1 -1
  663. package/dist/scheduler/createFrameBudget.d.ts.map +1 -1
  664. package/dist/scheduler/createFrameBudget.js.map +1 -1
  665. package/dist/scheduler/index.d.ts.map +1 -1
  666. package/dist/scheduler/index.js.map +1 -1
  667. package/dist/semantic/controller.d.ts.map +1 -1
  668. package/dist/semantic/controller.js +8 -3
  669. package/dist/semantic/controller.js.map +1 -1
  670. package/dist/semantic/index.d.ts +1 -1
  671. package/dist/semantic/index.d.ts.map +1 -1
  672. package/dist/semantic/index.js +1 -1
  673. package/dist/semantic/index.js.map +1 -1
  674. package/dist/semantic/schema.json +16 -4
  675. package/dist/semantic/validator.d.ts.map +1 -1
  676. package/dist/semantic/validator.js +4 -4
  677. package/dist/semantic/validator.js.map +1 -1
  678. package/dist/tokens/colorPresetSettings.d.ts.map +1 -1
  679. package/dist/tokens/colorPresetSettings.js +3 -1
  680. package/dist/tokens/colorPresetSettings.js.map +1 -1
  681. package/dist/tokens/index.d.ts.map +1 -1
  682. package/dist/tokens/index.js.map +1 -1
  683. package/dist/tokens/mergeTheme.js.map +1 -1
  684. package/dist/tokens/theme-base.d.ts.map +1 -1
  685. package/dist/tokens/theme-base.js.map +1 -1
  686. package/dist/tokens/theme-china.d.ts.map +1 -1
  687. package/dist/tokens/theme-china.js.map +1 -1
  688. package/dist/tokens/theme-dark.js.map +1 -1
  689. package/dist/tokens/theme-light.js.map +1 -1
  690. package/dist/tokens/themeToCssVars.d.ts.map +1 -1
  691. package/dist/tokens/themeToCssVars.js.map +1 -1
  692. package/dist/tokens/types.d.ts.map +1 -1
  693. package/dist/types/price.d.ts.map +1 -1
  694. package/dist/types/price.js +5 -1
  695. package/dist/types/price.js.map +1 -1
  696. package/dist/utils/dateFormat.d.ts.map +1 -1
  697. package/dist/utils/dateFormat.js.map +1 -1
  698. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  699. package/dist/utils/kLineDraw/axis.js +3 -3
  700. package/dist/utils/kLineDraw/axis.js.map +1 -1
  701. package/dist/utils/priceToY.d.ts.map +1 -1
  702. package/dist/utils/priceToY.js.map +1 -1
  703. package/dist/utils/volumePrice.d.ts.map +1 -1
  704. package/dist/utils/volumePrice.js +1 -1
  705. package/dist/utils/volumePrice.js.map +1 -1
  706. package/dist/version.d.ts +1 -1
  707. package/dist/version.d.ts.map +1 -1
  708. package/dist/version.js +1 -1
  709. package/dist/version.js.map +1 -1
  710. package/package.json +1 -1
  711. package/src/__bench__/indicators.bench.ts +129 -129
  712. package/src/__bench__/orderBookHeatmap.bench.ts +32 -32
  713. package/src/__bench__/scale.bench.ts +56 -56
  714. package/src/__bench__/signal.bench.ts +23 -23
  715. package/src/__bench__/volumeProfile.bench.ts +35 -35
  716. package/src/__tests__/depthPipeline.test.ts +315 -0
  717. package/src/__tests__/errors-help.test.ts +132 -135
  718. package/src/__tests__/errors.test.ts +140 -144
  719. package/src/__tests__/signal.test.ts +100 -100
  720. package/src/alerts/__tests__/controller.test.ts +173 -173
  721. package/src/alerts/__tests__/predicates.test.ts +287 -287
  722. package/src/alerts/__tests__/ruleSchema.test.ts +145 -148
  723. package/src/alerts/createAlertController.ts +236 -255
  724. package/src/alerts/index.ts +10 -14
  725. package/src/alerts/predicates.ts +152 -158
  726. package/src/alerts/ruleSchema.ts +181 -186
  727. package/src/alerts/types.ts +103 -103
  728. package/src/chartTypes/__tests__/heikinAshi.test.ts +105 -105
  729. package/src/chartTypes/__tests__/pointAndFigure.test.ts +147 -147
  730. package/src/chartTypes/__tests__/rangeBars.test.ts +127 -127
  731. package/src/chartTypes/__tests__/renko.test.ts +144 -138
  732. package/src/chartTypes/heikinAshi.ts +59 -55
  733. package/src/chartTypes/pointAndFigure.ts +171 -165
  734. package/src/chartTypes/rangeBars.ts +213 -213
  735. package/src/chartTypes/renko.ts +199 -193
  736. package/src/chartTypes/types.ts +29 -29
  737. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +261 -268
  738. package/src/components/anchoredVwap/__tests__/controller.test.ts +324 -343
  739. package/src/components/anchoredVwap/computeAnchoredVwap.ts +81 -81
  740. package/src/components/anchoredVwap/createAnchoredVwapController.ts +246 -279
  741. package/src/components/anchoredVwap/index.ts +5 -5
  742. package/src/components/anchoredVwap/types.ts +88 -91
  743. package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +174 -174
  744. package/src/components/crosshairSync/createCrosshairSync.ts +113 -113
  745. package/src/components/crosshairSync/index.ts +3 -3
  746. package/src/components/footprint/__tests__/aggressor.test.ts +110 -106
  747. package/src/components/footprint/__tests__/controller.test.ts +97 -97
  748. package/src/components/footprint/__tests__/perBarStats.test.ts +92 -92
  749. package/src/components/footprint/aggressor.ts +55 -60
  750. package/src/components/footprint/createFootprintController.ts +262 -269
  751. package/src/components/footprint/index.ts +8 -16
  752. package/src/components/footprint/perBarStats.ts +50 -52
  753. package/src/components/footprint/types.ts +92 -92
  754. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +70 -70
  755. package/src/components/mtfOverlay/__tests__/controller.test.ts +134 -134
  756. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +80 -80
  757. package/src/components/mtfOverlay/alignToBaseIndex.ts +55 -55
  758. package/src/components/mtfOverlay/createMtfController.ts +149 -148
  759. package/src/components/mtfOverlay/index.ts +5 -5
  760. package/src/components/mtfOverlay/resampleBars.ts +88 -82
  761. package/src/components/mtfOverlay/types.ts +70 -73
  762. package/src/components/orderBookHeatmap/__tests__/controller.test.ts +337 -204
  763. package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +71 -71
  764. package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +56 -56
  765. package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +97 -97
  766. package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +39 -39
  767. package/src/components/orderBookHeatmap/computeShader.wgsl.md +3 -3
  768. package/src/components/orderBookHeatmap/createHeatmapController.ts +239 -213
  769. package/src/components/orderBookHeatmap/createOrderBookState.ts +77 -83
  770. package/src/components/orderBookHeatmap/deltaArchive.ts +70 -73
  771. package/src/components/orderBookHeatmap/index.ts +11 -11
  772. package/src/components/orderBookHeatmap/logColorScale.ts +52 -46
  773. package/src/components/orderBookHeatmap/snapshotRing.ts +43 -40
  774. package/src/components/orderBookHeatmap/types.ts +86 -76
  775. package/src/components/volumeProfile/__tests__/binning.test.ts +98 -98
  776. package/src/components/volumeProfile/__tests__/poc.test.ts +21 -21
  777. package/src/components/volumeProfile/__tests__/valueArea.test.ts +140 -140
  778. package/src/components/volumeProfile/binning.ts +67 -67
  779. package/src/components/volumeProfile/createVolumeProfileController.ts +143 -156
  780. package/src/components/volumeProfile/index.ts +6 -6
  781. package/src/components/volumeProfile/poc.ts +13 -13
  782. package/src/components/volumeProfile/types.ts +67 -67
  783. package/src/components/volumeProfile/valueArea.ts +119 -119
  784. package/src/config/chartSettings.ts +60 -14
  785. package/src/controllers/__tests__/drawing.test.ts +164 -170
  786. package/src/controllers/__tests__/indicatorSelector.test.ts +418 -405
  787. package/src/controllers/__tests__/toolbar.test.ts +174 -174
  788. package/src/controllers/createChartController.ts +911 -885
  789. package/src/controllers/createDrawingController.ts +54 -60
  790. package/src/controllers/createIndicatorSelectorController.ts +212 -228
  791. package/src/controllers/createToolbarController.ts +99 -103
  792. package/src/controllers/index.ts +65 -39
  793. package/src/controllers/types.ts +318 -285
  794. package/src/data-fetchers/__tests__/binance.test.ts +297 -0
  795. package/src/data-fetchers/__tests__/dataBuffer.test.ts +409 -412
  796. package/src/data-fetchers/__tests__/depthConnector.test.ts +259 -0
  797. package/src/data-fetchers/__tests__/fetcherRegistry.test.ts +64 -29
  798. package/src/data-fetchers/baostock.ts +4 -1
  799. package/src/data-fetchers/binance.ts +130 -0
  800. package/src/data-fetchers/dataBuffer.effects.ts +8 -11
  801. package/src/data-fetchers/dataBuffer.ts +248 -231
  802. package/src/data-fetchers/dataBufferTypes.ts +1 -1
  803. package/src/data-fetchers/depthConnector.ts +103 -0
  804. package/src/data-fetchers/depthTypes.ts +69 -0
  805. package/src/data-fetchers/fetcherDefinitionRegistry.ts +11 -7
  806. package/src/data-fetchers/gotdx.ts +35 -13
  807. package/src/data-fetchers/index.ts +9 -2
  808. package/src/data-fetchers/router.ts +10 -5
  809. package/src/data-fetchers/timeShareBuffer.ts +5 -2
  810. package/src/data-fetchers/tradingview.ts +4 -1
  811. package/src/data-fetchers/types.ts +1 -1
  812. package/src/engine/__tests__/chart.dpr.test.ts +6 -2
  813. package/src/engine/__tests__/subPaneManager.test.ts +23 -10
  814. package/src/engine/chart.ts +1290 -1213
  815. package/src/engine/controller/interaction.ts +921 -896
  816. package/src/engine/controller/markerInteraction.ts +4 -1
  817. package/src/engine/data/chartDataManager.ts +109 -45
  818. package/src/engine/draw/__tests__/pixelAlign.spec.ts +1 -1
  819. package/src/engine/draw/pixelAlign.ts +170 -166
  820. package/src/engine/drawing/AnchorCollector.ts +1 -1
  821. package/src/engine/drawing/DragHandler.ts +1 -1
  822. package/src/engine/drawing/DrawingState.ts +2 -2
  823. package/src/engine/drawing/HitTester.ts +34 -17
  824. package/src/engine/drawing/PreviewRenderer.ts +46 -19
  825. package/src/engine/drawing/coordinateUtils.ts +5 -5
  826. package/src/engine/drawing/index.ts +107 -28
  827. package/src/engine/drawing/interaction.ts +9 -7
  828. package/src/engine/drawing/linearRegression.ts +3 -1
  829. package/src/engine/drawing/plugin.ts +100 -30
  830. package/src/engine/drawing/toolConfig.ts +1 -1
  831. package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +104 -36
  832. package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +11 -12
  833. package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +39 -12
  834. package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +28 -28
  835. package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +39 -12
  836. package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +11 -12
  837. package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +73 -38
  838. package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +36 -29
  839. package/src/engine/indicators/__tests__/_propertyAssertions.ts +55 -54
  840. package/src/engine/indicators/__tests__/atr.test.ts +141 -144
  841. package/src/engine/indicators/__tests__/calculators.test.ts +4 -17
  842. package/src/engine/indicators/__tests__/chartIndicatorManager.test.ts +12 -1
  843. package/src/engine/indicators/__tests__/cmf-mfi.test.ts +77 -77
  844. package/src/engine/indicators/__tests__/dema.test.ts +54 -56
  845. package/src/engine/indicators/__tests__/donchian.test.ts +52 -58
  846. package/src/engine/indicators/__tests__/hma.test.ts +53 -55
  847. package/src/engine/indicators/__tests__/ichimoku.test.ts +91 -91
  848. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +6 -2
  849. package/src/engine/indicators/__tests__/kama.test.ts +60 -62
  850. package/src/engine/indicators/__tests__/keltner.test.ts +49 -55
  851. package/src/engine/indicators/__tests__/pivot-fib.test.ts +89 -89
  852. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +199 -51
  853. package/src/engine/indicators/__tests__/roc.test.ts +56 -53
  854. package/src/engine/indicators/__tests__/sar.test.ts +70 -70
  855. package/src/engine/indicators/__tests__/scheduler.test.ts +58 -15
  856. package/src/engine/indicators/__tests__/soa.test.ts +27 -7
  857. package/src/engine/indicators/__tests__/stateComposer.test.ts +227 -45
  858. package/src/engine/indicators/__tests__/structure.test.ts +109 -93
  859. package/src/engine/indicators/__tests__/supertrend.test.ts +47 -53
  860. package/src/engine/indicators/__tests__/tema.test.ts +49 -51
  861. package/src/engine/indicators/__tests__/trix.test.ts +56 -56
  862. package/src/engine/indicators/__tests__/volatility.test.ts +88 -94
  863. package/src/engine/indicators/__tests__/volume.test.ts +102 -102
  864. package/src/engine/indicators/__tests__/volumeProfile.test.ts +55 -61
  865. package/src/engine/indicators/__tests__/vwap.test.ts +56 -56
  866. package/src/engine/indicators/__tests__/wma.test.ts +86 -89
  867. package/src/engine/indicators/__tests__/zones.test.ts +88 -79
  868. package/src/engine/indicators/calculators/_shared.ts +41 -35
  869. package/src/engine/indicators/calculators/bands.ts +271 -282
  870. package/src/engine/indicators/calculators/index.ts +26 -3
  871. package/src/engine/indicators/calculators/movingAverages.ts +134 -134
  872. package/src/engine/indicators/calculators/oscillators.ts +302 -306
  873. package/src/engine/indicators/calculators/patterns.ts +233 -225
  874. package/src/engine/indicators/calculators/volatility.ts +119 -119
  875. package/src/engine/indicators/calculators/volume.ts +217 -220
  876. package/src/engine/indicators/calculators.ts +0 -2
  877. package/src/engine/indicators/chartIndicatorManager.ts +576 -484
  878. package/src/engine/indicators/indicator.worker.ts +134 -132
  879. package/src/engine/indicators/indicatorDefinitionRegistry.ts +111 -96
  880. package/src/engine/indicators/indicatorMetadata.ts +183 -175
  881. package/src/engine/indicators/indicatorRegistry.ts +146 -137
  882. package/src/engine/indicators/indicatorRuntime.ts +206 -196
  883. package/src/engine/indicators/registerBuiltins.ts +2 -1
  884. package/src/engine/indicators/scheduler.ts +725 -674
  885. package/src/engine/indicators/soa.ts +29 -19
  886. package/src/engine/indicators/state/atrState.ts +15 -16
  887. package/src/engine/indicators/state/bollState.ts +28 -28
  888. package/src/engine/indicators/state/cciState.ts +15 -16
  889. package/src/engine/indicators/state/chaikinVolState.ts +19 -19
  890. package/src/engine/indicators/state/cmfState.ts +15 -16
  891. package/src/engine/indicators/state/demaState.ts +15 -16
  892. package/src/engine/indicators/state/donchianState.ts +28 -28
  893. package/src/engine/indicators/state/eneState.ts +20 -20
  894. package/src/engine/indicators/state/expmaState.ts +20 -20
  895. package/src/engine/indicators/state/fastkState.ts +15 -16
  896. package/src/engine/indicators/state/fibState.ts +26 -27
  897. package/src/engine/indicators/state/hmaState.ts +15 -16
  898. package/src/engine/indicators/state/hvState.ts +19 -16
  899. package/src/engine/indicators/state/ichimokuState.ts +42 -42
  900. package/src/engine/indicators/state/kamaState.ts +20 -21
  901. package/src/engine/indicators/state/keltnerState.ts +32 -33
  902. package/src/engine/indicators/state/kstState.ts +31 -32
  903. package/src/engine/indicators/state/maState.ts +14 -14
  904. package/src/engine/indicators/state/mfiState.ts +15 -16
  905. package/src/engine/indicators/state/momState.ts +15 -16
  906. package/src/engine/indicators/state/obvState.ts +15 -16
  907. package/src/engine/indicators/state/parkinsonState.ts +19 -15
  908. package/src/engine/indicators/state/pivotState.ts +38 -39
  909. package/src/engine/indicators/state/pvtState.ts +15 -16
  910. package/src/engine/indicators/state/rocState.ts +15 -16
  911. package/src/engine/indicators/state/rsiState.ts +38 -39
  912. package/src/engine/indicators/state/sarState.ts +21 -22
  913. package/src/engine/indicators/state/stochState.ts +15 -16
  914. package/src/engine/indicators/state/structureState.ts +45 -45
  915. package/src/engine/indicators/state/supertrendState.ts +21 -21
  916. package/src/engine/indicators/state/temaState.ts +15 -16
  917. package/src/engine/indicators/state/trixState.ts +22 -23
  918. package/src/engine/indicators/state/vmaState.ts +15 -16
  919. package/src/engine/indicators/state/volumeProfileState.ts +41 -41
  920. package/src/engine/indicators/state/vwapState.ts +15 -16
  921. package/src/engine/indicators/state/wmaState.ts +15 -16
  922. package/src/engine/indicators/state/wmsrState.ts +15 -16
  923. package/src/engine/indicators/state/zonesState.ts +30 -31
  924. package/src/engine/indicators/stateComposer.ts +185 -190
  925. package/src/engine/indicators/visibleStateComposers.ts +785 -748
  926. package/src/engine/indicators/workerProtocol.ts +394 -397
  927. package/src/engine/layout/chartPaneLayout.ts +25 -16
  928. package/src/engine/layout/pane.ts +11 -3
  929. package/src/engine/marker/registry.ts +208 -190
  930. package/src/engine/modes/kLineMode.ts +26 -16
  931. package/src/engine/modes/timeShareMode.ts +26 -14
  932. package/src/engine/modes/types.ts +26 -14
  933. package/src/engine/paneRenderer.ts +130 -125
  934. package/src/engine/render/chartRenderer.ts +291 -118
  935. package/src/engine/render/layers/candleLayer.ts +9 -0
  936. package/src/engine/render/layers/comparisonLineLayer.ts +9 -0
  937. package/src/engine/render/layers/crosshairLayer.ts +18 -0
  938. package/src/engine/render/layers/customMarkersLayer.ts +8 -0
  939. package/src/engine/render/layers/extremaMarkersLayer.ts +8 -0
  940. package/src/engine/render/layers/gridLinesLayer.ts +8 -0
  941. package/src/engine/render/layers/lastPriceLabelLayer.ts +8 -0
  942. package/src/engine/render/layers/lastPriceLineLayer.ts +9 -0
  943. package/src/engine/render/layers/leftYAxisLayer.ts +15 -0
  944. package/src/engine/render/layers/mainIndicatorLegendLayer.ts +18 -0
  945. package/src/engine/render/layers/yAxisLayer.ts +15 -0
  946. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +4 -1
  947. package/src/engine/renderers/Indicator/atr.ts +197 -188
  948. package/src/engine/renderers/Indicator/boll.ts +364 -309
  949. package/src/engine/renderers/Indicator/cci.ts +223 -219
  950. package/src/engine/renderers/Indicator/chaikinVol.ts +129 -112
  951. package/src/engine/renderers/Indicator/cmf.ts +121 -111
  952. package/src/engine/renderers/Indicator/dema.ts +124 -112
  953. package/src/engine/renderers/Indicator/donchian.ts +162 -132
  954. package/src/engine/renderers/Indicator/ene.ts +286 -264
  955. package/src/engine/renderers/Indicator/expma.ts +237 -220
  956. package/src/engine/renderers/Indicator/fastk.ts +201 -197
  957. package/src/engine/renderers/Indicator/fib.ts +162 -138
  958. package/src/engine/renderers/Indicator/hma.ts +124 -112
  959. package/src/engine/renderers/Indicator/hv.ts +108 -94
  960. package/src/engine/renderers/Indicator/ichimoku.ts +183 -112
  961. package/src/engine/renderers/Indicator/index.ts +10 -10
  962. package/src/engine/renderers/Indicator/indicatorCatalog.ts +685 -78
  963. package/src/engine/renderers/Indicator/kama.ts +124 -112
  964. package/src/engine/renderers/Indicator/keltner.ts +170 -131
  965. package/src/engine/renderers/Indicator/kst.ts +290 -255
  966. package/src/engine/renderers/Indicator/ma.ts +292 -254
  967. package/src/engine/renderers/Indicator/macd.ts +174 -38
  968. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +30 -8
  969. package/src/engine/renderers/Indicator/mfi.ts +126 -116
  970. package/src/engine/renderers/Indicator/mom.ts +268 -250
  971. package/src/engine/renderers/Indicator/obv.ts +107 -98
  972. package/src/engine/renderers/Indicator/parkinson.ts +110 -94
  973. package/src/engine/renderers/Indicator/pivot.ts +187 -145
  974. package/src/engine/renderers/Indicator/pvt.ts +107 -98
  975. package/src/engine/renderers/Indicator/roc.ts +136 -124
  976. package/src/engine/renderers/Indicator/rsi.ts +395 -346
  977. package/src/engine/renderers/Indicator/sar.ts +121 -106
  978. package/src/engine/renderers/Indicator/scale/atr_scale.ts +13 -13
  979. package/src/engine/renderers/Indicator/scale/cci_scale.ts +13 -13
  980. package/src/engine/renderers/Indicator/scale/fastk_scale.ts +13 -13
  981. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +193 -174
  982. package/src/engine/renderers/Indicator/scale/kst_scale.ts +13 -13
  983. package/src/engine/renderers/Indicator/scale/macd_scale.ts +13 -13
  984. package/src/engine/renderers/Indicator/scale/mom_scale.ts +13 -13
  985. package/src/engine/renderers/Indicator/scale/rsi_scale.ts +13 -13
  986. package/src/engine/renderers/Indicator/scale/stoch_scale.ts +13 -13
  987. package/src/engine/renderers/Indicator/scale/volume_scale.ts +15 -15
  988. package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +13 -13
  989. package/src/engine/renderers/Indicator/shared/dashedLines.ts +16 -7
  990. package/src/engine/renderers/Indicator/shared/titleInfo.ts +3 -1
  991. package/src/engine/renderers/Indicator/shared/webglBand.ts +1 -1
  992. package/src/engine/renderers/Indicator/stoch.ts +263 -246
  993. package/src/engine/renderers/Indicator/structure.ts +165 -120
  994. package/src/engine/renderers/Indicator/supertrend.ts +145 -112
  995. package/src/engine/renderers/Indicator/tema.ts +124 -112
  996. package/src/engine/renderers/Indicator/trix.ts +170 -159
  997. package/src/engine/renderers/Indicator/vma.ts +108 -98
  998. package/src/engine/renderers/Indicator/volumeProfile.ts +150 -126
  999. package/src/engine/renderers/Indicator/vwap.ts +107 -98
  1000. package/src/engine/renderers/Indicator/wma.ts +124 -112
  1001. package/src/engine/renderers/Indicator/wmsr.ts +289 -265
  1002. package/src/engine/renderers/Indicator/zones.ts +139 -109
  1003. package/src/engine/renderers/__tests__/boll.renderer.test.ts +20 -9
  1004. package/src/engine/renderers/__tests__/ene.renderer.test.ts +3 -5
  1005. package/src/engine/renderers/__tests__/expma.renderer.test.ts +1 -1
  1006. package/src/engine/renderers/__tests__/ma.renderer.test.ts +14 -5
  1007. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +36 -49
  1008. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +7 -1
  1009. package/src/engine/renderers/candle.ts +556 -437
  1010. package/src/engine/renderers/comparisonLine.ts +96 -91
  1011. package/src/engine/renderers/crosshair.ts +5 -1
  1012. package/src/engine/renderers/customMarkers.ts +144 -118
  1013. package/src/engine/renderers/extremaMarkers.ts +191 -180
  1014. package/src/engine/renderers/gridLines.ts +51 -48
  1015. package/src/engine/renderers/lastPrice.ts +81 -70
  1016. package/src/engine/renderers/leftYAxis.ts +47 -26
  1017. package/src/engine/renderers/paneTitle.ts +140 -124
  1018. package/src/engine/renderers/subVolume.ts +264 -194
  1019. package/src/engine/renderers/timeAxis.ts +70 -48
  1020. package/src/engine/renderers/timeShare.ts +42 -13
  1021. package/src/engine/renderers/webgl/candleSurface.ts +943 -850
  1022. package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -122
  1023. package/src/engine/renderers/yAxis.ts +45 -29
  1024. package/src/engine/scale/__tests__/logFormula.spec.ts +141 -141
  1025. package/src/engine/scale/logFormula.ts +40 -40
  1026. package/src/engine/scale/price.ts +21 -22
  1027. package/src/engine/scale/priceScale.ts +269 -269
  1028. package/src/engine/subPaneManager.ts +291 -200
  1029. package/src/engine/theme/fonts.ts +5 -5
  1030. package/src/engine/utils/__tests__/tickPosition.test.ts +43 -43
  1031. package/src/engine/utils/chartZoomController.ts +10 -3
  1032. package/src/engine/utils/klineConfig.ts +22 -22
  1033. package/src/engine/utils/tickCount.ts +2 -2
  1034. package/src/engine/utils/tickPosition.ts +205 -207
  1035. package/src/engine/viewport/chartViewportManager.ts +33 -22
  1036. package/src/engine/viewport/viewport.ts +35 -28
  1037. package/src/errors-help.ts +134 -135
  1038. package/src/errors.ts +65 -62
  1039. package/src/index.ts +5 -9
  1040. package/src/indicators/__tests__/maFamily.test.ts +114 -114
  1041. package/src/indicators/__tests__/oscillators.test.ts +108 -104
  1042. package/src/indicators/alma.ts +36 -33
  1043. package/src/indicators/awesomeOscillator.ts +36 -33
  1044. package/src/indicators/dpo.ts +18 -17
  1045. package/src/indicators/fisherTransform.ts +40 -37
  1046. package/src/indicators/frama.ts +60 -53
  1047. package/src/indicators/index.ts +4 -16
  1048. package/src/indicators/lsma.ts +32 -31
  1049. package/src/indicators/schaffTrendCycle.ts +61 -59
  1050. package/src/indicators/stochRSI.ts +74 -74
  1051. package/src/indicators/t3.ts +55 -56
  1052. package/src/indicators/ultimateOscillator.ts +57 -54
  1053. package/src/indicators/vidya.ts +49 -48
  1054. package/src/indicators/zlema.ts +21 -20
  1055. package/src/input/__tests__/gesture.test.ts +182 -182
  1056. package/src/input/__tests__/keyboard.test.ts +228 -235
  1057. package/src/input/gesture.ts +262 -268
  1058. package/src/input/index.ts +15 -15
  1059. package/src/input/keyboard.ts +235 -237
  1060. package/src/mcp/chartBridge.ts +3 -11
  1061. package/src/plugin/HookSystem.ts +2 -6
  1062. package/src/plugin/PluginHost.ts +26 -6
  1063. package/src/plugin/StateStore.ts +1 -1
  1064. package/src/plugin/rendererPluginManager.ts +4 -8
  1065. package/src/plugin/types.ts +10 -7
  1066. package/src/reactivity/signal.ts +69 -69
  1067. package/src/render/Renderer.ts +57 -57
  1068. package/src/render/SurfaceBackend.ts +51 -51
  1069. package/src/render/__tests__/contract.test.ts +134 -134
  1070. package/src/render/__tests__/webglRenderer.fallback.test.ts +226 -0
  1071. package/src/render/__tests__/webglRenderer.test.ts +363 -0
  1072. package/src/render/__tests__/webglSurfaceBackend.test.ts +125 -0
  1073. package/src/render/createWebGLRenderer.ts +288 -0
  1074. package/src/render/createWebGLSurfaceBackend.ts +43 -0
  1075. package/src/render/index.ts +15 -19
  1076. package/src/renderer-tier/__tests__/detectRendererTier.test.ts +116 -119
  1077. package/src/renderer-tier/__tests__/selectBackend.test.ts +168 -172
  1078. package/src/renderer-tier/detectRendererTier.ts +65 -74
  1079. package/src/renderer-tier/index.ts +15 -15
  1080. package/src/renderer-tier/selectBackend.ts +89 -98
  1081. package/src/renderer-tier/types.ts +11 -11
  1082. package/src/replay/__tests__/controller.test.ts +268 -268
  1083. package/src/replay/__tests__/timeline.test.ts +77 -77
  1084. package/src/replay/createReplayController.ts +224 -232
  1085. package/src/replay/index.ts +7 -11
  1086. package/src/replay/timeline.ts +44 -50
  1087. package/src/replay/types.ts +63 -65
  1088. package/src/scale/__tests__/anchoredZoom.test.ts +121 -110
  1089. package/src/scale/__tests__/originShift.test.ts +80 -80
  1090. package/src/scale/__tests__/priceScale.test.ts +205 -205
  1091. package/src/scale/__tests__/timeScale.test.ts +104 -98
  1092. package/src/scale/anchoredZoom.ts +44 -44
  1093. package/src/scale/createPriceScale.ts +178 -175
  1094. package/src/scale/createTimeScale.ts +130 -124
  1095. package/src/scale/index.ts +3 -3
  1096. package/src/scale/originShift.ts +49 -43
  1097. package/src/scale/types.ts +43 -43
  1098. package/src/scene/__tests__/layerFromPlugin.test.ts +243 -0
  1099. package/src/scene/__tests__/layerRegistry.test.ts +154 -170
  1100. package/src/scene/__tests__/scene.test.ts +341 -345
  1101. package/src/scene/createLayerFromPlugin.ts +47 -0
  1102. package/src/scene/createScene.ts +85 -82
  1103. package/src/scene/index.ts +5 -16
  1104. package/src/scene/layerRegistry.ts +52 -54
  1105. package/src/scene/types.ts +37 -32
  1106. package/src/scheduler/__tests__/createFrameBudget.test.ts +227 -223
  1107. package/src/scheduler/createFrameBudget.ts +224 -224
  1108. package/src/scheduler/index.ts +5 -5
  1109. package/src/semantic/__tests__/controller.test.ts +11 -9
  1110. package/src/semantic/controller.ts +42 -18
  1111. package/src/semantic/drawShape.ts +3 -3
  1112. package/src/semantic/index.ts +7 -1
  1113. package/src/semantic/schema.json +16 -4
  1114. package/src/semantic/validator.ts +22 -8
  1115. package/src/tokens/__tests__/baseline.test.ts +99 -102
  1116. package/src/tokens/__tests__/themeToCssVars.test.ts +117 -128
  1117. package/src/tokens/__tests__/tokens.test.ts +119 -130
  1118. package/src/tokens/colorPresetSettings.ts +103 -99
  1119. package/src/tokens/index.ts +44 -44
  1120. package/src/tokens/mergeTheme.ts +20 -20
  1121. package/src/tokens/theme-base.ts +1 -2
  1122. package/src/tokens/theme-china.ts +70 -70
  1123. package/src/tokens/theme-dark.ts +182 -182
  1124. package/src/tokens/theme-light.ts +186 -186
  1125. package/src/tokens/themeToCssVars.ts +53 -54
  1126. package/src/tokens/types.ts +215 -215
  1127. package/src/types/price.ts +7 -2
  1128. package/src/types/volumePrice.ts +1 -2
  1129. package/src/utils/__tests__/dateFormat.test.ts +137 -142
  1130. package/src/utils/dateFormat.ts +115 -110
  1131. package/src/utils/kLineDraw/axis.ts +486 -453
  1132. package/src/utils/priceToY.ts +21 -21
  1133. package/src/utils/volumePrice.ts +8 -4
  1134. package/src/version.ts +1 -1
@@ -15,32 +15,33 @@
15
15
  import { KLineChartError } from '../errors'
16
16
  import { createSignal, type Signal } from '../reactivity'
17
17
  import type {
18
- ChartController,
19
- ChartMountOptions,
20
- ChartViewport,
21
- DrawingToolType,
22
- DrawingObject,
23
- SubPaneInfo,
24
- IndicatorInstance,
25
- InteractionSnapshot,
26
- DrawingControllerCallbacks,
27
- IndicatorDefinition,
28
- KLineData,
29
- PaneLayoutInfo,
30
- PaneSpec,
31
- SymbolSpec,
32
- DataFetcher,
33
- CustomDataSource,
18
+ ChartController,
19
+ ChartMountOptions,
20
+ ChartViewport,
21
+ DrawingToolType,
22
+ DrawingObject,
23
+ SubPaneInfo,
24
+ IndicatorInstance,
25
+ InteractionSnapshot,
26
+ DrawingControllerCallbacks,
27
+ IndicatorDefinition,
28
+ KLineData,
29
+ PaneLayoutInfo,
30
+ PaneSpec,
31
+ SymbolSpec,
32
+ SymbolInfo,
33
+ DataFetcher,
34
+ CustomDataSource,
34
35
  } from './types'
35
36
  import type { CustomMarkerEntity } from '../engine/marker/registry'
36
37
  import { Chart, type InteractionSnapshot as LegacyInteractionSnapshot } from '../engine/chart'
37
38
  import type {
38
- ChartOptions,
39
- ViewportState as LegacyViewportState,
40
- IndicatorInstance as LegacyIndicatorInstance,
41
- SubPaneInfo as LegacySubPaneInfo,
42
- DrawingObject as LegacyDrawingObject,
43
- DrawingToolType as LegacyDrawingToolType,
39
+ ChartOptions,
40
+ ViewportState as LegacyViewportState,
41
+ IndicatorInstance as LegacyIndicatorInstance,
42
+ SubPaneInfo as LegacySubPaneInfo,
43
+ DrawingObject as LegacyDrawingObject,
44
+ DrawingToolType as LegacyDrawingToolType,
44
45
  } from '../engine/chartTypes'
45
46
  import { zoomLevelToKWidth, kGapFromKWidth } from '../engine/utils/zoom'
46
47
  import { loadBuiltinIndicators } from '../engine/indicators/registerBuiltins'
@@ -48,42 +49,41 @@ import { ChartBridge } from '../mcp/chartBridge'
48
49
 
49
50
  // Plugin-backed drawings expose `kind` instead of legacy `type`.
50
51
  type PluginBackedDrawingObject = {
51
- id: string
52
- kind: string
52
+ id: string
53
+ kind: string
53
54
  }
54
55
 
55
56
  // ---------------------------------------------------------------------------
56
57
  // Defaults
57
58
  // ---------------------------------------------------------------------------
58
59
 
59
-
60
60
  const DEFAULT_OPTS = {
61
- yPaddingPx: 20,
62
- minKWidth: 1,
63
- maxKWidth: 50,
64
- rightAxisWidth: 0,
65
- leftAxisWidth: 0,
66
- bottomAxisHeight: 24,
67
- priceLabelWidth: 60,
68
- zoomLevels: 20,
69
- initialZoomLevel: 3,
61
+ yPaddingPx: 20,
62
+ minKWidth: 1,
63
+ maxKWidth: 50,
64
+ rightAxisWidth: 0,
65
+ leftAxisWidth: 0,
66
+ bottomAxisHeight: 24,
67
+ priceLabelWidth: 60,
68
+ zoomLevels: 20,
69
+ initialZoomLevel: 3,
70
70
  } as const
71
71
 
72
72
  const INITIAL_INTERACTION: InteractionSnapshot = {
73
- crosshairPos: null,
74
- crosshairIndex: null,
75
- crosshairPrice: null,
76
- hoveredIndex: null,
77
- activePaneId: null,
78
- tooltipPos: { x: 0, y: 0 },
79
- tooltipAnchorPlacement: 'right-bottom',
80
- hoveredMarkerData: null,
81
- hoveredCustomMarker: null,
82
- isDragging: false,
83
- isResizingPaneBoundary: false,
84
- isHoveringPaneBoundary: false,
85
- hoveredPaneBoundaryId: null,
86
- isHoveringRightAxis: false,
73
+ crosshairPos: null,
74
+ crosshairIndex: null,
75
+ crosshairPrice: null,
76
+ hoveredIndex: null,
77
+ activePaneId: null,
78
+ tooltipPos: { x: 0, y: 0 },
79
+ tooltipAnchorPlacement: 'right-bottom',
80
+ hoveredMarkerData: null,
81
+ hoveredCustomMarker: null,
82
+ isDragging: false,
83
+ isResizingPaneBoundary: false,
84
+ isHoveringPaneBoundary: false,
85
+ hoveredPaneBoundaryId: null,
86
+ isHoveringRightAxis: false,
87
87
  }
88
88
 
89
89
  // ---------------------------------------------------------------------------
@@ -91,26 +91,26 @@ const INITIAL_INTERACTION: InteractionSnapshot = {
91
91
  // ---------------------------------------------------------------------------
92
92
 
93
93
  const DEFAULT_INDICATOR_CATALOG: ReadonlyArray<IndicatorDefinition> = [
94
- { id: 'MA', label: 'MA', name: '移动平均线', role: 'main', params: [] },
95
- { id: 'BOLL', label: 'BOLL', name: '布林带', role: 'main', params: [] },
96
- { id: 'EXPMA', label: 'EXPMA', name: '指数平均线', role: 'main', params: [] },
97
- { id: 'ENE', label: 'ENE', name: '轨道线', role: 'main', params: [] },
98
- { id: 'SAR', label: 'SAR', name: '抛物线', role: 'main', params: [] },
99
- { id: 'SUPERTREND', label: 'SuperTrend', name: '超级趋势', role: 'main', params: [] },
100
- { id: 'STRUCTURE', label: 'Structure', name: 'SMC 结构', role: 'main', params: [] },
101
- { id: 'ZONES', label: 'Zones', name: 'SMC 区域', role: 'main', params: [] },
102
- { id: 'VOLUME', label: 'VOL', name: '成交量', role: 'sub', params: [] },
103
- { id: 'MACD', label: 'MACD', name: 'MACD', role: 'sub', params: [] },
104
- { id: 'RSI', label: 'RSI', name: '相对强弱', role: 'sub', params: [] },
105
- { id: 'CCI', label: 'CCI', name: '顺势指标', role: 'sub', params: [] },
106
- { id: 'STOCH', label: 'KDJ/STOCH', name: '随机指标', role: 'sub', params: [] },
107
- { id: 'MOM', label: 'MOM', name: '动量', role: 'sub', params: [] },
108
- { id: 'WMSR', label: 'WMSR', name: '威廉指标', role: 'sub', params: [] },
109
- { id: 'KST', label: 'KST', name: 'KST 振荡器', role: 'sub', params: [] },
110
- { id: 'FASTK', label: 'FASTK', name: '快速 K', role: 'sub', params: [] },
111
- { id: 'OBV', label: 'OBV', name: '能量潮', role: 'sub', params: [] },
112
- { id: 'VWAP', label: 'VWAP', name: '成交量加权均价', role: 'sub', params: [] },
113
- { id: 'VOLUME_PROFILE', label: 'VP', name: '成交量分布', role: 'sub', params: [] },
94
+ { id: 'MA', label: 'MA', name: '移动平均线', role: 'main', params: [] },
95
+ { id: 'BOLL', label: 'BOLL', name: '布林带', role: 'main', params: [] },
96
+ { id: 'EXPMA', label: 'EXPMA', name: '指数平均线', role: 'main', params: [] },
97
+ { id: 'ENE', label: 'ENE', name: '轨道线', role: 'main', params: [] },
98
+ { id: 'SAR', label: 'SAR', name: '抛物线', role: 'main', params: [] },
99
+ { id: 'SUPERTREND', label: 'SuperTrend', name: '超级趋势', role: 'main', params: [] },
100
+ { id: 'STRUCTURE', label: 'Structure', name: 'SMC 结构', role: 'main', params: [] },
101
+ { id: 'ZONES', label: 'Zones', name: 'SMC 区域', role: 'main', params: [] },
102
+ { id: 'VOLUME', label: 'VOL', name: '成交量', role: 'sub', params: [] },
103
+ { id: 'MACD', label: 'MACD', name: 'MACD', role: 'sub', params: [] },
104
+ { id: 'RSI', label: 'RSI', name: '相对强弱', role: 'sub', params: [] },
105
+ { id: 'CCI', label: 'CCI', name: '顺势指标', role: 'sub', params: [] },
106
+ { id: 'STOCH', label: 'KDJ/STOCH', name: '随机指标', role: 'sub', params: [] },
107
+ { id: 'MOM', label: 'MOM', name: '动量', role: 'sub', params: [] },
108
+ { id: 'WMSR', label: 'WMSR', name: '威廉指标', role: 'sub', params: [] },
109
+ { id: 'KST', label: 'KST', name: 'KST 振荡器', role: 'sub', params: [] },
110
+ { id: 'FASTK', label: 'FASTK', name: '快速 K', role: 'sub', params: [] },
111
+ { id: 'OBV', label: 'OBV', name: '能量潮', role: 'sub', params: [] },
112
+ { id: 'VWAP', label: 'VWAP', name: '成交量加权均价', role: 'sub', params: [] },
113
+ { id: 'VOLUME_PROFILE', label: 'VP', name: '成交量分布', role: 'sub', params: [] },
114
114
  ]
115
115
 
116
116
  // ---------------------------------------------------------------------------
@@ -118,177 +118,185 @@ const DEFAULT_INDICATOR_CATALOG: ReadonlyArray<IndicatorDefinition> = [
118
118
  // ---------------------------------------------------------------------------
119
119
 
120
120
  interface MountedDom {
121
- container: HTMLDivElement
122
- scrollContent?: HTMLDivElement
123
- canvasLayer: HTMLDivElement
124
- rightAxisLayer: HTMLDivElement
125
- leftAxisLayer?: HTMLDivElement
126
- xAxisCanvas: HTMLCanvasElement
127
- cleanup: () => void
121
+ container: HTMLDivElement
122
+ scrollContent?: HTMLDivElement
123
+ canvasLayer: HTMLDivElement
124
+ rightAxisLayer: HTMLDivElement
125
+ leftAxisLayer?: HTMLDivElement
126
+ xAxisCanvas: HTMLCanvasElement
127
+ cleanup: () => void
128
128
  }
129
129
 
130
130
  function mapViewportState(vp: LegacyViewportState): ChartViewport {
131
- return {
132
- zoomLevel: vp.zoomLevel,
133
- plotWidth: vp.plotWidth,
134
- plotHeight: vp.plotHeight,
135
- dpr: vp.dpr,
136
- visibleFrom: vp.visibleFrom,
137
- visibleTo: vp.visibleTo,
138
- kWidth: vp.kWidth,
139
- kGap: vp.kGap,
140
- }
131
+ return {
132
+ zoomLevel: vp.zoomLevel,
133
+ plotWidth: vp.plotWidth,
134
+ plotHeight: vp.plotHeight,
135
+ dpr: vp.dpr,
136
+ visibleFrom: vp.visibleFrom,
137
+ visibleTo: vp.visibleTo,
138
+ kWidth: vp.kWidth,
139
+ kGap: vp.kGap,
140
+ }
141
141
  }
142
142
 
143
143
  function mapIndicatorInstance(indicator: LegacyIndicatorInstance): IndicatorInstance {
144
- return {
145
- id: indicator.id,
146
- definitionId: indicator.definitionId,
147
- label: indicator.label,
148
- name: indicator.name,
149
- role: indicator.role,
150
- paneId: indicator.paneId,
151
- params: { ...indicator.params },
152
- }
144
+ return {
145
+ id: indicator.id,
146
+ definitionId: indicator.definitionId,
147
+ label: indicator.label,
148
+ name: indicator.name,
149
+ role: indicator.role,
150
+ paneId: indicator.paneId,
151
+ params: { ...indicator.params },
152
+ }
153
153
  }
154
154
 
155
155
  function mapSubPaneInfo(subPane: LegacySubPaneInfo): SubPaneInfo {
156
- return {
157
- paneId: subPane.paneId,
158
- indicatorId: subPane.indicatorId,
159
- params: { ...subPane.params },
160
- ratio: subPane.ratio,
161
- }
156
+ return {
157
+ paneId: subPane.paneId,
158
+ indicatorId: subPane.indicatorId,
159
+ params: { ...subPane.params },
160
+ ratio: subPane.ratio,
161
+ }
162
162
  }
163
163
 
164
164
  function mapDrawingTool(tool: LegacyDrawingToolType | null): DrawingToolType | null {
165
- return tool
165
+ return tool
166
166
  }
167
167
 
168
168
  function mapPluginDrawingKind(kind: PluginBackedDrawingObject['kind']): DrawingToolType {
169
- switch (kind) {
170
- case 'trend-line':
171
- case 'ray':
172
- case 'extended-line':
173
- return 'trendline'
174
- case 'horizontal-line':
175
- case 'horizontal-ray':
176
- case 'flat-line':
177
- return 'horizontal'
178
- default:
179
- return 'trendline'
180
- }
169
+ switch (kind) {
170
+ case 'trend-line':
171
+ case 'ray':
172
+ case 'extended-line':
173
+ return 'trendline'
174
+ case 'horizontal-line':
175
+ case 'horizontal-ray':
176
+ case 'flat-line':
177
+ return 'horizontal'
178
+ default:
179
+ return 'trendline'
180
+ }
181
181
  }
182
182
 
183
183
  function mapDrawingObject(drawing: LegacyDrawingObject | PluginBackedDrawingObject): DrawingObject {
184
- return {
185
- id: drawing.id,
186
- type: 'type' in drawing
187
- ? (mapDrawingTool(drawing.type) ?? drawing.type)
188
- : mapPluginDrawingKind(drawing.kind),
189
- }
184
+ return {
185
+ id: drawing.id,
186
+ type:
187
+ 'type' in drawing
188
+ ? (mapDrawingTool(drawing.type) ?? drawing.type)
189
+ : mapPluginDrawingKind(drawing.kind),
190
+ }
190
191
  }
191
192
 
192
193
  function mapPaneRatios(ratios: Readonly<Record<string, number>>): Readonly<Record<string, number>> {
193
- return { ...ratios }
194
+ return { ...ratios }
194
195
  }
195
196
 
196
- function mapInteractionRecord<T>(
197
- value: T | null | undefined,
198
- ): T | null {
199
- if (!value) {
200
- return null
201
- }
202
- return { ...value } as T
197
+ function mapInteractionRecord<T>(value: T | null | undefined): T | null {
198
+ if (!value) {
199
+ return null
200
+ }
201
+ return { ...value } as T
203
202
  }
204
203
 
205
204
  function mapInteractionSnapshot(snapshot: LegacyInteractionSnapshot): InteractionSnapshot {
206
- return {
207
- crosshairPos: snapshot.crosshairPos ? { ...snapshot.crosshairPos } : null,
208
- crosshairIndex: snapshot.crosshairIndex,
209
- crosshairPrice: snapshot.crosshairPrice,
210
- hoveredIndex: snapshot.hoveredIndex,
211
- activePaneId: snapshot.activePaneId,
212
- tooltipPos: { ...snapshot.tooltipPos },
213
- tooltipAnchorPlacement: snapshot.tooltipAnchorPlacement,
214
- hoveredMarkerData: mapInteractionRecord(snapshot.hoveredMarkerData),
215
- hoveredCustomMarker: mapInteractionRecord(snapshot.hoveredCustomMarker),
216
- isDragging: snapshot.isDragging,
217
- isResizingPaneBoundary: snapshot.isResizingPaneBoundary,
218
- isHoveringPaneBoundary: snapshot.isHoveringPaneBoundary,
219
- hoveredPaneBoundaryId: snapshot.hoveredPaneBoundaryId,
220
- isHoveringRightAxis: snapshot.isHoveringRightAxis,
221
- }
205
+ return {
206
+ crosshairPos: snapshot.crosshairPos ? { ...snapshot.crosshairPos } : null,
207
+ crosshairIndex: snapshot.crosshairIndex,
208
+ crosshairPrice: snapshot.crosshairPrice,
209
+ hoveredIndex: snapshot.hoveredIndex,
210
+ activePaneId: snapshot.activePaneId,
211
+ tooltipPos: { ...snapshot.tooltipPos },
212
+ tooltipAnchorPlacement: snapshot.tooltipAnchorPlacement,
213
+ hoveredMarkerData: mapInteractionRecord(snapshot.hoveredMarkerData),
214
+ hoveredCustomMarker: mapInteractionRecord(snapshot.hoveredCustomMarker),
215
+ isDragging: snapshot.isDragging,
216
+ isResizingPaneBoundary: snapshot.isResizingPaneBoundary,
217
+ isHoveringPaneBoundary: snapshot.isHoveringPaneBoundary,
218
+ hoveredPaneBoundaryId: snapshot.hoveredPaneBoundaryId,
219
+ isHoveringRightAxis: snapshot.isHoveringRightAxis,
220
+ }
222
221
  }
223
222
 
224
223
  function buildDom(container: HTMLElement): MountedDom {
225
- const ownerDoc = container.ownerDocument
226
- if (!ownerDoc) {
227
- throw new KLineChartError('CONTROLLER_CONFIG_INVALID',
228
- '[createChartController] container has no ownerDocument; cannot build DOM scaffold',
229
- )
230
- }
231
-
232
- let chartContainer: HTMLDivElement
233
- let containerCreatedByUs = false
234
- if (container instanceof HTMLDivElement) {
235
- chartContainer = container
236
- } else {
237
- chartContainer = ownerDoc.createElement('div')
238
- chartContainer.style.width = '100%'
239
- chartContainer.style.height = '100%'
240
- container.appendChild(chartContainer)
241
- containerCreatedByUs = true
242
- }
243
- chartContainer.style.position = 'relative'
244
- chartContainer.style.overflow = 'auto'
245
-
246
- const scrollContent = ownerDoc.createElement('div')
247
- scrollContent.className = 'klc-scroll-content'
248
- scrollContent.style.position = 'relative'
249
-
250
- const canvasLayer = ownerDoc.createElement('div')
251
- canvasLayer.className = 'klc-canvas-layer'
252
- canvasLayer.style.position = 'sticky'
253
- canvasLayer.style.top = '0'
254
- canvasLayer.style.left = '0'
255
- canvasLayer.style.zIndex = '1'
256
-
257
- const xAxisCanvas = ownerDoc.createElement('canvas')
258
- xAxisCanvas.className = 'klc-x-axis-canvas'
259
-
260
- canvasLayer.appendChild(xAxisCanvas)
261
- scrollContent.appendChild(canvasLayer)
262
- chartContainer.appendChild(scrollContent)
263
-
264
- const rightAxisLayer = ownerDoc.createElement('div')
265
- rightAxisLayer.className = 'klc-right-axis-host'
266
- rightAxisLayer.style.position = 'absolute'
267
- rightAxisLayer.style.top = '0'
268
- rightAxisLayer.style.right = '0'
269
- chartContainer.appendChild(rightAxisLayer)
270
-
271
- const leftAxisLayer = ownerDoc.createElement('div')
272
- leftAxisLayer.className = 'klc-left-axis-host'
273
- leftAxisLayer.style.position = 'absolute'
274
- leftAxisLayer.style.top = '0'
275
- leftAxisLayer.style.left = '0'
276
- chartContainer.appendChild(leftAxisLayer)
277
-
278
- const cleanup = (): void => {
279
- try {
280
- scrollContent.remove()
281
- rightAxisLayer.remove()
282
- leftAxisLayer.remove()
283
- if (containerCreatedByUs) {
284
- chartContainer.remove()
285
- }
286
- } catch {
287
- /* DOM may already be gone — best effort */
288
- }
289
- }
290
-
291
- return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, leftAxisLayer, xAxisCanvas, cleanup }
224
+ const ownerDoc = container.ownerDocument
225
+ if (!ownerDoc) {
226
+ throw new KLineChartError(
227
+ 'CONTROLLER_CONFIG_INVALID',
228
+ '[createChartController] container has no ownerDocument; cannot build DOM scaffold',
229
+ )
230
+ }
231
+
232
+ let chartContainer: HTMLDivElement
233
+ let containerCreatedByUs = false
234
+ if (container instanceof HTMLDivElement) {
235
+ chartContainer = container
236
+ } else {
237
+ chartContainer = ownerDoc.createElement('div')
238
+ chartContainer.style.width = '100%'
239
+ chartContainer.style.height = '100%'
240
+ container.appendChild(chartContainer)
241
+ containerCreatedByUs = true
242
+ }
243
+ chartContainer.style.position = 'relative'
244
+ chartContainer.style.overflow = 'auto'
245
+
246
+ const scrollContent = ownerDoc.createElement('div')
247
+ scrollContent.className = 'klc-scroll-content'
248
+ scrollContent.style.position = 'relative'
249
+
250
+ const canvasLayer = ownerDoc.createElement('div')
251
+ canvasLayer.className = 'klc-canvas-layer'
252
+ canvasLayer.style.position = 'sticky'
253
+ canvasLayer.style.top = '0'
254
+ canvasLayer.style.left = '0'
255
+ canvasLayer.style.zIndex = '1'
256
+
257
+ const xAxisCanvas = ownerDoc.createElement('canvas')
258
+ xAxisCanvas.className = 'klc-x-axis-canvas'
259
+
260
+ canvasLayer.appendChild(xAxisCanvas)
261
+ scrollContent.appendChild(canvasLayer)
262
+ chartContainer.appendChild(scrollContent)
263
+
264
+ const rightAxisLayer = ownerDoc.createElement('div')
265
+ rightAxisLayer.className = 'klc-right-axis-host'
266
+ rightAxisLayer.style.position = 'absolute'
267
+ rightAxisLayer.style.top = '0'
268
+ rightAxisLayer.style.right = '0'
269
+ chartContainer.appendChild(rightAxisLayer)
270
+
271
+ const leftAxisLayer = ownerDoc.createElement('div')
272
+ leftAxisLayer.className = 'klc-left-axis-host'
273
+ leftAxisLayer.style.position = 'absolute'
274
+ leftAxisLayer.style.top = '0'
275
+ leftAxisLayer.style.left = '0'
276
+ chartContainer.appendChild(leftAxisLayer)
277
+
278
+ const cleanup = (): void => {
279
+ try {
280
+ scrollContent.remove()
281
+ rightAxisLayer.remove()
282
+ leftAxisLayer.remove()
283
+ if (containerCreatedByUs) {
284
+ chartContainer.remove()
285
+ }
286
+ } catch {
287
+ /* DOM may already be gone — best effort */
288
+ }
289
+ }
290
+
291
+ return {
292
+ container: chartContainer,
293
+ scrollContent,
294
+ canvasLayer,
295
+ rightAxisLayer,
296
+ leftAxisLayer,
297
+ xAxisCanvas,
298
+ cleanup,
299
+ }
292
300
  }
293
301
 
294
302
  // ---------------------------------------------------------------------------
@@ -296,685 +304,703 @@ function buildDom(container: HTMLElement): MountedDom {
296
304
  // ---------------------------------------------------------------------------
297
305
 
298
306
  export async function createChartController(opts: ChartMountOptions): Promise<ChartController> {
299
- if (!opts) {
300
- throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts is required')
301
- }
302
- if (!opts.container) {
303
- throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts.container must be a non-null HTMLElement')
304
- }
305
-
306
- await loadBuiltinIndicators()
307
-
308
- const hasExistingDom = !!(opts.canvasLayer && opts.rightAxisLayer && opts.xAxisCanvas)
309
- const mounted = hasExistingDom
310
- ? {
311
- container: opts.container as HTMLDivElement,
312
- scrollContent: (opts.container as HTMLDivElement).querySelector<HTMLDivElement>('.scroll-content') ?? undefined,
313
- canvasLayer: opts.canvasLayer as HTMLDivElement,
314
- rightAxisLayer: opts.rightAxisLayer as HTMLDivElement,
315
- leftAxisLayer: opts.leftAxisLayer as HTMLDivElement | undefined,
316
- xAxisCanvas: opts.xAxisCanvas!,
317
- cleanup: () => { /* DOM owned by caller */ },
318
- }
319
- : buildDom(opts.container)
320
-
321
- // ── Fix 0×0 sizing for buildDom()-created right axis host ──
322
- if (!hasExistingDom && mounted.rightAxisLayer) {
323
- const hostWidth =
324
- (opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth) +
325
- (opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth)
326
- mounted.rightAxisLayer.style.bottom = '0'
327
- mounted.rightAxisLayer.style.width = hostWidth + 'px'
328
- }
329
-
330
- const initialZoomLevel = opts.initialZoomLevel ?? DEFAULT_OPTS.initialZoomLevel
331
- const zoomLevelCount = opts.zoomLevels ?? DEFAULT_OPTS.zoomLevels
332
-
333
- const chartOptions: ChartOptions = {
334
- yPaddingPx: opts.yPaddingPx ?? DEFAULT_OPTS.yPaddingPx,
335
- rightAxisWidth: opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth,
336
- leftAxisWidth: opts.leftAxisWidth ?? DEFAULT_OPTS.leftAxisWidth,
337
- bottomAxisHeight: opts.bottomAxisHeight ?? DEFAULT_OPTS.bottomAxisHeight,
338
- minKWidth: opts.minKWidth ?? DEFAULT_OPTS.minKWidth,
339
- maxKWidth: opts.maxKWidth ?? DEFAULT_OPTS.maxKWidth,
340
- priceLabelWidth: opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth,
341
- panes: [{ id: 'main', ratio: 1 }],
342
- paneGap: 0,
343
- zoomLevels: zoomLevelCount,
344
- initialZoomLevel,
345
- }
346
-
347
- const chart = new Chart(
348
- {
349
- container: mounted.container,
350
- scrollContent: mounted.scrollContent,
351
- canvasLayer: mounted.canvasLayer,
352
- rightAxisLayer: mounted.rightAxisLayer,
353
- leftAxisLayer: mounted.leftAxisLayer,
354
- xAxisCanvas: mounted.xAxisCanvas,
355
- },
356
- chartOptions,
307
+ if (!opts) {
308
+ throw new KLineChartError(
309
+ 'CONTROLLER_CONFIG_INVALID',
310
+ '[createChartController] opts is required',
357
311
  )
358
-
359
- const currentDpr = typeof window !== 'undefined' && window.devicePixelRatio > 0
360
- ? window.devicePixelRatio
361
- : 1
362
- const currentKWidth = zoomLevelToKWidth(initialZoomLevel, {
363
- minKWidth: DEFAULT_OPTS.minKWidth,
364
- maxKWidth: DEFAULT_OPTS.maxKWidth,
365
- zoomLevelCount,
366
- dpr: currentDpr,
367
- })
368
- const currentKGap = kGapFromKWidth(currentKWidth, currentDpr)
369
-
370
- // -------------------------------------------------------------------
371
- // Controller signals (bridge mode: subscribe to Chart's signals)
372
- // -------------------------------------------------------------------
373
-
374
- const viewport: Signal<ChartViewport> = createSignal<ChartViewport>({
375
- zoomLevel: initialZoomLevel,
376
- plotWidth: 0,
377
- plotHeight: 0,
378
- dpr: currentDpr,
379
- visibleFrom: 0,
380
- visibleTo: 0,
381
- kWidth: currentKWidth,
382
- kGap: currentKGap,
383
- })
384
-
385
- const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data ?? [])
386
- const dataLoading: Signal<boolean> = createSignal(false)
387
-
388
- const symbols: Signal<ReadonlyArray<SymbolSpec>> = chart.symbols
389
-
390
- const themeSignal: Signal<'light' | 'dark'> = createSignal(opts.theme ?? 'light')
391
-
392
- const indicators: Signal<ReadonlyArray<IndicatorInstance>> = createSignal<
393
- ReadonlyArray<IndicatorInstance>
394
- >([])
395
- const subPanes: Signal<ReadonlyArray<SubPaneInfo>> = createSignal<ReadonlyArray<SubPaneInfo>>([])
396
- const drawingTool: Signal<DrawingToolType | null> = createSignal<DrawingToolType | null>(null)
397
- const drawings: Signal<ReadonlyArray<DrawingObject>> = createSignal<ReadonlyArray<DrawingObject>>([])
398
- const paneRatios: Signal<Readonly<Record<string, number>>> = createSignal<
399
- Readonly<Record<string, number>>
400
- >({})
401
- const interactionState: Signal<InteractionSnapshot> = createSignal(INITIAL_INTERACTION)
402
- const comparisonColors: Signal<ReadonlyMap<string, string>> = createSignal<ReadonlyMap<string, string>>(new Map())
403
- const comparisonLoading: Signal<boolean> = createSignal(false)
404
-
405
- // -------------------------------------------------------------------
406
- // Apply initial render state + seed data
407
- // -------------------------------------------------------------------
408
-
312
+ }
313
+ if (!opts.container) {
314
+ throw new KLineChartError(
315
+ 'CONTROLLER_CONFIG_INVALID',
316
+ '[createChartController] opts.container must be a non-null HTMLElement',
317
+ )
318
+ }
319
+
320
+ await loadBuiltinIndicators()
321
+
322
+ const hasExistingDom = !!(opts.canvasLayer && opts.rightAxisLayer && opts.xAxisCanvas)
323
+ const mounted = hasExistingDom
324
+ ? {
325
+ container: opts.container as HTMLDivElement,
326
+ scrollContent:
327
+ (opts.container as HTMLDivElement).querySelector<HTMLDivElement>('.scroll-content') ??
328
+ undefined,
329
+ canvasLayer: opts.canvasLayer as HTMLDivElement,
330
+ rightAxisLayer: opts.rightAxisLayer as HTMLDivElement,
331
+ leftAxisLayer: opts.leftAxisLayer as HTMLDivElement | undefined,
332
+ xAxisCanvas: opts.xAxisCanvas!,
333
+ cleanup: () => {
334
+ /* DOM owned by caller */
335
+ },
336
+ }
337
+ : buildDom(opts.container)
338
+
339
+ // ── Fix 0×0 sizing for buildDom()-created right axis host ──
340
+ if (!hasExistingDom && mounted.rightAxisLayer) {
341
+ const hostWidth =
342
+ (opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth) +
343
+ (opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth)
344
+ mounted.rightAxisLayer.style.bottom = '0'
345
+ mounted.rightAxisLayer.style.width = hostWidth + 'px'
346
+ }
347
+
348
+ const initialZoomLevel = opts.initialZoomLevel ?? DEFAULT_OPTS.initialZoomLevel
349
+ const zoomLevelCount = opts.zoomLevels ?? DEFAULT_OPTS.zoomLevels
350
+
351
+ const chartOptions: ChartOptions = {
352
+ yPaddingPx: opts.yPaddingPx ?? DEFAULT_OPTS.yPaddingPx,
353
+ rightAxisWidth: opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth,
354
+ leftAxisWidth: opts.leftAxisWidth ?? DEFAULT_OPTS.leftAxisWidth,
355
+ bottomAxisHeight: opts.bottomAxisHeight ?? DEFAULT_OPTS.bottomAxisHeight,
356
+ minKWidth: opts.minKWidth ?? DEFAULT_OPTS.minKWidth,
357
+ maxKWidth: opts.maxKWidth ?? DEFAULT_OPTS.maxKWidth,
358
+ priceLabelWidth: opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth,
359
+ panes: [{ id: 'main', ratio: 1 }],
360
+ paneGap: 0,
361
+ zoomLevels: zoomLevelCount,
362
+ initialZoomLevel,
363
+ }
364
+
365
+ const chart = new Chart(
366
+ {
367
+ container: mounted.container,
368
+ scrollContent: mounted.scrollContent,
369
+ canvasLayer: mounted.canvasLayer,
370
+ rightAxisLayer: mounted.rightAxisLayer,
371
+ leftAxisLayer: mounted.leftAxisLayer,
372
+ xAxisCanvas: mounted.xAxisCanvas,
373
+ },
374
+ chartOptions,
375
+ )
376
+
377
+ const currentDpr =
378
+ typeof window !== 'undefined' && window.devicePixelRatio > 0 ? window.devicePixelRatio : 1
379
+ const currentKWidth = zoomLevelToKWidth(initialZoomLevel, {
380
+ minKWidth: DEFAULT_OPTS.minKWidth,
381
+ maxKWidth: DEFAULT_OPTS.maxKWidth,
382
+ zoomLevelCount,
383
+ dpr: currentDpr,
384
+ })
385
+ const currentKGap = kGapFromKWidth(currentKWidth, currentDpr)
386
+
387
+ // -------------------------------------------------------------------
388
+ // Controller signals (bridge mode: subscribe to Chart's signals)
389
+ // -------------------------------------------------------------------
390
+
391
+ const viewport: Signal<ChartViewport> = createSignal<ChartViewport>({
392
+ zoomLevel: initialZoomLevel,
393
+ plotWidth: 0,
394
+ plotHeight: 0,
395
+ dpr: currentDpr,
396
+ visibleFrom: 0,
397
+ visibleTo: 0,
398
+ kWidth: currentKWidth,
399
+ kGap: currentKGap,
400
+ })
401
+
402
+ const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data ?? [])
403
+ const dataLoading: Signal<boolean> = createSignal(false)
404
+
405
+ const symbols: Signal<ReadonlyArray<SymbolSpec>> = chart.symbols
406
+
407
+ const themeSignal: Signal<'light' | 'dark'> = createSignal(opts.theme ?? 'light')
408
+
409
+ const indicators: Signal<ReadonlyArray<IndicatorInstance>> = createSignal<
410
+ ReadonlyArray<IndicatorInstance>
411
+ >([])
412
+ const subPanes: Signal<ReadonlyArray<SubPaneInfo>> = createSignal<ReadonlyArray<SubPaneInfo>>([])
413
+ const drawingTool: Signal<DrawingToolType | null> = createSignal<DrawingToolType | null>(null)
414
+ const drawings: Signal<ReadonlyArray<DrawingObject>> = createSignal<ReadonlyArray<DrawingObject>>(
415
+ [],
416
+ )
417
+ const paneRatios: Signal<Readonly<Record<string, number>>> = createSignal<
418
+ Readonly<Record<string, number>>
419
+ >({})
420
+ const interactionState: Signal<InteractionSnapshot> = createSignal(INITIAL_INTERACTION)
421
+ const comparisonColors: Signal<ReadonlyMap<string, string>> = createSignal<
422
+ ReadonlyMap<string, string>
423
+ >(new Map())
424
+ const comparisonLoading: Signal<boolean> = createSignal(false)
425
+
426
+ // symbolCatalog — bridge from Chart's data manager
427
+ const symbolCatalog: Signal<ReadonlyArray<SymbolInfo>> = chart.symbolCatalog
428
+
429
+ // -------------------------------------------------------------------
430
+ // Apply initial render state + seed data
431
+ // -------------------------------------------------------------------
432
+
433
+ try {
434
+ chart.applyRenderState(currentKWidth, currentKGap, initialZoomLevel)
435
+ } catch {
436
+ /* tolerate jsdom */
437
+ }
438
+
439
+ if (opts.data) {
409
440
  try {
410
- chart.applyRenderState(currentKWidth, currentKGap, initialZoomLevel)
441
+ chart.setData([...opts.data])
411
442
  } catch {
412
- /* tolerate jsdom */
413
- }
414
-
415
- if (opts.data) {
416
- try {
417
- chart.setData([...opts.data])
418
- } catch {
419
- /* tolerate first-paint racing */
420
- }
421
- }
422
-
423
- // Apply initial DataFetcher
424
- if (opts.dataFetcher) {
425
- chart.setDataFetcher(opts.dataFetcher)
426
- }
427
-
428
- // Apply initial symbols
429
- if (opts.symbols && opts.symbols.length > 0) {
430
- chart.setSymbols(opts.symbols)
431
- }
432
-
433
- // Apply initial theme if non-default
434
- if (opts.theme && opts.theme !== 'light') {
435
- chart.setTheme(opts.theme)
436
- }
437
-
438
- // -------------------------------------------------------------------
439
- // Signal bridges — subscribe to Chart's facade signals and forward
440
- // -------------------------------------------------------------------
441
-
442
- const unsubs: Array<() => void> = []
443
-
444
- // viewport: after zoom/scroll through facade methods
445
- unsubs.push(
446
- chart.viewport.subscribe(() => {
447
- viewport.set(mapViewportState(chart.viewport.peek()))
448
- }),
449
- )
450
-
451
- // data
452
- unsubs.push(
453
- chart.data.subscribe(() => data.set(chart.data.peek())),
454
- )
455
-
456
- // dataLoading
457
- unsubs.push(
458
- chart.loading.subscribe(() => dataLoading.set(chart.loading.peek())),
459
- )
460
-
461
- // theme
462
- unsubs.push(
463
- chart.theme.subscribe(() => themeSignal.set(chart.theme.peek())),
464
- )
465
-
466
- // indicators
467
- unsubs.push(
468
- chart.indicators.subscribe(() =>
469
- indicators.set(chart.indicators.peek().map(mapIndicatorInstance)),
470
- ),
471
- )
472
-
473
- // subPanes
474
- unsubs.push(
475
- chart.subPanes.subscribe(() =>
476
- subPanes.set(chart.subPanes.peek().map(mapSubPaneInfo)),
477
- ),
478
- )
479
-
480
- // drawingTool
481
- unsubs.push(
482
- chart.drawingTool.subscribe(() =>
483
- drawingTool.set(mapDrawingTool(chart.drawingTool.peek())),
484
- ),
485
- )
486
-
487
- // drawings
488
- unsubs.push(
489
- chart.drawings.subscribe(() =>
490
- drawings.set(chart.drawings.peek().map(mapDrawingObject)),
491
- ),
492
- )
493
-
494
- // paneRatios
495
- unsubs.push(
496
- chart.paneRatios.subscribe(() => paneRatios.set(mapPaneRatios(chart.paneRatios.peek()))),
497
- )
498
-
499
- // paneLayout
500
- const paneLayout: Signal<ReadonlyArray<PaneSpec>> = createSignal<ReadonlyArray<PaneSpec>>([])
501
- unsubs.push(
502
- chart.paneLayout.subscribe(() => paneLayout.set([...chart.paneLayout.peek()])),
503
- )
504
-
505
- // interactionState
506
- unsubs.push(
507
- chart.interactionState.subscribe(() =>
508
- interactionState.set(mapInteractionSnapshot(chart.interactionState.peek())),
509
- ),
510
- )
511
-
512
- // comparisonColors
513
- unsubs.push(
514
- chart.comparisonColors.subscribe(() =>
515
- comparisonColors.set(new Map(chart.comparisonColors.peek())),
516
- ),
517
- )
518
-
519
- // comparisonLoading
520
- unsubs.push(
521
- chart.comparisonLoading.subscribe(() =>
522
- comparisonLoading.set(chart.comparisonLoading.peek()),
523
- ),
443
+ /* tolerate first-paint racing */
444
+ }
445
+ }
446
+
447
+ // Apply initial DataFetcher
448
+ if (opts.dataFetcher) {
449
+ chart.setDataFetcher(opts.dataFetcher)
450
+ }
451
+
452
+ // Apply initial symbols
453
+ if (opts.symbols && opts.symbols.length > 0) {
454
+ chart.setSymbols(opts.symbols)
455
+ }
456
+
457
+ // Apply initial theme if non-default
458
+ if (opts.theme && opts.theme !== 'light') {
459
+ chart.setTheme(opts.theme)
460
+ }
461
+
462
+ // -------------------------------------------------------------------
463
+ // Signal bridges — subscribe to Chart's facade signals and forward
464
+ // -------------------------------------------------------------------
465
+
466
+ const unsubs: Array<() => void> = []
467
+
468
+ // viewport: after zoom/scroll through facade methods
469
+ unsubs.push(
470
+ chart.viewport.subscribe(() => {
471
+ viewport.set(mapViewportState(chart.viewport.peek()))
472
+ }),
473
+ )
474
+
475
+ // data
476
+ unsubs.push(chart.data.subscribe(() => data.set(chart.data.peek())))
477
+
478
+ // dataLoading
479
+ unsubs.push(chart.loading.subscribe(() => dataLoading.set(chart.loading.peek())))
480
+
481
+ // theme
482
+ unsubs.push(chart.theme.subscribe(() => themeSignal.set(chart.theme.peek())))
483
+
484
+ // indicators
485
+ unsubs.push(
486
+ chart.indicators.subscribe(() =>
487
+ indicators.set(chart.indicators.peek().map(mapIndicatorInstance)),
488
+ ),
489
+ )
490
+
491
+ // subPanes
492
+ unsubs.push(
493
+ chart.subPanes.subscribe(() => subPanes.set(chart.subPanes.peek().map(mapSubPaneInfo))),
494
+ )
495
+
496
+ // drawingTool
497
+ unsubs.push(
498
+ chart.drawingTool.subscribe(() => drawingTool.set(mapDrawingTool(chart.drawingTool.peek()))),
499
+ )
500
+
501
+ // drawings
502
+ unsubs.push(
503
+ chart.drawings.subscribe(() => drawings.set(chart.drawings.peek().map(mapDrawingObject))),
504
+ )
505
+
506
+ // paneRatios
507
+ unsubs.push(
508
+ chart.paneRatios.subscribe(() => paneRatios.set(mapPaneRatios(chart.paneRatios.peek()))),
509
+ )
510
+
511
+ // paneLayout
512
+ const paneLayout: Signal<ReadonlyArray<PaneSpec>> = createSignal<ReadonlyArray<PaneSpec>>([])
513
+ unsubs.push(chart.paneLayout.subscribe(() => paneLayout.set([...chart.paneLayout.peek()])))
514
+
515
+ // interactionState
516
+ unsubs.push(
517
+ chart.interactionState.subscribe(() =>
518
+ interactionState.set(mapInteractionSnapshot(chart.interactionState.peek())),
519
+ ),
520
+ )
521
+
522
+ // comparisonColors
523
+ unsubs.push(
524
+ chart.comparisonColors.subscribe(() =>
525
+ comparisonColors.set(new Map(chart.comparisonColors.peek())),
526
+ ),
527
+ )
528
+
529
+ // comparisonLoading
530
+ unsubs.push(
531
+ chart.comparisonLoading.subscribe(() => comparisonLoading.set(chart.comparisonLoading.peek())),
532
+ )
533
+
534
+ // -------------------------------------------------------------------
535
+ // Lifecycle guard
536
+ // -------------------------------------------------------------------
537
+
538
+ let disposed = false
539
+
540
+ // -------------------------------------------------------------------
541
+ // Public methods — delegate to Chart facade
542
+ // -------------------------------------------------------------------
543
+
544
+ function setData(next: ReadonlyArray<KLineData>): void {
545
+ if (disposed) return
546
+ try {
547
+ chart.setData([...next])
548
+ } catch {
549
+ data.set([...next])
550
+ }
551
+ }
552
+
553
+ function setSymbols(next: ReadonlyArray<SymbolSpec>): void {
554
+ if (disposed) return
555
+ chart.setSymbols(next)
556
+ }
557
+
558
+ function addComparisonSymbol(spec: SymbolSpec): void {
559
+ if (disposed) return
560
+ chart.addComparisonSymbol(spec)
561
+ }
562
+
563
+ function removeComparisonSymbol(symbol: string): void {
564
+ if (disposed) return
565
+ chart.removeComparisonSymbol(symbol)
566
+ }
567
+
568
+ function setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void {
569
+ if (disposed) return
570
+ chart.setComparisonData(symbol, [...data])
571
+ }
572
+
573
+ function setCurrentSymbol(symbol: string): void {
574
+ if (disposed) return
575
+ chart.setCurrentSymbol(symbol)
576
+ }
577
+
578
+ function setCurrentPeriod(period: string): void {
579
+ if (disposed) return
580
+ chart.setCurrentPeriod(period)
581
+ }
582
+
583
+ function switchToTimeShareForDate(dateYYYYMMDD: number): void {
584
+ if (disposed) return
585
+ chart.switchToTimeShareForDate(dateYYYYMMDD)
586
+ }
587
+
588
+ function registerSymbols(infos: ReadonlyArray<SymbolInfo>): void {
589
+ if (disposed) return
590
+ chart.registerSymbols(infos)
591
+ }
592
+
593
+ function applyCustomData(source: CustomDataSource): void {
594
+ if (disposed) return
595
+ chart.applyCustomData(source)
596
+ }
597
+
598
+ function setDataFetcher(fetcher: DataFetcher | null): void {
599
+ if (disposed) return
600
+ chart.setDataFetcher(fetcher)
601
+ }
602
+
603
+ function ensureDataRange(startTs: number): void {
604
+ if (disposed) return
605
+ const buf = chart.dataBuffer
606
+ const win = buf.loadedWindow
607
+ if (!win || startTs >= win.earliestTs) return
608
+ buf.ensureRange(startTs, win.earliestTs)
609
+ }
610
+
611
+ function appendData(next: ReadonlyArray<KLineData>): void {
612
+ if (disposed) return
613
+ const current = data.peek()
614
+ const merged = [...current, ...next]
615
+ setData(merged)
616
+ }
617
+
618
+ function getData(): ReadonlyArray<KLineData> {
619
+ if (disposed) return []
620
+ return chart.getData()
621
+ }
622
+
623
+ function getZoomLevelCount(): number {
624
+ if (disposed) return 0
625
+ return chart.getZoomLevelCount()
626
+ }
627
+
628
+ function setTheme(nextTheme: 'light' | 'dark'): void {
629
+ if (disposed) return
630
+ chart.setTheme(nextTheme)
631
+ }
632
+
633
+ function zoomToLevel(level: number, anchorX?: number): void {
634
+ if (disposed) return
635
+ chart.zoomToLevel(level, anchorX)
636
+ }
637
+
638
+ function zoomIn(anchorX?: number): void {
639
+ if (disposed) return
640
+ chart.zoomIn(anchorX)
641
+ }
642
+
643
+ function zoomOut(anchorX?: number): void {
644
+ if (disposed) return
645
+ chart.zoomOut(anchorX)
646
+ }
647
+
648
+ function handlePointerEvent(
649
+ e: PointerEvent,
650
+ drawingController?: DrawingControllerCallbacks,
651
+ ): boolean {
652
+ if (disposed) return false
653
+ return chart.handlePointerEvent(e, drawingController)
654
+ }
655
+
656
+ function handleWheelEvent(e: WheelEvent): void {
657
+ if (disposed) return
658
+ chart.handleWheelEvent(e)
659
+ }
660
+
661
+ function handleScrollEvent(): void {
662
+ if (disposed) return
663
+ chart.handleScrollEvent()
664
+ }
665
+
666
+ function handlePinchZoom(delta: number, centerClientX: number): void {
667
+ if (disposed) return
668
+ chart.handlePinchZoom(delta, centerClientX)
669
+ }
670
+
671
+ function addIndicator(
672
+ definitionId: string,
673
+ role: 'main' | 'sub',
674
+ params?: Record<string, unknown>,
675
+ ): string | null {
676
+ if (disposed) return null
677
+ return chart.addIndicator(definitionId, role, params)
678
+ }
679
+
680
+ function removeIndicator(instanceId: string): boolean {
681
+ if (disposed) return false
682
+ return chart.removeIndicator(instanceId)
683
+ }
684
+
685
+ function updateIndicatorParams(instanceId: string, params: Record<string, unknown>): boolean {
686
+ if (disposed) return false
687
+ return chart.updateIndicatorParams(instanceId, params)
688
+ }
689
+
690
+ function updateRendererConfig(name: string, config: Record<string, unknown>): void {
691
+ if (disposed) return
692
+ chart.updateRendererConfig(name, config)
693
+ }
694
+
695
+ function setTooltipSize(size: { width: number; height: number }): void {
696
+ if (disposed) return
697
+ chart.interaction.setTooltipSize(size)
698
+ }
699
+
700
+ function setTooltipAnchorPositioning(enabled: boolean): void {
701
+ if (disposed) return
702
+ chart.interaction.setTooltipAnchorPositioning(enabled)
703
+ }
704
+
705
+ function getContentWidth(): number {
706
+ if (disposed) return 0
707
+ return chart.getContentWidth()
708
+ }
709
+
710
+ function getLeftLoadBufferWidth(): number {
711
+ if (disposed) return 0
712
+ return chart.getLeftLoadBufferWidth()
713
+ }
714
+
715
+ function scrollToRight(): void {
716
+ if (disposed) return
717
+ chart.scrollToRight()
718
+ }
719
+
720
+ function getIndicatorTitle(instanceId: string): string | undefined {
721
+ if (disposed) return undefined
722
+ const instances = chart.indicators.peek()
723
+ const match = instances.find((inst) => inst.id === instanceId)
724
+ return match?.label
725
+ }
726
+
727
+ function setDrawingTool(tool: DrawingToolType | null): void {
728
+ if (disposed) return
729
+ chart.setDrawingTool(tool)
730
+ }
731
+
732
+ function clearDrawings(): void {
733
+ if (disposed) return
734
+ chart.clearDrawings()
735
+ }
736
+
737
+ function removeDrawing(drawingId: string): void {
738
+ if (disposed) return
739
+ chart.removeDrawing(drawingId)
740
+ }
741
+
742
+ // ---- DrawingChartAdapter methods ----
743
+
744
+ function setDrawings(drawings: any[]): void {
745
+ if (disposed) return
746
+ chart.setDrawings(drawings)
747
+ }
748
+
749
+ function getFullDrawings(): any[] {
750
+ if (disposed) return []
751
+ return chart.drawings() as any[]
752
+ }
753
+
754
+ function setSelectedDrawingId(id: string | null): void {
755
+ if (disposed) return
756
+ chart.setSelectedDrawingId(id)
757
+ }
758
+
759
+ function getViewport(): { scrollLeft: number; plotWidth: number; plotHeight: number } | null {
760
+ if (disposed) return null
761
+ const vp = chart.getViewport()
762
+ return vp
763
+ }
764
+
765
+ function getKWidthKGap(): { kWidth: number; kGap: number } {
766
+ if (disposed) return { kWidth: 0, kGap: 0 }
767
+ const opt = chart.getOption()
768
+ return { kWidth: opt.kWidth, kGap: opt.kGap }
769
+ }
770
+
771
+ function getCurrentDpr(): number {
772
+ if (disposed) return 1
773
+ return chart.getCurrentDpr()
774
+ }
775
+
776
+ function getLogicalIndexAtX(mouseX: number): number | null {
777
+ if (disposed) return null
778
+ return chart.getLogicalIndexAtX(mouseX)
779
+ }
780
+
781
+ function getTimestampAtLogicalIndex(index: number): number | null {
782
+ if (disposed) return null
783
+ return chart.getTimestampAtLogicalIndex(index)
784
+ }
785
+
786
+ function priceToY(paneId: string, price: number): number {
787
+ if (disposed) return 0
788
+ const renderer = chart.getPaneRenderers().find((item) => item.getPane().id === paneId)
789
+ return renderer?.getPane().yAxis.priceToY(price) ?? 0
790
+ }
791
+
792
+ function yToPrice(paneId: string, y: number): number {
793
+ if (disposed) return 0
794
+ const renderer = chart.getPaneRenderers().find((item) => item.getPane().id === paneId)
795
+ return renderer?.getPane().yAxis.yToPrice(y) ?? 0
796
+ }
797
+
798
+ function getPaneInfo(paneId: string): PaneLayoutInfo | undefined {
799
+ if (disposed) return undefined
800
+ const renderer = chart.getPaneRenderers().find((item) => item.getPane().id === paneId)
801
+ const pane = renderer?.getPane()
802
+ if (!pane) return undefined
803
+ return { paneId: pane.id, top: pane.top, height: pane.height }
804
+ }
805
+
806
+ function createSubPane(
807
+ paneId: string,
808
+ indicatorId: string,
809
+ params?: Record<string, unknown>,
810
+ ): boolean {
811
+ if (disposed) return false
812
+ return chart.createSubPane(
813
+ paneId,
814
+ indicatorId as never,
815
+ params as Record<string, string | number | boolean> | undefined,
524
816
  )
525
-
526
- // -------------------------------------------------------------------
527
- // Lifecycle guard
528
- // -------------------------------------------------------------------
529
-
530
- let disposed = false
531
-
532
- // -------------------------------------------------------------------
533
- // Public methods — delegate to Chart facade
534
- // -------------------------------------------------------------------
535
-
536
- function setData(next: ReadonlyArray<KLineData>): void {
537
- if (disposed) return
538
- try {
539
- chart.setData([...next])
540
- } catch {
541
- data.set([...next])
542
- }
543
- }
544
-
545
- function setSymbols(next: ReadonlyArray<SymbolSpec>): void {
546
- if (disposed) return
547
- chart.setSymbols(next)
548
- }
549
-
550
- function addComparisonSymbol(spec: SymbolSpec): void {
551
- if (disposed) return
552
- chart.addComparisonSymbol(spec)
553
- }
554
-
555
- function removeComparisonSymbol(symbol: string): void {
556
- if (disposed) return
557
- chart.removeComparisonSymbol(symbol)
558
- }
559
-
560
- function setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void {
561
- if (disposed) return
562
- chart.setComparisonData(symbol, [...data])
563
- }
564
-
565
- function setCurrentSymbol(symbol: string): void {
566
- if (disposed) return
567
- chart.setCurrentSymbol(symbol)
568
- }
569
-
570
- function setCurrentPeriod(period: string): void {
571
- if (disposed) return
572
- chart.setCurrentPeriod(period)
573
- }
574
-
575
- function switchToTimeShareForDate(dateYYYYMMDD: number): void {
576
- if (disposed) return
577
- chart.switchToTimeShareForDate(dateYYYYMMDD)
578
- }
579
-
580
- function applyCustomData(source: CustomDataSource): void {
581
- if (disposed) return
582
- chart.applyCustomData(source)
583
- }
584
-
585
- function setDataFetcher(fetcher: DataFetcher | null): void {
586
- if (disposed) return
587
- chart.setDataFetcher(fetcher)
588
- }
589
-
590
- function ensureDataRange(startTs: number): void {
591
- if (disposed) return
592
- const buf = chart.dataBuffer
593
- const win = buf.loadedWindow
594
- if (!win || startTs >= win.earliestTs) return
595
- buf.ensureRange(startTs, win.earliestTs)
596
- }
597
-
598
- function appendData(next: ReadonlyArray<KLineData>): void {
599
- if (disposed) return
600
- const current = data.peek()
601
- const merged = [...current, ...next]
602
- setData(merged)
603
- }
604
-
605
- function getData(): ReadonlyArray<KLineData> {
606
- if (disposed) return []
607
- return chart.getData()
608
- }
609
-
610
- function getZoomLevelCount(): number {
611
- if (disposed) return 0
612
- return chart.getZoomLevelCount()
613
- }
614
-
615
- function setTheme(nextTheme: 'light' | 'dark'): void {
616
- if (disposed) return
617
- chart.setTheme(nextTheme)
618
- }
619
-
620
- function zoomToLevel(level: number, anchorX?: number): void {
621
- if (disposed) return
622
- chart.zoomToLevel(level, anchorX)
623
- }
624
-
625
- function zoomIn(anchorX?: number): void {
626
- if (disposed) return
627
- chart.zoomIn(anchorX)
628
- }
629
-
630
- function zoomOut(anchorX?: number): void {
631
- if (disposed) return
632
- chart.zoomOut(anchorX)
633
- }
634
-
635
- function handlePointerEvent(
636
- e: PointerEvent,
637
- drawingController?: DrawingControllerCallbacks,
638
- ): boolean {
639
- if (disposed) return false
640
- return chart.handlePointerEvent(e, drawingController)
641
- }
642
-
643
- function handleWheelEvent(e: WheelEvent): void {
644
- if (disposed) return
645
- chart.handleWheelEvent(e)
646
- }
647
-
648
- function handleScrollEvent(): void {
649
- if (disposed) return
650
- chart.handleScrollEvent()
651
- }
652
-
653
- function handlePinchZoom(delta: number, centerClientX: number): void {
654
- if (disposed) return
655
- chart.handlePinchZoom(delta, centerClientX)
656
- }
657
-
658
- function addIndicator(
659
- definitionId: string,
660
- role: 'main' | 'sub',
661
- params?: Record<string, unknown>,
662
- ): string | null {
663
- if (disposed) return null
664
- return chart.addIndicator(definitionId, role, params)
665
- }
666
-
667
- function removeIndicator(instanceId: string): boolean {
668
- if (disposed) return false
669
- return chart.removeIndicator(instanceId)
670
- }
671
-
672
- function updateIndicatorParams(
673
- instanceId: string,
674
- params: Record<string, unknown>,
675
- ): boolean {
676
- if (disposed) return false
677
- return chart.updateIndicatorParams(instanceId, params)
678
- }
679
-
680
- function updateRendererConfig(name: string, config: Record<string, unknown>): void {
681
- if (disposed) return
682
- chart.updateRendererConfig(name, config)
683
- }
684
-
685
- function setTooltipSize(size: { width: number; height: number }): void {
686
- if (disposed) return
687
- chart.interaction.setTooltipSize(size)
688
- }
689
-
690
- function setTooltipAnchorPositioning(enabled: boolean): void {
691
- if (disposed) return
692
- chart.interaction.setTooltipAnchorPositioning(enabled)
693
- }
694
-
695
- function getContentWidth(): number {
696
- if (disposed) return 0
697
- return chart.getContentWidth()
698
- }
699
-
700
- function getLeftLoadBufferWidth(): number {
701
- if (disposed) return 0
702
- return chart.getLeftLoadBufferWidth()
703
- }
704
-
705
- function scrollToRight(): void {
706
- if (disposed) return
707
- chart.scrollToRight()
708
- }
709
-
710
- function getIndicatorTitle(instanceId: string): string | undefined {
711
- if (disposed) return undefined
712
- const instances = chart.indicators.peek()
713
- const match = instances.find(inst => inst.id === instanceId)
714
- return match?.label
715
- }
716
-
717
- function setDrawingTool(tool: DrawingToolType | null): void {
718
- if (disposed) return
719
- chart.setDrawingTool(tool)
720
- }
721
-
722
- function clearDrawings(): void {
723
- if (disposed) return
724
- chart.clearDrawings()
725
- }
726
-
727
- function removeDrawing(drawingId: string): void {
728
- if (disposed) return
729
- chart.removeDrawing(drawingId)
730
- }
731
-
732
- // ---- DrawingChartAdapter methods ----
733
-
734
- function setDrawings(drawings: any[]): void {
735
- if (disposed) return
736
- chart.setDrawings(drawings)
737
- }
738
-
739
- function getFullDrawings(): any[] {
740
- if (disposed) return []
741
- return chart.drawings() as any[]
742
- }
743
-
744
- function setSelectedDrawingId(id: string | null): void {
745
- if (disposed) return
746
- chart.setSelectedDrawingId(id)
747
- }
748
-
749
- function getViewport(): { scrollLeft: number; plotWidth: number; plotHeight: number } | null {
750
- if (disposed) return null
751
- const vp = chart.getViewport()
752
- return vp
753
- }
754
-
755
- function getKWidthKGap(): { kWidth: number; kGap: number } {
756
- if (disposed) return { kWidth: 0, kGap: 0 }
757
- const opt = chart.getOption()
758
- return { kWidth: opt.kWidth, kGap: opt.kGap }
759
- }
760
-
761
- function getCurrentDpr(): number {
762
- if (disposed) return 1
763
- return chart.getCurrentDpr()
764
- }
765
-
766
- function getLogicalIndexAtX(mouseX: number): number | null {
767
- if (disposed) return null
768
- return chart.getLogicalIndexAtX(mouseX)
769
- }
770
-
771
- function getTimestampAtLogicalIndex(index: number): number | null {
772
- if (disposed) return null
773
- return chart.getTimestampAtLogicalIndex(index)
774
- }
775
-
776
- function priceToY(paneId: string, price: number): number {
777
- if (disposed) return 0
778
- const renderer = chart.getPaneRenderers().find(item => item.getPane().id === paneId)
779
- return renderer?.getPane().yAxis.priceToY(price) ?? 0
780
- }
781
-
782
- function yToPrice(paneId: string, y: number): number {
783
- if (disposed) return 0
784
- const renderer = chart.getPaneRenderers().find(item => item.getPane().id === paneId)
785
- return renderer?.getPane().yAxis.yToPrice(y) ?? 0
786
- }
787
-
788
- function getPaneInfo(paneId: string): PaneLayoutInfo | undefined {
789
- if (disposed) return undefined
790
- const renderer = chart.getPaneRenderers().find(item => item.getPane().id === paneId)
791
- const pane = renderer?.getPane()
792
- if (!pane) return undefined
793
- return { paneId: pane.id, top: pane.top, height: pane.height }
794
- }
795
-
796
- function createSubPane(paneId: string, indicatorId: string, params?: Record<string, unknown>): boolean {
797
- if (disposed) return false
798
- return chart.createSubPane(paneId, indicatorId as never, params as Record<string, string | number | boolean> | undefined)
799
- }
800
-
801
- function clearSubPanes(): void {
802
- if (disposed) return
803
- chart.clearSubPanes()
804
- }
805
-
806
- function replaceSubPaneIndicator(
807
- paneId: string,
808
- indicatorId: string,
809
- params?: Record<string, unknown>,
810
- ): boolean {
811
- if (disposed) return false
812
- try {
813
- chart.replaceSubPaneIndicator(paneId, indicatorId as never, params as Record<string, string | number | boolean>)
814
- return true
815
- } catch {
816
- return false
817
- }
818
- }
819
-
820
- function updatePaneLayout(panes: PaneSpec[]): void {
821
- if (disposed) return
822
- chart.updatePaneLayout(panes)
823
- }
824
-
825
- function resizeSubPane(paneId: string, deltaY: number): boolean {
826
- if (disposed) return false
827
- return chart.resizeSubPane(paneId, deltaY)
828
- }
829
-
830
- function updateCustomMarkers(markers: ReadonlyArray<CustomMarkerEntity>): void {
831
- if (disposed) return
832
- chart.updateCustomMarkers([...markers])
833
- }
834
-
835
- function clearCustomMarkers(): void {
836
- if (disposed) return
837
- chart.clearCustomMarkers()
838
- }
839
-
840
- function updateSettingsFacade(settings: Record<string, unknown>): void {
841
- if (disposed) return
842
- chart.updateSettingsFacade(settings)
843
- }
844
-
845
- function updateOptionsFacade(options: Record<string, unknown>): void {
846
- if (disposed) return
847
- chart.updateOptionsFacade(options)
848
- }
849
-
850
- function dispose(): void {
851
- if (disposed) return
852
- disposed = true
853
- bridge?.destroy()
854
- for (const unsub of unsubs) {
855
- try {
856
- unsub()
857
- } catch {
858
- /* best-effort */
859
- }
860
- }
861
- try {
862
- void chart.destroy()
863
- } catch {
864
- /* best-effort */
865
- }
866
- try {
867
- mounted.cleanup()
868
- } catch {
869
- /* best-effort */
870
- }
871
- }
872
-
873
- // ---------------------------------------------------------------------------
874
- // MCP bridge (optional)
875
- // ---------------------------------------------------------------------------
876
-
877
- let bridge: ChartBridge | null = null
878
- if (opts.mcp) {
879
- const mcp = opts.mcp
880
- const wsUrl = mcp.wsUrl ?? 'ws://localhost:8081'
881
- console.info(`[MCP] Creating bridge, wsUrl=${wsUrl}`)
882
- bridge = new ChartBridge({
883
- wsUrl,
884
- onToolCall: mcp.onToolCall ?? (() => ({
885
- success: false,
886
- error:
887
- 'No onToolCall handler provided. Import executeTool from @363045841yyt/klinechart-ai-runtime and pass it via mcp.onToolCall.',
888
- })),
889
- autoReconnect: mcp.autoReconnect,
890
- })
891
- bridge.on('connected', () => {
892
- console.info(`[MCP] Bridge connected, sessionId=${bridge!.sessionId}`)
893
- })
894
- bridge.on('error', (err) => {
895
- console.error(`[MCP] Bridge error: ${(err as Error).message}`)
896
- })
897
- bridge.on('disconnected', () => {
898
- console.warn(`[MCP] Bridge disconnected`)
899
- })
900
- bridge.connect().catch((err) => {
901
- console.error(`[MCP] Bridge connect failed: ${(err as Error).message}`)
902
- })
817
+ }
818
+
819
+ function clearSubPanes(): void {
820
+ if (disposed) return
821
+ chart.clearSubPanes()
822
+ }
823
+
824
+ function replaceSubPaneIndicator(
825
+ paneId: string,
826
+ indicatorId: string,
827
+ params?: Record<string, unknown>,
828
+ ): boolean {
829
+ if (disposed) return false
830
+ try {
831
+ chart.replaceSubPaneIndicator(
832
+ paneId,
833
+ indicatorId as never,
834
+ params as Record<string, string | number | boolean>,
835
+ )
836
+ return true
837
+ } catch {
838
+ return false
839
+ }
840
+ }
841
+
842
+ function updatePaneLayout(panes: PaneSpec[]): void {
843
+ if (disposed) return
844
+ chart.updatePaneLayout(panes)
845
+ }
846
+
847
+ function resizeSubPane(paneId: string, deltaY: number): boolean {
848
+ if (disposed) return false
849
+ return chart.resizeSubPane(paneId, deltaY)
850
+ }
851
+
852
+ function updateCustomMarkers(markers: ReadonlyArray<CustomMarkerEntity>): void {
853
+ if (disposed) return
854
+ chart.updateCustomMarkers([...markers])
855
+ }
856
+
857
+ function clearCustomMarkers(): void {
858
+ if (disposed) return
859
+ chart.clearCustomMarkers()
860
+ }
861
+
862
+ function updateSettingsFacade(settings: Record<string, unknown>): void {
863
+ if (disposed) return
864
+ chart.updateSettingsFacade(settings)
865
+ }
866
+
867
+ function updateOptionsFacade(options: Record<string, unknown>): void {
868
+ if (disposed) return
869
+ chart.updateOptionsFacade(options)
870
+ }
871
+
872
+ function dispose(): void {
873
+ if (disposed) return
874
+ disposed = true
875
+ bridge?.destroy()
876
+ for (const unsub of unsubs) {
877
+ try {
878
+ unsub()
879
+ } catch {
880
+ /* best-effort */
881
+ }
903
882
  }
904
-
905
- return {
906
- viewport,
907
- data,
908
- dataLoading,
909
- symbols,
910
- theme: themeSignal,
911
- indicators,
912
- subPanes,
913
- drawingTool,
914
- drawings,
915
- paneRatios,
916
- paneLayout,
917
- interactionState,
918
- comparisonColors,
919
- comparisonLoading,
920
- catalog: DEFAULT_INDICATOR_CATALOG,
921
- alertController: chart.alertController,
922
- setSymbols,
923
- addComparisonSymbol,
924
- removeComparisonSymbol,
925
- setComparisonData,
926
- setCurrentSymbol,
927
- setCurrentPeriod,
928
- switchToTimeShareForDate,
929
- applyCustomData,
930
- setDataFetcher,
931
- ensureDataRange,
932
- setData,
933
- appendData,
934
- updateData: setData,
935
- getData,
936
- getZoomLevelCount,
937
- setTheme,
938
- zoomToLevel,
939
- zoomIn,
940
- zoomOut,
941
- handlePointerEvent,
942
- handleWheelEvent,
943
- handleScrollEvent,
944
- handlePinchZoom,
945
- addIndicator,
946
- removeIndicator,
947
- updateIndicatorParams,
948
- updateRendererConfig,
949
- setTooltipSize,
950
- setTooltipAnchorPositioning,
951
- getIndicatorTitle,
952
- getContentWidth,
953
- getLeftLoadBufferWidth,
954
- scrollToRight,
955
- setDrawingTool,
956
- clearDrawings,
957
- removeDrawing,
958
- setDrawings,
959
- getFullDrawings,
960
- setSelectedDrawingId,
961
- getViewport,
962
- getKWidthKGap,
963
- getCurrentDpr,
964
- getLogicalIndexAtX,
965
- getTimestampAtLogicalIndex,
966
- priceToY,
967
- yToPrice,
968
- getPaneInfo,
969
- createSubPane,
970
- clearSubPanes,
971
- replaceSubPaneIndicator,
972
- updatePaneLayout,
973
- resizeSubPane,
974
- updateCustomMarkers,
975
- clearCustomMarkers,
976
- updateSettingsFacade,
977
- updateOptionsFacade,
978
- dispose,
883
+ try {
884
+ void chart.destroy()
885
+ } catch {
886
+ /* best-effort */
979
887
  }
888
+ try {
889
+ mounted.cleanup()
890
+ } catch {
891
+ /* best-effort */
892
+ }
893
+ }
894
+
895
+ // ---------------------------------------------------------------------------
896
+ // MCP bridge (optional)
897
+ // ---------------------------------------------------------------------------
898
+
899
+ let bridge: ChartBridge | null = null
900
+ if (opts.mcp) {
901
+ const mcp = opts.mcp
902
+ const wsUrl = mcp.wsUrl ?? 'ws://localhost:8081'
903
+ console.info(`[MCP] Creating bridge, wsUrl=${wsUrl}`)
904
+ bridge = new ChartBridge({
905
+ wsUrl,
906
+ onToolCall:
907
+ mcp.onToolCall ??
908
+ (() => ({
909
+ success: false,
910
+ error:
911
+ 'No onToolCall handler provided. Import executeTool from @363045841yyt/klinechart-ai-runtime and pass it via mcp.onToolCall.',
912
+ })),
913
+ autoReconnect: mcp.autoReconnect,
914
+ })
915
+ bridge.on('connected', () => {
916
+ console.info(`[MCP] Bridge connected, sessionId=${bridge!.sessionId}`)
917
+ })
918
+ bridge.on('error', (err) => {
919
+ console.error(`[MCP] Bridge error: ${(err as Error).message}`)
920
+ })
921
+ bridge.on('disconnected', () => {
922
+ console.warn(`[MCP] Bridge disconnected`)
923
+ })
924
+ bridge.connect().catch((err) => {
925
+ console.error(`[MCP] Bridge connect failed: ${(err as Error).message}`)
926
+ })
927
+ }
928
+
929
+ return {
930
+ viewport,
931
+ data,
932
+ dataLoading,
933
+ symbols,
934
+ theme: themeSignal,
935
+ indicators,
936
+ subPanes,
937
+ drawingTool,
938
+ drawings,
939
+ paneRatios,
940
+ paneLayout,
941
+ interactionState,
942
+ comparisonColors,
943
+ comparisonLoading,
944
+ symbolCatalog,
945
+ catalog: DEFAULT_INDICATOR_CATALOG,
946
+ alertController: chart.alertController,
947
+ setSymbols,
948
+ registerSymbols,
949
+ addComparisonSymbol,
950
+ removeComparisonSymbol,
951
+ setComparisonData,
952
+ setCurrentSymbol,
953
+ setCurrentPeriod,
954
+ switchToTimeShareForDate,
955
+ applyCustomData,
956
+ setDataFetcher,
957
+ ensureDataRange,
958
+ setData,
959
+ appendData,
960
+ updateData: setData,
961
+ getData,
962
+ getZoomLevelCount,
963
+ setTheme,
964
+ zoomToLevel,
965
+ zoomIn,
966
+ zoomOut,
967
+ handlePointerEvent,
968
+ handleWheelEvent,
969
+ handleScrollEvent,
970
+ handlePinchZoom,
971
+ addIndicator,
972
+ removeIndicator,
973
+ updateIndicatorParams,
974
+ updateRendererConfig,
975
+ setTooltipSize,
976
+ setTooltipAnchorPositioning,
977
+ getIndicatorTitle,
978
+ getContentWidth,
979
+ getLeftLoadBufferWidth,
980
+ scrollToRight,
981
+ setDrawingTool,
982
+ clearDrawings,
983
+ removeDrawing,
984
+ setDrawings,
985
+ getFullDrawings,
986
+ setSelectedDrawingId,
987
+ getViewport,
988
+ getKWidthKGap,
989
+ getCurrentDpr,
990
+ getLogicalIndexAtX,
991
+ getTimestampAtLogicalIndex,
992
+ priceToY,
993
+ yToPrice,
994
+ getPaneInfo,
995
+ createSubPane,
996
+ clearSubPanes,
997
+ replaceSubPaneIndicator,
998
+ updatePaneLayout,
999
+ resizeSubPane,
1000
+ updateCustomMarkers,
1001
+ clearCustomMarkers,
1002
+ updateSettingsFacade,
1003
+ updateOptionsFacade,
1004
+ dispose,
1005
+ }
980
1006
  }