@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,118 @@
1
+ /**
2
+ * Crosshair sync — broadcasts crosshair position across multiple
3
+ * chart panes so a hover in one pane lights up the same time index
4
+ * in every other pane.
5
+ *
6
+ * Why this is the controller, not just a callback:
7
+ *
8
+ * - Multi-pane layouts (price + volume + 1+ indicator panes) are
9
+ * standard for finance charts. TradingView's multi-pane crosshair
10
+ * is one of its iconic UX features.
11
+ * - Each pane has its own scale/transform. The universal coordinate
12
+ * they share is the **time index** — the integer-valued position
13
+ * within the bar array. Sync on index, not pixel; the rendering
14
+ * pane converts back to its own x coordinate.
15
+ * - Loop prevention: a pane that consumed a sync event must not
16
+ * re-emit it. We track the source identifier so the pane that
17
+ * drove the update doesn't recurse.
18
+ *
19
+ * Pure data, signal-based, framework-agnostic — same shape as the
20
+ * rest of `@klinechart-quant/core`.
21
+ *
22
+ * const sync = createCrosshairSync()
23
+ * sync.register('price')
24
+ * sync.register('volume')
25
+ * sync.register('rsi')
26
+ *
27
+ * priceContainer.addEventListener('pointermove', e => {
28
+ * const idx = timeScale.xToBarIndex(e.offsetX)
29
+ * sync.move('price', idx)
30
+ * })
31
+ *
32
+ * sync.position.subscribe(() => {
33
+ * const p = sync.position.peek()
34
+ * if (p === null) hideCrosshair()
35
+ * else if (p.source !== 'volume') drawCrosshairInVolume(p.index)
36
+ * })
37
+ */
38
+ import { createSignal } from '../../reactivity';
39
+ import { KLineChartError } from '../../errors';
40
+ // ---------------------------------------------------------------------------
41
+ // Factory
42
+ // ---------------------------------------------------------------------------
43
+ export function createCrosshairSync() {
44
+ const position = createSignal(null);
45
+ const paneCount = createSignal(0);
46
+ const panes = new Set();
47
+ let disposed = false;
48
+ function publishPaneCount() {
49
+ paneCount.set(panes.size);
50
+ }
51
+ function register(paneId) {
52
+ if (disposed)
53
+ return;
54
+ if (paneId === '' || typeof paneId !== 'string') {
55
+ throw new KLineChartError('INVALID_PARAM', `CrosshairSync.register: paneId must be a non-empty string`);
56
+ }
57
+ if (panes.has(paneId))
58
+ return;
59
+ panes.add(paneId);
60
+ publishPaneCount();
61
+ }
62
+ function unregister(paneId) {
63
+ if (disposed)
64
+ return;
65
+ if (!panes.has(paneId))
66
+ return;
67
+ panes.delete(paneId);
68
+ publishPaneCount();
69
+ const cur = position.peek();
70
+ if (cur !== null && cur.source === paneId) {
71
+ position.set(null);
72
+ }
73
+ }
74
+ function move(paneId, index) {
75
+ if (disposed)
76
+ return;
77
+ if (!panes.has(paneId)) {
78
+ throw new KLineChartError('NOT_REGISTERED', `CrosshairSync.move: pane ${JSON.stringify(paneId)} is not registered — call register(${JSON.stringify(paneId)}) before move()`);
79
+ }
80
+ if (!Number.isFinite(index)) {
81
+ throw new KLineChartError('INVALID_PARAM', `CrosshairSync.move: index must be finite, got ${index}`);
82
+ }
83
+ // Normalise to integer. Sub-bar precision lives in the per-pane
84
+ // pixel layer, not in the shared index broadcast.
85
+ const idx = Math.round(index);
86
+ const cur = position.peek();
87
+ // Coalesce identical updates so subscribers don't fire on no-ops.
88
+ if (cur !== null && cur.index === idx && cur.source === paneId)
89
+ return;
90
+ position.set({ index: idx, source: paneId });
91
+ }
92
+ function clear() {
93
+ if (disposed)
94
+ return;
95
+ if (position.peek() === null)
96
+ return;
97
+ position.set(null);
98
+ }
99
+ function reset() {
100
+ if (disposed)
101
+ return;
102
+ panes.clear();
103
+ publishPaneCount();
104
+ if (position.peek() !== null)
105
+ position.set(null);
106
+ }
107
+ function dispose() {
108
+ if (disposed)
109
+ return;
110
+ disposed = true;
111
+ panes.clear();
112
+ // No notify on dispose — subscribers should listen for their own
113
+ // host lifecycle. Setting paneCount/position now would notify
114
+ // dead subscribers in some host frameworks.
115
+ }
116
+ return { position, paneCount, register, unregister, move, clear, reset, dispose };
117
+ }
118
+ //# sourceMappingURL=createCrosshairSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCrosshairSync.js","sourceRoot":"","sources":["../../../src/components/crosshairSync/createCrosshairSync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createCrosshairSync, type CrosshairSync, type CrosshairPosition, } from './createCrosshairSync';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/crosshairSync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACzB,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { createCrosshairSync, } from './createCrosshairSync';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/crosshairSync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,GAGtB,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Aggressor classification — three heuristics for tagging a print as
3
+ * buyer-initiated ("buy", aggressor lifted the ASK) or seller-initiated
4
+ * ("sell", aggressor hit the BID).
5
+ *
6
+ * Future hook: Bulk Volume Classification (BVC) by Easley/Lopez de Prado/O'Hara
7
+ * 2012 is more robust in HFT-fragmented markets where the tick rule's serial
8
+ * correlation assumptions break. BVC is planned as a v2 classifier under the
9
+ * same `AggressorResult` interface.
10
+ *
11
+ * Each classifier exports the same `AggressorResult` shape so the controller
12
+ * can compose them in a fallback chain (explicit → heuristic) without
13
+ * branching on classifier identity.
14
+ *
15
+ * See `docs/ROADMAP.md` §3.3 for the rationale — order of preference is
16
+ * always explicit > Lee-Ready > tick rule.
17
+ */
18
+ import type { AggressorSide, Trade, TradeWithFlag } from './types';
19
+ /**
20
+ * Output of every classifier.
21
+ *
22
+ * `side` is `'unknown'` only when there is genuinely no information to act
23
+ * on (e.g. the first trade in a tick-rule sequence). The controller should
24
+ * treat `'unknown'` as "drop this trade from the aggregate", NOT as a
25
+ * silent default to 'buy' or 'sell'.
26
+ *
27
+ * `inferred=false` means the side came from an exchange flag (zero error).
28
+ * `inferred=true` means it was estimated; downstream UI should mark such
29
+ * bars as approximate.
30
+ */
31
+ export type { AggressorSide, Trade, TradeWithFlag };
32
+ export interface AggressorResult {
33
+ side: AggressorSide | 'unknown';
34
+ inferred: boolean;
35
+ }
36
+ /**
37
+ * Read Binance-style `isBuyerMaker`. When the buyer is the maker (passive),
38
+ * the seller was the aggressor — so we report `'sell'`. When the buyer is
39
+ * NOT the maker, the buyer was the aggressor — `'buy'`.
40
+ *
41
+ * Returns `null` (not an `AggressorResult`) when the flag is missing so the
42
+ * caller can distinguish "no data" from "we classified it as unknown". This
43
+ * lets the controller fall back to the configured heuristic only when truly
44
+ * needed.
45
+ */
46
+ export declare function classifyExplicit(trade: TradeWithFlag): AggressorResult | null;
47
+ /**
48
+ * State carried across consecutive trades for the tick rule. The classifier
49
+ * MUTATES this in place — callers should keep one instance per stream
50
+ * (per-symbol if multiplexing).
51
+ */
52
+ export interface TickRuleState {
53
+ prevPrice: number | null;
54
+ prevSide: AggressorSide | null;
55
+ }
56
+ /**
57
+ * Classic tick test (Lee & Ready 1991 §2):
58
+ *
59
+ * price > prevPrice → 'buy' (uptick)
60
+ * price < prevPrice → 'sell' (downtick)
61
+ * price == prevPrice → repeats prevSide (zero-tick)
62
+ * first trade (prevPrice null) → 'unknown'
63
+ *
64
+ * The state is MUTATED so subsequent calls inherit the running context.
65
+ */
66
+ export declare function classifyTickRule(state: TickRuleState, trade: Trade): AggressorResult;
67
+ /**
68
+ * Lee-Ready uses the same carry-over fields as the tick rule — the two
69
+ * heuristics can share a single state record because Lee-Ready falls back
70
+ * to the tick rule on a quote-mid hit.
71
+ */
72
+ export interface LeeReadyState extends TickRuleState {
73
+ }
74
+ /**
75
+ * Lee-Ready (1991) quote test:
76
+ *
77
+ * If bid and ask are both finite:
78
+ * mid = (bid + ask) / 2
79
+ * price > mid → 'buy'
80
+ * price < mid → 'sell'
81
+ * price == mid → tick-rule fallback (zero spread or mid-cross)
82
+ * Else (bid/ask missing or non-finite) → tick-rule fallback.
83
+ *
84
+ * The state MUTATES exactly like `classifyTickRule` — when the quote test
85
+ * resolves, we still update `prevPrice`/`prevSide` so a subsequent
86
+ * tick-rule fallback has the latest context.
87
+ */
88
+ export declare function classifyLeeReady(state: LeeReadyState, trade: Trade, bid: number, ask: number): AggressorResult;
89
+ //# sourceMappingURL=aggressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggressor.d.ts","sourceRoot":"","sources":["../../../src/components/footprint/aggressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAElE;;;;;;;;;;;GAWG;AACH,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;AACnD,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;IAC/B,QAAQ,EAAE,OAAO,CAAA;CACpB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,GACrB,eAAe,GAAG,IAAI,CAMxB;AAMD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,KAAK,GACb,eAAe,CAsBjB;AAMD;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa;CAAG;AAEvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACZ,eAAe,CAqBjB"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Aggressor classification — three heuristics for tagging a print as
3
+ * buyer-initiated ("buy", aggressor lifted the ASK) or seller-initiated
4
+ * ("sell", aggressor hit the BID).
5
+ *
6
+ * Future hook: Bulk Volume Classification (BVC) by Easley/Lopez de Prado/O'Hara
7
+ * 2012 is more robust in HFT-fragmented markets where the tick rule's serial
8
+ * correlation assumptions break. BVC is planned as a v2 classifier under the
9
+ * same `AggressorResult` interface.
10
+ *
11
+ * Each classifier exports the same `AggressorResult` shape so the controller
12
+ * can compose them in a fallback chain (explicit → heuristic) without
13
+ * branching on classifier identity.
14
+ *
15
+ * See `docs/ROADMAP.md` §3.3 for the rationale — order of preference is
16
+ * always explicit > Lee-Ready > tick rule.
17
+ */
18
+ // ---------------------------------------------------------------------------
19
+ // 1. Explicit (exchange-provided flag)
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Read Binance-style `isBuyerMaker`. When the buyer is the maker (passive),
23
+ * the seller was the aggressor — so we report `'sell'`. When the buyer is
24
+ * NOT the maker, the buyer was the aggressor — `'buy'`.
25
+ *
26
+ * Returns `null` (not an `AggressorResult`) when the flag is missing so the
27
+ * caller can distinguish "no data" from "we classified it as unknown". This
28
+ * lets the controller fall back to the configured heuristic only when truly
29
+ * needed.
30
+ */
31
+ export function classifyExplicit(trade) {
32
+ if (trade.isBuyerMaker === undefined)
33
+ return null;
34
+ return {
35
+ side: trade.isBuyerMaker ? 'sell' : 'buy',
36
+ inferred: false,
37
+ };
38
+ }
39
+ /**
40
+ * Classic tick test (Lee & Ready 1991 §2):
41
+ *
42
+ * price > prevPrice → 'buy' (uptick)
43
+ * price < prevPrice → 'sell' (downtick)
44
+ * price == prevPrice → repeats prevSide (zero-tick)
45
+ * first trade (prevPrice null) → 'unknown'
46
+ *
47
+ * The state is MUTATED so subsequent calls inherit the running context.
48
+ */
49
+ export function classifyTickRule(state, trade) {
50
+ const prev = state.prevPrice;
51
+ let side;
52
+ if (prev === null) {
53
+ side = 'unknown';
54
+ }
55
+ else if (trade.price > prev) {
56
+ side = 'buy';
57
+ }
58
+ else if (trade.price < prev) {
59
+ side = 'sell';
60
+ }
61
+ else {
62
+ // zero-tick: inherit previous decision; 'unknown' if no prior side.
63
+ side = state.prevSide ?? 'unknown';
64
+ }
65
+ // Update running state. We commit a known side; we deliberately do NOT
66
+ // overwrite `prevSide` with 'unknown', otherwise a single missing-price
67
+ // trade would poison the carry-over for the rest of the stream.
68
+ state.prevPrice = trade.price;
69
+ if (side === 'buy' || side === 'sell')
70
+ state.prevSide = side;
71
+ return { side, inferred: true };
72
+ }
73
+ /**
74
+ * Lee-Ready (1991) quote test:
75
+ *
76
+ * If bid and ask are both finite:
77
+ * mid = (bid + ask) / 2
78
+ * price > mid → 'buy'
79
+ * price < mid → 'sell'
80
+ * price == mid → tick-rule fallback (zero spread or mid-cross)
81
+ * Else (bid/ask missing or non-finite) → tick-rule fallback.
82
+ *
83
+ * The state MUTATES exactly like `classifyTickRule` — when the quote test
84
+ * resolves, we still update `prevPrice`/`prevSide` so a subsequent
85
+ * tick-rule fallback has the latest context.
86
+ */
87
+ export function classifyLeeReady(state, trade, bid, ask) {
88
+ const quotesUsable = Number.isFinite(bid) && Number.isFinite(ask);
89
+ if (!quotesUsable) {
90
+ return classifyTickRule(state, trade);
91
+ }
92
+ const mid = (bid + ask) / 2;
93
+ if (trade.price > mid) {
94
+ state.prevPrice = trade.price;
95
+ state.prevSide = 'buy';
96
+ return { side: 'buy', inferred: true };
97
+ }
98
+ if (trade.price < mid) {
99
+ state.prevPrice = trade.price;
100
+ state.prevSide = 'sell';
101
+ return { side: 'sell', inferred: true };
102
+ }
103
+ // price == mid → fall back to tick rule (which updates state).
104
+ return classifyTickRule(state, trade);
105
+ }
106
+ //# sourceMappingURL=aggressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggressor.js","sourceRoot":"","sources":["../../../src/components/footprint/aggressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB;IAEpB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACjD,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACzC,QAAQ,EAAE,KAAK;KAClB,CAAA;AACL,CAAC;AAgBD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB,EACpB,KAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAA;IAC5B,IAAI,IAA+B,CAAA;IAEnC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,IAAI,GAAG,SAAS,CAAA;IACpB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,KAAK,CAAA;IAChB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,MAAM,CAAA;IACjB,CAAC;SAAM,CAAC;QACJ,oEAAoE;QACpE,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAA;IACtC,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,gEAAgE;IAChE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;IAC7B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM;QAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;IAE5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC;AAaD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB,EACpB,KAAY,EACZ,GAAW,EACX,GAAW;IAEX,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAEjE,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IAE3B,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;QAC7B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAA;QACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;QAC7B,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC3C,CAAC;IACD,+DAA+D;IAC/D,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACzC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * FootprintController — framework-agnostic, signal-based.
3
+ *
4
+ * Streams trades in, materialises a `FootprintBar[]` out. Composes:
5
+ *
6
+ * - `classifyExplicit` (try exchange flag first)
7
+ * - `classifyTickRule` / `classifyLeeReady` (fallback per config)
8
+ * - `computeDelta`, `computeDiagonalImbalances`, `computeCumulativeDelta`
9
+ *
10
+ * Internal storage is hot-path-friendly:
11
+ *
12
+ * buckets: Map<barIndex, Map<priceTickKey, { askVol, bidVol }>>
13
+ *
14
+ * Materialisation (sorting + array build) is deferred to `bars` / `cumulativeDelta`
15
+ * signal reads. A `dirty` flag invalidates the cache on every `ingestTrade`.
16
+ *
17
+ * Classifier state carry-over: the `TickRuleState` / `LeeReadyState` records
18
+ * are MAINTAINED ACROSS BAR BOUNDARIES — i.e. the last trade's price/side of
19
+ * bar N is used as the prior for the first trade of bar N+1. This is the
20
+ * documented choice (see ROADMAP §3.3): per-bar reset would flag every bar's
21
+ * first trade as `unknown`, which inflates dropped volume and breaks the
22
+ * Lee-Ready zero-tick fallback at every minute boundary. The tested behaviour
23
+ * relies on this carry-over.
24
+ *
25
+ * Dispose-guard pattern mirrors `createIndicatorSelectorController.ts`.
26
+ */
27
+ import type { FootprintConfig, FootprintController } from './types';
28
+ export declare function createFootprintController(init: Partial<FootprintConfig>): FootprintController;
29
+ //# sourceMappingURL=createFootprintController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFootprintController.d.ts","sourceRoot":"","sources":["../../../src/components/footprint/createFootprintController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAiBH,OAAO,KAAK,EAGR,eAAe,EACf,mBAAmB,EAGtB,MAAM,SAAS,CAAA;AAsChB,wBAAgB,yBAAyB,CACrC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAC/B,mBAAmB,CAwPrB"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * FootprintController — framework-agnostic, signal-based.
3
+ *
4
+ * Streams trades in, materialises a `FootprintBar[]` out. Composes:
5
+ *
6
+ * - `classifyExplicit` (try exchange flag first)
7
+ * - `classifyTickRule` / `classifyLeeReady` (fallback per config)
8
+ * - `computeDelta`, `computeDiagonalImbalances`, `computeCumulativeDelta`
9
+ *
10
+ * Internal storage is hot-path-friendly:
11
+ *
12
+ * buckets: Map<barIndex, Map<priceTickKey, { askVol, bidVol }>>
13
+ *
14
+ * Materialisation (sorting + array build) is deferred to `bars` / `cumulativeDelta`
15
+ * signal reads. A `dirty` flag invalidates the cache on every `ingestTrade`.
16
+ *
17
+ * Classifier state carry-over: the `TickRuleState` / `LeeReadyState` records
18
+ * are MAINTAINED ACROSS BAR BOUNDARIES — i.e. the last trade's price/side of
19
+ * bar N is used as the prior for the first trade of bar N+1. This is the
20
+ * documented choice (see ROADMAP §3.3): per-bar reset would flag every bar's
21
+ * first trade as `unknown`, which inflates dropped volume and breaks the
22
+ * Lee-Ready zero-tick fallback at every minute boundary. The tested behaviour
23
+ * relies on this carry-over.
24
+ *
25
+ * Dispose-guard pattern mirrors `createIndicatorSelectorController.ts`.
26
+ */
27
+ import { createSignal } from '../../reactivity';
28
+ import { KLineChartError } from '../../errors';
29
+ import { classifyExplicit, classifyLeeReady, classifyTickRule, } from './aggressor';
30
+ import { computeCumulativeDelta, computeDelta, computeDiagonalImbalances, } from './perBarStats';
31
+ // ---------------------------------------------------------------------------
32
+ // Defaults & validation
33
+ // ---------------------------------------------------------------------------
34
+ const DEFAULT_CONFIG = {
35
+ tickSize: 0.01,
36
+ barIntervalMs: 60_000,
37
+ imbalanceRatio: 3,
38
+ fallbackClassifier: 'tick-rule',
39
+ };
40
+ function validateConfig(c) {
41
+ if (!(c.tickSize > 0)) {
42
+ throw new KLineChartError('FOOTPRINT_TICKSIZE_INVALID', 'FootprintController: tickSize must be > 0');
43
+ }
44
+ if (!(c.barIntervalMs > 0) || !Number.isFinite(c.barIntervalMs)) {
45
+ throw new KLineChartError('FOOTPRINT_BAR_INTERVAL_INVALID', 'FootprintController: barIntervalMs must be > 0');
46
+ }
47
+ if (!(c.imbalanceRatio > 0)) {
48
+ throw new KLineChartError('FOOTPRINT_RATIO_INVALID', 'FootprintController: imbalanceRatio must be > 0');
49
+ }
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Factory
53
+ // ---------------------------------------------------------------------------
54
+ export function createFootprintController(init) {
55
+ const initialConfig = { ...DEFAULT_CONFIG, ...init };
56
+ validateConfig(initialConfig);
57
+ const config = createSignal(initialConfig);
58
+ const bars = createSignal([]);
59
+ const cumulativeDelta = createSignal([]);
60
+ // ---- Internal state ------------------------------------------------
61
+ /**
62
+ * barIndex → (priceTickKey → mutable cell).
63
+ *
64
+ * We use Maps so insertion order is preserved per-bar (for debug-time
65
+ * inspection); the public materialisation sorts deterministically.
66
+ */
67
+ let buckets = new Map();
68
+ /**
69
+ * Classifier carry-over. One record shared by tick rule and Lee-Ready —
70
+ * they have the same field surface. NEVER reset on bar boundary
71
+ * (see header comment).
72
+ */
73
+ const tickState = {
74
+ prevPrice: null,
75
+ prevSide: null,
76
+ };
77
+ /** Set to true on every successful `ingestTrade`; cleared on materialise. */
78
+ let dirty = false;
79
+ /** Disposal guard. */
80
+ let disposed = false;
81
+ // ---- Helpers -------------------------------------------------------
82
+ function classify(trade, bid, ask) {
83
+ // 1. Try the explicit exchange flag first (zero error).
84
+ const explicit = classifyExplicit(trade);
85
+ if (explicit !== null) {
86
+ // Even when we don't consume the heuristic, advance the
87
+ // carry-over so a later fallback-classified trade still has a
88
+ // useful prevPrice/prevSide. We commit prevSide only for known
89
+ // explicit sides.
90
+ tickState.prevPrice = trade.price;
91
+ tickState.prevSide = explicit.side === 'unknown' ? null : explicit.side;
92
+ return explicit;
93
+ }
94
+ // 2. Fall back to the configured heuristic.
95
+ const mode = config.peek().fallbackClassifier;
96
+ if (mode === 'lee-ready') {
97
+ // If quotes are missing, classifyLeeReady will degrade to the
98
+ // tick rule itself — same state record.
99
+ const b = bid ?? Number.NaN;
100
+ const a = ask ?? Number.NaN;
101
+ return classifyLeeReady(tickState, trade, b, a);
102
+ }
103
+ return classifyTickRule(tickState, trade);
104
+ }
105
+ function bucketFor(barIndex) {
106
+ let bar = buckets.get(barIndex);
107
+ if (bar === undefined) {
108
+ bar = new Map();
109
+ buckets.set(barIndex, bar);
110
+ }
111
+ return bar;
112
+ }
113
+ function cellFor(bar, priceTickKey) {
114
+ let cell = bar.get(priceTickKey);
115
+ if (cell === undefined) {
116
+ cell = { askVol: 0, bidVol: 0 };
117
+ bar.set(priceTickKey, cell);
118
+ }
119
+ return cell;
120
+ }
121
+ /**
122
+ * Build the materialised view from `buckets`. Sorts bars ascending by
123
+ * barIndex; within each bar, sorts cells ascending by price.
124
+ */
125
+ function materialise() {
126
+ const cfg = config.peek();
127
+ const sortedBarIndices = [...buckets.keys()].sort((a, b) => a - b);
128
+ const outBars = [];
129
+ const perBarDeltas = [];
130
+ for (const barIndex of sortedBarIndices) {
131
+ const internal = buckets.get(barIndex);
132
+ if (internal === undefined)
133
+ continue;
134
+ const sortedKeys = [...internal.keys()].sort((a, b) => a - b);
135
+ const cells = sortedKeys.map((k) => {
136
+ const c = internal.get(k);
137
+ return {
138
+ price: k * cfg.tickSize,
139
+ askVol: c.askVol,
140
+ bidVol: c.bidVol,
141
+ };
142
+ });
143
+ const delta = computeDelta(cells);
144
+ let totalVolume = 0;
145
+ for (let i = 0; i < cells.length; i++) {
146
+ const cell = cells[i];
147
+ if (cell === undefined)
148
+ continue;
149
+ totalVolume += cell.askVol + cell.bidVol;
150
+ }
151
+ const imbalances = computeDiagonalImbalances(cells, cfg.imbalanceRatio);
152
+ const startTime = barIndex * cfg.barIntervalMs;
153
+ const endTime = startTime + cfg.barIntervalMs - 1;
154
+ outBars.push({
155
+ barIndex,
156
+ startTime,
157
+ endTime,
158
+ cells,
159
+ delta,
160
+ totalVolume,
161
+ imbalances,
162
+ });
163
+ perBarDeltas.push(delta);
164
+ }
165
+ return { bars: outBars, cumulative: computeCumulativeDelta(perBarDeltas) };
166
+ }
167
+ function publishIfDirty() {
168
+ if (!dirty)
169
+ return;
170
+ const { bars: nextBars, cumulative } = materialise();
171
+ bars.set(nextBars);
172
+ cumulativeDelta.set(cumulative);
173
+ dirty = false;
174
+ }
175
+ // ---- Mutators ------------------------------------------------------
176
+ function ingestTrade(trade, bid, ask) {
177
+ if (disposed)
178
+ return;
179
+ // Defensive: reject malformed trades. We do not throw — a single bad
180
+ // print should not poison the live stream.
181
+ if (!Number.isFinite(trade.price) || !Number.isFinite(trade.size)) {
182
+ return;
183
+ }
184
+ if (!Number.isFinite(trade.timestamp))
185
+ return;
186
+ if (trade.size <= 0)
187
+ return;
188
+ const result = classify(trade, bid, ask);
189
+ if (result.side === 'unknown') {
190
+ // Drop from the aggregate (the documented contract). We've still
191
+ // updated tickState inside `classify` so the next trade has
192
+ // context.
193
+ return;
194
+ }
195
+ const cfg = config.peek();
196
+ const barIndex = Math.floor(trade.timestamp / cfg.barIntervalMs);
197
+ const priceTickKey = Math.round(trade.price / cfg.tickSize);
198
+ const bar = bucketFor(barIndex);
199
+ const cell = cellFor(bar, priceTickKey);
200
+ if (result.side === 'buy') {
201
+ cell.askVol += trade.size;
202
+ }
203
+ else {
204
+ cell.bidVol += trade.size;
205
+ }
206
+ dirty = true;
207
+ publishIfDirty();
208
+ }
209
+ function setConfig(next) {
210
+ if (disposed)
211
+ return;
212
+ const cur = config.peek();
213
+ const merged = { ...cur, ...next };
214
+ validateConfig(merged);
215
+ // Changing tickSize or barIntervalMs invalidates the buckets — the
216
+ // priceTickKey and barIndex of every accumulated cell would be wrong
217
+ // under the new partitioning. Clear them and let the caller re-feed
218
+ // history if needed.
219
+ const partitionChanged = merged.tickSize !== cur.tickSize ||
220
+ merged.barIntervalMs !== cur.barIntervalMs;
221
+ if (partitionChanged) {
222
+ buckets = new Map();
223
+ // We do NOT reset tickState — the next trade's carry-over is
224
+ // still valid because the classifier only depends on price
225
+ // history, not on the bucket partitioning.
226
+ }
227
+ config.set(merged);
228
+ // Re-materialise. If partition changed, bars/cumulative now empty.
229
+ // If only imbalanceRatio changed, we still want to re-flag.
230
+ dirty = true;
231
+ publishIfDirty();
232
+ }
233
+ function reset() {
234
+ if (disposed)
235
+ return;
236
+ buckets = new Map();
237
+ tickState.prevPrice = null;
238
+ tickState.prevSide = null;
239
+ bars.set([]);
240
+ cumulativeDelta.set([]);
241
+ dirty = false;
242
+ }
243
+ function dispose() {
244
+ if (disposed)
245
+ return;
246
+ disposed = true;
247
+ // Mutators check `disposed` so no further writes will fire — existing
248
+ // subscribers receive no further notifications.
249
+ }
250
+ return {
251
+ config,
252
+ bars,
253
+ cumulativeDelta,
254
+ // Canonical verb (API audit BLOCKER-001 harmonisation across
255
+ // VolumeProfile / OrderBookHeatmap / Footprint). Wired to the same
256
+ // implementation as `ingestTrade` so existing consumers keep working.
257
+ ingest: ingestTrade,
258
+ ingestTrade,
259
+ setConfig,
260
+ reset,
261
+ dispose,
262
+ };
263
+ }
264
+ //# sourceMappingURL=createFootprintController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFootprintController.js","sourceRoot":"","sources":["../../../src/components/footprint/createFootprintController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { AggressorSide, Trade, TradeWithFlag, FootprintBar, FootprintConfig, FootprintController, } from './types';
2
+ export type { AggressorResult, TickRuleState, LeeReadyState } from './aggressor';
3
+ export { classifyExplicit, classifyTickRule, classifyLeeReady, } from './aggressor';
4
+ export type { FootprintBarCell, FootprintImbalance } from './perBarStats';
5
+ export { computeDelta, computeCumulativeDelta, computeDiagonalImbalances, } from './perBarStats';
6
+ export { createFootprintController } from './createFootprintController';
7
+ //# sourceMappingURL=index.d.ts.map