@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
@@ -29,6 +29,7 @@ import type {
29
29
  PaneSpec,
30
30
  SymbolSpec,
31
31
  DataFetcher,
32
+ CustomDataSource,
32
33
  } from './types'
33
34
  import type { CustomMarkerEntity } from '../engine/marker/registry'
34
35
  import { Chart, type InteractionSnapshot as LegacyInteractionSnapshot } from '../engine/chart'
@@ -60,6 +61,7 @@ const DEFAULT_OPTS = {
60
61
  minKWidth: 1,
61
62
  maxKWidth: 50,
62
63
  rightAxisWidth: 0,
64
+ leftAxisWidth: 0,
63
65
  bottomAxisHeight: 24,
64
66
  priceLabelWidth: 60,
65
67
  zoomLevels: 20,
@@ -119,6 +121,7 @@ interface MountedDom {
119
121
  scrollContent?: HTMLDivElement
120
122
  canvasLayer: HTMLDivElement
121
123
  rightAxisLayer: HTMLDivElement
124
+ leftAxisLayer?: HTMLDivElement
122
125
  xAxisCanvas: HTMLCanvasElement
123
126
  cleanup: () => void
124
127
  }
@@ -264,10 +267,18 @@ function buildDom(container: HTMLElement): MountedDom {
264
267
  rightAxisLayer.style.right = '0'
265
268
  chartContainer.appendChild(rightAxisLayer)
266
269
 
270
+ const leftAxisLayer = ownerDoc.createElement('div')
271
+ leftAxisLayer.className = 'klc-left-axis-host'
272
+ leftAxisLayer.style.position = 'absolute'
273
+ leftAxisLayer.style.top = '0'
274
+ leftAxisLayer.style.left = '0'
275
+ chartContainer.appendChild(leftAxisLayer)
276
+
267
277
  const cleanup = (): void => {
268
278
  try {
269
279
  scrollContent.remove()
270
280
  rightAxisLayer.remove()
281
+ leftAxisLayer.remove()
271
282
  if (containerCreatedByUs) {
272
283
  chartContainer.remove()
273
284
  }
@@ -276,7 +287,7 @@ function buildDom(container: HTMLElement): MountedDom {
276
287
  }
277
288
  }
278
289
 
279
- return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, xAxisCanvas, cleanup }
290
+ return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, leftAxisLayer, xAxisCanvas, cleanup }
280
291
  }
281
292
 
282
293
  // ---------------------------------------------------------------------------
@@ -299,6 +310,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
299
310
  container: opts.container as HTMLDivElement,
300
311
  canvasLayer: opts.canvasLayer as HTMLDivElement,
301
312
  rightAxisLayer: opts.rightAxisLayer as HTMLDivElement,
313
+ leftAxisLayer: opts.leftAxisLayer as HTMLDivElement | undefined,
302
314
  xAxisCanvas: opts.xAxisCanvas!,
303
315
  cleanup: () => { /* DOM owned by caller */ },
304
316
  }
@@ -310,6 +322,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
310
322
  const chartOptions: ChartOptions = {
311
323
  yPaddingPx: opts.yPaddingPx ?? DEFAULT_OPTS.yPaddingPx,
312
324
  rightAxisWidth: opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth,
325
+ leftAxisWidth: opts.leftAxisWidth ?? DEFAULT_OPTS.leftAxisWidth,
313
326
  bottomAxisHeight: opts.bottomAxisHeight ?? DEFAULT_OPTS.bottomAxisHeight,
314
327
  minKWidth: opts.minKWidth ?? DEFAULT_OPTS.minKWidth,
315
328
  maxKWidth: opts.maxKWidth ?? DEFAULT_OPTS.maxKWidth,
@@ -326,6 +339,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
326
339
  scrollContent: mounted.scrollContent,
327
340
  canvasLayer: mounted.canvasLayer,
328
341
  rightAxisLayer: mounted.rightAxisLayer,
342
+ leftAxisLayer: mounted.leftAxisLayer,
329
343
  xAxisCanvas: mounted.xAxisCanvas,
330
344
  },
331
345
  chartOptions,
@@ -428,7 +442,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
428
442
 
429
443
  // dataLoading
