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

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 (578) hide show
  1. package/dist/alerts/createAlertController.d.ts +30 -0
  2. package/dist/alerts/createAlertController.d.ts.map +1 -0
  3. package/dist/alerts/createAlertController.js +261 -0
  4. package/dist/alerts/createAlertController.js.map +1 -0
  5. package/dist/alerts/index.d.ts +5 -0
  6. package/dist/alerts/index.d.ts.map +1 -0
  7. package/dist/alerts/index.js +4 -0
  8. package/dist/alerts/index.js.map +1 -0
  9. package/dist/alerts/predicates.d.ts +28 -0
  10. package/dist/alerts/predicates.d.ts.map +1 -0
  11. package/dist/alerts/predicates.js +211 -0
  12. package/dist/alerts/predicates.js.map +1 -0
  13. package/dist/alerts/rollingVolume.d.ts +15 -0
  14. package/dist/alerts/rollingVolume.d.ts.map +1 -0
  15. package/dist/alerts/rollingVolume.js +42 -0
  16. package/dist/alerts/rollingVolume.js.map +1 -0
  17. package/dist/alerts/ruleSchema.d.ts +42 -0
  18. package/dist/alerts/ruleSchema.d.ts.map +1 -0
  19. package/dist/alerts/ruleSchema.js +240 -0
  20. package/dist/alerts/ruleSchema.js.map +1 -0
  21. package/dist/alerts/types.d.ts +169 -0
  22. package/dist/alerts/types.d.ts.map +1 -0
  23. package/dist/alerts/types.js +24 -0
  24. package/dist/alerts/types.js.map +1 -0
  25. package/dist/chartTypes/heikinAshi.d.ts +49 -0
  26. package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
  27. package/dist/chartTypes/heikinAshi.js +94 -0
  28. package/dist/chartTypes/heikinAshi.js.map +1 -0
  29. package/dist/chartTypes/index.d.ts +6 -0
  30. package/dist/chartTypes/index.d.ts.map +1 -0
  31. package/dist/chartTypes/index.js +5 -0
  32. package/dist/chartTypes/index.js.map +1 -0
  33. package/dist/chartTypes/pointAndFigure.d.ts +83 -0
  34. package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
  35. package/dist/chartTypes/pointAndFigure.js +159 -0
  36. package/dist/chartTypes/pointAndFigure.js.map +1 -0
  37. package/dist/chartTypes/rangeBars.d.ts +61 -0
  38. package/dist/chartTypes/rangeBars.d.ts.map +1 -0
  39. package/dist/chartTypes/rangeBars.js +181 -0
  40. package/dist/chartTypes/rangeBars.js.map +1 -0
  41. package/dist/chartTypes/renko.d.ts +94 -0
  42. package/dist/chartTypes/renko.d.ts.map +1 -0
  43. package/dist/chartTypes/renko.js +207 -0
  44. package/dist/chartTypes/renko.js.map +1 -0
  45. package/dist/chartTypes/types.d.ts +97 -0
  46. package/dist/chartTypes/types.d.ts.map +1 -0
  47. package/dist/chartTypes/types.js +39 -0
  48. package/dist/chartTypes/types.js.map +1 -0
  49. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
  50. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
  51. package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
  52. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
  53. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
  54. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
  55. package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
  56. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
  57. package/dist/components/anchoredVwap/index.d.ts +11 -0
  58. package/dist/components/anchoredVwap/index.d.ts.map +1 -0
  59. package/dist/components/anchoredVwap/index.js +10 -0
  60. package/dist/components/anchoredVwap/index.js.map +1 -0
  61. package/dist/components/anchoredVwap/types.d.ts +171 -0
  62. package/dist/components/anchoredVwap/types.d.ts.map +1 -0
  63. package/dist/components/anchoredVwap/types.js +25 -0
  64. package/dist/components/anchoredVwap/types.js.map +1 -0
  65. package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
  66. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
  67. package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
  68. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
  69. package/dist/components/crosshairSync/index.d.ts +2 -0
  70. package/dist/components/crosshairSync/index.d.ts.map +1 -0
  71. package/dist/components/crosshairSync/index.js +2 -0
  72. package/dist/components/crosshairSync/index.js.map +1 -0
  73. package/dist/components/footprint/aggressor.d.ts +89 -0
  74. package/dist/components/footprint/aggressor.d.ts.map +1 -0
  75. package/dist/components/footprint/aggressor.js +106 -0
  76. package/dist/components/footprint/aggressor.js.map +1 -0
  77. package/dist/components/footprint/createFootprintController.d.ts +29 -0
  78. package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
  79. package/dist/components/footprint/createFootprintController.js +264 -0
  80. package/dist/components/footprint/createFootprintController.js.map +1 -0
  81. package/dist/components/footprint/index.d.ts +7 -0
  82. package/dist/components/footprint/index.d.ts.map +1 -0
  83. package/dist/components/footprint/index.js +4 -0
  84. package/dist/components/footprint/index.js.map +1 -0
  85. package/dist/components/footprint/perBarStats.d.ts +63 -0
  86. package/dist/components/footprint/perBarStats.d.ts.map +1 -0
  87. package/dist/components/footprint/perBarStats.js +123 -0
  88. package/dist/components/footprint/perBarStats.js.map +1 -0
  89. package/dist/components/footprint/types.d.ts +197 -0
  90. package/dist/components/footprint/types.d.ts.map +1 -0
  91. package/dist/components/footprint/types.js +23 -0
  92. package/dist/components/footprint/types.js.map +1 -0
  93. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
  94. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
  95. package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
  96. package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
  97. package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
  98. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
  99. package/dist/components/mtfOverlay/createMtfController.js +134 -0
  100. package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
  101. package/dist/components/mtfOverlay/index.d.ts +19 -0
  102. package/dist/components/mtfOverlay/index.d.ts.map +1 -0
  103. package/dist/components/mtfOverlay/index.js +18 -0
  104. package/dist/components/mtfOverlay/index.js.map +1 -0
  105. package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
  106. package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
  107. package/dist/components/mtfOverlay/resampleBars.js +93 -0
  108. package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
  109. package/dist/components/mtfOverlay/types.d.ts +132 -0
  110. package/dist/components/mtfOverlay/types.d.ts.map +1 -0
  111. package/dist/components/mtfOverlay/types.js +22 -0
  112. package/dist/components/mtfOverlay/types.js.map +1 -0
  113. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
  114. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
  115. package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
  116. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
  117. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
  118. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
  119. package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
  120. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
  121. package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
  122. package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
  123. package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
  124. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
  125. package/dist/components/orderBookHeatmap/index.d.ts +13 -0
  126. package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
  127. package/dist/components/orderBookHeatmap/index.js +12 -0
  128. package/dist/components/orderBookHeatmap/index.js.map +1 -0
  129. package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
  130. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
  131. package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
  132. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
  133. package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
  134. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
  135. package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
  136. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
  137. package/dist/components/orderBookHeatmap/types.d.ts +128 -0
  138. package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
  139. package/dist/components/orderBookHeatmap/types.js +16 -0
  140. package/dist/components/orderBookHeatmap/types.js.map +1 -0
  141. package/dist/components/volumeProfile/binning.d.ts +54 -0
  142. package/dist/components/volumeProfile/binning.d.ts.map +1 -0
  143. package/dist/components/volumeProfile/binning.js +123 -0
  144. package/dist/components/volumeProfile/binning.js.map +1 -0
  145. package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
  146. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
  147. package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
  148. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
  149. package/dist/components/volumeProfile/index.d.ts +6 -0
  150. package/dist/components/volumeProfile/index.d.ts.map +1 -0
  151. package/dist/components/volumeProfile/index.js +5 -0
  152. package/dist/components/volumeProfile/index.js.map +1 -0
  153. package/dist/components/volumeProfile/poc.d.ts +35 -0
  154. package/dist/components/volumeProfile/poc.d.ts.map +1 -0
  155. package/dist/components/volumeProfile/poc.js +51 -0
  156. package/dist/components/volumeProfile/poc.js.map +1 -0
  157. package/dist/components/volumeProfile/types.d.ts +138 -0
  158. package/dist/components/volumeProfile/types.d.ts.map +1 -0
  159. package/dist/components/volumeProfile/types.js +19 -0
  160. package/dist/components/volumeProfile/types.js.map +1 -0
  161. package/dist/components/volumeProfile/valueArea.d.ts +58 -0
  162. package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
  163. package/dist/components/volumeProfile/valueArea.js +172 -0
  164. package/dist/components/volumeProfile/valueArea.js.map +1 -0
  165. package/dist/controllers/createChartController.d.ts.map +1 -1
  166. package/dist/controllers/createChartController.js +22 -11
  167. package/dist/controllers/createChartController.js.map +1 -1
  168. package/dist/controllers/types.d.ts +3 -1
  169. package/dist/controllers/types.d.ts.map +1 -1
  170. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  171. package/dist/data-fetchers/baostock.js +2 -1
  172. package/dist/data-fetchers/baostock.js.map +1 -1
  173. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  174. package/dist/data-fetchers/dataBuffer.effects.js +2 -1
  175. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  176. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  177. package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
  178. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  179. package/dist/data-fetchers/gotdx.js +4 -3
  180. package/dist/data-fetchers/gotdx.js.map +1 -1
  181. package/dist/data-fetchers/router.d.ts.map +1 -1
  182. package/dist/data-fetchers/router.js +4 -3
  183. package/dist/data-fetchers/router.js.map +1 -1
  184. package/dist/data-fetchers/tradingview.js +3 -2
  185. package/dist/data-fetchers/tradingview.js.map +1 -1
  186. package/dist/engine/chart.d.ts +13 -0
  187. package/dist/engine/chart.d.ts.map +1 -1
  188. package/dist/engine/chart.js +109 -0
  189. package/dist/engine/chart.js.map +1 -1
  190. package/dist/engine/data/chartDataManager.d.ts +1 -0
  191. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  192. package/dist/engine/data/chartDataManager.js +27 -4
  193. package/dist/engine/data/chartDataManager.js.map +1 -1
  194. package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
  195. package/dist/engine/drawing/toolConfig.js +2 -1
  196. package/dist/engine/drawing/toolConfig.js.map +1 -1
  197. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  198. package/dist/engine/indicators/chartIndicatorManager.js +2 -1
  199. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  200. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  201. package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
  202. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  203. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  204. package/dist/engine/indicators/indicatorMetadata.js +2 -1
  205. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  206. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  207. package/dist/engine/indicators/indicatorRegistry.js +6 -5
  208. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  209. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  210. package/dist/engine/indicators/registerBuiltins.js +2 -1
  211. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  212. package/dist/engine/indicators/scheduler.d.ts +6 -0
  213. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  214. package/dist/engine/indicators/scheduler.js +12 -0
  215. package/dist/engine/indicators/scheduler.js.map +1 -1
  216. package/dist/engine/indicators/soa.d.ts.map +1 -1
  217. package/dist/engine/indicators/soa.js +2 -1
  218. package/dist/engine/indicators/soa.js.map +1 -1
  219. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  220. package/dist/engine/indicators/stateComposer.js +2 -1
  221. package/dist/engine/indicators/stateComposer.js.map +1 -1
  222. package/dist/engine/subPaneManager.d.ts.map +1 -1
  223. package/dist/engine/subPaneManager.js +2 -1
  224. package/dist/engine/subPaneManager.js.map +1 -1
  225. package/dist/engine/utils/chartZoomController.d.ts +2 -0
  226. package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
  227. package/dist/engine/utils/chartZoomController.js +5 -1
  228. package/dist/engine/utils/chartZoomController.js.map +1 -1
  229. package/dist/errors-help.d.ts +72 -0
  230. package/dist/errors-help.d.ts.map +1 -0
  231. package/dist/errors-help.js +149 -0
  232. package/dist/errors-help.js.map +1 -0
  233. package/dist/errors.d.ts +64 -0
  234. package/dist/errors.d.ts.map +1 -0
  235. package/dist/errors.js +61 -0
  236. package/dist/errors.js.map +1 -0
  237. package/dist/index.d.ts +18 -0
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +22 -0
  240. package/dist/index.js.map +1 -1
  241. package/dist/indicators/alma.d.ts +27 -0
  242. package/dist/indicators/alma.d.ts.map +1 -0
  243. package/dist/indicators/alma.js +36 -0
  244. package/dist/indicators/alma.js.map +1 -0
  245. package/dist/indicators/awesomeOscillator.d.ts +19 -0
  246. package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
  247. package/dist/indicators/awesomeOscillator.js +36 -0
  248. package/dist/indicators/awesomeOscillator.js.map +1 -0
  249. package/dist/indicators/dpo.d.ts +17 -0
  250. package/dist/indicators/dpo.d.ts.map +1 -0
  251. package/dist/indicators/dpo.js +24 -0
  252. package/dist/indicators/dpo.js.map +1 -0
  253. package/dist/indicators/fisherTransform.d.ts +26 -0
  254. package/dist/indicators/fisherTransform.d.ts.map +1 -0
  255. package/dist/indicators/fisherTransform.js +44 -0
  256. package/dist/indicators/fisherTransform.js.map +1 -0
  257. package/dist/indicators/frama.d.ts +25 -0
  258. package/dist/indicators/frama.d.ts.map +1 -0
  259. package/dist/indicators/frama.js +61 -0
  260. package/dist/indicators/frama.js.map +1 -0
  261. package/dist/indicators/index.d.ts +24 -0
  262. package/dist/indicators/index.d.ts.map +1 -0
  263. package/dist/indicators/index.js +26 -0
  264. package/dist/indicators/index.js.map +1 -0
  265. package/dist/indicators/lsma.d.ts +21 -0
  266. package/dist/indicators/lsma.d.ts.map +1 -0
  267. package/dist/indicators/lsma.js +37 -0
  268. package/dist/indicators/lsma.js.map +1 -0
  269. package/dist/indicators/schaffTrendCycle.d.ts +24 -0
  270. package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
  271. package/dist/indicators/schaffTrendCycle.js +70 -0
  272. package/dist/indicators/schaffTrendCycle.js.map +1 -0
  273. package/dist/indicators/stochRSI.d.ts +24 -0
  274. package/dist/indicators/stochRSI.d.ts.map +1 -0
  275. package/dist/indicators/stochRSI.js +86 -0
  276. package/dist/indicators/stochRSI.js.map +1 -0
  277. package/dist/indicators/t3.d.ts +31 -0
  278. package/dist/indicators/t3.d.ts.map +1 -0
  279. package/dist/indicators/t3.js +63 -0
  280. package/dist/indicators/t3.js.map +1 -0
  281. package/dist/indicators/ultimateOscillator.d.ts +26 -0
  282. package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
  283. package/dist/indicators/ultimateOscillator.js +59 -0
  284. package/dist/indicators/ultimateOscillator.js.map +1 -0
  285. package/dist/indicators/vidya.d.ts +24 -0
  286. package/dist/indicators/vidya.d.ts.map +1 -0
  287. package/dist/indicators/vidya.js +54 -0
  288. package/dist/indicators/vidya.js.map +1 -0
  289. package/dist/indicators/zlema.d.ts +16 -0
  290. package/dist/indicators/zlema.d.ts.map +1 -0
  291. package/dist/indicators/zlema.js +26 -0
  292. package/dist/indicators/zlema.js.map +1 -0
  293. package/dist/input/gesture.d.ts +125 -0
  294. package/dist/input/gesture.d.ts.map +1 -0
  295. package/dist/input/gesture.js +249 -0
  296. package/dist/input/gesture.js.map +1 -0
  297. package/dist/input/index.d.ts +9 -0
  298. package/dist/input/index.d.ts.map +1 -0
  299. package/dist/input/index.js +9 -0
  300. package/dist/input/index.js.map +1 -0
  301. package/dist/input/keyboard.d.ts +140 -0
  302. package/dist/input/keyboard.d.ts.map +1 -0
  303. package/dist/input/keyboard.js +260 -0
  304. package/dist/input/keyboard.js.map +1 -0
  305. package/dist/mcp/chartBridge.d.ts +2 -2
  306. package/dist/mcp/chartBridge.d.ts.map +1 -1
  307. package/dist/mcp/chartBridge.js +27 -21
  308. package/dist/mcp/chartBridge.js.map +1 -1
  309. package/dist/plugin/PluginHost.d.ts +0 -3
  310. package/dist/plugin/PluginHost.d.ts.map +1 -1
  311. package/dist/plugin/PluginHost.js +7 -3
  312. package/dist/plugin/PluginHost.js.map +1 -1
  313. package/dist/plugin/PluginRegistry.d.ts +0 -3
  314. package/dist/plugin/PluginRegistry.d.ts.map +1 -1
  315. package/dist/plugin/PluginRegistry.js +5 -1
  316. package/dist/plugin/PluginRegistry.js.map +1 -1
  317. package/dist/render/Renderer.d.ts +116 -0
  318. package/dist/render/Renderer.d.ts.map +1 -0
  319. package/dist/render/Renderer.js +31 -0
  320. package/dist/render/Renderer.js.map +1 -0
  321. package/dist/render/SurfaceBackend.d.ts +83 -0
  322. package/dist/render/SurfaceBackend.d.ts.map +1 -0
  323. package/dist/render/SurfaceBackend.js +27 -0
  324. package/dist/render/SurfaceBackend.js.map +1 -0
  325. package/dist/render/index.d.ts +12 -0
  326. package/dist/render/index.d.ts.map +1 -0
  327. package/dist/render/index.js +11 -0
  328. package/dist/render/index.js.map +1 -0
  329. package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
  330. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
  331. package/dist/renderer-tier/detectRendererTier.js +143 -0
  332. package/dist/renderer-tier/detectRendererTier.js.map +1 -0
  333. package/dist/renderer-tier/index.d.ts +12 -0
  334. package/dist/renderer-tier/index.d.ts.map +1 -0
  335. package/dist/renderer-tier/index.js +12 -0
  336. package/dist/renderer-tier/index.js.map +1 -0
  337. package/dist/renderer-tier/selectBackend.d.ts +106 -0
  338. package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
  339. package/dist/renderer-tier/selectBackend.js +113 -0
  340. package/dist/renderer-tier/selectBackend.js.map +1 -0
  341. package/dist/renderer-tier/types.d.ts +50 -0
  342. package/dist/renderer-tier/types.d.ts.map +1 -0
  343. package/dist/renderer-tier/types.js +24 -0
  344. package/dist/renderer-tier/types.js.map +1 -0
  345. package/dist/replay/createReplayController.d.ts +3 -0
  346. package/dist/replay/createReplayController.d.ts.map +1 -0
  347. package/dist/replay/createReplayController.js +251 -0
  348. package/dist/replay/createReplayController.js.map +1 -0
  349. package/dist/replay/index.d.ts +5 -0
  350. package/dist/replay/index.d.ts.map +1 -0
  351. package/dist/replay/index.js +3 -0
  352. package/dist/replay/index.js.map +1 -0
  353. package/dist/replay/timeline.d.ts +50 -0
  354. package/dist/replay/timeline.d.ts.map +1 -0
  355. package/dist/replay/timeline.js +104 -0
  356. package/dist/replay/timeline.js.map +1 -0
  357. package/dist/replay/types.d.ts +94 -0
  358. package/dist/replay/types.d.ts.map +1 -0
  359. package/dist/replay/types.js +21 -0
  360. package/dist/replay/types.js.map +1 -0
  361. package/dist/scale/anchoredZoom.d.ts +64 -0
  362. package/dist/scale/anchoredZoom.d.ts.map +1 -0
  363. package/dist/scale/anchoredZoom.js +67 -0
  364. package/dist/scale/anchoredZoom.js.map +1 -0
  365. package/dist/scale/createPriceScale.d.ts +49 -0
  366. package/dist/scale/createPriceScale.d.ts.map +1 -0
  367. package/dist/scale/createPriceScale.js +175 -0
  368. package/dist/scale/createPriceScale.js.map +1 -0
  369. package/dist/scale/createTimeScale.d.ts +27 -0
  370. package/dist/scale/createTimeScale.d.ts.map +1 -0
  371. package/dist/scale/createTimeScale.js +139 -0
  372. package/dist/scale/createTimeScale.js.map +1 -0
  373. package/dist/scale/index.d.ts +6 -0
  374. package/dist/scale/index.d.ts.map +1 -0
  375. package/dist/scale/index.js +5 -0
  376. package/dist/scale/index.js.map +1 -0
  377. package/dist/scale/originShift.d.ts +69 -0
  378. package/dist/scale/originShift.d.ts.map +1 -0
  379. package/dist/scale/originShift.js +41 -0
  380. package/dist/scale/originShift.js.map +1 -0
  381. package/dist/scale/types.d.ts +90 -0
  382. package/dist/scale/types.d.ts.map +1 -0
  383. package/dist/scale/types.js +17 -0
  384. package/dist/scale/types.js.map +1 -0
  385. package/dist/scene/createScene.d.ts +22 -0
  386. package/dist/scene/createScene.d.ts.map +1 -0
  387. package/dist/scene/createScene.js +114 -0
  388. package/dist/scene/createScene.js.map +1 -0
  389. package/dist/scene/index.d.ts +13 -0
  390. package/dist/scene/index.d.ts.map +1 -0
  391. package/dist/scene/index.js +11 -0
  392. package/dist/scene/index.js.map +1 -0
  393. package/dist/scene/layerRegistry.d.ts +83 -0
  394. package/dist/scene/layerRegistry.d.ts.map +1 -0
  395. package/dist/scene/layerRegistry.js +43 -0
  396. package/dist/scene/layerRegistry.js.map +1 -0
  397. package/dist/scene/types.d.ts +128 -0
  398. package/dist/scene/types.d.ts.map +1 -0
  399. package/dist/scene/types.js +21 -0
  400. package/dist/scene/types.js.map +1 -0
  401. package/dist/scheduler/createFrameBudget.d.ts +91 -0
  402. package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
  403. package/dist/scheduler/createFrameBudget.js +232 -0
  404. package/dist/scheduler/createFrameBudget.js.map +1 -0
  405. package/dist/scheduler/index.d.ts +2 -0
  406. package/dist/scheduler/index.d.ts.map +1 -0
  407. package/dist/scheduler/index.js +2 -0
  408. package/dist/scheduler/index.js.map +1 -0
  409. package/dist/tokens/themeToCssVars.d.ts.map +1 -1
  410. package/dist/tokens/themeToCssVars.js +2 -28
  411. package/dist/tokens/themeToCssVars.js.map +1 -1
  412. package/dist/version.d.ts +1 -1
  413. package/dist/version.d.ts.map +1 -1
  414. package/dist/version.js +1 -1
  415. package/dist/version.js.map +1 -1
  416. package/package.json +1 -1
  417. package/src/__bench__/indicators.bench.ts +215 -0
  418. package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
  419. package/src/__bench__/scale.bench.ts +80 -0
  420. package/src/__bench__/signal.bench.ts +41 -0
  421. package/src/__bench__/volumeProfile.bench.ts +66 -0
  422. package/src/__tests__/errors-help.test.ts +184 -0
  423. package/src/__tests__/errors.test.ts +187 -0
  424. package/src/alerts/__tests__/controller.test.ts +231 -0
  425. package/src/alerts/__tests__/predicates.test.ts +374 -0
  426. package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
  427. package/src/alerts/createAlertController.ts +312 -0
  428. package/src/alerts/index.ts +18 -0
  429. package/src/alerts/predicates.ts +231 -0
  430. package/src/alerts/rollingVolume.ts +51 -0
  431. package/src/alerts/ruleSchema.ts +278 -0
  432. package/src/alerts/types.ts +177 -0
  433. package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
  434. package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
  435. package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
  436. package/src/chartTypes/__tests__/renko.test.ts +160 -0
  437. package/src/chartTypes/heikinAshi.ts +116 -0
  438. package/src/chartTypes/index.ts +5 -0
  439. package/src/chartTypes/pointAndFigure.ts +278 -0
  440. package/src/chartTypes/rangeBars.ts +303 -0
  441. package/src/chartTypes/renko.ts +311 -0
  442. package/src/chartTypes/types.ts +99 -0
  443. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
  444. package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
  445. package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
  446. package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
  447. package/src/components/anchoredVwap/index.ts +17 -0
  448. package/src/components/anchoredVwap/types.ts +187 -0
  449. package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
  450. package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
  451. package/src/components/crosshairSync/index.ts +5 -0
  452. package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
  453. package/src/components/footprint/__tests__/controller.test.ts +130 -0
  454. package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
  455. package/src/components/footprint/aggressor.ts +165 -0
  456. package/src/components/footprint/createFootprintController.ts +338 -0
  457. package/src/components/footprint/index.ts +21 -0
  458. package/src/components/footprint/perBarStats.ts +137 -0
  459. package/src/components/footprint/types.ts +232 -0
  460. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
  461. package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
  462. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
  463. package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
  464. package/src/components/mtfOverlay/createMtfController.ts +180 -0
  465. package/src/components/mtfOverlay/index.ts +26 -0
  466. package/src/components/mtfOverlay/resampleBars.ts +134 -0
  467. package/src/components/mtfOverlay/types.ts +148 -0
  468. package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
  469. package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
  470. package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
  471. package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
  472. package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
  473. package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
  474. package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
  475. package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
  476. package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
  477. package/src/components/orderBookHeatmap/index.ts +25 -0
  478. package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
  479. package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
  480. package/src/components/orderBookHeatmap/types.ts +168 -0
  481. package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
  482. package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
  483. package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
  484. package/src/components/volumeProfile/binning.ts +133 -0
  485. package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
  486. package/src/components/volumeProfile/index.ts +12 -0
  487. package/src/components/volumeProfile/poc.ts +53 -0
  488. package/src/components/volumeProfile/types.ts +148 -0
  489. package/src/components/volumeProfile/valueArea.ts +187 -0
  490. package/src/controllers/createChartController.ts +23 -10
  491. package/src/controllers/types.ts +5 -1
  492. package/src/data-fetchers/baostock.ts +2 -1
  493. package/src/data-fetchers/dataBuffer.effects.ts +3 -1
  494. package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
  495. package/src/data-fetchers/gotdx.ts +4 -3
  496. package/src/data-fetchers/router.ts +6 -3
  497. package/src/data-fetchers/tradingview.ts +3 -2
  498. package/src/engine/chart.ts +126 -3
  499. package/src/engine/data/chartDataManager.ts +26 -4
  500. package/src/engine/drawing/toolConfig.ts +2 -1
  501. package/src/engine/indicators/chartIndicatorManager.ts +2 -1
  502. package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
  503. package/src/engine/indicators/indicatorMetadata.ts +2 -1
  504. package/src/engine/indicators/indicatorRegistry.ts +6 -5
  505. package/src/engine/indicators/registerBuiltins.ts +2 -1
  506. package/src/engine/indicators/scheduler.ts +15 -0
  507. package/src/engine/indicators/soa.ts +2 -1
  508. package/src/engine/indicators/stateComposer.ts +2 -1
  509. package/src/engine/subPaneManager.ts +2 -1
  510. package/src/engine/utils/chartZoomController.ts +7 -1
  511. package/src/errors-help.ts +218 -0
  512. package/src/errors.ts +128 -0
  513. package/src/index.ts +37 -0
  514. package/src/indicators/__tests__/maFamily.test.ts +159 -0
  515. package/src/indicators/__tests__/oscillators.test.ts +150 -0
  516. package/src/indicators/alma.ts +61 -0
  517. package/src/indicators/awesomeOscillator.ts +54 -0
  518. package/src/indicators/dpo.ts +37 -0
  519. package/src/indicators/fisherTransform.ts +63 -0
  520. package/src/indicators/frama.ts +87 -0
  521. package/src/indicators/index.ts +39 -0
  522. package/src/indicators/lsma.ts +58 -0
  523. package/src/indicators/schaffTrendCycle.ts +92 -0
  524. package/src/indicators/stochRSI.ts +108 -0
  525. package/src/indicators/t3.ts +96 -0
  526. package/src/indicators/ultimateOscillator.ts +83 -0
  527. package/src/indicators/vidya.ts +80 -0
  528. package/src/indicators/zlema.ts +41 -0
  529. package/src/input/__tests__/gesture.test.ts +271 -0
  530. package/src/input/__tests__/keyboard.test.ts +317 -0
  531. package/src/input/gesture.ts +357 -0
  532. package/src/input/index.ts +26 -0
  533. package/src/input/keyboard.ts +373 -0
  534. package/src/mcp/chartBridge.ts +98 -72
  535. package/src/plugin/PluginHost.ts +4 -3
  536. package/src/plugin/PluginRegistry.ts +2 -1
  537. package/src/render/Renderer.ts +127 -0
  538. package/src/render/SurfaceBackend.ts +94 -0
  539. package/src/render/__tests__/contract.test.ts +176 -0
  540. package/src/render/index.ts +27 -0
  541. package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
  542. package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
  543. package/src/renderer-tier/detectRendererTier.ts +168 -0
  544. package/src/renderer-tier/index.ts +30 -0
  545. package/src/renderer-tier/selectBackend.ts +201 -0
  546. package/src/renderer-tier/types.ts +59 -0
  547. package/src/replay/__tests__/controller.test.ts +309 -0
  548. package/src/replay/__tests__/timeline.test.ts +99 -0
  549. package/src/replay/createReplayController.ts +302 -0
  550. package/src/replay/index.ts +15 -0
  551. package/src/replay/timeline.ts +106 -0
  552. package/src/replay/types.ts +107 -0
  553. package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
  554. package/src/scale/__tests__/originShift.test.ts +97 -0
  555. package/src/scale/__tests__/priceScale.test.ts +219 -0
  556. package/src/scale/__tests__/timeScale.test.ts +119 -0
  557. package/src/scale/anchoredZoom.ts +104 -0
  558. package/src/scale/createPriceScale.ts +226 -0
  559. package/src/scale/createTimeScale.ts +150 -0
  560. package/src/scale/index.ts +9 -0
  561. package/src/scale/originShift.ts +111 -0
  562. package/src/scale/types.ts +100 -0
  563. package/src/scene/__tests__/layerRegistry.test.ts +207 -0
  564. package/src/scene/__tests__/scene.test.ts +411 -0
  565. package/src/scene/createScene.ts +117 -0
  566. package/src/scene/index.ts +29 -0
  567. package/src/scene/layerRegistry.ts +117 -0
  568. package/src/scene/types.ts +143 -0
  569. package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
  570. package/src/scheduler/createFrameBudget.ts +316 -0
  571. package/src/scheduler/index.ts +7 -0
  572. package/src/tokens/themeToCssVars.ts +3 -1
  573. package/src/version.ts +1 -1
  574. package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
  575. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
  576. package/dist/data-fetchers/gotdx/gotdx.js +0 -7
  577. package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
  578. package/src/data-fetchers/gotdx/gotdx.ts +0 -6
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Renderer backend selector — bridges the tier-detection layer
3
+ * ({@link detectRendererTier}) to the actual backend factory the
4
+ * `Renderer` interface will instantiate.
5
+ *
6
+ * Why this exists separately from {@link detectRendererTier}:
7
+ *
8
+ * - Detection answers "what's *possible*?".
9
+ * - Selection answers "what's *registered* and matches what's possible?".
10
+ *
11
+ * In practice the answers diverge. A consumer can:
12
+ *
13
+ * (a) Choose to omit a backend they don't want to ship (e.g. drop the
14
+ * WebGPU backend to save bundle size; the selector then falls
15
+ * through to WebGL2 even when the host supports WebGPU).
16
+ * (b) Override a backend for a specific tier (e.g. inject a Canvas2D
17
+ * backend stub during tests, so the chart still renders headless).
18
+ *
19
+ * Both shapes need a *structural* fallback chain, not just "give me the
20
+ * factory for the detected tier". This module formalises that chain so
21
+ * the wiring is consistent across React, Vue, Angular, and any future
22
+ * adapter.
23
+ *
24
+ * Pure data: no DOM, no async, no side effects. The returned factory is
25
+ * just the function the caller registered.
26
+ */
27
+ import { type DetectRendererTierOptions, type RendererTier, type RendererTierResult } from './types';
28
+ /**
29
+ * Opaque factory shape. We don't constrain the Renderer construction here —
30
+ * the consumer's backend implementation knows its own signature. The
31
+ * selector is purely about *which* factory to hand back.
32
+ */
33
+ export type BackendFactory<T = unknown> = () => T;
34
+ /**
35
+ * Map of tier → registered factory. Tiers that are absent or `null` are
36
+ * treated as "not registered" and skipped during selection.
37
+ *
38
+ * `'none'` is intentionally absent from the type. A `'none'` tier is the
39
+ * absence of any rendering capability; there is nothing to register.
40
+ */
41
+ export type BackendRegistry<T = unknown> = Partial<Record<Exclude<RendererTier, 'none'>, BackendFactory<T> | null>>;
42
+ /**
43
+ * Selection result. `tier` is the effective tier the chosen factory
44
+ * targets — which is at most the detected tier. `fallbackChain`
45
+ * enumerates the tiers the selector traversed (high → low). When no
46
+ * backend is registered for any tier ≤ the detected tier, returns
47
+ * `tier: 'none'` and `factory: null`.
48
+ */
49
+ export interface BackendSelection<T = unknown> {
50
+ readonly tier: RendererTier;
51
+ readonly factory: BackendFactory<T> | null;
52
+ readonly fallbackChain: ReadonlyArray<RendererTier>;
53
+ readonly reason: string;
54
+ /**
55
+ * The original tier-detection result. Useful for telemetry — when
56
+ * `tier < detection.tier` the consumer knows the host could have
57
+ * done better but the registry was the binding constraint.
58
+ */
59
+ readonly detection: RendererTierResult;
60
+ }
61
+ export interface SelectBackendOptions<T = unknown> {
62
+ readonly registry: BackendRegistry<T>;
63
+ /**
64
+ * Tier-detection probes pass-through for tests. Same shape as
65
+ * {@link DetectRendererTierOptions}.
66
+ */
67
+ readonly detect?: DetectRendererTierOptions;
68
+ /**
69
+ * Optional pre-computed detection result. When provided, the selector
70
+ * skips `detectRendererTier()` and uses this directly. Useful when
71
+ * the caller cached the detection at app startup.
72
+ */
73
+ readonly detection?: RendererTierResult;
74
+ /**
75
+ * Optional floor — refuse to select a backend below this tier even
76
+ * if a lower-tier factory is registered. Used by features that need
77
+ * GPU compute (`minimum: 'webgl2'`). When the floor can't be met,
78
+ * the result has `tier: 'none'` and `factory: null`.
79
+ */
80
+ readonly minimum?: RendererTier;
81
+ }
82
+ /**
83
+ * Pick the highest registered backend at or below the detected tier
84
+ * (and at or above the optional minimum). Pure-data.
85
+ *
86
+ * const sel = selectBackend({
87
+ * registry: { webgpu: makeGpu, webgl2: makeGl2, canvas2d: makeC2d },
88
+ * })
89
+ * if (sel.factory === null) throw new Error('no renderer')
90
+ * const renderer = sel.factory()
91
+ *
92
+ * Telemetry pattern:
93
+ *
94
+ * if (sel.tier !== sel.detection.tier) {
95
+ * log('renderer downgrade', sel.detection.tier, '→', sel.tier, sel.reason)
96
+ * }
97
+ */
98
+ export declare function selectBackend<T = unknown>(opts: SelectBackendOptions<T>): BackendSelection<T>;
99
+ /**
100
+ * Strict variant: throws `KLineChartError('INVALID_STATE')` if no factory
101
+ * could be selected. Use when a renderable backend is mandatory.
102
+ */
103
+ export declare function selectBackendOrThrow<T = unknown>(opts: SelectBackendOptions<T>): BackendSelection<T> & {
104
+ factory: BackendFactory<T>;
105
+ };
106
+ //# sourceMappingURL=selectBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectBackend.d.ts","sourceRoot":"","sources":["../../src/renderer-tier/selectBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAC1B,MAAM,SAAS,CAAA;AAOhB;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAC9C,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAClE,CAAA;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACrC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAA;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAClC;AAYD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACrC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAuDrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,gBAAgB,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,CAStD"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Renderer backend selector — bridges the tier-detection layer
3
+ * ({@link detectRendererTier}) to the actual backend factory the
4
+ * `Renderer` interface will instantiate.
5
+ *
6
+ * Why this exists separately from {@link detectRendererTier}:
7
+ *
8
+ * - Detection answers "what's *possible*?".
9
+ * - Selection answers "what's *registered* and matches what's possible?".
10
+ *
11
+ * In practice the answers diverge. A consumer can:
12
+ *
13
+ * (a) Choose to omit a backend they don't want to ship (e.g. drop the
14
+ * WebGPU backend to save bundle size; the selector then falls
15
+ * through to WebGL2 even when the host supports WebGPU).
16
+ * (b) Override a backend for a specific tier (e.g. inject a Canvas2D
17
+ * backend stub during tests, so the chart still renders headless).
18
+ *
19
+ * Both shapes need a *structural* fallback chain, not just "give me the
20
+ * factory for the detected tier". This module formalises that chain so
21
+ * the wiring is consistent across React, Vue, Angular, and any future
22
+ * adapter.
23
+ *
24
+ * Pure data: no DOM, no async, no side effects. The returned factory is
25
+ * just the function the caller registered.
26
+ */
27
+ import { KLineChartError } from '../errors';
28
+ import { RENDERER_TIER_RANK, } from './types';
29
+ import { detectRendererTier, isTierAtLeast } from './detectRendererTier';
30
+ // ---------------------------------------------------------------------------
31
+ // Selection
32
+ // ---------------------------------------------------------------------------
33
+ const SEARCH_ORDER = [
34
+ 'webgpu',
35
+ 'webgl2',
36
+ 'canvas2d',
37
+ ];
38
+ /**
39
+ * Pick the highest registered backend at or below the detected tier
40
+ * (and at or above the optional minimum). Pure-data.
41
+ *
42
+ * const sel = selectBackend({
43
+ * registry: { webgpu: makeGpu, webgl2: makeGl2, canvas2d: makeC2d },
44
+ * })
45
+ * if (sel.factory === null) throw new Error('no renderer')
46
+ * const renderer = sel.factory()
47
+ *
48
+ * Telemetry pattern:
49
+ *
50
+ * if (sel.tier !== sel.detection.tier) {
51
+ * log('renderer downgrade', sel.detection.tier, '→', sel.tier, sel.reason)
52
+ * }
53
+ */
54
+ export function selectBackend(opts) {
55
+ const detection = opts.detection ?? detectRendererTier(opts.detect);
56
+ const detectedTier = detection.tier;
57
+ const minimum = opts.minimum ?? 'none';
58
+ // Validate the minimum is a known tier; reject 'none' as a minimum
59
+ // because a 'none' floor is meaningless — nothing can be below it.
60
+ if (!(minimum in RENDERER_TIER_RANK)) {
61
+ throw new KLineChartError('INVALID_PARAM', `selectBackend: minimum must be a RendererTier, got ${JSON.stringify(minimum)}`);
62
+ }
63
+ const chain = [];
64
+ // Search from the detected tier downwards through SEARCH_ORDER.
65
+ for (const candidate of SEARCH_ORDER) {
66
+ // Skip tiers above the detected ceiling.
67
+ if (RENDERER_TIER_RANK[candidate] > RENDERER_TIER_RANK[detectedTier]) {
68
+ continue;
69
+ }
70
+ chain.push(candidate);
71
+ // Skip below the configured minimum.
72
+ if (!isTierAtLeast(candidate, minimum)) {
73
+ // No further candidate will satisfy the minimum.
74
+ break;
75
+ }
76
+ const factory = opts.registry[candidate] ?? null;
77
+ if (factory !== null) {
78
+ return {
79
+ tier: candidate,
80
+ factory,
81
+ fallbackChain: chain,
82
+ reason: candidate === detectedTier
83
+ ? `direct match: detected ${candidate} and ${candidate} backend is registered`
84
+ : `downgrade: detected ${detectedTier}, but only ${candidate} backend is registered`,
85
+ detection,
86
+ };
87
+ }
88
+ }
89
+ return {
90
+ tier: 'none',
91
+ factory: null,
92
+ fallbackChain: chain,
93
+ reason: detectedTier === 'none'
94
+ ? `host has no renderable tier`
95
+ : `no registered backend at or below detected ${detectedTier}` +
96
+ (opts.minimum !== undefined && opts.minimum !== 'none'
97
+ ? ` (minimum=${opts.minimum})`
98
+ : ''),
99
+ detection,
100
+ };
101
+ }
102
+ /**
103
+ * Strict variant: throws `KLineChartError('INVALID_STATE')` if no factory
104
+ * could be selected. Use when a renderable backend is mandatory.
105
+ */
106
+ export function selectBackendOrThrow(opts) {
107
+ const sel = selectBackend(opts);
108
+ if (sel.factory === null) {
109
+ throw new KLineChartError('INVALID_STATE', `selectBackendOrThrow: ${sel.reason}`);
110
+ }
111
+ return sel;
112
+ }
113
+ //# sourceMappingURL=selectBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectBackend.js","sourceRoot":"","sources":["../../src/renderer-tier/selectBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EACH,kBAAkB,GAIrB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAkExE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,YAAY,GAAiD;IAC/D,QAAQ;IACR,QAAQ;IACR,UAAU;CACb,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CACzB,IAA6B;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnE,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAA;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAA;IAEtC,mEAAmE;IACnE,mEAAmE;IACnE,IAAI,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,sDAAsD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAClF,CAAA;IACL,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,CAAA;IAChC,gEAAgE;IAChE,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACnC,yCAAyC;QACzC,IAAI,kBAAkB,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;YACnE,SAAQ;QACZ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrB,qCAAqC;QACrC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;YACrC,iDAAiD;YACjD,MAAK;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;QAChD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO;gBACH,IAAI,EAAE,SAAS;gBACf,OAAO;gBACP,aAAa,EAAE,KAAK;gBACpB,MAAM,EACF,SAAS,KAAK,YAAY;oBACtB,CAAC,CAAC,0BAA0B,SAAS,QAAQ,SAAS,wBAAwB;oBAC9E,CAAC,CAAC,uBAAuB,YAAY,cAAc,SAAS,wBAAwB;gBAC5F,SAAS;aACZ,CAAA;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,KAAK;QACpB,MAAM,EACF,YAAY,KAAK,MAAM;YACnB,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,8CAA8C,YAAY,EAAE;gBAC5D,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;oBAClD,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,GAAG;oBAC9B,CAAC,CAAC,EAAE,CAAC;QACnB,SAAS;KACZ,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,IAA6B;IAE7B,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,yBAAyB,GAAG,CAAC,MAAM,EAAE,CACxC,CAAA;IACL,CAAC;IACD,OAAO,GAA2D,CAAA;AACtE,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Renderer tier types.
3
+ *
4
+ * `RendererTier` is a totally-ordered enum (`'webgpu' > 'webgl2' >
5
+ * 'canvas2d' > 'none'`). Consumers pick the highest tier the host
6
+ * environment supports and configure the {@link Renderer} accordingly.
7
+ *
8
+ * Why a string union (not a numeric enum):
9
+ * - Logs and analytics stay human-readable.
10
+ * - Tree-shakable; no runtime enum object.
11
+ * - Cross-package safe — string equality survives serialization
12
+ * and avoids the "two enum copies don't compare" footgun.
13
+ */
14
+ export type RendererTier = 'webgpu' | 'webgl2' | 'canvas2d' | 'none';
15
+ /**
16
+ * Numeric rank used for `compareRendererTier`. Higher = better.
17
+ * Exposed so consumers can write their own "at least X" guards.
18
+ */
19
+ export declare const RENDERER_TIER_RANK: Readonly<Record<RendererTier, number>>;
20
+ /**
21
+ * Detection result. `tier` is the picked tier; `reason` is a one-line
22
+ * human-readable explanation (intended for diagnostics, not for
23
+ * branching — branch on `tier`).
24
+ *
25
+ * `tried` enumerates the tiers probed in order — useful when reporting
26
+ * "we wanted WebGPU but it threw" telemetry.
27
+ */
28
+ export interface RendererTierResult {
29
+ readonly tier: RendererTier;
30
+ readonly reason: string;
31
+ readonly tried: ReadonlyArray<RendererTier>;
32
+ }
33
+ /**
34
+ * Probe injection — the unit tests use this to simulate every tier
35
+ * combination without poking globals. Production code passes nothing
36
+ * and the real `globalThis` probes run.
37
+ *
38
+ * Each probe returns `true` when the tier is detected, `false` when
39
+ * it is conclusively unavailable. Throwing is treated as "unavailable"
40
+ * with the message folded into `reason`.
41
+ */
42
+ export interface RendererTierProbes {
43
+ readonly webgpu?: () => boolean;
44
+ readonly webgl2?: () => boolean;
45
+ readonly canvas2d?: () => boolean;
46
+ }
47
+ export interface DetectRendererTierOptions {
48
+ readonly probes?: RendererTierProbes;
49
+ }
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/renderer-tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;AAEpE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAKrE,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;CACvC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Renderer tier types.
3
+ *
4
+ * `RendererTier` is a totally-ordered enum (`'webgpu' > 'webgl2' >
5
+ * 'canvas2d' > 'none'`). Consumers pick the highest tier the host
6
+ * environment supports and configure the {@link Renderer} accordingly.
7
+ *
8
+ * Why a string union (not a numeric enum):
9
+ * - Logs and analytics stay human-readable.
10
+ * - Tree-shakable; no runtime enum object.
11
+ * - Cross-package safe — string equality survives serialization
12
+ * and avoids the "two enum copies don't compare" footgun.
13
+ */
14
+ /**
15
+ * Numeric rank used for `compareRendererTier`. Higher = better.
16
+ * Exposed so consumers can write their own "at least X" guards.
17
+ */
18
+ export const RENDERER_TIER_RANK = {
19
+ webgpu: 3,
20
+ webgl2: 2,
21
+ canvas2d: 1,
22
+ none: 0,
23
+ };
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/renderer-tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2C;IACtE,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;CACV,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ReplayController, ReplayControllerInit } from './types';
2
+ export declare function createReplayController(init?: ReplayControllerInit): ReplayController;
3
+ //# sourceMappingURL=createReplayController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReplayController.d.ts","sourceRoot":"","sources":["../../src/replay/createReplayController.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACR,gBAAgB,EAChB,oBAAoB,EAIvB,MAAM,SAAS,CAAA;AAwDhB,wBAAgB,sBAAsB,CAClC,IAAI,CAAC,EAAE,oBAAoB,GAC5B,gBAAgB,CAoNlB"}
@@ -0,0 +1,251 @@
1
+ import { KLineChartError } from '../errors';
2
+ /**
3
+ * createReplayController — framework-agnostic Bar Replay state machine.
4
+ *
5
+ * Owns: position, mode, pacing, speed, [start, end] range.
6
+ * Doesn't own: the data series, the calendar, the frame loop. Those are
7
+ * supplied by the surrounding chart adapter.
8
+ *
9
+ * Why we expose it via a single `state` signal (rather than five separate
10
+ * signals): every replay mutation is a transaction over the playhead — the
11
+ * mode flip on auto-pause, the clamp on `setRange`, etc. Emitting a single
12
+ * snapshot keeps subscribers (React/Vue) from rendering intermediate states.
13
+ *
14
+ * Open design question (deferred from v1):
15
+ * Should "reverse play" (speed < 0) be supported in v2?
16
+ * The cleanest extension is to drop the `speed <= 0` guard, accept negative
17
+ * multipliers in `tick()` math (already symmetric), and add an
18
+ * `autoStartReached` clamp that mirrors `autoEndReached`. The on-disk
19
+ * contract (the `ReplayState` shape) does not need to change. We defer it
20
+ * because reverse playback is meaningless for live-data sessions and the
21
+ * indicator runtime currently assumes monotonic time — flipping that
22
+ * assumption is a larger cross-package change than this PR.
23
+ */
24
+ import { createSignal } from '../reactivity/signal';
25
+ // ---------------------------------------------------------------------------
26
+ // Constants
27
+ // ---------------------------------------------------------------------------
28
+ /** Default bar interval used by wall-clock pacing when the host did not
29
+ * supply one via `init.barIntervalMs`. Picked to match the most common
30
+ * intraday chart (1-minute bars). */
31
+ const DEFAULT_BAR_INTERVAL_MS = 60_000;
32
+ /** For `tick` pacing, this is the nominal wall-time spent on one bar at
33
+ * speed=1. 100ms means a 60-bar tick replay takes 6 seconds at 1x — fast
34
+ * enough to feel like "tick playback", slow enough to follow visually. */
35
+ const TICK_PACING_MS_PER_BAR = 100;
36
+ // ---------------------------------------------------------------------------
37
+ // Helpers
38
+ // ---------------------------------------------------------------------------
39
+ function clamp(value, lo, hi) {
40
+ if (value < lo)
41
+ return lo;
42
+ if (value > hi)
43
+ return hi;
44
+ return value;
45
+ }
46
+ function assertValidRange(start, end) {
47
+ if (!Number.isFinite(start) || !Number.isFinite(end)) {
48
+ throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay range must be finite numbers: got start=${String(start)}, end=${String(end)}`);
49
+ }
50
+ if (end < start) {
51
+ throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay range end (${end}) must be >= start (${start})`);
52
+ }
53
+ }
54
+ function assertValidSpeed(speed) {
55
+ if (!Number.isFinite(speed) || speed <= 0) {
56
+ // Reverse playback (negative speed) is deliberately rejected in v1.
57
+ // See the header comment for the extension path.
58
+ throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay speed must be a positive finite number; got ${String(speed)}`);
59
+ }
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Factory
63
+ // ---------------------------------------------------------------------------
64
+ export function createReplayController(init) {
65
+ // -------------------------------------------------------------------
66
+ // Initial state — validate eagerly so misconfiguration surfaces at
67
+ // construction rather than on first tick.
68
+ // -------------------------------------------------------------------
69
+ const start = init?.start ?? 0;
70
+ const end = init?.end ?? 0;
71
+ assertValidRange(start, end);
72
+ const pacing = init?.pacing ?? 'bar';
73
+ const speed = init?.speed ?? 1;
74
+ assertValidSpeed(speed);
75
+ let barIntervalMs = init?.barIntervalMs ?? DEFAULT_BAR_INTERVAL_MS;
76
+ if (!Number.isFinite(barIntervalMs) || barIntervalMs <= 0) {
77
+ throw new KLineChartError('REPLAY_CONFIG_INVALID', `barIntervalMs must be a positive finite number; got ${String(barIntervalMs)}`);
78
+ }
79
+ const state = createSignal({
80
+ position: start,
81
+ start,
82
+ end,
83
+ mode: 'paused',
84
+ pacing,
85
+ speed,
86
+ });
87
+ // -------------------------------------------------------------------
88
+ // Internal commit helper. All mutations funnel through here so the
89
+ // immutability invariant and auto-pause check live in one place.
90
+ // -------------------------------------------------------------------
91
+ function commit(patch) {
92
+ const prev = state.peek();
93
+ const next = { ...prev, ...patch };
94
+ // Re-clamp position whenever it or the range changed.
95
+ if (patch.position !== undefined ||
96
+ patch.start !== undefined ||
97
+ patch.end !== undefined) {
98
+ next.position = clamp(next.position, next.start, next.end);
99
+ }
100
+ // Auto-pause when the playhead arrives at the right edge while
101
+ // playing. This is the natural end-of-tape transition; without it,
102
+ // the frame loop would happily tick forever against a clamped
103
+ // value and waste battery.
104
+ if (next.mode === 'playing' && next.position >= next.end) {
105
+ next.position = next.end;
106
+ next.mode = 'paused';
107
+ }
108
+ // Object.is short-circuits identical structural snapshots so a
109
+ // no-op commit (e.g. seekTo(currentPosition)) doesn't notify.
110
+ if (prev.position === next.position &&
111
+ prev.start === next.start &&
112
+ prev.end === next.end &&
113
+ prev.mode === next.mode &&
114
+ prev.pacing === next.pacing &&
115
+ prev.speed === next.speed) {
116
+ return;
117
+ }
118
+ state.set(next);
119
+ }
120
+ // -------------------------------------------------------------------
121
+ // Public mutators
122
+ // -------------------------------------------------------------------
123
+ function setRange(nextStart, nextEnd) {
124
+ assertValidRange(nextStart, nextEnd);
125
+ commit({ start: nextStart, end: nextEnd });
126
+ }
127
+ function seekTo(position) {
128
+ if (!Number.isFinite(position))
129
+ return;
130
+ commit({ position });
131
+ }
132
+ function seekBy(delta) {
133
+ if (!Number.isFinite(delta))
134
+ return;
135
+ const cur = state.peek().position;
136
+ commit({ position: cur + delta });
137
+ }
138
+ function stepForward() {
139
+ seekBy(1);
140
+ }
141
+ function stepBackward() {
142
+ seekBy(-1);
143
+ }
144
+ function play() {
145
+ const cur = state.peek();
146
+ // If we're already at the end, calling play() should not flip to
147
+ // 'playing' only to immediately auto-pause — that would be a
148
+ // confusing observable transition for subscribers. Stay paused.
149
+ if (cur.position >= cur.end)
150
+ return;
151
+ commit({ mode: 'playing' });
152
+ }
153
+ function pause() {
154
+ commit({ mode: 'paused' });
155
+ }
156
+ function toggle() {
157
+ const cur = state.peek();
158
+ if (cur.mode === 'playing') {
159
+ pause();
160
+ }
161
+ else {
162
+ play();
163
+ }
164
+ }
165
+ function setPacing(p) {
166
+ commit({ pacing: p });
167
+ }
168
+ function setSpeed(s) {
169
+ assertValidSpeed(s);
170
+ commit({ speed: s });
171
+ }
172
+ // -------------------------------------------------------------------
173
+ // Frame-loop driver
174
+ //
175
+ // `tick()` is deliberately stateless w.r.t. internal clock
176
+ // accumulation: each call applies the full advance derived from
177
+ // `deltaMs` directly to `position`. We DO carry fractional position
178
+ // values forward through the signal itself, so sub-bar progress is
179
+ // visible to subscribers (useful for smooth scrubbing animations and
180
+ // for sub-bar interpolation in the renderer).
181
+ //
182
+ // Rationale: a stateful internal accumulator would hide state from
183
+ // the signal, defeating the "fully observable" property that
184
+ // distinguishes us from TradingView. Anyone driving the controller
185
+ // can save/restore the entire replay session by snapshotting the
186
+ // state signal — no hidden bookkeeping.
187
+ // -------------------------------------------------------------------
188
+ function tick(deltaMs) {
189
+ if (!Number.isFinite(deltaMs) || deltaMs <= 0)
190
+ return false;
191
+ const cur = state.peek();
192
+ if (cur.mode !== 'playing')
193
+ return false;
194
+ let advance = 0;
195
+ switch (cur.pacing) {
196
+ case 'bar':
197
+ // Bar pacing is keyboard-driven: tick() never auto-advances.
198
+ return false;
199
+ case 'wallclock':
200
+ advance = (deltaMs / barIntervalMs) * cur.speed;
201
+ break;
202
+ case 'tick':
203
+ advance = (deltaMs / TICK_PACING_MS_PER_BAR) * cur.speed;
204
+ break;
205
+ }
206
+ if (advance === 0)
207
+ return false;
208
+ const prevPosition = cur.position;
209
+ commit({ position: cur.position + advance });
210
+ // commit() may have clamped or auto-paused; the only way position
211
+ // genuinely did not change is if we were already at end and the
212
+ // clamp swallowed the advance.
213
+ return state.peek().position !== prevPosition;
214
+ }
215
+ // -------------------------------------------------------------------
216
+ // Disposal — same guard pattern as createIndicatorSelectorController.
217
+ // -------------------------------------------------------------------
218
+ let disposed = false;
219
+ function dispose() {
220
+ if (disposed)
221
+ return;
222
+ disposed = true;
223
+ }
224
+ function guard(fn) {
225
+ return (...args) => {
226
+ if (disposed)
227
+ return undefined;
228
+ return fn(...args);
229
+ };
230
+ }
231
+ return {
232
+ state,
233
+ setRange: guard(setRange),
234
+ seekTo: guard(seekTo),
235
+ seekBy: guard(seekBy),
236
+ stepForward: guard(stepForward),
237
+ stepBackward: guard(stepBackward),
238
+ play: guard(play),
239
+ pause: guard(pause),
240
+ toggle: guard(toggle),
241
+ setPacing: guard(setPacing),
242
+ setSpeed: guard(setSpeed),
243
+ tick: ((deltaMs) => {
244
+ if (disposed)
245
+ return false;
246
+ return tick(deltaMs);
247
+ }),
248
+ dispose,
249
+ };
250
+ }
251
+ //# sourceMappingURL=createReplayController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReplayController.js","sourceRoot":"","sources":["../../src/replay/createReplayController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { ReplayMode, ReplayPacing, ReplayState, ReplayController, ReplayControllerInit, CreateReplayController, } from './types';
2
+ export { createReplayController } from './createReplayController';
3
+ export { barIndexToTimestamp, timestampToBarIndex, inferBarIntervalMs, } from './timeline';
4
+ export type { BarCalendar } from './timeline';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACzB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { createReplayController } from './createReplayController';
2
+ export { barIndexToTimestamp, timestampToBarIndex, inferBarIntervalMs, } from './timeline';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Timeline — bar-index ↔ timestamp navigation.
3
+ *
4
+ * A `BarCalendar` is the authoritative list of bar open-times in
5
+ * milliseconds. Real markets aren't uniformly spaced: there are weekend
6
+ * gaps, half-day holiday closes, exchange maintenance windows, etc. The
7
+ * timeline functions must honor those gaps exactly — bar N and bar N+1 can
8
+ * be 60 seconds apart on a Tuesday and three days apart Friday→Monday.
9
+ *
10
+ * Both functions are pure and total: out-of-range inputs return `null`
11
+ * instead of throwing. Callers (e.g. the replay controller, the crosshair
12
+ * tooltip) should treat `null` as "no data at that position".
13
+ */
14
+ /** A monotonically-increasing list of bar open timestamps (ms since epoch).
15
+ * By convention `calendar[i]` is the open time of bar `i`. */
16
+ export type BarCalendar = ReadonlyArray<number>;
17
+ /**
18
+ * Look up the timestamp for an integer bar index.
19
+ *
20
+ * Fractional `barIndex` is floored — the timestamp returned is the
21
+ * open-time of the containing bar. (Callers that want intra-bar
22
+ * interpolation should do it themselves.)
23
+ *
24
+ * Returns `null` if the calendar is empty or the index is out of range.
25
+ */
26
+ export declare function barIndexToTimestamp(calendar: BarCalendar, barIndex: number): number | null;
27
+ /**
28
+ * Look up the bar index that contains a given timestamp.
29
+ *
30
+ * Uses binary search; cost is O(log n). The returned index is the bar
31
+ * whose open-time is the largest value `<= ts`. This means a timestamp
32
+ * that falls inside a non-trading gap (e.g. Saturday) resolves to the
33
+ * last bar before the gap (Friday's close), which is the intuitive
34
+ * behavior for "scrub to this wall-clock time".
35
+ *
36
+ * Returns `null` if the calendar is empty or `ts` precedes the first bar.
37
+ */
38
+ export declare function timestampToBarIndex(calendar: BarCalendar, ts: number): number | null;
39
+ /**
40
+ * Compute the dominant bar interval (in ms) from a calendar.
41
+ *
42
+ * Uses the median delta between successive bars, which is robust to
43
+ * weekend and holiday gaps that would skew a simple mean. Returns
44
+ * `null` if the calendar has fewer than two bars.
45
+ *
46
+ * The replay controller uses this when `barIntervalMs` is not configured
47
+ * but a calendar is available, so wall-clock pacing self-calibrates.
48
+ */
49
+ export declare function inferBarIntervalMs(calendar: BarCalendar): number | null;
50
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/replay/timeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;+DAC+D;AAC/D,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAOf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,WAAW,EACrB,EAAE,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAsBf;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAkBvE"}