@363045841yyt/klinechart-core 0.8.5 → 0.8.7

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 (517) hide show
  1. package/dist/config/chartSettings.d.ts +21 -2
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +9 -1
  4. package/dist/config/chartSettings.js.map +1 -1
  5. package/dist/controllers/createChartController.d.ts.map +1 -1
  6. package/dist/controllers/createChartController.js +50 -3
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/types.d.ts +34 -23
  9. package/dist/controllers/types.d.ts.map +1 -1
  10. package/dist/data-fetchers/baostock.d.ts +0 -3
  11. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  12. package/dist/data-fetchers/baostock.js +0 -1
  13. package/dist/data-fetchers/baostock.js.map +1 -1
  14. package/dist/data-fetchers/dataBuffer.d.ts +13 -2
  15. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  16. package/dist/data-fetchers/dataBuffer.js +41 -7
  17. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  18. package/dist/data-fetchers/dataBufferTypes.d.ts +11 -0
  19. package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -0
  20. package/dist/data-fetchers/dataBufferTypes.js +2 -0
  21. package/dist/data-fetchers/dataBufferTypes.js.map +1 -0
  22. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +4 -3
  23. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  24. package/dist/data-fetchers/fetcherDefinitionRegistry.js +9 -2
  25. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  26. package/dist/data-fetchers/gotdx/gotdx.d.ts +7 -0
  27. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +1 -0
  28. package/dist/data-fetchers/gotdx/gotdx.js +7 -0
  29. package/dist/data-fetchers/gotdx/gotdx.js.map +1 -0
  30. package/dist/data-fetchers/gotdx.d.ts +0 -8
  31. package/dist/data-fetchers/gotdx.d.ts.map +1 -1
  32. package/dist/data-fetchers/gotdx.js +40 -3
  33. package/dist/data-fetchers/gotdx.js.map +1 -1
  34. package/dist/data-fetchers/hundred-mock.d.ts +0 -3
  35. package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
  36. package/dist/data-fetchers/hundred-mock.js +0 -1
  37. package/dist/data-fetchers/hundred-mock.js.map +1 -1
  38. package/dist/data-fetchers/index.d.ts +10 -8
  39. package/dist/data-fetchers/index.d.ts.map +1 -1
  40. package/dist/data-fetchers/index.js +8 -7
  41. package/dist/data-fetchers/index.js.map +1 -1
  42. package/dist/data-fetchers/router.d.ts +2 -0
  43. package/dist/data-fetchers/router.d.ts.map +1 -1
  44. package/dist/data-fetchers/router.js +8 -1
  45. package/dist/data-fetchers/router.js.map +1 -1
  46. package/dist/data-fetchers/thousand-mock.d.ts +0 -3
  47. package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
  48. package/dist/data-fetchers/thousand-mock.js +0 -1
  49. package/dist/data-fetchers/thousand-mock.js.map +1 -1
  50. package/dist/data-fetchers/timeShareBuffer.d.ts +27 -0
  51. package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -0
  52. package/dist/data-fetchers/timeShareBuffer.js +79 -0
  53. package/dist/data-fetchers/timeShareBuffer.js.map +1 -0
  54. package/dist/data-fetchers/tradingview.d.ts +0 -8
  55. package/dist/data-fetchers/tradingview.d.ts.map +1 -1
  56. package/dist/data-fetchers/tradingview.js +1 -2
  57. package/dist/data-fetchers/tradingview.js.map +1 -1
  58. package/dist/data-fetchers/types.d.ts +9 -1
  59. package/dist/data-fetchers/types.d.ts.map +1 -1
  60. package/dist/engine/chart.d.ts +29 -1
  61. package/dist/engine/chart.d.ts.map +1 -1
  62. package/dist/engine/chart.js +140 -5
  63. package/dist/engine/chart.js.map +1 -1
  64. package/dist/engine/chartTypes.d.ts +3 -0
  65. package/dist/engine/chartTypes.d.ts.map +1 -1
  66. package/dist/engine/controller/interaction.d.ts +12 -1
  67. package/dist/engine/controller/interaction.d.ts.map +1 -1
  68. package/dist/engine/controller/interaction.js +105 -14
  69. package/dist/engine/controller/interaction.js.map +1 -1
  70. package/dist/engine/data/chartDataManager.d.ts +38 -11
  71. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  72. package/dist/engine/data/chartDataManager.js +491 -188
  73. package/dist/engine/data/chartDataManager.js.map +1 -1
  74. package/dist/engine/draw/pixelAlign.d.ts +0 -27
  75. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  76. package/dist/engine/draw/pixelAlign.js +1 -1
  77. package/dist/engine/draw/pixelAlign.js.map +1 -1
  78. package/dist/engine/indicators/calculators.d.ts +0 -104
  79. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  80. package/dist/engine/indicators/calculators.js +77 -171
  81. package/dist/engine/indicators/calculators.js.map +1 -1
  82. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  83. package/dist/engine/indicators/chartIndicatorManager.js +3 -2
  84. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  85. package/dist/engine/indicators/ichimokuState.d.ts +2 -0
  86. package/dist/engine/indicators/ichimokuState.d.ts.map +1 -1
  87. package/dist/engine/indicators/ichimokuState.js.map +1 -1
  88. package/dist/engine/indicators/macdState.d.ts +0 -5
  89. package/dist/engine/indicators/macdState.d.ts.map +1 -1
  90. package/dist/engine/indicators/macdState.js +1 -1
  91. package/dist/engine/indicators/macdState.js.map +1 -1
  92. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  93. package/dist/engine/indicators/registerBuiltins.js +1 -0
  94. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  95. package/dist/engine/indicators/rsiState.d.ts +0 -4
  96. package/dist/engine/indicators/rsiState.d.ts.map +1 -1
  97. package/dist/engine/indicators/rsiState.js +1 -1
  98. package/dist/engine/indicators/rsiState.js.map +1 -1
  99. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  100. package/dist/engine/indicators/scheduler.js +1 -7
  101. package/dist/engine/indicators/scheduler.js.map +1 -1
  102. package/dist/engine/indicators/visibleStateComposers.d.ts +14 -0
  103. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  104. package/dist/engine/indicators/visibleStateComposers.js +34 -0
  105. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  106. package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
  107. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  108. package/dist/engine/layout/chartPaneLayout.js +24 -6
  109. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  110. package/dist/engine/modes/kLineMode.d.ts +37 -0
  111. package/dist/engine/modes/kLineMode.d.ts.map +1 -0
  112. package/dist/engine/modes/kLineMode.js +22 -0
  113. package/dist/engine/modes/kLineMode.js.map +1 -0
  114. package/dist/engine/modes/timeShareMode.d.ts +37 -0
  115. package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
  116. package/dist/engine/modes/timeShareMode.js +59 -0
  117. package/dist/engine/modes/timeShareMode.js.map +1 -0
  118. package/dist/engine/modes/types.d.ts +47 -0
  119. package/dist/engine/modes/types.d.ts.map +1 -0
  120. package/dist/engine/modes/types.js +2 -0
  121. package/dist/engine/modes/types.js.map +1 -0
  122. package/dist/engine/paneRenderer.d.ts +4 -0
  123. package/dist/engine/paneRenderer.d.ts.map +1 -1
  124. package/dist/engine/paneRenderer.js +27 -40
  125. package/dist/engine/paneRenderer.js.map +1 -1
  126. package/dist/engine/render/chartRenderer.d.ts +4 -23
  127. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  128. package/dist/engine/render/chartRenderer.js +87 -17
  129. package/dist/engine/render/chartRenderer.js.map +1 -1
  130. package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
  131. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  132. package/dist/engine/renderers/Indicator/atr.js +3 -22
  133. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  134. package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
  135. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  136. package/dist/engine/renderers/Indicator/boll.js +3 -18
  137. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  138. package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
  139. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  140. package/dist/engine/renderers/Indicator/cci.js +8 -20
  141. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  142. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
  143. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  144. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
  145. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  146. package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
  147. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  148. package/dist/engine/renderers/Indicator/cmf.js +3 -15
  149. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  150. package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
  151. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  152. package/dist/engine/renderers/Indicator/dema.js +3 -17
  153. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  154. package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
  155. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  156. package/dist/engine/renderers/Indicator/donchian.js +2 -2
  157. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  158. package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
  159. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  160. package/dist/engine/renderers/Indicator/ene.js +3 -18
  161. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  162. package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
  163. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  164. package/dist/engine/renderers/Indicator/expma.js +2 -2
  165. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  166. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
  167. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  168. package/dist/engine/renderers/Indicator/fastk.js +11 -64
  169. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  170. package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
  171. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  172. package/dist/engine/renderers/Indicator/fib.js +2 -2
  173. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  174. package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
  175. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  176. package/dist/engine/renderers/Indicator/hma.js +3 -17
  177. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  178. package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
  179. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  180. package/dist/engine/renderers/Indicator/hv.js +3 -16
  181. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  182. package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
  183. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  184. package/dist/engine/renderers/Indicator/ichimoku.js +27 -5
  185. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  186. package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
  187. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  188. package/dist/engine/renderers/Indicator/kama.js +3 -17
  189. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  190. package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
  191. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  192. package/dist/engine/renderers/Indicator/keltner.js +2 -2
  193. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  194. package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
  195. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  196. package/dist/engine/renderers/Indicator/kst.js +2 -2
  197. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  198. package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
  199. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  200. package/dist/engine/renderers/Indicator/ma.js +1 -1
  201. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  202. package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
  203. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  204. package/dist/engine/renderers/Indicator/macd.js +2 -12
  205. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  206. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  207. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +205 -0
  208. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  209. package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
  210. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  211. package/dist/engine/renderers/Indicator/mfi.js +3 -15
  212. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  213. package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
  214. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  215. package/dist/engine/renderers/Indicator/mom.js +8 -23
  216. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  217. package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
  218. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  219. package/dist/engine/renderers/Indicator/obv.js +3 -14
  220. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  221. package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
  222. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  223. package/dist/engine/renderers/Indicator/parkinson.js +3 -16
  224. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  225. package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
  226. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  227. package/dist/engine/renderers/Indicator/pivot.js +2 -2
  228. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  229. package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
  230. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  231. package/dist/engine/renderers/Indicator/pvt.js +3 -14
  232. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  233. package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
  234. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  235. package/dist/engine/renderers/Indicator/roc.js +3 -15
  236. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  237. package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
  238. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  239. package/dist/engine/renderers/Indicator/rsi.js +3 -3
  240. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  241. package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
  242. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  243. package/dist/engine/renderers/Indicator/sar.js +2 -2
  244. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  245. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
  246. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  247. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
  248. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  249. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
  250. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
  251. package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
  252. package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
  253. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
  254. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
  255. package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
  256. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
  257. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
  258. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
  259. package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
  260. package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
  261. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
  262. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  263. package/dist/engine/renderers/Indicator/stoch.js +5 -46
  264. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  265. package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
  266. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  267. package/dist/engine/renderers/Indicator/structure.js +2 -2
  268. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  269. package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
  270. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  271. package/dist/engine/renderers/Indicator/supertrend.js +2 -2
  272. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  273. package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
  274. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  275. package/dist/engine/renderers/Indicator/tema.js +3 -17
  276. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  277. package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
  278. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  279. package/dist/engine/renderers/Indicator/trix.js +2 -2
  280. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  281. package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
  282. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  283. package/dist/engine/renderers/Indicator/vma.js +3 -15
  284. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  285. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
  286. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  287. package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
  288. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  289. package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
  290. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  291. package/dist/engine/renderers/Indicator/vwap.js +3 -14
  292. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  293. package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
  294. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  295. package/dist/engine/renderers/Indicator/wma.js +3 -17
  296. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  297. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
  298. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  299. package/dist/engine/renderers/Indicator/wmsr.js +8 -23
  300. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  301. package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
  302. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  303. package/dist/engine/renderers/Indicator/zones.js +2 -2
  304. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  305. package/dist/engine/renderers/candle.d.ts +0 -16
  306. package/dist/engine/renderers/candle.d.ts.map +1 -1
  307. package/dist/engine/renderers/candle.js +1 -1
  308. package/dist/engine/renderers/candle.js.map +1 -1
  309. package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
  310. package/dist/engine/renderers/comparisonLine.js +2 -0
  311. package/dist/engine/renderers/comparisonLine.js.map +1 -1
  312. package/dist/engine/renderers/crosshair.js +1 -1
  313. package/dist/engine/renderers/crosshair.js.map +1 -1
  314. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  315. package/dist/engine/renderers/extremaMarkers.js +2 -0
  316. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  317. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  318. package/dist/engine/renderers/lastPrice.js +7 -2
  319. package/dist/engine/renderers/lastPrice.js.map +1 -1
  320. package/dist/engine/renderers/leftYAxis.d.ts +11 -0
  321. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
  322. package/dist/engine/renderers/leftYAxis.js +67 -0
  323. package/dist/engine/renderers/leftYAxis.js.map +1 -0
  324. package/dist/engine/renderers/subVolume.d.ts +1 -13
  325. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  326. package/dist/engine/renderers/subVolume.js +1 -1
  327. package/dist/engine/renderers/subVolume.js.map +1 -1
  328. package/dist/engine/renderers/timeAxis.d.ts +0 -2
  329. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  330. package/dist/engine/renderers/timeAxis.js +4 -1
  331. package/dist/engine/renderers/timeAxis.js.map +1 -1
  332. package/dist/engine/renderers/timeShare.d.ts +3 -0
  333. package/dist/engine/renderers/timeShare.d.ts.map +1 -0
  334. package/dist/engine/renderers/timeShare.js +260 -0
  335. package/dist/engine/renderers/timeShare.js.map +1 -0
  336. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  337. package/dist/engine/renderers/yAxis.js +9 -1
  338. package/dist/engine/renderers/yAxis.js.map +1 -1
  339. package/dist/engine/scale/price.d.ts +0 -7
  340. package/dist/engine/scale/price.d.ts.map +1 -1
  341. package/dist/engine/scale/price.js +3 -2
  342. package/dist/engine/scale/price.js.map +1 -1
  343. package/dist/engine/theme/fonts.d.ts +0 -2
  344. package/dist/engine/theme/fonts.d.ts.map +1 -1
  345. package/dist/engine/theme/fonts.js +1 -1
  346. package/dist/engine/theme/fonts.js.map +1 -1
  347. package/dist/engine/utils/klineConfig.d.ts.map +1 -1
  348. package/dist/engine/utils/klineConfig.js +1 -5
  349. package/dist/engine/utils/klineConfig.js.map +1 -1
  350. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  351. package/dist/engine/viewport/chartViewportManager.js +6 -5
  352. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  353. package/dist/index.d.ts +1 -0
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.js +1 -0
  356. package/dist/index.js.map +1 -1
  357. package/dist/mcp/chartBridge.d.ts.map +1 -1
  358. package/dist/mcp/chartBridge.js +2 -1
  359. package/dist/mcp/chartBridge.js.map +1 -1
  360. package/dist/plugin/types.d.ts +1 -0
  361. package/dist/plugin/types.d.ts.map +1 -1
  362. package/dist/plugin/types.js.map +1 -1
  363. package/dist/semantic/types.d.ts +1 -1
  364. package/dist/semantic/types.d.ts.map +1 -1
  365. package/dist/tokens/theme-base.d.ts +5 -0
  366. package/dist/tokens/theme-base.d.ts.map +1 -0
  367. package/dist/tokens/theme-base.js +31 -0
  368. package/dist/tokens/theme-base.js.map +1 -0
  369. package/dist/tokens/theme-china.d.ts.map +1 -1
  370. package/dist/tokens/theme-china.js +3 -0
  371. package/dist/tokens/theme-china.js.map +1 -1
  372. package/dist/tokens/theme-dark.d.ts.map +1 -1
  373. package/dist/tokens/theme-dark.js +12 -31
  374. package/dist/tokens/theme-dark.js.map +1 -1
  375. package/dist/tokens/theme-light.d.ts.map +1 -1
  376. package/dist/tokens/theme-light.js +11 -30
  377. package/dist/tokens/theme-light.js.map +1 -1
  378. package/dist/tokens/types.d.ts +7 -0
  379. package/dist/tokens/types.d.ts.map +1 -1
  380. package/dist/types/price.d.ts +8 -0
  381. package/dist/types/price.d.ts.map +1 -1
  382. package/dist/types/price.js +4 -0
  383. package/dist/types/price.js.map +1 -1
  384. package/dist/utils/dateFormat.d.ts +5 -42
  385. package/dist/utils/dateFormat.d.ts.map +1 -1
  386. package/dist/utils/dateFormat.js +24 -4
  387. package/dist/utils/dateFormat.js.map +1 -1
  388. package/dist/utils/kLineDraw/axis.d.ts +9 -28
  389. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  390. package/dist/utils/kLineDraw/axis.js +33 -58
  391. package/dist/utils/kLineDraw/axis.js.map +1 -1
  392. package/dist/utils/uuid.d.ts +2 -0
  393. package/dist/utils/uuid.d.ts.map +1 -0
  394. package/dist/utils/uuid.js +10 -0
  395. package/dist/utils/uuid.js.map +1 -0
  396. package/dist/utils/volumePrice.d.ts +0 -40
  397. package/dist/utils/volumePrice.d.ts.map +1 -1
  398. package/dist/utils/volumePrice.js +2 -2
  399. package/dist/utils/volumePrice.js.map +1 -1
  400. package/dist/version.d.ts +1 -1
  401. package/dist/version.js +1 -1
  402. package/package.json +1 -1
  403. package/src/config/chartSettings.ts +9 -1
  404. package/src/controllers/createChartController.ts +53 -3
  405. package/src/controllers/types.ts +36 -17
  406. package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
  407. package/src/data-fetchers/baostock.ts +1 -1
  408. package/src/data-fetchers/dataBuffer.ts +48 -11
  409. package/src/data-fetchers/dataBufferTypes.ts +11 -0
  410. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
  411. package/src/data-fetchers/gotdx/gotdx.ts +6 -0
  412. package/src/data-fetchers/gotdx.ts +45 -7
  413. package/src/data-fetchers/hundred-mock.ts +1 -1
  414. package/src/data-fetchers/index.ts +10 -20
  415. package/src/data-fetchers/router.ts +12 -1
  416. package/src/data-fetchers/thousand-mock.ts +1 -1
  417. package/src/data-fetchers/timeShareBuffer.ts +92 -0
  418. package/src/data-fetchers/tradingview.ts +2 -2
  419. package/src/data-fetchers/types.ts +15 -2
  420. package/src/engine/__tests__/chart.dpr.test.ts +1 -0
  421. package/src/engine/chart.ts +157 -7
  422. package/src/engine/chartTypes.ts +3 -0
  423. package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
  424. package/src/engine/controller/interaction.ts +115 -16
  425. package/src/engine/data/chartDataManager.ts +557 -214
  426. package/src/engine/draw/pixelAlign.ts +1 -1
  427. package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
  428. package/src/engine/indicators/__tests__/ichimoku.test.ts +3 -3
  429. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
  430. package/src/engine/indicators/calculators.ts +105 -236
  431. package/src/engine/indicators/chartIndicatorManager.ts +3 -2
  432. package/src/engine/indicators/ichimokuState.ts +2 -0
  433. package/src/engine/indicators/macdState.ts +1 -1
  434. package/src/engine/indicators/registerBuiltins.ts +1 -0
  435. package/src/engine/indicators/rsiState.ts +1 -1
  436. package/src/engine/indicators/scheduler.ts +1 -7
  437. package/src/engine/indicators/visibleStateComposers.ts +51 -0
  438. package/src/engine/layout/chartPaneLayout.ts +26 -6
  439. package/src/engine/modes/kLineMode.ts +57 -0
  440. package/src/engine/modes/timeShareMode.ts +95 -0
  441. package/src/engine/modes/types.ts +63 -0
  442. package/src/engine/paneRenderer.ts +37 -46
  443. package/src/engine/render/chartRenderer.ts +93 -20
  444. package/src/engine/renderers/Indicator/atr.ts +4 -29
  445. package/src/engine/renderers/Indicator/boll.ts +3 -24
  446. package/src/engine/renderers/Indicator/cci.ts +9 -27
  447. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
  448. package/src/engine/renderers/Indicator/cmf.ts +3 -22
  449. package/src/engine/renderers/Indicator/dema.ts +5 -26
  450. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  451. package/src/engine/renderers/Indicator/ene.ts +3 -24
  452. package/src/engine/renderers/Indicator/expma.ts +2 -2
  453. package/src/engine/renderers/Indicator/fastk.ts +12 -95
  454. package/src/engine/renderers/Indicator/fib.ts +2 -2
  455. package/src/engine/renderers/Indicator/hma.ts +5 -26
  456. package/src/engine/renderers/Indicator/hv.ts +3 -23
  457. package/src/engine/renderers/Indicator/ichimoku.ts +26 -6
  458. package/src/engine/renderers/Indicator/kama.ts +5 -26
  459. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  460. package/src/engine/renderers/Indicator/kst.ts +3 -3
  461. package/src/engine/renderers/Indicator/ma.ts +1 -1
  462. package/src/engine/renderers/Indicator/macd.ts +4 -21
  463. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +228 -1
  464. package/src/engine/renderers/Indicator/mfi.ts +3 -22
  465. package/src/engine/renderers/Indicator/mom.ts +9 -30
  466. package/src/engine/renderers/Indicator/obv.ts +3 -21
  467. package/src/engine/renderers/Indicator/parkinson.ts +3 -23
  468. package/src/engine/renderers/Indicator/pivot.ts +2 -2
  469. package/src/engine/renderers/Indicator/pvt.ts +3 -21
  470. package/src/engine/renderers/Indicator/roc.ts +4 -23
  471. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  472. package/src/engine/renderers/Indicator/sar.ts +3 -3
  473. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
  474. package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
  475. package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
  476. package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
  477. package/src/engine/renderers/Indicator/stoch.ts +6 -71
  478. package/src/engine/renderers/Indicator/structure.ts +2 -2
  479. package/src/engine/renderers/Indicator/supertrend.ts +3 -3
  480. package/src/engine/renderers/Indicator/tema.ts +5 -26
  481. package/src/engine/renderers/Indicator/trix.ts +3 -3
  482. package/src/engine/renderers/Indicator/vma.ts +3 -22
  483. package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
  484. package/src/engine/renderers/Indicator/vwap.ts +3 -21
  485. package/src/engine/renderers/Indicator/wma.ts +5 -26
  486. package/src/engine/renderers/Indicator/wmsr.ts +9 -30
  487. package/src/engine/renderers/Indicator/zones.ts +2 -2
  488. package/src/engine/renderers/candle.ts +1 -1
  489. package/src/engine/renderers/comparisonLine.ts +1 -0
  490. package/src/engine/renderers/crosshair.ts +1 -1
  491. package/src/engine/renderers/extremaMarkers.ts +1 -0
  492. package/src/engine/renderers/lastPrice.ts +5 -2
  493. package/src/engine/renderers/leftYAxis.ts +77 -0
  494. package/src/engine/renderers/subVolume.ts +3 -3
  495. package/src/engine/renderers/timeAxis.ts +16 -13
  496. package/src/engine/renderers/timeShare.ts +271 -0
  497. package/src/engine/renderers/yAxis.ts +9 -1
  498. package/src/engine/scale/price.ts +2 -2
  499. package/src/engine/theme/fonts.ts +1 -1
  500. package/src/engine/utils/klineConfig.ts +1 -5
  501. package/src/engine/viewport/chartViewportManager.ts +6 -5
  502. package/src/index.ts +1 -0
  503. package/src/mcp/chartBridge.ts +2 -1
  504. package/src/plugin/types.ts +1 -0
  505. package/src/semantic/types.ts +1 -1
  506. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +15 -1
  507. package/src/tokens/theme-base.ts +36 -0
  508. package/src/tokens/theme-china.ts +4 -0
  509. package/src/tokens/theme-dark.ts +13 -33
  510. package/src/tokens/theme-light.ts +13 -33
  511. package/src/tokens/types.ts +9 -0
  512. package/src/types/price.ts +13 -0
  513. package/src/utils/dateFormat.ts +27 -4
  514. package/src/utils/kLineDraw/axis.ts +40 -107
  515. package/src/utils/uuid.ts +8 -0
  516. package/src/utils/volumePrice.ts +2 -2
  517. package/src/version.ts +1 -1