430
444
  unsubs.push(
431
- chart.dataBuffer.loading.subscribe(() => dataLoading.set(chart.dataBuffer.loading.peek())),
445
+ chart.loading.subscribe(() => dataLoading.set(chart.loading.peek())),
432
446
  )
433
447
 
434
448
  // theme
@@ -530,6 +544,31 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
530
544
  chart.removeComparisonSymbol(symbol)
531
545
  }
532
546
 
547
+ function setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void {
548
+ if (disposed) return
549
+ chart.setComparisonData(symbol, [...data])
550
+ }
551
+
552
+ function setCurrentSymbol(symbol: string): void {
553
+ if (disposed) return
554
+ chart.setCurrentSymbol(symbol)
555
+ }
556
+
557
+ function setCurrentPeriod(period: string): void {
558
+ if (disposed) return
559
+ chart.setCurrentPeriod(period)
560
+ }
561
+
562
+ function switchToTimeShareForDate(dateYYYYMMDD: number): void {
563
+ if (disposed) return
564
+ chart.switchToTimeShareForDate(dateYYYYMMDD)
565
+ }
566
+
567
+ function applyCustomData(source: CustomDataSource): void {
568
+ if (disposed) return
569
+ chart.applyCustomData(source)
570
+ }
571
+
533
572
  function setDataFetcher(fetcher: DataFetcher | null): void {
534
573
  if (disposed) return
535
574
  chart.setDataFetcher(fetcher)
@@ -679,6 +718,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
679
718
  chart.setDrawings(drawings)
680
719
  }
681
720
 
