@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,139 @@
1
+ /**
2
+ * TimeScale factory — discrete bar-index ↔ screen X mapping (ROADMAP §1.1).
3
+ *
4
+ * The math is one-line in each direction; the value of this factory is the
5
+ * reactive plumbing (signals so adapters can subscribe) and the optional
6
+ * wall-clock calendar that maps bar indices ↔ timestamps.
7
+ *
8
+ * forward: x(i) = (i - firstVisibleIndex) * barWidth + leftPadding
9
+ * inverse: i(x) = (x - leftPadding) / barWidth + firstVisibleIndex
10
+ *
11
+ * Calendar semantics: when the user attaches a `barTimestamps` array, we treat
12
+ * bar index `i` as the array index. Integer indices map directly; fractional
13
+ * indices linearly interpolate between neighboring timestamps. Anything
14
+ * outside `[0, N-1]` returns `null` — the caller decides whether to clamp,
15
+ * extrapolate, or display a "—" label.
16
+ */
17
+ import { createSignal } from '../reactivity/signal';
18
+ import { KLineChartError } from '../errors';
19
+ export function createTimeScale(config = {}) {
20
+ const initialFirstVisibleIndex = config.initialFirstVisibleIndex ?? 0;
21
+ const initialBarWidth = config.initialBarWidth ?? 8;
22
+ const initialLeftPadding = config.initialLeftPadding ?? 0;
23
+ if (!(initialBarWidth > 0)) {
24
+ throw new KLineChartError('SCALE_BAR_WIDTH_INVALID', `createTimeScale: initialBarWidth must be > 0, got ${initialBarWidth}`);
25
+ }
26
+ const firstVisibleIndex = createSignal(initialFirstVisibleIndex);
27
+ const barWidth = createSignal(initialBarWidth);
28
+ const leftPadding = createSignal(initialLeftPadding);
29
+ let calendar = null;
30
+ let disposed = false;
31
+ /**
32
+ * Post-dispose: mutator calls become silent no-ops. This matches the
33
+ * convention used by every other controller in @klinechart-quant/core
34
+ * (IndicatorSelector, Toolbar, Drawing, Alerts, Replay, VolumeProfile,
35
+ * Footprint, OrderBookHeatmap, AnchoredVwap, MtfOverlay). Throwing on
36
+ * stale references — as the original implementation did — was the API
37
+ * audit BLOCKER-004 (docs/audit/API_REVIEW.md) divergence; harmonized
38
+ * to silent-no-op here.
39
+ *
40
+ * Returns `true` when the operation should proceed (controller live),
41
+ * `false` when it should be skipped (post-dispose).
42
+ */
43
+ const guard = () => !disposed;
44
+ const scale = {
45
+ firstVisibleIndex,
46
+ barWidth,
47
+ leftPadding,
48
+ xToBarIndex(x) {
49
+ // We deliberately read with `.peek()` here — these methods are pure
50
+ // queries, they must not register the caller as a reactive subscriber.
51
+ const lp = leftPadding.peek();
52
+ const bw = barWidth.peek();
53
+ const fvi = firstVisibleIndex.peek();
54
+ return (x - lp) / bw + fvi;
55
+ },
56
+ barIndexToX(i) {
57
+ const lp = leftPadding.peek();
58
+ const bw = barWidth.peek();
59
+ const fvi = firstVisibleIndex.peek();
60
+ return (i - fvi) * bw + lp;
61
+ },
62
+ setFirstVisibleIndex(i) {
63
+ if (!guard())
64
+ return;
65
+ firstVisibleIndex.set(i);
66
+ },
67
+ setBarWidth(w) {
68
+ if (!guard())
69
+ return;
70
+ if (!(w > 0)) {
71
+ throw new KLineChartError('SCALE_BAR_WIDTH_INVALID', `TimeScale.setBarWidth: barWidth must be > 0, got ${w}`);
72
+ }
73
+ barWidth.set(w);
74
+ },
75
+ setLeftPadding(p) {
76
+ if (!guard())
77
+ return;
78
+ leftPadding.set(p);
79
+ },
80
+ setCalendar(c) {
81
+ if (!guard())
82
+ return;
83
+ calendar = c;
84
+ },
85
+ timeToBarIndex(timestamp) {
86
+ if (calendar === null)
87
+ return null;
88
+ const ts = calendar.barTimestamps;
89
+ const n = ts.length;
90
+ if (n === 0)
91
+ return null;
92
+ // Binary search for the upper bound of `timestamp` in `ts`.
93
+ // Returns the fractional index that interpolates linearly between
94
+ // bracketing bars. Outside the calendar → null.
95
+ if (timestamp < ts[0] || timestamp > ts[n - 1])
96
+ return null;
97
+ if (timestamp === ts[n - 1])
98
+ return n - 1;
99
+ let lo = 0;
100
+ let hi = n - 1;
101
+ while (hi - lo > 1) {
102
+ const mid = (lo + hi) >>> 1;
103
+ if (ts[mid] <= timestamp)
104
+ lo = mid;
105
+ else
106
+ hi = mid;
107
+ }
108
+ const span = ts[hi] - ts[lo];
109
+ if (span <= 0)
110
+ return lo;
111
+ return lo + (timestamp - ts[lo]) / span;
112
+ },
113
+ barIndexToTime(i) {
114
+ if (calendar === null)
115
+ return null;
116
+ const ts = calendar.barTimestamps;
117
+ const n = ts.length;
118
+ if (n === 0)
119
+ return null;
120
+ if (i < 0 || i > n - 1)
121
+ return null;
122
+ const lo = Math.floor(i);
123
+ const hi = Math.min(lo + 1, n - 1);
124
+ if (lo === hi)
125
+ return ts[lo];
126
+ const frac = i - lo;
127
+ return ts[lo] + (ts[hi] - ts[lo]) * frac;
128
+ },
129
+ dispose() {
130
+ // Signals don't allocate listeners we own; we just mark the
131
+ // instance as dead so writes throw and tests can assert dispose
132
+ // semantics. Reads remain functional as pure math.
133
+ disposed = true;
134
+ calendar = null;
135
+ },
136
+ };
137
+ return scale;
138
+ }
139
+ //# sourceMappingURL=createTimeScale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTimeScale.js","sourceRoot":"","sources":["../../src/scale/createTimeScale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { ScaleMode, TimeScale, PriceScale } from './types';
2
+ export { createTimeScale, type TimeScaleConfig } from './createTimeScale';
3
+ export { createPriceScale, type PriceScaleConfig } from './createPriceScale';
4
+ export { computeAnchoredZoom, type AnchoredZoomOptions, type AnchoredZoomResult, } from './anchoredZoom';
5
+ export { createOriginShiftPolicy, type OriginShiftPolicy } from './originShift';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scale/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EACH,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GAC1B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { createTimeScale } from './createTimeScale';
2
+ export { createPriceScale } from './createPriceScale';
3
+ export { computeAnchoredZoom, } from './anchoredZoom';
4
+ export { createOriginShiftPolicy } from './originShift';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scale/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAwB,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAyB,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EACH,mBAAmB,GAGtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,uBAAuB,EAA0B,MAAM,eAAe,CAAA"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Origin-shift policy — ROADMAP §2.5, refined per the upstream PR feedback
3
+ * about *rebaseline drift*.
4
+ *
5
+ * Background. GPUs run fp32 (~7 decimal digits of precision). At BTC-tier
6
+ * prices (~67,000) and tick sizes (~0.01) the absolute price burns most of
7
+ * the mantissa, and a subtraction like `(p - pMin)` inside a zoomed-in
8
+ * sub-dollar range produces catastrophic cancellation. The cheap fix is to
9
+ * subtract a "reference value" `ref` on the CPU (which is fp64 and can spare
10
+ * it) before uploading, so the GPU only ever sees relative deltas in the
11
+ * 0.1-or-so range.
12
+ *
13
+ * Why this is its own policy object, and why **threshold-based**:
14
+ *
15
+ * The naive implementation — "every frame, set `ref = midpoint of current
16
+ * visible range`" — looks right but is actively harmful on pan. Every time
17
+ * the user drags one logical pixel, `ref` changes by one logical-pixel-of-
18
+ * price, and *all* prices get re-quantized to a slightly different fp32
19
+ * rounding. The result is a continuous, sub-pixel **shimmer** of the entire
20
+ * chart that the eye perceives as soft jitter even when no actual data has
21
+ * changed. (This is the bug I flagged on the upstream PR.)
22
+ *
23
+ * The fix is to keep `ref` *stable* until the visible-range center has
24
+ * drifted far enough that the fp32 budget is at risk of being exhausted —
25
+ * then rebaseline once, deliberately. The visible artifact becomes a single
26
+ * imperceptible discrete snap, instead of a continuous wobble.
27
+ *
28
+ * In practice 1% of the visible range works well: at a 100-dollar range you
29
+ * tolerate `ref` being 1 dollar off-center before re-snapping, which is
30
+ * nowhere near the fp32 cliff but cuts rebaselines from "every frame" to
31
+ * a handful per pan gesture.
32
+ *
33
+ * Edge cases worth documenting:
34
+ *
35
+ * - `threshold === 0` forces a rebaseline on *every* call where the midpoint
36
+ * differs from `ref` at all — this is the legacy "naive" behaviour, kept
37
+ * for parity tests against the bug we're avoiding.
38
+ *
39
+ * - `threshold >= 1` effectively disables rebaselining, useful when an
40
+ * adapter wants to manage `ref` externally.
41
+ *
42
+ * - A `currentRange` of zero (degenerate, visibleMin === visibleMax) is
43
+ * treated as "no signal" — we don't rebaseline because we cannot compute a
44
+ * meaningful normalized drift. The caller is responsible for handling the
45
+ * degenerate range elsewhere.
46
+ */
47
+ export interface OriginShiftPolicy {
48
+ /** Current reference value. Subtract this from any price before upload. */
49
+ readonly ref: number;
50
+ /** Subtract `ref` from `value`. The fp32-safe number to upload. */
51
+ shift(value: number): number;
52
+ /**
53
+ * Maybe rebaseline. Returns `true` iff `ref` was updated.
54
+ *
55
+ * Policy: rebaseline only when
56
+ * `|currentMid - ref| / currentRange > threshold`.
57
+ * On rebaseline, `ref` becomes `currentMid`.
58
+ */
59
+ maybeRebaseline(currentMid: number, currentRange: number): boolean;
60
+ }
61
+ /**
62
+ * @internal — building block used by `createPriceScale`. Reachable today
63
+ * via the top-level `@klinechart-quant/core` barrel but **NOT
64
+ * part of the supported public API**. typedoc / api-extractor
65
+ * hide it from generated docs. Prefer the controller factory
66
+ * for stable user code. Closes API audit BLOCKER-002.
67
+ */
68
+ export declare function createOriginShiftPolicy(initialRef: number, threshold?: number): OriginShiftPolicy;
69
+ //# sourceMappingURL=originShift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originShift.d.ts","sourceRoot":"","sources":["../../src/scale/originShift.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,mEAAmE;IACnE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC5B;;;;;;OAMG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAA;CACrE;AAID;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,MAA0B,GACtC,iBAAiB,CAmCnB"}
@@ -0,0 +1,41 @@
1
+ import { KLineChartError } from '../errors';
2
+ const DEFAULT_THRESHOLD = 0.01;
3
+ /**
4
+ * @internal — building block used by `createPriceScale`. Reachable today
5
+ * via the top-level `@klinechart-quant/core` barrel but **NOT
6
+ * part of the supported public API**. typedoc / api-extractor
7
+ * hide it from generated docs. Prefer the controller factory
8
+ * for stable user code. Closes API audit BLOCKER-002.
9
+ */
10
+ export function createOriginShiftPolicy(initialRef, threshold = DEFAULT_THRESHOLD) {
11
+ if (!Number.isFinite(initialRef)) {
12
+ throw new KLineChartError('INVALID_PARAM', `createOriginShiftPolicy: initialRef must be finite, got ${initialRef}`);
13
+ }
14
+ if (!Number.isFinite(threshold) || threshold < 0) {
15
+ throw new KLineChartError('INVALID_PARAM', `createOriginShiftPolicy: threshold must be >= 0, got ${threshold}`);
16
+ }
17
+ let ref = initialRef;
18
+ const policy = {
19
+ get ref() {
20
+ return ref;
21
+ },
22
+ shift(value) {
23
+ return value - ref;
24
+ },
25
+ maybeRebaseline(currentMid, currentRange) {
26
+ // Degenerate range — refuse to rebaseline. Caller handles this elsewhere.
27
+ if (!Number.isFinite(currentMid) || !Number.isFinite(currentRange) || currentRange <= 0) {
28
+ return false;
29
+ }
30
+ const drift = Math.abs(currentMid - ref);
31
+ const normalized = drift / currentRange;
32
+ if (normalized > threshold) {
33
+ ref = currentMid;
34
+ return true;
35
+ }
36
+ return false;
37
+ },
38
+ };
39
+ return policy;
40
+ }
41
+ //# sourceMappingURL=originShift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"originShift.js","sourceRoot":"","sources":["../../src/scale/originShift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AA+D3C,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACnC,UAAkB,EAClB,YAAoB,iBAAiB;IAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,2DAA2D,UAAU,EAAE,CAAC,CAAA;IACvH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,wDAAwD,SAAS,EAAE,CAAC,CAAA;IACnH,CAAC;IAED,IAAI,GAAG,GAAG,UAAU,CAAA;IAEpB,MAAM,MAAM,GAAsB;QAC9B,IAAI,GAAG;YACH,OAAO,GAAG,CAAA;QACd,CAAC;QACD,KAAK,CAAC,KAAa;YACf,OAAO,KAAK,GAAG,GAAG,CAAA;QACtB,CAAC;QACD,eAAe,CAAC,UAAkB,EAAE,YAAoB;YACpD,0EAA0E;YAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtF,OAAO,KAAK,CAAA;YAChB,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAA;YACxC,MAAM,UAAU,GAAG,KAAK,GAAG,YAAY,CAAA;YAEvC,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;gBACzB,GAAG,GAAG,UAAU,CAAA;gBAChB,OAAO,IAAI,CAAA;YACf,CAAC;YACD,OAAO,KAAK,CAAA;QAChB,CAAC;KACJ,CAAA;IAED,OAAO,MAAM,CAAA;AACjB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Coordinate-system interfaces for the headless core.
3
+ *
4
+ * The `TimeScale` maps **bar index** (a discrete-but-fractional sequence number)
5
+ * to a screen X position, per ROADMAP §1.1. Wall-clock time is a secondary
6
+ * label, available only when a calendar is attached.
7
+ *
8
+ * The `PriceScale` maps a (possibly very narrow) price range to screen Y per
9
+ * ROADMAP §1.2 — and additionally exposes an origin-shift policy so adapters
10
+ * can keep GPU uploads in safe fp32 territory (ROADMAP §2.5).
11
+ *
12
+ * Both scales are **reactive**: their core state is exposed as signals so the
13
+ * React/Vue/Angular adapter layer can subscribe without re-implementing the
14
+ * change-detection plumbing.
15
+ */
16
+ import type { Signal } from '../reactivity/signal';
17
+ /** Linear (arithmetic) or logarithmic Y mapping. */
18
+ export type ScaleMode = 'linear' | 'log';
19
+ /**
20
+ * Discrete bar-index ↔ screen X mapping (ROADMAP §1.1).
21
+ *
22
+ * Forward equation (the only equation a renderer needs to know):
23
+ *
24
+ * x(i) = (i - firstVisibleIndex) * barWidth + leftPadding
25
+ *
26
+ * Inverse, used by anchored zoom and hit-testing:
27
+ *
28
+ * i(x) = (x - leftPadding) / barWidth + firstVisibleIndex
29
+ *
30
+ * `firstVisibleIndex` is allowed to be **fractional, negative, or > N**;
31
+ * this is what lets the user pan to "half a bar" or scroll into the future.
32
+ */
33
+ export interface TimeScale {
34
+ /** Inverse: screen X (logical px) → fractional bar index. */
35
+ xToBarIndex(x: number): number;
36
+ /** Forward: fractional bar index → screen X (logical px). */
37
+ barIndexToX(i: number): number;
38
+ /** Fractional, may be negative or > N. */
39
+ readonly firstVisibleIndex: Signal<number>;
40
+ /** Logical pixels per bar. Clamped by the caller (e.g. zoom) not the scale. */
41
+ readonly barWidth: Signal<number>;
42
+ /** Logical pixels added on the left edge before bar 0. */
43
+ readonly leftPadding: Signal<number>;
44
+ setFirstVisibleIndex(i: number): void;
45
+ setBarWidth(w: number): void;
46
+ setLeftPadding(p: number): void;
47
+ /**
48
+ * Attach (or detach with `null`) a wall-clock calendar so the scale can
49
+ * answer `timeToBarIndex` / `barIndexToTime`. Bar indices not covered by
50
+ * the calendar return `null` — *time is a label, not a coordinate*.
51
+ */
52
+ setCalendar(c: {
53
+ barTimestamps: ReadonlyArray<number>;
54
+ } | null): void;
55
+ /** wall-clock ms → fractional bar index; `null` if no calendar / out of range. */
56
+ timeToBarIndex(timestamp: number): number | null;
57
+ /** fractional bar index → wall-clock ms; `null` if no calendar / out of range. */
58
+ barIndexToTime(i: number): number | null;
59
+ /** Detach signal subscribers and release any internal listeners. */
60
+ dispose(): void;
61
+ }
62
+ /**
63
+ * Price → screen Y mapping (ROADMAP §1.2) plus an origin-shift policy
64
+ * (ROADMAP §2.5) so adapters can upload fp32-safe values to the GPU.
65
+ *
66
+ * Coordinate convention: top-origin, Y increases downward (DOM standard).
67
+ * A price ≥ `visibleMax` maps to y = 0, a price ≤ `visibleMin` maps to
68
+ * y = `height`.
69
+ */
70
+ export interface PriceScale {
71
+ /** Forward: price → screen Y (top-origin, increases downward). */
72
+ priceToY(p: number): number;
73
+ /** Inverse: screen Y → price. */
74
+ yToPrice(y: number): number;
75
+ readonly mode: Signal<ScaleMode>;
76
+ readonly visibleMin: Signal<number>;
77
+ readonly visibleMax: Signal<number>;
78
+ readonly height: Signal<number>;
79
+ /** Set `'linear'` or `'log'`; throws on `'log'` if `visibleMin <= 0`. */
80
+ setMode(mode: ScaleMode): void;
81
+ /** Update visible range. Triggers the origin-shift rebaseline check. */
82
+ setVisibleRange(min: number, max: number): void;
83
+ setHeight(h: number): void;
84
+ /** Origin-shift reference; managed automatically but exposed for tests. */
85
+ readonly originShiftRef: Signal<number>;
86
+ /** Returns `p - originShiftRef.peek()` — what to upload to the GPU as fp32. */
87
+ toShiftedFp32(p: number): number;
88
+ dispose(): void;
89
+ }
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scale/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,oDAAoD;AACpD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAA;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,SAAS;IACtB,6DAA6D;IAC7D,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,6DAA6D;IAC7D,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE9B,0CAA0C;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAEpC,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAE/B;;;;OAIG;IACH,WAAW,CAAC,CAAC,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI,CAAA;IAErE,kFAAkF;IAClF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAChD,kFAAkF;IAClF,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAExC,oEAAoE;IACpE,OAAO,IAAI,IAAI,CAAA;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACvB,kEAAkE;IAClE,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAE/B,yEAAyE;IACzE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC9B,wEAAwE;IACxE,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/C,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAE1B,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACvC,+EAA+E;IAC/E,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAEhC,OAAO,IAAI,IAAI,CAAA;CAClB"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Coordinate-system interfaces for the headless core.
3
+ *
4
+ * The `TimeScale` maps **bar index** (a discrete-but-fractional sequence number)
5
+ * to a screen X position, per ROADMAP §1.1. Wall-clock time is a secondary
6
+ * label, available only when a calendar is attached.
7
+ *
8
+ * The `PriceScale` maps a (possibly very narrow) price range to screen Y per
9
+ * ROADMAP §1.2 — and additionally exposes an origin-shift policy so adapters
10
+ * can keep GPU uploads in safe fp32 territory (ROADMAP §2.5).
11
+ *
12
+ * Both scales are **reactive**: their core state is exposed as signals so the
13
+ * React/Vue/Angular adapter layer can subscribe without re-implementing the
14
+ * change-detection plumbing.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scale/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Scene factory — composition, ordered iteration, lifecycle.
3
+ *
4
+ * Design notes:
5
+ * - The layer list is stored in **registration order** in a private array.
6
+ * `paintPane` performs a stable sort by `z` at paint time. We do not
7
+ * maintain a sorted invariant on the array itself because:
8
+ * 1. Add/remove must remain O(n), and z is a number, so a sorted
9
+ * insert is O(n) anyway.
10
+ * 2. Stable sort by z gives the documented tie-breaker (registration
11
+ * order) "for free" without parallel arrays or registration counters.
12
+ * - The `layers` signal exposes a snapshot. Every mutation produces a NEW
13
+ * array via spread or filter — never mutate the previous value. This is
14
+ * the immutability contract framework adapters rely on.
15
+ * - After `dispose`, every public method becomes a no-op. The `disposed`
16
+ * flag is checked at the top of each method; this matches the renderer's
17
+ * "dispose freezes" semantic and prevents callers from leaking listeners
18
+ * into a torn-down scene.
19
+ */
20
+ import type { Scene } from './types';
21
+ export declare function createScene(): Scene;
22
+ //# sourceMappingURL=createScene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createScene.d.ts","sourceRoot":"","sources":["../../src/scene/createScene.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,SAAS,CAAA;AAEzD,wBAAgB,WAAW,IAAI,KAAK,CA6FnC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Scene factory — composition, ordered iteration, lifecycle.
3
+ *
4
+ * Design notes:
5
+ * - The layer list is stored in **registration order** in a private array.
6
+ * `paintPane` performs a stable sort by `z` at paint time. We do not
7
+ * maintain a sorted invariant on the array itself because:
8
+ * 1. Add/remove must remain O(n), and z is a number, so a sorted
9
+ * insert is O(n) anyway.
10
+ * 2. Stable sort by z gives the documented tie-breaker (registration
11
+ * order) "for free" without parallel arrays or registration counters.
12
+ * - The `layers` signal exposes a snapshot. Every mutation produces a NEW
13
+ * array via spread or filter — never mutate the previous value. This is
14
+ * the immutability contract framework adapters rely on.
15
+ * - After `dispose`, every public method becomes a no-op. The `disposed`
16
+ * flag is checked at the top of each method; this matches the renderer's
17
+ * "dispose freezes" semantic and prevents callers from leaking listeners
18
+ * into a torn-down scene.
19
+ */
20
+ import { createSignal } from '../reactivity/signal';
21
+ export function createScene() {
22
+ // ---- internal state ----------------------------------------------------
23
+ // Mutable list held outside the signal so that signal.set always receives
24
+ // a fresh frozen-shape snapshot. We never expose this array directly.
25
+ let layerList = [];
26
+ let disposed = false;
27
+ const layersSignal = createSignal([]);
28
+ const publish = () => {
29
+ layersSignal.set(layerList.slice());
30
+ };
31
+ // ---- public API --------------------------------------------------------
32
+ const addLayer = (layer) => {
33
+ if (disposed)
34
+ return;
35
+ // Reject duplicate ids silently — protects against double-registration
36
+ // races where two systems (e.g. an indicator controller + a config
37
+ // restore) both attempt to add the same layer. The first wins.
38
+ if (layerList.some((existing) => existing.id === layer.id))
39
+ return;
40
+ layerList = [...layerList, layer];
41
+ publish();
42
+ };
43
+ const removeLayer = (id) => {
44
+ if (disposed)
45
+ return false;
46
+ const next = layerList.filter((layer) => layer.id !== id);
47
+ if (next.length === layerList.length)
48
+ return false;
49
+ layerList = next;
50
+ publish();
51
+ return true;
52
+ };
53
+ const getLayer = (id) => {
54
+ if (disposed)
55
+ return null;
56
+ const hit = layerList.find((layer) => layer.id === id);
57
+ return hit ?? null;
58
+ };
59
+ const setLayerVisibility = (id, visible) => {
60
+ if (disposed)
61
+ return false;
62
+ const layer = layerList.find((l) => l.id === id);
63
+ if (!layer)
64
+ return false;
65
+ // `visible` is a mutable field on the layer (per the interface);
66
+ // mutating it does not affect the `layers` signal's identity because
67
+ // subscribers care about membership, not field state. This matches
68
+ // how chart adapters batch visibility toggles (no re-render storm).
69
+ layer.visible = visible;
70
+ return true;
71
+ };
72
+ const paintPane = (ctx) => {
73
+ if (disposed)
74
+ return;
75
+ // Filter then stable-sort. Native Array.prototype.sort is required
76
+ // by ECMAScript 2019+ to be stable, so equal z values preserve the
77
+ // surviving registration order from the filter pass.
78
+ const candidates = layerList.filter((layer) => layer.paneRole === ctx.paneRole && layer.visible);
79
+ candidates.sort((a, b) => a.z - b.z);
80
+ for (const layer of candidates) {
81
+ layer.paint(ctx);
82
+ }
83
+ };
84
+ const dispose = () => {
85
+ if (disposed)
86
+ return;
87
+ disposed = true;
88
+ // Snapshot first because layer.dispose may attempt further mutations
89
+ // through a stale reference — we want predictable iteration here.
90
+ const snapshot = layerList;
91
+ layerList = [];
92
+ for (const layer of snapshot) {
93
+ try {
94
+ layer.dispose();
95
+ }
96
+ catch {
97
+ // Swallow per-layer dispose errors so one broken layer can't
98
+ // strand the rest. A logger would go here in production; the
99
+ // headless core does not own a logger contract yet.
100
+ }
101
+ }
102
+ layersSignal.set([]);
103
+ };
104
+ return {
105
+ layers: layersSignal,
106
+ addLayer,
107
+ removeLayer,
108
+ getLayer,
109
+ setLayerVisibility,
110
+ paintPane,
111
+ dispose,
112
+ };
113
+ }
114
+ //# sourceMappingURL=createScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createScene.js","sourceRoot":"","sources":["../../src/scene/createScene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Scene abstraction barrel.
3
+ *
4
+ * Exports the `Layer` / `Scene` types, the `createScene` factory, and the
5
+ * `LayerRegistry` mechanism + canonical built-in layer typeIds. This is the
6
+ * level above `render` and below `interaction` in the core dependency stack
7
+ * — see `docs/ROADMAP.md` §0.
8
+ */
9
+ export type { Layer, LayerRole, PaneRole, PaintContext, Scene, } from './types';
10
+ export { createScene } from './createScene';
11
+ export { createLayerRegistry, BUILTIN_LAYER_TYPES, } from './layerRegistry';
12
+ export type { LayerFactory, LayerRegistry, BuiltinLayerType, } from './layerRegistry';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,YAAY,EACR,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,KAAK,GACR,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EACH,mBAAmB,EACnB,mBAAmB,GACtB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACR,YAAY,EACZ,aAAa,EACb,gBAAgB,GACnB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Scene abstraction barrel.
3
+ *
4
+ * Exports the `Layer` / `Scene` types, the `createScene` factory, and the
5
+ * `LayerRegistry` mechanism + canonical built-in layer typeIds. This is the
6
+ * level above `render` and below `interaction` in the core dependency stack
7
+ * — see `docs/ROADMAP.md` §0.
8
+ */
9
+ export { createScene } from './createScene';
10
+ export { createLayerRegistry, BUILTIN_LAYER_TYPES, } from './layerRegistry';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EACH,mBAAmB,EACnB,mBAAmB,GACtB,MAAM,iBAAiB,CAAA"}