@@ -1,24 +1,36 @@
1
1
  import { createSignal } from '../../reactivity/signal';
2
2
  import { DataBuffer } from '../../data-fetchers/dataBuffer';
3
+ import { TimeShareBuffer } from '../../data-fetchers/timeShareBuffer';
3
4
  import { getVisibleRange } from '../viewport/viewport';
4
5
  import { getPhysicalKLineConfig } from '../utils/klineConfig';
5
6
  const COMPARISON_PALETTE = ['#f59e0b', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316'];
6
7
  const DEFAULT_COMPARISON_COLOR = '#f59e0b';
8
+ const BUF_PRIMARY = 'main';
9
+ const BUF_COMPARISON = 'cmp';
10
+ const BUF_TIMESHARE = 'ts';
11
+ function bufKey(type, symbol, period) {
12
+ if (type === BUF_TIMESHARE)
13
+ return `ts:${symbol}`;
14
+ return `${type}:${symbol}:${period ?? 'daily'}`;
15
+ }
7
16
  export class ChartDataManager {
8
- _internalData = [];
9
17
  _dataFetcher = null;
10
- _dataBuffer = new DataBuffer();
11
- _dataBufferUnsub = null;
18
+ _timeShareFetcher = null;
19
+ _buffers = new Map();
20
+ _activeBufferKey = null;
21
+ _activeBufferUnsub = null;
22
+ _dataSignal = createSignal([]);
23
+ _loadingSignal = createSignal(false);
24
+ _symbolsSignal = createSignal([]);
25
+ _currentSpec = null;
26
+ // Comparison-specific state (still needed for rendering pass-through)
12
27
  _comparisonSpecs = [];
13
28
  _comparisonData = new Map();
14
- _comparisonBuffers = new Map();
15
- _comparisonBufferUnsubs = new Map();
16
29
  _comparisonColors = new Map();
17
30
  _comparisonColorsSignal = createSignal(new Map());
18
- _comparisonLoadingUnsubs = new Map();
19
31
  _comparisonLoadingSignal = createSignal(false);
20
- _dataSignal = createSignal([]);
21
- _symbolsSignal = createSignal([]);
32
+ // Track loading per-comparison buffer (keyed by buffer key)
33
+ _cmpLoadingUnsubs = new Map();
22
34
  _pendingFetches = [];
23
35
  _batchFlushScheduled = false;
24
36
  incrementalLoadHintEl = null;
@@ -31,30 +43,174 @@ export class ChartDataManager {
31
43
  constructor(deps) {
32
44
  this.deps = deps;
33
45
  }
46
+ // ── Buffer helpers ──
47
+ activateBuffer(key) {
48
+ if (this._activeBufferKey === key)
49
+ return;
50
+ this._activeBufferUnsub?.();
51
+ this._activeBufferKey = key;
52
+ const buf = this._buffers.get(key);
53
+ if (buf) {
54
+ this._dataSignal.set([...buf.data.peek()]);
55
+ this._loadingSignal.set(buf.loading.peek());
56
+ const unsubData = buf.data.subscribe(() => {
57
+ this._dataSignal.set([...buf.data.peek()]);
58
+ this.onBufferDataChanged(key);
59
+ });
60
+ const unsubLoading = buf.loading.subscribe(() => {
61
+ this._loadingSignal.set(buf.loading.peek());
62
+ });
63
+ this._activeBufferUnsub = () => {
64
+ unsubData();
65
+ unsubLoading();
66
+ };
67
+ }
68
+ else {
69
+ this._dataSignal.set([]);
70
+ this._loadingSignal.set(false);
71
+ this._activeBufferUnsub = null;
72
+ }
73
+ }
74
+ disposeBuffer(key) {
75
+ const buf = this._buffers.get(key);
76
+ if (!buf)
77
+ return;
78
+ const unsub = this._cmpLoadingUnsubs.get(key);
79
+ unsub?.();
80
+ const loadingUnsub = this._cmpLoadingUnsubs.get(`loading:${key}`);
81
+ loadingUnsub?.();
82
+ this._cmpLoadingUnsubs.delete(key);
83
+ this._cmpLoadingUnsubs.delete(`loading:${key}`);
84
+ buf.dispose();
85
+ this._buffers.delete(key);
86
+ }
87
+ getActiveDataBuffer() {
88
+ const buf = this._activeBufferKey ? this._buffers.get(this._activeBufferKey) : null;
89
+ return buf instanceof DataBuffer ? buf : null;
90
+ }
91
+ getActiveTimeShareBuffer() {
92
+ const buf = this._activeBufferKey ? this._buffers.get(this._activeBufferKey) : null;
93
+ return buf instanceof TimeShareBuffer ? buf : null;
94
+ }
95
+ getPrimaryDataBuffer(symbol, period) {
96
+ const key = bufKey(BUF_PRIMARY, symbol, period);
97
+ let buf = this._buffers.get(key);
98
+ if (!buf) {
99
+ buf = new DataBuffer();
100
+ buf.setFetcher(this._dataFetcher);
101
+ if (this._dataFetcher) {
102
+ buf.setRequestFetch(this._createBatchHandler(this._dataFetcher));
103
+ }
104
+ this._buffers.set(key, buf);
105
+ }
106
+ else {
107
+ buf.setFetcher(this._dataFetcher);
108
+ if (this._dataFetcher) {
109
+ buf.setRequestFetch(this._createBatchHandler(this._dataFetcher));
110
+ }
111
+ }
112
+ return buf;
113
+ }
114
+ // ── Buffer data change handler ──
115
+ onBufferDataChanged(key) {
116
+ const buf = this._buffers.get(key);
117
+ if (!buf)
118
+ return;
119
+ if (buf instanceof DataBuffer) {
120
+ this.onKLineBufferChanged(key, buf);
121
+ }
122
+ else if (buf instanceof TimeShareBuffer) {
123
+ this.onTimeShareBufferChanged(key, buf);
124
+ }
125
+ }
126
+ onKLineBufferChanged(key, buf) {
127
+ if (!key.startsWith('main:'))
128
+ return;
129
+ const prevLength = this.getActiveKLineLength();
130
+ const bufferData = buf.getRawData();
131
+ const prependedCount = this.pendingPrependedCount;
132
+ this.pendingPrependedCount = 0;
133
+ if (this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
134
+ const desiredScrollLeft = this.getLeftLoadBufferWidth();
135
+ this.deps.setCachedScrollLeft(desiredScrollLeft);
136
+ this.deps.setPendingScrollLeft(desiredScrollLeft);
137
+ }
138
+ if (prevLength === 0 && bufferData.length > 0) {
139
+ const dpr = this.deps.getEffectiveDpr();
140
+ const opt = this.deps.getOption();
141
+ const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr);
142
+ const lastKLineEndPx = (startXPx + bufferData.length * unitPx) / dpr;
143
+ const container = this.deps.getDom().container;
144
+ if (container) {
145
+ const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - container.clientWidth);
146
+ const contentWidth = this.getContentWidth();
147
+ const maxScroll = Math.max(0, contentWidth - container.clientWidth);
148
+ const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr;
149
+ this.deps.setCachedScrollLeft(scrollLeft);
150
+ this.deps.setPendingScrollLeft(scrollLeft);
151
+ }
152
+ }
153
+ this.deps.resetInteraction();
154
+ if (this.lastVisibleRange.start === 0 && this.lastVisibleRange.end === 0 && bufferData.length > 0) {
155
+ const plotWidth = this.deps.getObservedSize().width > 0
156
+ ? this.deps.getObservedSize().width
157
+ : Math.max(1, Math.round(this.deps.getDom().container?.clientWidth ?? 800));
158
+ const dpr = this.deps.getEffectiveDpr();
159
+ const opt = this.deps.getOption();
160
+ const { start, end } = getVisibleRange(this.deps.getLogicalScrollLeft(), plotWidth, opt.kWidth, opt.kGap, bufferData.length, dpr);
161
+ this.lastRawVisibleRange = { start, end };
162
+ this.lastVisibleRange = { start: Math.max(0, start), end };
163
+ }
164
+ const scheduler = this.deps.getIndicatorScheduler();
165
+ const indicatorsReady = scheduler.update(bufferData, this.lastVisibleRange);
166
+ if (indicatorsReady) {
167
+ this.pendingIndicatorDataUpdate = false;
168
+ this.deps.scheduleDraw();
169
+ }
170
+ else {
171
+ this.pendingIndicatorDataUpdate = true;
172
+ }
173
+ this.showIncrementalLoadHint(prependedCount);
174
+ }
175
+ onTimeShareBufferChanged(_key, _buf) {
176
+ const data = this._dataSignal.peek();
177
+ this.lastVisibleRange = { start: 0, end: data.length };
178
+ this.lastRawVisibleRange = { start: 0, end: data.length };
179
+ this.deps.resetInteraction();
180
+ this.deps.onTimeShareDataReady(data.length);
181
+ }
182
+ // ── Internal helpers ──
34
183
  getScrollContentHost() {
35
184
  return this.deps.getDom().scrollContent ?? this.deps.getDom().container ?? null;
36
185
  }
37
186
  getLeftLoadBufferWidth() {
38
- if (this._internalData.length === 0)
187
+ const buf = this.getActiveDataBuffer();
188
+ const dataLength = buf ? buf.getRawData().length : 0;
189
+ if (dataLength === 0)
39
190
  return 0;
40
191
  const plotWidth = this.deps.getViewport()?.plotWidth
41
192
  ?? (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined)
42
193
  ?? Math.round(this.deps.getDom().container?.clientWidth ?? 0);
43
194
  return Math.max(0, plotWidth);
44
195
  }
196
+ getActiveKLineLength() {
197
+ const buf = this.getActiveDataBuffer();
198
+ return buf ? buf.getRawData().length : 0;
199
+ }
45
200
  computeRawVisibleRange() {
46
- if (this._internalData.length === 0)
201
+ const buf = this.getActiveDataBuffer();
202
+ const dataLength = buf ? buf.getRawData().length : 0;
203
+ if (dataLength === 0)
47
204
  return null;
48
205
  const vp = this.deps.getViewport();
49
206
  if (!vp)
50
207
  return null;
51
208
  const opt = this.deps.getOption();
52
- return getVisibleRange(vp.scrollLeft, vp.plotWidth, opt.kWidth, opt.kGap, this._internalData.length, vp.dpr);
209
+ return getVisibleRange(vp.scrollLeft, vp.plotWidth, opt.kWidth, opt.kGap, dataLength, vp.dpr);
53
210
  }
54
211
  getTrailingSlotCount() {
55
212
  return 24;
56
213
  }
57
- static LEADING_SLOTS = 60;
58
214
  static TRAILING_DRAWING_SLOTS = 24;
59
215
  clearIncrementalLoadHintTimer() {
60
216
  if (this.incrementalLoadHintTimer !== null) {
@@ -118,17 +274,43 @@ export class ChartDataManager {
118
274
  this.incrementalLoadHintTimer = null;
119
275
  }, 900);
120
276
  }
277
+ // ── Public accessors ──
278
+ /** Unified data signal — always reflects the active buffer's data */
121
279
  get data() {
122
280
  return this._dataSignal;
123
281
  }
282
+ /** Loading signal — mirrors the active buffer's loading state */
283
+ get loading() {
284
+ return this._loadingSignal;
285
+ }
124
286
  get symbols() {
125
287
  return this._symbolsSignal;
126
288
  }
127
289
  get currentPeriod() {
128
- return this._dataBuffer.currentSpec?.period ?? 'daily';
290
+ return this._currentSpec?.period ?? 'daily';
129
291
  }
292
+ /** Internal KLine data for indicator scheduler (empty in timeshare mode) */
130
293
  getInternalData() {
131
- return this._internalData;
294
+ const buf = this.getActiveDataBuffer();
295
+ return buf ? buf.getRawData() : [];
296
+ }
297
+ getRenderData() {
298
+ return [...this._dataSignal.peek()];
299
+ }
300
+ getTimeShareData() {
301
+ const buf = this.getActiveTimeShareBuffer();
302
+ return buf ? buf.getRawData() : [];
303
+ }
304
+ getTimeShareSignal() {
305
+ const buf = this.getActiveTimeShareBuffer();
306
+ return (buf?.data ?? createSignal([]));
307
+ }
308
+ getTimeShareLoadingSignal() {
309
+ const buf = this.getActiveTimeShareBuffer();
310
+ return (buf?.loading ?? createSignal(false));
311
+ }
312
+ setTimeShareFetcher(fetcher) {
313
+ this._timeShareFetcher = fetcher;
132
314
  }
133
315
  getComparisonData() {
134
316
  return this._comparisonData;
@@ -137,7 +319,17 @@ export class ChartDataManager {
137
319
  return this._comparisonSpecs;
138
320
  }
139
321
  get dataBuffer() {
140
- return this._dataBuffer;
322
+ const buf = this.getActiveDataBuffer();
323
+ if (buf)
324
+ return buf;
325
+ // Fallback: create a primary buffer if none exists yet
326
+ const key = bufKey(BUF_PRIMARY, '', 'daily');
327
+ let fallback = this._buffers.get(key);
328
+ if (!fallback) {
329
+ fallback = new DataBuffer();
330
+ this._buffers.set(key, fallback);
331
+ }
332
+ return fallback;
141
333
  }
142
334
  get comparisonColors() {
143
335
  return this._comparisonColorsSignal;
@@ -149,70 +341,59 @@ export class ChartDataManager {
149
341
  return this._comparisonColors;
150
342
  }
151
343
  recomputeComparisonLoading() {
152
- const anyLoading = Array.from(this._comparisonBuffers.values()).some((b) => b.loading.peek());
344
+ const anyLoading = Array.from(this._buffers.entries()).some(([k, b]) => k.startsWith(BUF_COMPARISON) && b instanceof DataBuffer && b.loading.peek());
153
345
  this._comparisonLoadingSignal.set(anyLoading);
154
346
  }
347
+ // ── Data updates (KLine) ──
155
348
  updateData(data) {
156
- this._internalData = data ?? [];
157
- this._dataSignal.set([...this._internalData]);
158
- const container = this.deps.getDom().container;
159
- if (container) {
160
- const minScrollLeft = this.getLeftLoadBufferWidth();
161
- if (this.deps.getCachedScrollLeft() < minScrollLeft) {
162
- this.deps.setCachedScrollLeft(minScrollLeft);
163
- this.deps.setPendingScrollLeft(minScrollLeft);
164
- }
165
- const contentWidth = this.getContentWidth();
166
- const maxScrollLeft = Math.max(0, contentWidth - container.clientWidth);
167
- if (this.deps.getCachedScrollLeft() > maxScrollLeft) {
168
- this.deps.setCachedScrollLeft(maxScrollLeft);
169
- this.deps.setPendingScrollLeft(maxScrollLeft);
170
- }
171
- }
172
- this.deps.resetInteraction();
173
- if (this.lastVisibleRange.start === 0 && this.lastVisibleRange.end === 0 && this._internalData.length > 0) {
174
- const plotWidth = this.deps.getObservedSize().width > 0
175
- ? this.deps.getObservedSize().width
176
- : Math.max(1, Math.round(this.deps.getDom().container?.clientWidth ?? 800));
177
- const dpr = this.deps.getEffectiveDpr();
178
- const opt = this.deps.getOption();
179
- const { start, end } = getVisibleRange(this.deps.getLogicalScrollLeft(), plotWidth, opt.kWidth, opt.kGap, this._internalData.length, dpr);
180
- this.lastRawVisibleRange = { start, end };
181
- this.lastVisibleRange = { start: Math.max(0, start), end };
349
+ if (this.currentPeriod === 'timeshare')
350
+ return;
351
+ const buf = this.getActiveDataBuffer();
352
+ if (buf) {
353
+ buf.setInlineData(data);
182
354
  }
183
- const scheduler = this.deps.getIndicatorScheduler();
184
- const indicatorsReady = scheduler.update(this._internalData, this.lastVisibleRange);
185
- if (indicatorsReady) {
186
- this.pendingIndicatorDataUpdate = false;
187
- this.deps.scheduleDraw();
355
+ }
356
+ setData(data) {
357
+ const buf = this.getActiveDataBuffer();
358
+ if (buf) {
359
+ buf.setInlineData(data);
188
360
  }
189
361
  else {
190
- this.pendingIndicatorDataUpdate = true;
362
+ this._dataSignal.set([...data]);
191
363
  }
192
364
  }
193
- setData(data) {
194
- this.updateData(data);
195
- }
196
365
  appendData(newData) {
197
- const merged = [...this._internalData, ...newData];
198
- this.setData(merged);
366
+ const buf = this.getActiveDataBuffer();
367
+ if (buf) {
368
+ const merged = [...buf.getRawData(), ...newData];
369
+ buf.setInlineData(merged);
370
+ }
371
+ else {
372
+ this._dataSignal.set([...this._dataSignal.peek(), ...newData]);
373
+ }
199
374
  }
200
375
  getData() {
201
- return this._internalData;
376
+ const buf = this.getActiveDataBuffer();
377
+ return buf ? buf.getRawData() : [];
202
378
  }
379
+ // ── Fetcher ──
203
380
  setDataFetcher(fetcher) {
204
381
  this._dataFetcher = fetcher;
205
382
  if (!fetcher) {
206
- this._dataBuffer.setRequestFetch(null);
207
- for (const buffer of this._comparisonBuffers.values()) {
208
- buffer.setRequestFetch(null);
383
+ for (const [key, buf] of this._buffers) {
384
+ if (buf instanceof DataBuffer) {
385
+ const dataBuf = buf;
386
+ dataBuf.setRequestFetch(null);
387
+ }
209
388
  }
210
389
  return;
211
390
  }
212
391
  const handler = this._createBatchHandler(fetcher);
213
- this._dataBuffer.setRequestFetch(handler);
214
- for (const buffer of this._comparisonBuffers.values()) {
215
- buffer.setRequestFetch(handler);
392
+ for (const [key, buf] of this._buffers) {
393
+ if (buf instanceof DataBuffer) {
394
+ const dataBuf = buf;
395
+ dataBuf.setRequestFetch(handler);
396
+ }
216
397
  }
217
398
  }
218
399
  _createBatchHandler(fetcher) {
@@ -254,9 +435,13 @@ export class ChartDataManager {
254
435
  }
255
436
  }
256
437
  checkVisibleRangeGap() {
257
- if (this._internalData.length === 0)
438
+ const buf = this.getActiveDataBuffer();
439
+ if (!buf)
258
440
  return;
259
- const window = this._dataBuffer.loadedWindow;
441
+ const data = buf.getRawData();
442
+ if (data.length === 0)
443
+ return;
444
+ const window = buf.loadedWindow;
260
445
  if (!window)
261
446
  return;
262
447
  const range = this.computeRawVisibleRange() ?? this.lastRawVisibleRange;
@@ -264,74 +449,77 @@ export class ChartDataManager {
264
449
  let firstVisibleTs;
265
450
  if (range.start < 0 && this._dataFetcher) {
266
451
  const earlierThanEarliest = window.earliestTs - 365 * MS_PER_DAY;
267
- this._dataBuffer.ensureRange(earlierThanEarliest, window.earliestTs);
268
- firstVisibleTs = this._internalData[0]?.timestamp;
452
+ buf.ensureRange(earlierThanEarliest, window.earliestTs);
453
+ firstVisibleTs = data[0]?.timestamp;
269
454
  }
270
- else if (range.start < this._internalData.length) {
271
- firstVisibleTs = this._internalData[Math.max(0, range.start)]?.timestamp;
455
+ else if (range.start < data.length) {
456
+ firstVisibleTs = data[Math.max(0, range.start)]?.timestamp;
272
457
  if (firstVisibleTs !== undefined && firstVisibleTs < window.earliestTs) {
273
- this._dataBuffer.ensureRange(firstVisibleTs, window.earliestTs);
458
+ buf.ensureRange(firstVisibleTs, window.earliestTs);
274
459
  }
275
460
  }
276
461
  if (firstVisibleTs === undefined)
277
462
  return;
278
- for (const buffer of this._comparisonBuffers.values()) {
279
- buffer.ensureRange(firstVisibleTs, window.earliestTs);
463
+ for (const [key, b] of this._buffers) {
464
+ if (key.startsWith(BUF_COMPARISON) && b instanceof DataBuffer) {
465
+ b.ensureRange(firstVisibleTs, window.earliestTs);
466
+ }
280
467
  }
281
468
  }
469
+ // ── Comparison management ──
282
470
  syncComparisonBuffers(specs) {
283
471
  this._comparisonSpecs = [...specs];
284
472
  const nextKeys = new Set(specs.map((spec) => spec.symbol));
285
- for (const [key, buffer] of this._comparisonBuffers) {
286
- if (nextKeys.has(key))
473
+ // Remove buffers for removed comparisons
474
+ for (const [key, buf] of this._buffers) {
475
+ if (!key.startsWith(BUF_COMPARISON))
287
476
  continue;
288
- this._comparisonBufferUnsubs.get(key)?.();
289
- this._comparisonBufferUnsubs.delete(key);
290
- buffer.dispose();
291
- this._comparisonBuffers.delete(key);
292
- this._comparisonData.delete(key);
477
+ const symbol = key.split(':')[1];
478
+ if (nextKeys.has(symbol))
479
+ continue;
480
+ this.disposeBuffer(key);
481
+ this._comparisonData.delete(symbol);
293
482
  }
294
483
  if (!this._dataFetcher)
295
484
  return;
485
+ const primaryBuf = this.getActiveDataBuffer();
296
486
  for (const spec of specs) {
297
- const key = spec.symbol;
298
- let buffer = this._comparisonBuffers.get(key);
299
- if (!buffer) {
487
+ const key = bufKey(BUF_COMPARISON, spec.symbol, spec.period);
488
+ const symbol = spec.symbol;
489
+ let buf = this._buffers.get(key);
490
+ if (!buf) {
300
491
  const newBuffer = new DataBuffer();
301
492
  newBuffer.setFetcher(this._dataFetcher);
302
493
  if (this._dataFetcher) {
303
494
  newBuffer.setRequestFetch(this._createBatchHandler(this._dataFetcher));
304
495
  }
305
- this._comparisonBuffers.set(key, newBuffer);
496
+ this._buffers.set(key, newBuffer);
306
497
  const unsubscribe = newBuffer.data.subscribe(() => {
307
- this._comparisonData.set(key, [...newBuffer.data.peek()]);
498
+ this._comparisonData.set(symbol, [...newBuffer.getRawData()]);
308
499
  this.deps.scheduleDraw();
309
500
  });
310
- this._comparisonBufferUnsubs.set(key, unsubscribe);
501
+ this._cmpLoadingUnsubs.set(key, unsubscribe);
311
502
  const unsubLoading = newBuffer.loading.subscribe(() => this.recomputeComparisonLoading());
312
- this._comparisonLoadingUnsubs.set(key, unsubLoading);
313
- buffer = newBuffer;
503
+ // Store loading unsubscribe with a special key
504
+ this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading);
505
+ buf = newBuffer;
314
506
  }
315
507
  else {
316
- buffer.setFetcher(this._dataFetcher);
508
+ buf.setFetcher(this._dataFetcher);
317
509
  if (this._dataFetcher) {
318
- buffer.setRequestFetch(this._createBatchHandler(this._dataFetcher));
510
+ buf.setRequestFetch(this._createBatchHandler(this._dataFetcher));
319
511
  }
320
512
  }
321
- const mainEarliest = this._dataBuffer.loadedWindow?.earliestTs;
322
- buffer.setSymbol(spec, mainEarliest);
513
+ const mainEarliest = primaryBuf?.loadedWindow?.earliestTs;
514
+ buf.setSymbol(spec, mainEarliest);
323
515
  }
324
516
  }
325
517
  clearComparisonBuffers() {
326
- for (const unsubscribe of this._comparisonBufferUnsubs.values())
327
- unsubscribe();
328
- this._comparisonBufferUnsubs.clear();
329
- for (const unsub of this._comparisonLoadingUnsubs.values())
330
- unsub();
331
- this._comparisonLoadingUnsubs.clear();
332
- for (const buffer of this._comparisonBuffers.values())
333
- buffer.dispose();
334
- this._comparisonBuffers.clear();
518
+ for (const [key, buf] of this._buffers) {
519
+ if (key.startsWith(BUF_COMPARISON)) {
520
+ this.disposeBuffer(key);
521
+ }
522
+ }
335
523
  this._comparisonData.clear();
336
524
  this._comparisonColors.clear();
337
525
  this._comparisonColorsSignal.set(new Map());
@@ -339,12 +527,16 @@ export class ChartDataManager {
339
527
  this._comparisonSpecs = [];
340
528
  }
341
529
  addComparisonSymbol(spec) {
342
- const key = spec.symbol;
343
- if (this._comparisonBuffers.has(key))
344
- return;
530
+ const symbol = spec.symbol;
531
+ const key = bufKey(BUF_COMPARISON, symbol, spec.period);
532
+ // Check if already exists
533
+ for (const k of this._buffers.keys()) {
534
+ if (k.startsWith(BUF_COMPARISON) && k.split(':')[1] === symbol)
535
+ return;
536
+ }
345
537
  this._comparisonSpecs.push(spec);
346
538
  const color = COMPARISON_PALETTE[this._comparisonColors.size % COMPARISON_PALETTE.length] ?? DEFAULT_COMPARISON_COLOR;
347
- this._comparisonColors.set(key, color);
539
+ this._comparisonColors.set(symbol, color);
348
540
  this._comparisonColorsSignal.set(new Map(this._comparisonColors));
349
541
  if (!this._dataFetcher)
350
542
  return;
@@ -353,47 +545,183 @@ export class ChartDataManager {
353
545
  if (this._dataFetcher) {
354
546
  newBuffer.setRequestFetch(this._createBatchHandler(this._dataFetcher));
355
547
  }
356
- this._comparisonBuffers.set(key, newBuffer);
548
+ this._buffers.set(key, newBuffer);
357
549
  const unsubscribe = newBuffer.data.subscribe(() => {
358
- this._comparisonData.set(key, [...newBuffer.data.peek()]);
550
+ this._comparisonData.set(symbol, [...newBuffer.getRawData()]);
359
551
  this.deps.scheduleDraw();
360
552
  });
361
- this._comparisonBufferUnsubs.set(key, unsubscribe);
553
+ this._cmpLoadingUnsubs.set(key, unsubscribe);
362
554
  const unsubLoading = newBuffer.loading.subscribe(() => this.recomputeComparisonLoading());
363
- this._comparisonLoadingUnsubs.set(key, unsubLoading);
364
- const mainEarliest = this._dataBuffer.loadedWindow?.earliestTs;
555
+ this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading);
556
+ const primaryBuf = this.getActiveDataBuffer();
557
+ const mainEarliest = primaryBuf?.loadedWindow?.earliestTs;
365
558
  newBuffer.setSymbol(spec, mainEarliest);
366
559
  this._symbolsSignal.set([this._symbolsSignal.peek()[0], ...this._comparisonSpecs]);
367
560
  }
561
+ setComparisonData(symbol, data) {
562
+ const period = this.currentPeriod;
563
+ const key = bufKey(BUF_COMPARISON, symbol, period);
564
+ const existing = this._buffers.get(key);
565
+ if (!existing) {
566
+ const buffer = new DataBuffer();
567
+ this._buffers.set(key, buffer);
568
+ const unsub = buffer.data.subscribe(() => {
569
+ this._comparisonData.set(symbol, [...buffer.getRawData()]);
570
+ this.deps.scheduleDraw();
571
+ });
572
+ this._cmpLoadingUnsubs.set(key, unsub);
573
+ const unsubLoading = buffer.loading.subscribe(() => this.recomputeComparisonLoading());
574
+ this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading);
575
+ const color = COMPARISON_PALETTE[this._comparisonColors.size % COMPARISON_PALETTE.length] ??
576
+ DEFAULT_COMPARISON_COLOR;
577
+ this._comparisonColors.set(symbol, color);
578
+ this._comparisonColorsSignal.set(new Map(this._comparisonColors));
579
+ const spec = { symbol, period };
580
+ this._comparisonSpecs.push(spec);
581
+ const mainSpec = this._symbolsSignal.peek()[0];
582
+ this._symbolsSignal.set(mainSpec ? [mainSpec, ...this._comparisonSpecs] : [...this._comparisonSpecs]);
583
+ buffer.setInlineData(data);
584
+ return;
585
+ }
586
+ existing.setInlineData(data);
587
+ }
368
588
  removeComparisonSymbol(symbol) {
369
- const key = symbol;
370
- if (!this._comparisonBuffers.has(key))
589
+ let found = false;
590
+ for (const [key, buf] of this._buffers) {
591
+ if (key.startsWith(BUF_COMPARISON) && key.split(':')[1] === symbol) {
592
+ this.disposeBuffer(key);
593
+ found = true;
594
+ break;
595
+ }
596
+ }
597
+ if (!found)
371
598
  return;
372
- this._comparisonBufferUnsubs.get(key)?.();
373
- this._comparisonBufferUnsubs.delete(key);
374
- this._comparisonLoadingUnsubs.get(key)?.();
375
- this._comparisonLoadingUnsubs.delete(key);
376
- this._comparisonBuffers.get(key)?.dispose();
377
- this._comparisonBuffers.delete(key);
378
- this._comparisonData.delete(key);
379
- this._comparisonColors.delete(key);
599
+ this._comparisonData.delete(symbol);
600
+ this._comparisonColors.delete(symbol);
380
601
  this._comparisonColorsSignal.set(new Map(this._comparisonColors));
381
602
  this._comparisonSpecs = this._comparisonSpecs.filter((s) => s.symbol !== symbol);
382
603
  this._symbolsSignal.set([this._symbolsSignal.peek()[0], ...this._comparisonSpecs]);
383
604
  this.recomputeComparisonLoading();
605
+ this.deps.scheduleDraw();
606
+ }
607
+ // ── Symbol / Period ──
608
+ setCurrentSymbol(symbol) {
609
+ const current = this._currentSpec ?? { symbol };
610
+ this._currentSpec = { ...current, symbol };
611
+ const specs = this._symbolsSignal.peek();
612
+ if (specs.length > 0) {
613
+ const updated = [{ ...specs[0], symbol }, ...specs.slice(1)];
614
+ this._symbolsSignal.set(updated);
615
+ }
384
616
  }
617
+ setTimeShareQueryDate(date) {
618
+ const buf = this.getActiveTimeShareBuffer();
619
+ if (buf) {
620
+ buf.setQueryDate(date);
621
+ }
622
+ else {
623
+ // Store for later when buffer is created
624
+ const tsBuf = new TimeShareBuffer();
625
+ tsBuf.setFetcher(this._timeShareFetcher);
626
+ tsBuf.setQueryDate(date);
627
+ const spec = this._currentSpec;
628
+ if (spec) {
629
+ const key = bufKey(BUF_TIMESHARE, spec.symbol);
630
+ this._buffers.set(key, tsBuf);
631
+ this.activateBuffer(key);
632
+ tsBuf.load(spec);
633
+ }
634
+ }
635
+ }
636
+ setCurrentPeriod(period) {
637
+ const current = this._currentSpec;
638
+ if (!current) {
639
+ this._currentSpec = { symbol: '', period };
640
+ return;
641
+ }
642
+ const next = { ...current, period };
643
+ this.setSymbols([next, ...this._comparisonSpecs]);
644
+ }
645
+ applyCustomData(source) {
646
+ if (source.symbol)
647
+ this.setCurrentSymbol(source.symbol);
648
+ if (source.period)
649
+ this.setCurrentPeriod(source.period);
650
+ const specs = this._symbolsSignal.peek();
651
+ if (specs.length === 0 && source.symbol) {
652
+ const mainSpec = {
653
+ symbol: source.symbol,
654
+ period: source.period ?? 'daily',
655
+ };
656
+ this._symbolsSignal.set([mainSpec]);
657
+ }
658
+ const plainData = source.data.map((d) => ({ ...d }));
659
+ this.setData(plainData);
660
+ if (source.comparisons) {
661
+ for (const key of this._comparisonData.keys()) {
662
+ if (!source.comparisons[key])
663
+ this.removeComparisonSymbol(key);
664
+ }
665
+ for (const [symbol, data] of Object.entries(source.comparisons)) {
666
+ this.setComparisonData(symbol, data.map((d) => ({ ...d })));
667
+ }
668
+ }
669
+ }
670
+ // ── Main symbol switching ──
385
671
  setSymbols(specs) {
386
672
  this._symbolsSignal.set(specs);
387
673
  if (specs.length === 0) {
674
+ this._currentSpec = null;
675
+ this.disposeAllBuffers();
676
+ this._dataSignal.set([]);
677
+ this.lastVisibleRange = { start: 0, end: 0 };
678
+ this.lastRawVisibleRange = { start: 0, end: 0 };
679
+ return;
680
+ }
681
+ const primary = specs[0];
682
+ this._currentSpec = primary;
683
+ if (primary.period === 'timeshare') {
684
+ // Switch to timeshare mode
388
685
  this.clearComparisonBuffers();
686
+ // Dispose primary KLine buffer
687
+ for (const [key, buf] of this._buffers) {
688
+ if (key.startsWith(BUF_PRIMARY)) {
689
+ this.disposeBuffer(key);
690
+ }
691
+ }
692
+ this._dataSignal.set([]);
693
+ this.lastVisibleRange = { start: 0, end: 0 };
694
+ this.lastRawVisibleRange = { start: 0, end: 0 };
695
+ // Get or create timeshare buffer
696
+ const tsKey = bufKey(BUF_TIMESHARE, primary.symbol);
697
+ let tsBuf = this._buffers.get(tsKey);
698
+ if (!tsBuf) {
699
+ tsBuf = new TimeShareBuffer();
700
+ tsBuf.setFetcher(this._timeShareFetcher);
701
+ this._buffers.set(tsKey, tsBuf);
702
+ }
703
+ this.activateBuffer(tsKey);
704
+ tsBuf.load(primary);
389
705
  return;
390
706
  }
707
+ // KLine mode
708
+ // Dispose timeshare buffer
709
+ for (const [key, buf] of this._buffers) {
710
+ if (key.startsWith(BUF_TIMESHARE)) {
711
+ this.disposeBuffer(key);
712
+ }
713
+ }
714
+ this.loadKLineSymbols(specs);
715
+ }
716
+ // ── KLine loading ──
717
+ loadKLineSymbols(specs) {
391
718
  const spec = specs[0];
392
719
  this.syncComparisonBuffers(specs.slice(1));
393
720
  if (!this._dataFetcher)
394
721
  return;
395
- this._dataBuffer.setFetcher(this._dataFetcher);
396
- this._dataBuffer.onPrepend = (count) => {
722
+ const buf = this.getPrimaryDataBuffer(spec.symbol, spec.period);
723
+ this.activateBuffer(bufKey(BUF_PRIMARY, spec.symbol, spec.period));
724
+ buf.onPrepend = (count) => {
397
725
  this.pendingPrependedCount = count;
398
726
  const dpr = this.deps.getEffectiveDpr();
399
727
  const opt = this.deps.getOption();
@@ -405,88 +733,51 @@ export class ChartDataManager {
405
733
  this.deps.setCachedScrollLeft(container.scrollLeft);
406
734
  }
407
735
  };
408
- if (!this._dataBufferUnsub) {
409
- this._dataBufferUnsub = this._dataBuffer.data.subscribe(() => {
410
- const prevLength = this._internalData.length;
411
- const bufferData = this._dataBuffer.data.peek();
412
- this._internalData = [...bufferData];
413
- this._dataSignal.set([...this._internalData]);
414
- const prependedCount = this.pendingPrependedCount;
415
- this.pendingPrependedCount = 0;
416
- if (this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
417
- const desiredScrollLeft = this.getLeftLoadBufferWidth();
418
- this.deps.setCachedScrollLeft(desiredScrollLeft);
419
- this.deps.setPendingScrollLeft(desiredScrollLeft);
420
- }
421
- if (prevLength === 0 && this._internalData.length > 0) {
422
- const dpr = this.deps.getEffectiveDpr();
423
- const opt = this.deps.getOption();
424
- const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr);
425
- const lastKLineEndPx = (startXPx + this._internalData.length * unitPx) / dpr;
426
- const container = this.deps.getDom().container;
427
- if (container) {
428
- const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - container.clientWidth);
429
- const contentWidth = this.getContentWidth();
430
- const maxScroll = Math.max(0, contentWidth - container.clientWidth);
431
- const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr;
432
- this.deps.setCachedScrollLeft(scrollLeft);
433
- this.deps.setPendingScrollLeft(scrollLeft);
434
- }
435
- }
436
- this.deps.resetInteraction();
437
- if (this.lastVisibleRange.start === 0 && this.lastVisibleRange.end === 0 && this._internalData.length > 0) {
438
- const plotWidth = this.deps.getObservedSize().width > 0
439
- ? this.deps.getObservedSize().width
440
- : Math.max(1, Math.round(this.deps.getDom().container?.clientWidth ?? 800));
441
- const dpr = this.deps.getEffectiveDpr();
442
- const opt = this.deps.getOption();
443
- const { start, end } = getVisibleRange(this.deps.getLogicalScrollLeft(), plotWidth, opt.kWidth, opt.kGap, this._internalData.length, dpr);
444
- this.lastRawVisibleRange = { start, end };
445
- this.lastVisibleRange = { start: Math.max(0, start), end };
446
- }
447
- const scheduler = this.deps.getIndicatorScheduler();
448
- const indicatorsReady = scheduler.update(this._internalData, this.lastVisibleRange);
449
- if (indicatorsReady) {
450
- this.pendingIndicatorDataUpdate = false;
451
- this.deps.scheduleDraw();
452
- }
453
- else {
454
- this.pendingIndicatorDataUpdate = true;
455
- }
456
- this.showIncrementalLoadHint(prependedCount);
457
- });
458
- }
459
- this._dataBuffer.setSymbol(spec);
736
+ buf.setSymbol(spec);
460
737
  }
738
+ // ── Content width ──
461
739
  getContentWidth() {
462
- const dataLength = this._internalData.length;
740
+ if (this.currentPeriod === 'timeshare') {
741
+ const tsData = this.getTimeShareData();
742
+ if (tsData.length === 0)
743
+ return 0;
744
+ const viewWidth = this.deps.getViewport()?.plotWidth ?? 0;
745
+ return this.getLeftLoadBufferWidth() + Math.max(viewWidth, 1);
746
+ }
747
+ const buf = this.getActiveDataBuffer();
748
+ const dataLength = buf ? buf.getRawData().length : 0;
463
749
  if (dataLength === 0)
464
750
  return 0;
465
751
  const opt = this.deps.getOption();
466
752
  const viewWidth = this.deps.getViewport()?.plotWidth ?? 0;
467
753
  const dpr = this.deps.getEffectiveDpr();
468
754
  const { startXPx, unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr);
469
- const dataPlotWidth = (startXPx + (ChartDataManager.LEADING_SLOTS + dataLength + ChartDataManager.TRAILING_DRAWING_SLOTS) * unitPx) / dpr;
755
+ const dataPlotWidth = (startXPx + (dataLength + ChartDataManager.TRAILING_DRAWING_SLOTS) * unitPx) / dpr;
470
756
  return this.getLeftLoadBufferWidth() + Math.max(dataPlotWidth, viewWidth);
471
757
  }
472
758
  scrollToRight() {
759
+ const buf = this.getActiveDataBuffer();
760
+ const dataLength = buf ? buf.getRawData().length : 0;
473
761
  const container = this.deps.getDom().container;
474
- if (!container || this._internalData.length === 0)
762
+ if (!container || dataLength === 0)
475
763
  return;
476
764
  const dpr = this.deps.getEffectiveDpr();
477
765
  const opt = this.deps.getOption();
478
766
  const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr);
479
- const lastKLineEndPx = (startXPx + this._internalData.length * unitPx) / dpr;
767
+ const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr;
480
768
  const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - container.clientWidth);
481
769
  const maxScroll = Math.max(0, container.scrollWidth - container.clientWidth);
482
770
  container.scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr;
483
771
  this.deps.setCachedScrollLeft(container.scrollLeft);
484
772
  }
773
+ // ── Comparison price range ──
485
774
  getComparisonEquivalentPriceRange(range) {
486
775
  if (this._comparisonSpecs.length === 0 || this._comparisonData.size === 0)
487
776
  return null;
777
+ const buf = this.getActiveDataBuffer();
778
+ const internalData = buf ? buf.getRawData() : [];
488
779
  const baseIndex = Math.max(0, range.start);
489
- const baseItem = this._internalData[baseIndex];
780
+ const baseItem = internalData[baseIndex];
490
781
  if (!baseItem || !Number.isFinite(baseItem.close) || baseItem.close <= 0)
491
782
  return null;
492
783
  const mainBase = baseItem.close;
@@ -509,8 +800,8 @@ export class ChartDataManager {
509
800
  else
510
801
  byDate.set(String(item.timestamp), item);
511
802
  }
512
- for (let i = Math.max(0, range.start); i < range.end && i < this._internalData.length; i++) {
513
- const mainItem = this._internalData[i];
803
+ for (let i = Math.max(0, range.start); i < range.end && i < internalData.length; i++) {
804
+ const mainItem = internalData[i];
514
805
  if (!mainItem)
515
806
  continue;
516
807
  const key = mainItem.date ?? String(mainItem.timestamp);
@@ -529,17 +820,26 @@ export class ChartDataManager {
529
820
  return null;
530
821
  return { min, max };
531
822
  }
823
+ // ── Index helpers ──
532
824
  getLogicalSlotCount() {
533
- return this._internalData.length + this.getTrailingSlotCount();
825
+ const buf = this.getActiveDataBuffer();
826
+ const dataLength = buf ? buf.getRawData().length : 0;
827
+ return dataLength + this.getTrailingSlotCount();
534
828
  }
535
829
  getTimestampAtLogicalIndex(index) {
536
- if (!Number.isInteger(index) || index < 0 || index >= this._internalData.length)
830
+ const buf = this.getActiveDataBuffer();
831
+ const data = buf ? buf.getRawData() : [];
832
+ if (!Number.isInteger(index) || index < 0 || index >= data.length)
537
833
  return null;
538
- return this._internalData[index]?.timestamp ?? null;
834
+ return data[index]?.timestamp ?? null;
539
835
  }
540
836
  getLogicalIndexAtX(mouseX) {
541
837
  const vp = this.deps.getViewport();
542
- if (!vp || this._internalData.length === 0)
838
+ if (!vp)
839
+ return null;
840
+ const buf = this.getActiveDataBuffer();
841
+ const data = buf ? buf.getRawData() : [];
842
+ if (data.length === 0)
543
843
  return null;
544
844
  const dpr = this.deps.getEffectiveDpr();
545
845
  const opt = this.deps.getOption();
@@ -552,21 +852,24 @@ export class ChartDataManager {
552
852
  }
553
853
  getDataIndexAtX(mouseX) {
554
854
  const index = this.getLogicalIndexAtX(mouseX);
555
- if (index === null || index >= this._internalData.length)
855
+ const buf = this.getActiveDataBuffer();
856
+ const dataLength = buf ? buf.getRawData().length : 0;
857
+ if (index === null || index >= dataLength)
556
858
  return null;
557
859
  return index;
558
860
  }
559
- destroy() {
560
- if (this._dataBufferUnsub) {
561
- this._dataBufferUnsub();
562
- this._dataBufferUnsub = null;
861
+ disposeAllBuffers() {
862
+ for (const key of this._buffers.keys()) {
863
+ this.disposeBuffer(key);
563
864
  }
865
+ }
866
+ destroy() {
867
+ this._activeBufferUnsub?.();
868
+ this.disposeAllBuffers();
564
869
  this.clearIncrementalLoadHintTimer();
565
870
  this.incrementalLoadHintEl?.remove();
566
871
  this.incrementalLoadHintEl = null;
567
872
  this.pendingPrependedCount = 0;
568
- this._dataBuffer.dispose();
569
- this.clearComparisonBuffers();
570
873
  }
571
874
  }
572
875
  function findComparisonBaselineByDate(data, date) {