721
+ function getFullDrawings(): any[] {
722
+ if (disposed) return []
723
+ return chart.drawings() as any[]
724
+ }
725
+
682
726
  function setSelectedDrawingId(id: string | null): void {
683
727
  if (disposed) return
684
728
  chart.setSelectedDrawingId(id)
@@ -815,7 +859,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
815
859
  let bridge: ChartBridge | null = null
816
860
  if (opts.mcp) {
817
861
  const mcp = opts.mcp
818
- const wsUrl = mcp.wsUrl ?? 'ws://localhost:8080'
862
+ const wsUrl = mcp.wsUrl ?? 'ws://localhost:8081'
819
863
  console.info(`[MCP] Creating bridge, wsUrl=${wsUrl}`)
820
864
  bridge = new ChartBridge({
821
865
  wsUrl,
@@ -859,6 +903,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
859
903
  setSymbols,
860
904
  addComparisonSymbol,
861
905
  removeComparisonSymbol,
906
+ setComparisonData,
907
+ setCurrentSymbol,
908
+ setCurrentPeriod,
909
+ switchToTimeShareForDate,
910
+ applyCustomData,
862
911
  setDataFetcher,
863
912
  ensureDataRange,
864
913
  setData,
@@ -887,6 +936,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
887
936
  clearDrawings,
888
937
  removeDrawing,
889
938
  setDrawings,
939
+ getFullDrawings,
890
940
  setSelectedDrawingId,
891
941
  getViewport,
892
942
  getKWidthKGap,
@@ -9,8 +9,9 @@
9
9
  */
10
10
 
11
11
  import type { Signal } from '../reactivity'
12
- import type { CustomMarkerEntity, MarkerEntity } from '../engine/marker/registry'
12
+ import type { CustomMarkerEntity } from '../engine/marker/registry'
13
13
  import type { PaneSpec } from '../engine/chartTypes'
14
+ import type { InteractionSnapshot } from '../engine/chart'
14
15
 
15
16
  // Controller-owned public surface. Legacy engine types may mirror these
16
17
  // shapes internally, but adapters depend only on core-defined contracts.
@@ -74,6 +75,14 @@ export interface KLineData {
74
75
  date?: string
75
76
  }
76
77
 
78
+ export interface TimeShareData {
79
+ timestamp: number
80
+ price: number
81
+ average: number
82
+ volume: number
83
+ amount: number
84
+ }
85
+
77
86
  export type { PaneSpec }
78
87
 
79
88
  // ---------------------------------------------------------------------------
@@ -102,6 +111,17 @@ export type DataFetcher = (
102
111
  },
103
112
  ) => Promise<ReadonlyArray<KLineData>>
104
113
 
114
+ /** User-provided K-line data bundle — bypasses the fetcher pipeline entirely */
115
+ export interface CustomDataSource {
116
+ symbol?: string
117
+ period?: string
118
+ adjust?: string
119
+ /** Main chart K-line data (required) */
120
+ data: ReadonlyArray<KLineData>
121
+ /** Comparison products keyed by symbol */
122
+ comparisons?: Record<string, ReadonlyArray<KLineData>>
123
+ }
124
+
105
125
  // ---------------------------------------------------------------------------
106
126
  // Indicator metadata
107
127
  // ---------------------------------------------------------------------------
@@ -130,22 +150,7 @@ export interface IndicatorDefinition {
130
150
  // Interaction state
131
151
  // ---------------------------------------------------------------------------
132
152
 
133
- export interface InteractionSnapshot {
134
- crosshairPos: { x: number; y: number } | null
135
- crosshairIndex: number | null
136
- crosshairPrice: number | null
137
- hoveredIndex: number | null
138
- activePaneId: string | null
139
- tooltipPos: { x: number; y: number }
140
- tooltipAnchorPlacement: 'right-bottom' | 'left-bottom'
141
- hoveredMarkerData: MarkerEntity | null
142
- hoveredCustomMarker: CustomMarkerEntity | null
143
- isDragging: boolean
144
- isResizingPaneBoundary: boolean
145
- isHoveringPaneBoundary: boolean
146
- hoveredPaneBoundaryId: string | null
147
- isHoveringRightAxis: boolean
148
- }
153
+ export type { InteractionSnapshot }
149
154
 
150
155
  // ---------------------------------------------------------------------------
151
156
  // Pane info (read-only pane metadata for DrawingChartAdapter)
@@ -170,6 +175,8 @@ export interface DrawingChartViewport {
170
175
  export interface DrawingChartAdapter {
171
176
  /** persist full drawing list to the chart engine */
172
177
  setDrawings(drawings: any[]): void
178
+ /** read the full drawing list (plugin-level DrawingObject) */
179
+ getFullDrawings(): any[]
173
180
  /** highlight a drawing by ID */
174
181
  setSelectedDrawingId(id: string | null): void
175
182
  /** current viewport (nullable if chart not ready) */
@@ -218,11 +225,13 @@ export interface ChartMountOptions {
218
225
  // Pre-existing DOM elements (skip buildDom when provided)
219
226
  canvasLayer?: HTMLElement
220
227
  rightAxisLayer?: HTMLElement
228
+ leftAxisLayer?: HTMLElement
221
229
  xAxisCanvas?: HTMLCanvasElement
222
230
 
223
231
  // Chart options overrides
224
232
  yPaddingPx?: number
225
233
  rightAxisWidth?: number
234
+ leftAxisWidth?: number
226
235
  bottomAxisHeight?: number
227
236
  priceLabelWidth?: number
228
237
  minKWidth?: number
@@ -262,6 +271,16 @@ export interface ChartController extends DrawingChartAdapter {
262
271
  setSymbols(next: ReadonlyArray<SymbolSpec>): void
263
272
  addComparisonSymbol(spec: SymbolSpec): void
264
273
  removeComparisonSymbol(symbol: string): void
274
+ /** Inject comparison product data directly (bypasses fetcher) */
275
+ setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void
276
+ /** Update the main symbol code without triggering a fetch */
277
+ setCurrentSymbol(symbol: string): void
278
+ /** Update the K-line period without triggering a fetch */
279
+ setCurrentPeriod(period: string): void
280
+ /** Switch to time-share view for a specific date (YYYYMMDD), e.g. after double-clicking a daily bar */
281
+ switchToTimeShareForDate(dateYYYYMMDD: number): void
282
+ /** Inject a complete custom data bundle (bypasses fetcher pipeline) */
283
+ applyCustomData(source: CustomDataSource): void
265
284
  setDataFetcher(fetcher: DataFetcher | null): void
266
285
  setData(next: ReadonlyArray<KLineData>): void
267
286
  appendData(next: ReadonlyArray<KLineData>): void
@@ -199,6 +199,38 @@ describe('DataBuffer', () => {
199
199
  expect(fetchCount).toBeGreaterThanOrEqual(2)
200
200
  })
201
201
 
202
+ it('deduplicates same-boundary ensureRange calls while request is pending', async () => {
203
+ const now = Date.now()
204
+ const oneYearAgo = now - 365 * MS_PER_DAY
205
+
206
+ const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
207
+ let fetchCount = 0
208
+ const fetcher: DataFetcher = async () => {
209
+ fetchCount++
210
+ await new Promise((r) => setTimeout(r, 10))
211
+ if (fetchCount === 1) return initialData
212
+ return [makeKLine(oneYearAgo - 90 * MS_PER_DAY)]
213
+ }
214
+
215
+ buffer.setFetcher(fetcher)
216
+ buffer.setSymbol(defaultSpec)
217
+
218
+ await vi.waitFor(() => {
219
+ expect(buffer.loading()).toBe(false)
220
+ })
221
+
222
+ buffer.ensureRange(oneYearAgo - 30 * MS_PER_DAY, oneYearAgo)
223
+ buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
224
+
225
+ expect(fetchCount).toBe(2)
226
+
227
+ await vi.waitFor(() => {
228
+ expect(buffer.loading()).toBe(false)
229
+ })
230
+
231
+ expect(fetchCount).toBe(2)
232
+ })
233
+
202
234
  it('dispose prevents further fetches', async () => {
203
235
  const fetcher: DataFetcher = async () => {
204
236
  return [makeKLine(Date.now())]
@@ -285,7 +317,7 @@ describe('DataBuffer', () => {
285
317
  expect(prependCalls).toHaveLength(0)
286
318
  })
287
319
 
288
- it('ensureRange skips when same boundary was already attempted (empty fetch)', async () => {
320
+ it('ensureRange allows retry when previous fetch did not advance earliestTs', async () => {
289
321
  const now = Date.now()
290
322
  const oneYearAgo = now - 365 * MS_PER_DAY
291
323
  const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
@@ -295,7 +327,7 @@ describe('DataBuffer', () => {
295
327
  fetchCount++
296
328
  if (fetchCount === 1) return initialData
297
329
  // Return data with same timestamps so mergeSortedData deduplicates them,
298
- // avoiding loadedWindow change while keeping boundary in _attemptedBoundaries
330
+ // avoiding loadedWindow change. The boundary should remain retryable.
299
331
  return initialData
300
332
  }
301
333
 
@@ -316,12 +348,14 @@ describe('DataBuffer', () => {
316
348
 
317
349
  expect(fetchCount).toBe(2)
318
350
 
319
- // same boundary should be skipped
351
+ // Same boundary but the previous fetch did not prepend data, so retry.
320
352
  buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
321
353
 
322
- await new Promise((r) => setTimeout(r, 50))
354
+ await vi.waitFor(() => {
355
+ expect(buffer.loading()).toBe(false)
356
+ })
323
357
 
324
- expect(fetchCount).toBe(2)
358
+ expect(fetchCount).toBe(3)
325
359
  })
326
360
 
327
361
  it('ensureRange allows retry when earliestTs moves after successful load', async () => {
@@ -58,7 +58,7 @@ async function fetchBaoStock(
58
58
  version: '1.0.0',
59
59
  capabilities: ['daily', 'weekly', 'monthly', '5min', '15min', '30min', '60min'],
60
60
  })
61
- export class BaoStockFetcher {
61
+ class BaoStockFetcher {
62
62
  static fetcher = fetchBaoStock
63
63
  }
64
64
 
@@ -1,5 +1,6 @@
1
1
  import { createSignal, type Signal } from '../reactivity/signal'
2
2
  import type { DataFetcher, KLineData, SymbolSpec } from '../controllers/types'
3
+ import type { DataBufferLike } from './dataBufferTypes'
3
4
 
4
5
  export interface DataWindow {
5
6
  earliestTs: number
@@ -35,7 +36,7 @@ function mergeSortedData(
35
36
  return merged
36
37
  }
37
38
 
38
- export class DataBuffer {
39
+ export class DataBuffer implements DataBufferLike {
39
40
  private _data: KLineData[] = []
40
41
  private _dataSignal: Signal<ReadonlyArray<KLineData>>
41
42
  private _loadingSignal: Signal<boolean>
@@ -54,8 +55,8 @@ export class DataBuffer {
54
55
  this._loadingSignal = createSignal<boolean>(false)
55
56
  }
56
57
 
57
- get data(): Signal<ReadonlyArray<KLineData>> {
58
- return this._dataSignal
58
+ get data(): Signal<ReadonlyArray<unknown>> {
59
+ return this._dataSignal as Signal<ReadonlyArray<unknown>>
59
60
  }
60
61
 
61
62
  get loading(): Signal<boolean> {
@@ -70,6 +71,10 @@ export class DataBuffer {
70
71
  return this._loadedWindow
71
72
  }
72
73
 
74
+ getRawData(): KLineData[] {
75
+ return this._data
76
+ }
77
+
73
78
  setFetcher(fetcher: DataFetcher | null): void {
74
79
  this._fetcher = fetcher
75
80
  }
@@ -159,17 +164,22 @@ export class DataBuffer {
159
164
  const oldLength = this._data.length
160
165
  const oldEarliestTs = oldLength > 0 ? this._data[0]!.timestamp : null
161
166
  const merged = mergeSortedData(this._data, [...incoming])
162
-
163
- if (oldLength > 0 && merged.length > oldLength && oldEarliestTs !== null) {
164
- const newEarliestTs = merged[0]!.timestamp
165
- if (newEarliestTs < oldEarliestTs) {
166
- const prependCount = merged.findIndex((d) => d.timestamp === oldEarliestTs)
167
- if (prependCount > 0) {
168
- this.onPrepend?.(prependCount)
169
- }
167
+ const newEarliestTs = merged[0]?.timestamp ?? null
168
+ const advancedEarliest = oldEarliestTs !== null
169
+ && newEarliestTs !== null
170
+ && newEarliestTs < oldEarliestTs
171
+
172
+ if (oldLength > 0 && merged.length > oldLength && advancedEarliest) {
173
+ const prependCount = merged.findIndex((d) => d.timestamp === oldEarliestTs)
174
+ if (prependCount > 0) {
175
+ this.onPrepend?.(prependCount)
170
176
  }
171
177
  }
172
178
 
179
+ if (oldLength > 0 && !advancedEarliest) {
180
+ this._attemptedBoundaries.delete(endTs)
181
+ }
182
+
173
183
  this._data = merged
174
184
  this._dataSignal.set([...merged])
175
185
 
@@ -217,6 +227,33 @@ export class DataBuffer {
217
227
  })
218
228
  }
219
229
 
230
+ /**
231
+ * Put the buffer in inline mode — use the provided data directly
232
+ * instead of fetching. Sets data signal and tracks loadedWindow.
233
+ */
234
+ setInlineData(data: unknown[]): void {
235
+ if (this._disposed) return
236
+ const kData = data as KLineData[]
237
+ this._data = [...kData]
238
+ this._dataSignal.set([...kData])
239
+ if (data.length > 0) {
240
+ this._loadedWindow = {
241
+ earliestTs: kData[0]!.timestamp,
242
+ latestTs: kData[kData.length - 1]!.timestamp,
243
+ }
244
+ } else {
245
+ this._loadedWindow = null
246
+ }
247
+ this._attemptedBoundaries.clear()
248
+ }
249
+
250
+ /**
251
+ * Update just the spec metadata without triggering any fetch.
252
+ */
253
+ setCurrentSpec(spec: SymbolSpec): void {
254
+ this._currentSpec = spec
255
+ }
256
+
220
257
  dispose(): void {
221
258
  this._disposed = true
222
259
  this._pendingFetch = null
@@ -0,0 +1,11 @@
1
+ import type { Signal } from '../reactivity/signal'
2
+ import type { DataWindow } from './dataBuffer'
3
+
4
+ export interface DataBufferLike {
5
+ readonly data: Signal<ReadonlyArray<unknown>>
6
+ readonly loading: Signal<boolean>
7
+ readonly loadedWindow: DataWindow | null
8
+ getRawData(): unknown[]
9
+ setInlineData(data: unknown[]): void
10
+ dispose(): void
11
+ }
@@ -1,8 +1,9 @@
1
- import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn } from './types'
1
+ import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
2
2
 
3
3
  type DataFetcherClass = {
4
4
  new(...args: never[]): unknown
5
5
  fetcher: DataFetcherFn
6
+ timeShareFetcher?: TimeShareFetcherFn
6
7
  }
7
8
 
8
9
  const definitions = new Map<string, DataFetcherDefinition>()
@@ -18,6 +19,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
18
19
  definitions.set(config.name, {
19
20
  ...config,
20
21
  fetcher: this.fetcher,
22
+ timeShareFetcher: this.timeShareFetcher,
21
23
  })
22
24
  })
23
25
  return value
@@ -30,11 +32,11 @@ export function getRegisteredFetcher(
30
32
  return definitions.get(name)
31
33
  }
32
34
 
33
- export function getRegisteredFetchers(): DataFetcherDefinition[] {
35
+ function getRegisteredFetchers(): DataFetcherDefinition[] {
34
36
  return Array.from(definitions.values())
35
37
  }
36
38
 
37
- export function fetcherHasCapability(name: string, capability: string): boolean {
39
+ function fetcherHasCapability(name: string, capability: string): boolean {
38
40
  return definitions.get(name)?.capabilities?.includes(capability) ?? false
39
41
  }
40
42
 
@@ -45,6 +47,14 @@ export function fetcherSupportsPeriod(name: string, period: string): boolean {
45
47
  return def.capabilities.includes('*') || def.capabilities.includes(period)
46
48
  }
47
49
 
50
+ export function getTimeShareFetcher(name: string): TimeShareFetcherFn | undefined {
51
+ return definitions.get(name)?.timeShareFetcher
52
+ }
53
+
54
+ export function fetcherSupportsTimeShare(name: string): boolean {
55
+ return typeof definitions.get(name)?.timeShareFetcher === 'function'
56
+ }
57
+
48
58
  export function clearRegisteredFetchersForTest(): void {
49
59
  definitions.clear()
50
- }
60
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export from root gotdx fetcher.
3
+ * This file exists for backward compatibility only.
4
+ * All implementation lives in packages/core/src/data-fetchers/gotdx.ts
5
+ */
6
+ export * from '../gotdx'
@@ -1,6 +1,6 @@
1
- import type { KLineData } from '../controllers/types'
1
+ import type { KLineData, TimeShareData } from '../controllers/types'
2
2
  import { DataFetcher } from './fetcherDefinitionRegistry'
3
- import type { FetchConfig } from './types'
3
+ import type { FetchConfig, TimeShareFetchConfig } from './types'
4
4
 
5
5
  const PERIOD_TO_CATEGORY: Record<string, number> = {
6
6
  '1min': 8,
@@ -31,6 +31,46 @@ const EXCHANGE_EX_CATEGORY: Record<string, number> = {
31
31
 
32
32
  const BASE_URL = 'http://127.0.0.1:8080'
33
33
 
34
+ function getShanghaiDateYYYYMMDD(): number {
35
+ const formatter = new Intl.DateTimeFormat('zh-CN', {
36
+ timeZone: 'Asia/Shanghai',
37
+ year: 'numeric', month: '2-digit', day: '2-digit',
38
+ })
39
+ const parts = formatter.formatToParts(new Date())
40
+ let y = '', m = '', d = ''
41
+ for (const p of parts) {
42
+ if (p.type === 'year') y = p.value
43
+ else if (p.type === 'month') m = p.value
44
+ else if (p.type === 'day') d = p.value
45
+ }
46
+ return +y * 10000 + +m * 100 + +d
47
+ }
48
+
49
+ async function fetchGotdxHistoryTick(
50
+ _source: string,
51
+ config: TimeShareFetchConfig,
52
+ ): Promise<ReadonlyArray<TimeShareData>> {
53
+ const body = {
54
+ date: config.date ?? getShanghaiDateYYYYMMDD(),
55
+ market: config.symbol.startsWith('6') || config.symbol.startsWith('9') ? 1 : 0,
56
+ code: config.symbol,
57
+ }
58
+ const res = await fetch(`${BASE_URL}/api/stock/history-tick`, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify(body),
62
+ })
63
+ if (!res.ok) throw new Error(`[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
64
+ const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
65
+ return list.map((item) => ({
66
+ timestamp: new Date(item.timestamp).getTime(),
67
+ price: item.Price,
68
+ average: item.Avg,
69
+ volume: item.Vol,
70
+ amount: item.Price * item.Vol,
71
+ }))
72
+ }
73
+
34
74
  interface SecurityBar {
35
75
  Last: number
36
76
  Open: number
@@ -154,9 +194,7 @@ async function fetchGotdx(
154
194
  'daily', 'weekly', 'monthly', 'quarterly', 'yearly',
155
195
  ],
156
196
  })
157
- export class GotdxFetcher {
197
+ class GotdxFetcher {
158
198
  static fetcher = fetchGotdx
159
- }
160
-
161
- /** @deprecated Use `GotdxFetcher.fetcher` directly or rely on routerDataFetcher. */
162
- export const gotdxDataFetcher = fetchGotdx
199
+ static timeShareFetcher = fetchGotdxHistoryTick
200
+ }
@@ -70,7 +70,7 @@ async function fetchHundredMock(
70
70
  version: '1.0.0',
71
71
  capabilities: ['*'],
72
72
  })
73
- export class HundredMockFetcher {
73
+ class HundredMockFetcher {
74
74
  static fetcher = fetchHundredMock
75
75
  }
76
76
 
@@ -1,22 +1,12 @@
1
- export { HundredMockFetcher, hundredMockDataFetcher } from './hundred-mock'
2
- export { ThousandMockFetcher, thousandMockDataFetcher } from './thousand-mock'
3
- export { BaoStockFetcher, baostockDataFetcher } from './baostock'
4
- export { TradingviewFetcher, tradingviewDataFetcher } from './tradingview'
5
- export { GotdxFetcher, gotdxDataFetcher } from './gotdx'
6
- export { routerDataFetcher } from './router'
1
+ export { hundredMockDataFetcher } from './hundred-mock'
2
+ export { thousandMockDataFetcher } from './thousand-mock'
3
+ export { baostockDataFetcher } from './baostock'
4
+ export { routerDataFetcher, routerTimeShareFetcher } from './router'
7
5
  export { DataBuffer } from './dataBuffer'
8
6
  export type { DataWindow } from './dataBuffer'
9
- export {
10
- DataFetcher,
11
- getRegisteredFetcher,
12
- getRegisteredFetchers,
13
- fetcherHasCapability,
14
- fetcherSupportsPeriod,
15
- clearRegisteredFetchersForTest,
16
- } from './fetcherDefinitionRegistry'
17
- export type {
18
- FetchConfig,
19
- DataFetcherDefinitionConfig,
20
- DataFetcherDefinition,
21
- DataFetcherFn,
22
- } from './types'
7
+ export { TimeShareBuffer } from './timeShareBuffer'
8
+ export type { DataBufferLike } from './dataBufferTypes'
9
+ export { getRegisteredFetcher, getTimeShareFetcher, fetcherSupportsTimeShare } from './fetcherDefinitionRegistry'
10
+ export type { TimeShareFetcherFn, TimeShareFetchConfig } from './types'
11
+ import './gotdx'
12
+ import './tradingview'
@@ -1,5 +1,6 @@
1
1
  import type { DataFetcher } from '../controllers/types'
2
- import { getRegisteredFetcher, fetcherSupportsPeriod } from './fetcherDefinitionRegistry'
2
+ import type { TimeShareFetcherFn } from './types'
3
+ import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
3
4
 
4
5
  const FALLBACK_SOURCE = 'baostock'
5
6
 
@@ -30,3 +31,13 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
30
31
 
31
32
  return def.fetcher(source, config)
32
33
  }
34
+
35
+ export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
36
+ const fetcher = getTimeShareFetcher(source)
37
+ if (!fetcher) {
38
+ return Promise.reject(
39
+ new Error(`[DataFetcher] "${source}" does not support timeshare data fetching`),
40
+ )
41
+ }
42
+ return fetcher(source, config)
43
+ }
@@ -55,7 +55,7 @@ async function fetchThousandMock(
55
55
  version: '1.0.0',
56
56
  capabilities: ['*'],
57
57
  })
58
- export class ThousandMockFetcher {
58
+ class ThousandMockFetcher {
59
59
  static fetcher = fetchThousandMock
60
60
  }
61
61