@forgecharts/sdk 1.1.28 → 1.1.29

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 (237) hide show
  1. package/dist/index.js +8100 -48
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.js +8851 -31
  4. package/dist/internal.js.map +1 -1
  5. package/dist/react/index.js +11558 -27
  6. package/dist/react/index.js.map +1 -1
  7. package/dist/react/internal.js +12147 -43
  8. package/dist/react/internal.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/backwardCompatibility.test.js +0 -159
  11. package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
  12. package/dist/__tests__/candleInvariant.test.js +0 -415
  13. package/dist/__tests__/candleInvariant.test.js.map +0 -1
  14. package/dist/__tests__/public-api-surface.js +0 -38
  15. package/dist/__tests__/public-api-surface.js.map +0 -1
  16. package/dist/__tests__/timeframeBoundary.test.js +0 -452
  17. package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
  18. package/dist/api/DrawingManager.js +0 -190
  19. package/dist/api/DrawingManager.js.map +0 -1
  20. package/dist/api/EventBus.js +0 -44
  21. package/dist/api/EventBus.js.map +0 -1
  22. package/dist/api/IndicatorDAG.js +0 -316
  23. package/dist/api/IndicatorDAG.js.map +0 -1
  24. package/dist/api/IndicatorRegistry.js +0 -39
  25. package/dist/api/IndicatorRegistry.js.map +0 -1
  26. package/dist/api/LayoutManager.js +0 -51
  27. package/dist/api/LayoutManager.js.map +0 -1
  28. package/dist/api/PaneManager.js +0 -119
  29. package/dist/api/PaneManager.js.map +0 -1
  30. package/dist/api/ReferenceAPI.js +0 -153
  31. package/dist/api/ReferenceAPI.js.map +0 -1
  32. package/dist/api/TChart.js +0 -765
  33. package/dist/api/TChart.js.map +0 -1
  34. package/dist/api/createChart.js +0 -42
  35. package/dist/api/createChart.js.map +0 -1
  36. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
  37. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
  38. package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
  39. package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
  40. package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
  41. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
  42. package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
  43. package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
  44. package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
  45. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
  46. package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
  47. package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
  48. package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
  49. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
  50. package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
  51. package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
  52. package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
  53. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
  54. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
  55. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
  56. package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
  57. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
  58. package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
  59. package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
  60. package/dist/api/drawing tools/lines menu/ray.js +0 -23
  61. package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
  62. package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
  63. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
  64. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
  65. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
  66. package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
  67. package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
  68. package/dist/api/drawing tools/lines menu/trendline.js +0 -11
  69. package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
  70. package/dist/api/drawing tools/lines menu/vertical.js +0 -11
  71. package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
  72. package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
  73. package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
  74. package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
  75. package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
  76. package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
  77. package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
  78. package/dist/api/drawing tools/pointers menu/dot.js +0 -23
  79. package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
  80. package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
  81. package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
  82. package/dist/api/drawing tools/shapes menu/text.js +0 -25
  83. package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
  84. package/dist/api/drawingUtils.js +0 -83
  85. package/dist/api/drawingUtils.js.map +0 -1
  86. package/dist/core/CanvasLayer.js +0 -56
  87. package/dist/core/CanvasLayer.js.map +0 -1
  88. package/dist/core/Chart.js +0 -839
  89. package/dist/core/Chart.js.map +0 -1
  90. package/dist/core/CoordTransform.js +0 -224
  91. package/dist/core/CoordTransform.js.map +0 -1
  92. package/dist/core/Crosshair.js +0 -186
  93. package/dist/core/Crosshair.js.map +0 -1
  94. package/dist/core/IndicatorEngine.js +0 -181
  95. package/dist/core/IndicatorEngine.js.map +0 -1
  96. package/dist/core/InteractionManager.js +0 -698
  97. package/dist/core/InteractionManager.js.map +0 -1
  98. package/dist/core/PriceScale.js +0 -113
  99. package/dist/core/PriceScale.js.map +0 -1
  100. package/dist/core/Series.js +0 -114
  101. package/dist/core/Series.js.map +0 -1
  102. package/dist/core/TimeScale.js +0 -150
  103. package/dist/core/TimeScale.js.map +0 -1
  104. package/dist/datafeed/DatafeedConnector.js +0 -268
  105. package/dist/datafeed/DatafeedConnector.js.map +0 -1
  106. package/dist/engine/CandleEngine.js +0 -318
  107. package/dist/engine/CandleEngine.js.map +0 -1
  108. package/dist/engine/__tests__/CandleEngine.test.js +0 -300
  109. package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
  110. package/dist/engine/candleInvariants.js +0 -134
  111. package/dist/engine/candleInvariants.js.map +0 -1
  112. package/dist/engine/mergeUtils.js +0 -64
  113. package/dist/engine/mergeUtils.js.map +0 -1
  114. package/dist/engine/timeframeUtils.js +0 -100
  115. package/dist/engine/timeframeUtils.js.map +0 -1
  116. package/dist/licensing/ChartRuntimeResolver.js +0 -310
  117. package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
  118. package/dist/licensing/LicenseManager.js +0 -114
  119. package/dist/licensing/LicenseManager.js.map +0 -1
  120. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
  121. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
  122. package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
  123. package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
  124. package/dist/licensing/licenseTypes.js +0 -2
  125. package/dist/licensing/licenseTypes.js.map +0 -1
  126. package/dist/pine/PineCompiler.js +0 -44
  127. package/dist/pine/PineCompiler.js.map +0 -1
  128. package/dist/pine/diagnostics.js +0 -11
  129. package/dist/pine/diagnostics.js.map +0 -1
  130. package/dist/pine/index.js +0 -5
  131. package/dist/pine/index.js.map +0 -1
  132. package/dist/pine/pine-ast.js +0 -19
  133. package/dist/pine/pine-ast.js.map +0 -1
  134. package/dist/pine/pine-lexer.js +0 -249
  135. package/dist/pine/pine-lexer.js.map +0 -1
  136. package/dist/pine/pine-parser.js +0 -416
  137. package/dist/pine/pine-parser.js.map +0 -1
  138. package/dist/pine/pine-transpiler.js +0 -260
  139. package/dist/pine/pine-transpiler.js.map +0 -1
  140. package/dist/pixi/LayerName.js +0 -35
  141. package/dist/pixi/LayerName.js.map +0 -1
  142. package/dist/pixi/PixiCandlestickRenderer.js +0 -107
  143. package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
  144. package/dist/pixi/PixiChart.js +0 -367
  145. package/dist/pixi/PixiChart.js.map +0 -1
  146. package/dist/pixi/PixiCrosshairRenderer.js +0 -110
  147. package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
  148. package/dist/pixi/PixiDrawingRenderer.js +0 -111
  149. package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
  150. package/dist/pixi/PixiGridRenderer.js +0 -114
  151. package/dist/pixi/PixiGridRenderer.js.map +0 -1
  152. package/dist/pixi/PixiLayerManager.js +0 -92
  153. package/dist/pixi/PixiLayerManager.js.map +0 -1
  154. package/dist/react/canvas/ChartCanvas.js +0 -604
  155. package/dist/react/canvas/ChartCanvas.js.map +0 -1
  156. package/dist/react/canvas/ChartContextMenu.js +0 -5
  157. package/dist/react/canvas/ChartContextMenu.js.map +0 -1
  158. package/dist/react/canvas/ChartSettingsDialog.js +0 -28
  159. package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
  160. package/dist/react/canvas/IndicatorLabel.js +0 -196
  161. package/dist/react/canvas/IndicatorLabel.js.map +0 -1
  162. package/dist/react/canvas/IndicatorPane.js +0 -395
  163. package/dist/react/canvas/IndicatorPane.js.map +0 -1
  164. package/dist/react/canvas/PointerOverlay.js +0 -61
  165. package/dist/react/canvas/PointerOverlay.js.map +0 -1
  166. package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
  167. package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
  168. package/dist/react/hooks/useChartCapabilities.js +0 -66
  169. package/dist/react/hooks/useChartCapabilities.js.map +0 -1
  170. package/dist/react/shell/ManagedAppShell.js +0 -440
  171. package/dist/react/shell/ManagedAppShell.js.map +0 -1
  172. package/dist/react/trading/TradingBridge.js +0 -73
  173. package/dist/react/trading/TradingBridge.js.map +0 -1
  174. package/dist/react/workspace/ChartWorkspace.js +0 -42
  175. package/dist/react/workspace/ChartWorkspace.js.map +0 -1
  176. package/dist/react/workspace/FloatingPanel.js +0 -82
  177. package/dist/react/workspace/FloatingPanel.js.map +0 -1
  178. package/dist/react/workspace/IndicatorsDialog.js +0 -121
  179. package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
  180. package/dist/react/workspace/LayoutMenu.js +0 -113
  181. package/dist/react/workspace/LayoutMenu.js.map +0 -1
  182. package/dist/react/workspace/SymbolSearchDialog.js +0 -245
  183. package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
  184. package/dist/react/workspace/TabBar.js +0 -29
  185. package/dist/react/workspace/TabBar.js.map +0 -1
  186. package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
  187. package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
  188. package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
  189. package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
  190. package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
  191. package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
  192. package/dist/renderers/CandlestickRenderer.js +0 -98
  193. package/dist/renderers/CandlestickRenderer.js.map +0 -1
  194. package/dist/renderers/HistogramRenderer.js +0 -50
  195. package/dist/renderers/HistogramRenderer.js.map +0 -1
  196. package/dist/renderers/LineRenderer.js +0 -64
  197. package/dist/renderers/LineRenderer.js.map +0 -1
  198. package/dist/theme/colors.js +0 -19
  199. package/dist/theme/colors.js.map +0 -1
  200. package/dist/tools/barDivergenceCheck.js +0 -200
  201. package/dist/tools/barDivergenceCheck.js.map +0 -1
  202. package/dist/trading/TradingOverlayStore.js +0 -139
  203. package/dist/trading/TradingOverlayStore.js.map +0 -1
  204. package/dist/trading/UnmanagedIngestion.js +0 -114
  205. package/dist/trading/UnmanagedIngestion.js.map +0 -1
  206. package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
  207. package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
  208. package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
  209. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
  210. package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
  211. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
  212. package/dist/trading/managed/ManagedTradingController.js +0 -247
  213. package/dist/trading/managed/ManagedTradingController.js.map +0 -1
  214. package/dist/trading/managed/managedCapabilities.js +0 -79
  215. package/dist/trading/managed/managedCapabilities.js.map +0 -1
  216. package/dist/trading/managed/managedTypes.js +0 -13
  217. package/dist/trading/managed/managedTypes.js.map +0 -1
  218. package/dist/trading/tradingTypes.js +0 -8
  219. package/dist/trading/tradingTypes.js.map +0 -1
  220. package/dist/tscript/TScriptIndicator.js +0 -47
  221. package/dist/tscript/TScriptIndicator.js.map +0 -1
  222. package/dist/tscript/ast.js +0 -22
  223. package/dist/tscript/ast.js.map +0 -1
  224. package/dist/tscript/lexer.js +0 -187
  225. package/dist/tscript/lexer.js.map +0 -1
  226. package/dist/tscript/parser.js +0 -318
  227. package/dist/tscript/parser.js.map +0 -1
  228. package/dist/tscript/runtime.js +0 -475
  229. package/dist/tscript/runtime.js.map +0 -1
  230. package/dist/tscript/series.js +0 -79
  231. package/dist/tscript/series.js.map +0 -1
  232. package/dist/types/IChart.js +0 -2
  233. package/dist/types/IChart.js.map +0 -1
  234. package/dist/types/IRenderer.js +0 -2
  235. package/dist/types/IRenderer.js.map +0 -1
  236. package/dist/types/ISeries.js +0 -2
  237. package/dist/types/ISeries.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uDAAuD;AACvD,cAAc,SAAS,CAAC;AAExB,iFAAiF;AACjF,uDAAuD;AACvD,mFAAmF;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,gFAAgF;AAChF,oDAAoD;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,iFAAiF;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"sources":["../src/core/CanvasLayer.ts","../../utils/src/math.ts","../../utils/src/time.ts","../../utils/src/color.ts","../src/core/TimeScale.ts","../src/core/PriceScale.ts","../src/core/CoordTransform.ts","../src/core/Crosshair.ts","../src/renderers/CandlestickRenderer.ts","../src/renderers/LineRenderer.ts","../src/renderers/HistogramRenderer.ts","../src/core/Series.ts","../src/core/InteractionManager.ts","../src/api/drawingUtils.ts","../src/api/drawing%20tools/lines%20menu/trendline.ts","../src/api/drawing%20tools/lines%20menu/ray.ts","../src/api/drawing%20tools/lines%20menu/infoLine.ts","../src/api/drawing%20tools/lines%20menu/extendedLine.ts","../src/api/drawing%20tools/lines%20menu/trendAngle.ts","../src/api/drawing%20tools/lines%20menu/horizontal.ts","../src/api/drawing%20tools/lines%20menu/vertical.ts","../src/api/drawing%20tools/lines%20menu/horizontalRay.ts","../src/api/drawing%20tools/lines%20menu/crossLine.ts","../src/api/drawing%20tools/lines%20menu/parallelChannel.ts","../src/api/drawing%20tools/lines%20menu/regressionTrend.ts","../src/api/drawing%20tools/lines%20menu/flatTopBottom.ts","../src/api/drawing%20tools/lines%20menu/disjointChannel.ts","../src/api/drawing%20tools/lines%20menu/pitchfork.ts","../src/api/drawing%20tools/lines%20menu/schiffPitchfork.ts","../src/api/drawing%20tools/lines%20menu/modifiedSchiffPitchfork.ts","../src/api/drawing%20tools/lines%20menu/insidePitchfork.ts","../src/api/drawing%20tools/shapes%20menu/rectangle.ts","../src/api/drawing%20tools/shapes%20menu/text.ts","../src/api/drawing%20tools/fib%20gann%20menu/fibRetracement.ts","../src/api/DrawingManager.ts","../src/theme/colors.ts","../src/core/Chart.ts","../src/api/EventBus.ts","../src/api/IndicatorRegistry.ts","../src/api/LayoutManager.ts","../src/api/PaneManager.ts","../../shared/src/time/timeframeRegistry.ts","../../shared/src/time/timeUtils.ts","../src/engine/timeframeUtils.ts","../src/engine/mergeUtils.ts","../src/engine/candleInvariants.ts","../src/engine/CandleEngine.ts","../src/datafeed/DatafeedConnector.ts","../src/trading/TradingOverlayStore.ts","../src/licensing/LicenseManager.ts","../src/licensing/ChartRuntimeResolver.ts","../src/trading/UnmanagedIngestion.ts","../src/trading/managed/managedCapabilities.ts","../src/trading/managed/ManagedTradingController.ts","../src/api/TChart.ts","../src/api/createChart.ts","../src/api/ReferenceAPI.ts","../src/core/IndicatorEngine.ts","../src/tscript/series.ts","../src/tscript/lexer.ts","../src/tscript/parser.ts","../src/tscript/runtime.ts","../src/tscript/TScriptIndicator.ts","../src/api/IndicatorDAG.ts","../src/pine/pine-lexer.ts","../src/pine/pine-parser.ts","../src/pine/pine-transpiler.ts","../src/pine/diagnostics.ts","../src/pine/PineCompiler.ts","../src/api/drawing%20tools/pointers%20menu/cursor.ts","../src/api/drawing%20tools/pointers%20menu/crosshair.ts","../src/api/drawing%20tools/pointers%20menu/dot.ts","../src/api/drawing%20tools/pointers%20menu/demonstration.ts","../src/pixi/LayerName.ts","../src/pixi/PixiLayerManager.ts","../src/pixi/PixiGridRenderer.ts","../src/pixi/PixiCandlestickRenderer.ts","../src/pixi/PixiCrosshairRenderer.ts","../src/pixi/PixiDrawingRenderer.ts","../src/pixi/PixiChart.ts"],"names":["bar","m","_counter","nextId","timeframeToMs","getBucketStart","result","resolver","Series","node","LayerName","Container","Graphics","TextStyle","Text"],"mappings":"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","file":"internal.js","sourcesContent":["/**\n * CanvasLayer — a single <canvas> element inside the chart container.\n * Each layer has an independent bitmap; layers are stacked via CSS z-index.\n * Physical pixels are pre-scaled by devicePixelRatio for crisp rendering.\n */\nexport type CanvasLayerOptions = {\n readonly width: number;\n readonly height: number;\n readonly dpr: number;\n readonly zIndex: number;\n};\n\nexport class CanvasLayer {\n readonly canvas: HTMLCanvasElement;\n readonly context: CanvasRenderingContext2D;\n\n private _width: number;\n private _height: number;\n private _dpr: number;\n\n constructor(container: HTMLElement, options: CanvasLayerOptions) {\n this._width = options.width;\n this._height = options.height;\n this._dpr = options.dpr;\n\n this.canvas = document.createElement('canvas');\n this.canvas.style.position = 'absolute';\n this.canvas.style.inset = '0';\n this.canvas.style.zIndex = String(options.zIndex);\n this.canvas.style.pointerEvents = options.zIndex === 3 ? 'auto' : 'none';\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) throw new Error('[ForgeCharts] Failed to acquire 2D canvas context');\n this.context = ctx;\n\n this._applyDpr();\n container.appendChild(this.canvas);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n get dpr(): number {\n return this._dpr;\n }\n\n resize(width: number, height: number, dpr: number): void {\n const physW = Math.round(width * dpr);\n const physH = Math.round(height * dpr);\n // Setting canvas.width/height always clears the bitmap, so skip if nothing changed.\n if (physW === this.canvas.width && physH === this.canvas.height && dpr === this._dpr) {\n return;\n }\n this._width = width;\n this._height = height;\n this._dpr = dpr;\n this._applyDpr();\n }\n\n destroy(): void {\n this.canvas.remove();\n }\n\n private _applyDpr(): void {\n const { canvas, context, _width: w, _height: h, _dpr: dpr } = this;\n canvas.width = Math.round(w * dpr);\n canvas.height = Math.round(h * dpr);\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n}\n","/**\n * Clamps a value between min and max (inclusive).\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Linear interpolation between a and b by factor t (0–1).\n */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Maps a value from one numeric range to another.\n */\nexport function mapRange(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n if (inMax === inMin) return outMin;\n return ((value - inMin) / (inMax - inMin)) * (outMax - outMin) + outMin;\n}\n\n/**\n * Rounds a number to the given decimal precision.\n */\nexport function roundToPrecision(value: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n}\n\n/**\n * Returns the nice \"round\" step interval for an axis given a pixel range and bar count.\n * E.g. for ~6 gridlines across 500px, returns the nearest clean tick like 0.5, 1, 2.5, 5, 10…\n */\nexport function niceNumber(range: number, round: boolean): number {\n const exponent = Math.floor(Math.log10(range));\n const fraction = range / Math.pow(10, exponent);\n let niceFraction: number;\n if (round) {\n if (fraction < 1.5) niceFraction = 1;\n else if (fraction < 3) niceFraction = 2;\n else if (fraction < 7) niceFraction = 5;\n else niceFraction = 10;\n } else {\n if (fraction <= 1) niceFraction = 1;\n else if (fraction <= 2) niceFraction = 2;\n else if (fraction <= 5) niceFraction = 5;\n else niceFraction = 10;\n }\n return niceFraction * Math.pow(10, exponent);\n}\n\n/**\n * Computes evenly distributed tick values covering [min, max] with approx targetCount ticks.\n */\nexport function computeTicks(min: number, max: number, targetCount: number): number[] {\n const range = niceNumber(max - min, false);\n const step = niceNumber(range / (targetCount - 1), true);\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n for (let t = start; t <= end + step * 0.5; t = roundToPrecision(t + step, 10)) {\n ticks.push(t);\n }\n return ticks;\n}\n","import type { Timeframe } from '@forgecharts/types';\n\n/** Seconds per timeframe */\nexport const TIMEFRAME_SECONDS: Record<Timeframe, number> = {\n '1m': 60,\n '3m': 180,\n '5m': 300,\n '15m': 900,\n '30m': 1800,\n '1h': 3600,\n '2h': 7200,\n '4h': 14400,\n '6h': 21600,\n '12h': 43200,\n '1d': 86400,\n '3d': 259200,\n '1w': 604800,\n '1M': 2592000,\n};\n\nexport function timeframeToSeconds(tf: Timeframe): number {\n // TIMEFRAME_SECONDS is keyed on the full Timeframe union, so tf always has a value\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return TIMEFRAME_SECONDS[tf]!;\n}\n\n/** Returns true if the timeframe is intraday (< 1 day). */\nexport function isIntradayTimeframe(tf: Timeframe): boolean {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return TIMEFRAME_SECONDS[tf]! < 86400;\n}\n\n/**\n * Formats a Unix timestamp (seconds) as a human-readable axis label.\n * Label granularity adapts to the tick step size, matching TradingView style:\n * - Sub-hour steps → \"09:30\"\n * - Hourly steps → \"09:30\"; midnight shows \"Jan 5\"\n * - Daily steps → \"Jan 5\"; first week of January shows \"2018\"\n * - Monthly steps → \"Jul\"; January shows \"2018\"\n * - 5-month+ steps → \"Jul\"; January shows \"2018\"\n *\n * @param ts Unix timestamp in seconds\n * @param stepSeconds Tick step in seconds (controls label granularity)\n * @param tz IANA timezone string (defaults to UTC)\n */\nexport function formatTimestampLabel(ts: number, stepSeconds: number, tz?: string): string {\n const timeZone: string = (!tz || tz === 'exchange') ? 'UTC' : tz;\n const d = new Date(ts * 1000);\n\n // Sub-hour ticks → \"HH:MM\"\n if (stepSeconds < 3600) {\n return new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23', hour: '2-digit', minute: '2-digit', timeZone,\n }).format(d);\n }\n\n // Hourly ticks → \"HH:MM\"; at midnight show \"Jan 5\"\n if (stepSeconds < 86400) {\n const hFmt = new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23', hour: '2-digit', minute: '2-digit', timeZone,\n });\n const parts = hFmt.formatToParts(d);\n const h = parseInt(parts.find((p) => p.type === 'hour')?.value ?? '1', 10);\n const m = parseInt(parts.find((p) => p.type === 'minute')?.value ?? '0', 10);\n if (h === 0 && m === 0) {\n return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', timeZone }).format(d);\n }\n return hFmt.format(d);\n }\n\n // Daily+ ticks: choose between year, month abbreviation, or \"Jan 5\"\n const month = parseInt(\n new Intl.DateTimeFormat('en-US', { month: 'numeric', timeZone }).format(d), 10,\n ); // 1-indexed\n const yearStr = new Intl.DateTimeFormat('en-US', { year: 'numeric', timeZone }).format(d);\n const monthStr = new Intl.DateTimeFormat('en-US', { month: 'short', timeZone }).format(d);\n\n // Multi-month steps (≥ ~5 months) or monthly steps → \"Jul\"; January → \"2018\"\n if (stepSeconds >= 25 * 86400) {\n return month === 1 ? yearStr : monthStr;\n }\n\n // Weekly/daily steps → \"Jan 5\"; first week of January → \"2018\"\n const dayNum = parseInt(\n new Intl.DateTimeFormat('en-US', { day: 'numeric', timeZone }).format(d), 10,\n );\n if (month === 1 && dayNum <= 7) {\n return yearStr;\n }\n return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', timeZone }).format(d);\n}\n\n/**\n * Aligns a timestamp to the start of the nearest bar for a given timeframe.\n */\nexport function alignToTimeframe(ts: number, tf: Timeframe): number {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const secs = TIMEFRAME_SECONDS[tf]!;\n return Math.floor(ts / secs) * secs;\n}\n","/**\n * Converts a hex color string to an rgba() CSS string.\n * @param hex 6-digit hex color, e.g. \"#1a2b3c\"\n * @param alpha Opacity 0–1\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const clean = hex.replace('#', '');\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/**\n * Blends two hex colors by a factor t (0 = colorA, 1 = colorB).\n */\nexport function blendColors(colorA: string, colorB: string, t: number): string {\n const parse = (h: string): [number, number, number] => {\n const c = h.replace('#', '');\n return [parseInt(c.slice(0, 2), 16), parseInt(c.slice(2, 4), 16), parseInt(c.slice(4, 6), 16)];\n };\n const [r1, g1, b1] = parse(colorA);\n const [r2, g2, b2] = parse(colorB);\n const r = Math.round(r1 + (r2 - r1) * t);\n const g = Math.round(g1 + (g2 - g1) * t);\n const b = Math.round(b1 + (b2 - b1) * t);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/** Validates that a string is a recognisable CSS color. */\nexport function isValidColor(color: string): boolean {\n const s = new Option().style;\n s.color = color;\n return s.color !== '';\n}\n","import type { TimeRange, ChartColors, TimeScaleOptions, Timeframe } from '@forgecharts/types';\nimport { mapRange, computeTicks } from '@forgecharts/utils';\nimport { formatTimestampLabel } from '@forgecharts/utils';\nimport type { CanvasLayer } from './CanvasLayer';\n\nconst AXIS_HEIGHT = 30;\n\n/**\n * TimeScale — manages the horizontal time axis.\n * Handles pan/zoom of the visible time range and renders tick labels.\n */\nexport class TimeScale {\n private _visibleRange: TimeRange;\n private readonly _layer: CanvasLayer;\n private readonly _colors: ChartColors;\n private readonly _options: Required<TimeScaleOptions>;\n private _activeTimeframe: Timeframe = '1h';\n /** IANA timezone for axis labels. Falls back to UTC when unset. */\n timezone: string | undefined = undefined;\n\n constructor(layer: CanvasLayer, colors: ChartColors, options: TimeScaleOptions = {}) {\n this._layer = layer;\n this._colors = colors;\n this._options = {\n timeVisible: options.timeVisible ?? true,\n secondsVisible: options.secondsVisible ?? false,\n borderVisible: options.borderVisible ?? true,\n ticksVisible: options.ticksVisible ?? true,\n height: options.height ?? AXIS_HEIGHT,\n };\n\n const now = Math.floor(Date.now() / 1000);\n this._visibleRange = { from: now - 86400, to: now };\n }\n\n get visibleRange(): TimeRange {\n return this._visibleRange;\n }\n\n get height(): number {\n return this._options.height;\n }\n\n get activeTimeframe(): Timeframe {\n return this._activeTimeframe;\n }\n\n setVisibleRange(range: TimeRange): void {\n this._visibleRange = range;\n }\n\n setTimeframe(tf: Timeframe): void {\n this._activeTimeframe = tf;\n }\n\n /**\n * Converts a Unix timestamp to a canvas X coordinate.\n */\n timeToX(time: number, canvasWidth: number): number {\n const plotWidth = canvasWidth - this._priceScaleWidth();\n return mapRange(time, this._visibleRange.from, this._visibleRange.to, 0, plotWidth);\n }\n\n /**\n * Converts a canvas X coordinate back to a Unix timestamp.\n */\n xToTime(x: number, canvasWidth: number): number {\n const plotWidth = canvasWidth - this._priceScaleWidth();\n return mapRange(x, 0, plotWidth, this._visibleRange.from, this._visibleRange.to);\n }\n\n /**\n * Zooms around a pivot X coordinate by a scale factor.\n */\n zoom(factor: number, pivotX: number, canvasWidth: number = this._layer.width): void {\n const pivotTime = this.xToTime(pivotX, canvasWidth);\n const span = this._visibleRange.to - this._visibleRange.from;\n const newSpan = Math.max(60, span * factor);\n const ratio = (pivotTime - this._visibleRange.from) / span;\n const newFrom = pivotTime - ratio * newSpan;\n this._visibleRange = { from: newFrom, to: newFrom + newSpan };\n }\n\n /**\n * Scrolls by a delta in seconds.\n */\n scroll(deltaSeconds: number): void {\n this._visibleRange = {\n from: this._visibleRange.from + deltaSeconds,\n to: this._visibleRange.to + deltaSeconds,\n };\n }\n\n render(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (!this._options.ticksVisible) return;\n\n const axisY = height - this._options.height;\n const plotWidth = width - this._priceScaleWidth();\n\n // Axis separator line\n if (this._options.borderVisible) {\n ctx.beginPath();\n ctx.strokeStyle = this._colors.border;\n ctx.lineWidth = 1;\n ctx.moveTo(0, axisY);\n ctx.lineTo(plotWidth, axisY);\n ctx.stroke();\n }\n\n // Compute tick spacing — aim for a tick every ~100px\n const approxTicks = Math.max(2, Math.floor(plotWidth / 100));\n const span = this._visibleRange.to - this._visibleRange.from;\n const rawStep = span / approxTicks;\n const step = this._niceTimeStep(rawStep);\n\n const startTime = Math.ceil(this._visibleRange.from / step) * step;\n\n ctx.fillStyle = this._colors.text;\n ctx.font = '11px system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n for (let t = startTime; t <= this._visibleRange.to; t += step) {\n const x = this.timeToX(t, width);\n if (x < 0 || x > plotWidth) continue;\n\n // Tick mark\n ctx.beginPath();\n ctx.strokeStyle = this._colors.border;\n ctx.lineWidth = 1;\n ctx.moveTo(x, axisY);\n ctx.lineTo(x, axisY + 4);\n ctx.stroke();\n\n // Grid line\n ctx.beginPath();\n ctx.strokeStyle = this._colors.grid;\n ctx.setLineDash([1, 3]);\n ctx.moveTo(x, 0);\n ctx.lineTo(x, axisY);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Label\n const label = formatTimestampLabel(t, step, this.timezone);\n ctx.fillText(label, x, axisY + this._options.height / 2);\n }\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n private _priceScaleWidth(): number {\n return 70; // reserved for price scale — keep in sync with PriceScale\n }\n\n private _niceTimeStep(rawSeconds: number): number {\n const nice = [\n 1, 5, 10, 30, 60, 300, 600, 900, 1800, 3600, 7200, 14400, 21600, 43200,\n 86400, // 1 day\n 7 * 86400, // 1 week\n 14 * 86400, // 2 weeks\n 30 * 86400, // ~1 month\n 91 * 86400, // ~quarter\n 182 * 86400, // ~half year\n 365 * 86400, // ~1 year\n ];\n for (const s of nice) {\n if (s >= rawSeconds) return s;\n }\n return 365 * 86400 * Math.ceil(rawSeconds / (365 * 86400));\n }\n}\n\n// Re-export computeTicks so renderers can use it without an extra import\nexport { computeTicks };\n","import type { PriceRange, ChartColors, PriceScaleOptions } from '@forgecharts/types';\nimport { mapRange, computeTicks, roundToPrecision } from '@forgecharts/utils';\nimport type { CanvasLayer } from './CanvasLayer';\n\nconst AXIS_WIDTH = 70;\nconst TIME_SCALE_HEIGHT = 30;\n\n/**\n * PriceScale — manages the vertical price axis.\n * Auto-scales to the visible data range and renders price labels.\n */\nexport class PriceScale {\n private _visibleRange: PriceRange;\n private readonly _layer: CanvasLayer;\n private readonly _colors: ChartColors;\n private readonly _options: Required<PriceScaleOptions>;\n\n constructor(layer: CanvasLayer, colors: ChartColors, options: PriceScaleOptions = {}) {\n this._layer = layer;\n this._colors = colors;\n this._options = {\n autoScale: options.autoScale ?? true,\n invertScale: options.invertScale ?? false,\n borderVisible: options.borderVisible ?? true,\n ticksVisible: options.ticksVisible ?? true,\n mode: options.mode ?? 'normal',\n width: options.width ?? AXIS_WIDTH,\n };\n this._visibleRange = { min: 0, max: 100 };\n }\n\n get visibleRange(): PriceRange {\n return this._visibleRange;\n }\n\n get width(): number {\n return this._options.width;\n }\n\n setVisibleRange(range: PriceRange): void {\n this._visibleRange = range;\n }\n\n /**\n * Converts a price value to a canvas Y coordinate.\n */\n priceToY(price: number, canvasHeight: number): number {\n const plotHeight = canvasHeight - TIME_SCALE_HEIGHT;\n const { min, max } = this._visibleRange;\n\n if (this._options.mode === 'logarithmic') {\n const logMin = Math.log(Math.max(min, 1e-10));\n const logMax = Math.log(Math.max(max, 1e-10));\n const logPrice = Math.log(Math.max(price, 1e-10));\n return mapRange(logPrice, logMax, logMin, 0, plotHeight);\n }\n\n return this._options.invertScale\n ? mapRange(price, max, min, 0, plotHeight)\n : mapRange(price, max, min, 0, plotHeight);\n }\n\n /**\n * Converts a canvas Y coordinate back to a price value.\n */\n yToPrice(y: number, canvasHeight: number): number {\n const plotHeight = canvasHeight - TIME_SCALE_HEIGHT;\n const { min, max } = this._visibleRange;\n return mapRange(y, 0, plotHeight, max, min);\n }\n\n render(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (!this._options.ticksVisible) return;\n\n const axisX = width - this._options.width;\n const plotHeight = height - TIME_SCALE_HEIGHT;\n\n // Axis separator\n if (this._options.borderVisible) {\n ctx.beginPath();\n ctx.strokeStyle = this._colors.border;\n ctx.lineWidth = 1;\n ctx.moveTo(axisX, 0);\n ctx.lineTo(axisX, plotHeight);\n ctx.stroke();\n }\n\n // Compute ticks\n const approxTicks = Math.max(2, Math.floor(plotHeight / 50));\n const ticks = computeTicks(this._visibleRange.min, this._visibleRange.max, approxTicks);\n\n ctx.fillStyle = this._colors.text;\n ctx.font = '11px system-ui, sans-serif';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n for (const tick of ticks) {\n if (tick < this._visibleRange.min || tick > this._visibleRange.max) continue;\n\n const y = this.priceToY(tick, height);\n if (y < 0 || y > plotHeight) continue;\n\n // Grid line\n ctx.beginPath();\n ctx.strokeStyle = this._colors.grid;\n ctx.setLineDash([1, 3]);\n ctx.moveTo(0, y);\n ctx.lineTo(axisX, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Tick mark\n ctx.beginPath();\n ctx.strokeStyle = this._colors.border;\n ctx.lineWidth = 1;\n ctx.moveTo(axisX, y);\n ctx.lineTo(axisX + 4, y);\n ctx.stroke();\n\n // Label\n const label = this._formatPrice(tick);\n ctx.fillText(label, axisX + 6, y);\n }\n }\n\n // ─── Private ─────────────────────────────────────────────────────────────────\n\n private _formatPrice(price: number): string {\n const range = this._visibleRange.max - this._visibleRange.min;\n const precision = range < 0.01 ? 6 : range < 1 ? 4 : range < 100 ? 2 : 0;\n return roundToPrecision(price, precision).toFixed(precision);\n }\n}\n","import type { TimeRange, PriceRange, Point, DrawingPoint } from '@forgecharts/types';\nimport type { TimeScale } from './TimeScale';\nimport type { PriceScale } from './PriceScale';\n\n/**\n * Immutable snapshot of the plot area geometry (excluding axes).\n * All coordinates are in logical canvas pixels (pre-DPR).\n */\nexport type PlotArea = {\n /** Left edge — always 0. */\n readonly left: number;\n /** Top edge — always 0. */\n readonly top: number;\n /** Right edge = canvasWidth − priceScaleWidth. */\n readonly right: number;\n /** Bottom edge = canvasHeight − timeScaleHeight. */\n readonly bottom: number;\n /** Drawable width (canvasWidth − priceScaleWidth). */\n readonly width: number;\n /** Drawable height (canvasHeight − timeScaleHeight). */\n readonly height: number;\n};\n\n/**\n * CoordTransform — the single source of truth for all coordinate conversions.\n *\n * Converts between chart data-space coordinates (Unix timestamp in seconds,\n * price) and canvas pixel coordinates (x, y). Every chart subsystem that\n * needs coordinate maths — the Crosshair, series renderers, drawing tools,\n * plugins — should use this class rather than reading scale internals directly.\n *\n * A `CoordTransform` instance is owned by `Chart` and can be retrieved via\n * `chart.transform()`. It is kept up-to-date with every resize; callers\n * hold a stable reference and always see current values.\n *\n * @example\n * ```ts\n * const t = chart.transform();\n *\n * // Data → pixel\n * const x = t.timeToX(bar.time);\n * const y = t.priceToY(bar.close);\n * const { x, y } = t.toPixel(bar.time, bar.close);\n *\n * // Pixel → data (e.g. read pointer position)\n * const { time, price } = t.fromPixel(event.offsetX, event.offsetY);\n *\n * // Zoom on wheel\n * t.zoomTime(0.9, event.offsetX); // zoom in\n *\n * // Pan on drag\n * t.pan(dx, dy);\n * ```\n */\nexport class CoordTransform {\n private _canvasWidth = 0;\n private _canvasHeight = 0;\n\n private readonly _timeScale: TimeScale;\n private readonly _priceScale: PriceScale;\n\n /** Width of the right-side price axis in logical pixels. */\n readonly priceScaleWidth: number;\n\n /** Height of the bottom time axis in logical pixels. */\n readonly timeScaleHeight: number;\n\n constructor(\n timeScale: TimeScale,\n priceScale: PriceScale,\n priceScaleWidth: number,\n timeScaleHeight: number,\n ) {\n this._timeScale = timeScale;\n this._priceScale = priceScale;\n this.priceScaleWidth = priceScaleWidth;\n this.timeScaleHeight = timeScaleHeight;\n }\n\n // ─── Canvas update ────────────────────────────────────────────────────────\n\n /**\n * Stores the current canvas size.\n * **Must be called** by `Chart` once at construction and after every resize.\n */\n update(canvasWidth: number, canvasHeight: number): void {\n this._canvasWidth = canvasWidth;\n this._canvasHeight = canvasHeight;\n }\n\n // ─── Plot area geometry ───────────────────────────────────────────────────\n\n /**\n * The drawable region excluding both axes.\n * Use this to clip drawing operations or check mouse bounds.\n */\n get plotArea(): PlotArea {\n const w = this._canvasWidth - this.priceScaleWidth;\n const h = this._canvasHeight - this.timeScaleHeight;\n return { left: 0, top: 0, right: w, bottom: h, width: w, height: h };\n }\n\n /** Full logical canvas width (plot area + price axis). */\n get canvasWidth(): number {\n return this._canvasWidth;\n }\n\n /** Full logical canvas height (plot area + time axis). */\n get canvasHeight(): number {\n return this._canvasHeight;\n }\n\n /** Drawable width (canvas width minus the price axis). */\n get plotWidth(): number {\n return this._canvasWidth - this.priceScaleWidth;\n }\n\n /** Drawable height (canvas height minus the time axis). */\n get plotHeight(): number {\n return this._canvasHeight - this.timeScaleHeight;\n }\n\n // ─── Time axis ────────────────────────────────────────────────────────────\n\n /**\n * Maps a Unix timestamp (seconds) to a canvas X pixel.\n *\n * Returns a value in `[0, plotWidth]` for visible times; may be negative\n * or exceed `plotWidth` for off-screen bars — useful for clipping checks.\n */\n timeToX(time: number): number {\n return this._timeScale.timeToX(time, this._canvasWidth);\n }\n\n /**\n * Maps a canvas X pixel coordinate back to a Unix timestamp (seconds).\n */\n xToTime(x: number): number {\n return this._timeScale.xToTime(x, this._canvasWidth);\n }\n\n // ─── Price axis ───────────────────────────────────────────────────────────\n\n /**\n * Maps a price value to a canvas Y pixel.\n *\n * Y = 0 is the top of the canvas. Higher prices map to smaller Y values\n * in normal (non-inverted) scale mode.\n */\n priceToY(price: number): number {\n return this._priceScale.priceToY(price, this._canvasHeight);\n }\n\n /**\n * Maps a canvas Y pixel coordinate back to a price value.\n */\n yToPrice(y: number): number {\n return this._priceScale.yToPrice(y, this._canvasHeight);\n }\n\n // ─── Combined helpers ─────────────────────────────────────────────────────\n\n /**\n * Converts a data-space point to a canvas pixel.\n *\n * @example\n * ```ts\n * const { x, y } = transform.toPixel(bar.time, bar.high);\n * ctx.arc(x, y, 3, 0, Math.PI * 2);\n * ```\n */\n toPixel(time: number, price: number): Point {\n return { x: this.timeToX(time), y: this.priceToY(price) };\n }\n\n /**\n * Converts a canvas pixel to a data-space point (time, price).\n *\n * Returned `time` is in Unix seconds; `price` is in the same units as the\n * price scale (e.g. USD for BTCUSDT charts).\n *\n * @example\n * ```ts\n * canvas.addEventListener('click', e => {\n * const { time, price } = transform.fromPixel(e.offsetX, e.offsetY);\n * });\n * ```\n */\n fromPixel(x: number, y: number): DrawingPoint {\n return { time: this.xToTime(x), price: this.yToPrice(y) };\n }\n\n /**\n * Returns `true` when pixel `(x, y)` falls inside the plot area —\n * i.e. not over the axis gutter regions.\n */\n inPlotArea(x: number, y: number): boolean {\n return x >= 0 && x <= this.plotWidth && y >= 0 && y <= this.plotHeight;\n }\n\n // ─── Zoom ─────────────────────────────────────────────────────────────────\n\n /**\n * Zooms the time axis around a canvas-space pivot X pixel.\n *\n * @param factor Multiplier applied to the visible time span.\n * `< 1` = zoom in (fewer bars visible),\n * `> 1` = zoom out (more bars visible).\n * @param pivotX Canvas X pixel that remains fixed during the zoom.\n * Pass `event.offsetX` from a wheel event.\n */\n zoomTime(factor: number, pivotX: number): void {\n this._timeScale.zoom(factor, pivotX, this._canvasWidth);\n }\n\n /**\n * Zooms the price axis around a canvas-space pivot Y pixel.\n *\n * @param factor Multiplier for the visible price span.\n * `> 1` = zoom out (wider range), `< 1` = zoom in (narrower range).\n * @param pivotY Canvas Y pixel that stays fixed during the zoom.\n */\n zoomPrice(factor: number, pivotY: number): void {\n const pivotPrice = this.yToPrice(pivotY);\n const { min, max } = this._priceScale.visibleRange;\n const span = max - min;\n const newSpan = span * factor;\n // Keep the pivot price anchored at the same Y position\n const ratio = (pivotPrice - min) / span;\n const newMin = pivotPrice - ratio * newSpan;\n this._priceScale.setVisibleRange({ min: newMin, max: newMin + newSpan });\n }\n\n // ─── Pan ──────────────────────────────────────────────────────────────────\n\n /**\n * Pans the chart by a pixel delta — typically called from a drag handler.\n *\n * - `deltaX > 0` (right drag) shifts the visible time range backward\n * (revealing older bars).\n * - `deltaX < 0` (left drag) shifts forward (revealing newer bars).\n * - `deltaY > 0` (down drag) shifts the visible price range downward.\n * - `deltaY < 0` (up drag) shifts the price range upward.\n *\n * @param deltaX Horizontal pixel displacement since last event.\n * @param deltaY Vertical pixel displacement since last event.\n */\n pan(deltaX: number, deltaY: number): void {\n // ── Time axis ────────────────────────────────────────────────────────────\n if (deltaX !== 0 && this._canvasWidth > 0) {\n const { from, to } = this._timeScale.visibleRange;\n const timeSpan = to - from;\n // Right drag (deltaX > 0) → move range backward → negate\n const deltaSeconds = (deltaX / this.plotWidth) * timeSpan;\n this._timeScale.scroll(-deltaSeconds);\n }\n\n // ── Price axis ────────────────────────────────────────────────────────────\n if (deltaY !== 0 && this._canvasHeight > 0) {\n const { min, max } = this._priceScale.visibleRange;\n const priceSpan = max - min;\n // Down drag (deltaY > 0) → chart content moves down → reveal higher prices → add\n const deltaPrice = (deltaY / this.plotHeight) * priceSpan;\n this._priceScale.setVisibleRange({\n min: min + deltaPrice,\n max: max + deltaPrice,\n });\n }\n }\n\n // ─── Range accessors ──────────────────────────────────────────────────────\n\n /** The currently visible time range (Unix seconds). */\n get timeRange(): TimeRange {\n return this._timeScale.visibleRange;\n }\n\n /** The currently visible price range. */\n get priceRange(): PriceRange {\n return this._priceScale.visibleRange;\n }\n}\n","import type { ChartColors, ChartOptions, CrosshairOptions } from '@forgecharts/types';\nimport type { CanvasLayer } from './CanvasLayer';\nimport type { CoordTransform } from './CoordTransform';\nimport { hexToRgba } from '@forgecharts/utils';\n\n/**\n * Crosshair — renders the interactive cross-line overlay and price/time labels.\n */\nexport class Crosshair {\n private _x: number | null = null;\n private _snapTime: number | null = null;\n private _y: number | null = null;\n private readonly _layer: CanvasLayer;\n private readonly _colors: ChartColors;\n private readonly _options: Required<CrosshairOptions>;\n private readonly _transform: CoordTransform;\n /** IANA timezone for the time label on the crosshair. Falls back to UTC. */\n timezone: string | undefined = undefined;\n /** Active timeframe — controls whether time is shown alongside the date. */\n interval: string = '1h';\n\n constructor(\n layer: CanvasLayer,\n colors: ChartColors,\n chartOptions: ChartOptions,\n transform: CoordTransform,\n ) {\n this._layer = layer;\n this._colors = colors;\n this._transform = transform;\n const co = chartOptions.crosshair as CrosshairOptions | undefined;\n this._options = {\n mode: co?.mode ?? 'normal',\n vertLine: {\n ...(co?.vertLine?.color !== undefined ? { color: co.vertLine.color } : {}),\n width: co?.vertLine?.width ?? 1,\n style: co?.vertLine?.style ?? 'dashed',\n visible: co?.vertLine?.visible ?? true,\n labelVisible: co?.vertLine?.labelVisible ?? true,\n },\n horzLine: {\n ...(co?.horzLine?.color !== undefined ? { color: co.horzLine.color } : {}),\n width: co?.horzLine?.width ?? 1,\n style: co?.horzLine?.style ?? 'dashed',\n visible: co?.horzLine?.visible ?? true,\n labelVisible: co?.horzLine?.labelVisible ?? true,\n },\n };\n }\n\n update(x: number, y: number, snapTime?: number): void {\n this._x = x;\n this._y = y;\n this._snapTime = snapTime ?? null;\n }\n\n hide(): void {\n this._x = null;\n this._y = null;\n this._snapTime = null;\n }\n\n destroy(): void {\n this.hide();\n }\n\n render(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (this._x === null || this._y === null) return;\n if (this._options.mode === 'hidden') return;\n\n const { x, y } = { x: this._x, y: this._y };\n const priceScaleWidth = this._transform.priceScaleWidth;\n const timeScaleHeight = this._transform.timeScaleHeight;\n const plotWidth = this._transform.plotWidth;\n const plotHeight = this._transform.plotHeight;\n\n // Suppress unused-variable warnings — width/height kept for API compatibility\n void width;\n void height;\n\n ctx.save();\n\n // Vertical line\n if (this._options.vertLine.visible === true && x >= 0 && x <= plotWidth) {\n const vl = this._options.vertLine;\n ctx.beginPath();\n ctx.strokeStyle = vl.color ?? this._colors.crosshair;\n ctx.lineWidth = vl.width ?? 1;\n this._applyLineStyle(ctx, vl.style ?? 'dashed');\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotHeight);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Horizontal line\n if (this._options.horzLine.visible === true && y >= 0 && y <= plotHeight) {\n const hl = this._options.horzLine;\n ctx.beginPath();\n ctx.strokeStyle = hl.color ?? this._colors.crosshair;\n ctx.lineWidth = hl.width ?? 1;\n this._applyLineStyle(ctx, hl.style ?? 'dashed');\n ctx.moveTo(0, y);\n ctx.lineTo(plotWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Price label on right axis\n if (this._options.horzLine.labelVisible === true) {\n const price = this._transform.yToPrice(y);\n const label = this._formatPrice(price);\n const labelBg = hexToRgba(this._colors.crosshair, 0.9);\n ctx.fillStyle = labelBg;\n const labelW = priceScaleWidth;\n const labelH = 18;\n const labelY = y - labelH / 2;\n ctx.fillRect(plotWidth, labelY, labelW, labelH);\n ctx.fillStyle = this._colors.background;\n ctx.font = '11px system-ui, sans-serif';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, plotWidth + 6, y);\n }\n }\n\n // Center crosshair indicator — 4 short arms with a gap, matching the toolbar icon\n if (\n this._options.vertLine.visible === true &&\n this._options.horzLine.visible === true &&\n x >= 0 && x <= plotWidth &&\n y >= 0 && y <= plotHeight\n ) {\n const GAP = 4; // half-gap from center\n const ARM = 8; // arm length (tip to gap)\n ctx.beginPath();\n ctx.strokeStyle = this._colors.crosshair;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([]);\n // top arm\n ctx.moveTo(x, y - GAP); ctx.lineTo(x, y - GAP - ARM);\n // bottom arm\n ctx.moveTo(x, y + GAP); ctx.lineTo(x, y + GAP + ARM);\n // left arm\n ctx.moveTo(x - GAP, y); ctx.lineTo(x - GAP - ARM, y);\n // right arm\n ctx.moveTo(x + GAP, y); ctx.lineTo(x + GAP + ARM, y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Time label on bottom axis (below vertical line)\n if (\n this._options.vertLine.visible === true &&\n this._options.vertLine.labelVisible === true &&\n x >= 0 && x <= plotWidth\n ) {\n const time = this._snapTime ?? this._transform.xToTime(x);\n const label = this._formatTime(time);\n const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);\n const labelW = dailyIntervals.has(this.interval) ? 110 : 160;\n const labelH = timeScaleHeight - 4;\n const labelX = Math.max(labelW / 2, Math.min(x, plotWidth - labelW / 2));\n const labelBg = hexToRgba(this._colors.crosshair, 0.9);\n ctx.fillStyle = labelBg;\n ctx.fillRect(labelX - labelW / 2, plotHeight + 2, labelW, labelH);\n ctx.fillStyle = this._colors.background;\n ctx.font = '11px system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, labelX, plotHeight + 2 + labelH / 2);\n }\n\n ctx.restore();\n }\n\n private _applyLineStyle(ctx: CanvasRenderingContext2D, style: string): void {\n if (style === 'dashed') ctx.setLineDash([4, 4]);\n else if (style === 'dotted') ctx.setLineDash([1, 3]);\n else ctx.setLineDash([]);\n }\n\n /** Formats a price as a fixed-decimal string. */\n private _formatPrice(price: number): string {\n // Show more decimals for low-value instruments (e.g. forex, small-cap)\n const decimals = price < 1 ? 6 : price < 1000 ? 4 : 2;\n return price.toFixed(decimals);\n }\n\n /** Formats a Unix timestamp (seconds) as a human-readable date/time string. */\n private _formatTime(time: number): string {\n const timeZone: string = (!this.timezone || this.timezone === 'exchange') ? 'UTC' : this.timezone;\n const d = new Date(time * 1000);\n const weekday = d.toLocaleDateString('en-US', { weekday: 'short', timeZone });\n const day = d.toLocaleDateString('en-US', { day: '2-digit', timeZone });\n const month = d.toLocaleDateString('en-US', { month: 'short', timeZone });\n const year = d.toLocaleDateString('en-US', { year: '2-digit', timeZone });\n const datePart = `${weekday} ${day} ${month} '${year}`;\n\n // Show time only for sub-day intervals\n const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);\n if (dailyIntervals.has(this.interval)) return datePart;\n\n const hh = d.toLocaleString('en-US', { hour: '2-digit', hour12: false, timeZone });\n const mm = d.toLocaleString('en-US', { minute: '2-digit', timeZone }).padStart(2, '0');\n return `${datePart} ${hh}:${mm}`;\n }\n}\n","import type { OHLCV, SeriesOptions, Viewport, Rect, ChartColors } from '@forgecharts/types';\nimport type { IRenderer } from '../types/IRenderer';\nimport { mapRange } from '@forgecharts/utils';\n\n/**\n * CandlestickRenderer — draws OHLCV data as Japanese candlesticks.\n * All rendering is pure Canvas 2D; no third-party dependencies.\n */\nexport class CandlestickRenderer implements IRenderer {\n private readonly _colors: ChartColors;\n\n constructor(colors: ChartColors) {\n this._colors = colors;\n }\n\n draw(\n ctx: CanvasRenderingContext2D,\n bars: readonly OHLCV[],\n viewport: Viewport,\n rect: Rect,\n options: SeriesOptions,\n ): void {\n if (options.type !== 'candlestick' && options.type !== 'heikinashi' && options.type !== 'bar') {\n return;\n }\n const plotData = options.type === 'heikinashi' ? this._toHeikinAshi(bars) : bars;\n\n const upColor = 'upColor' in options ? (options.upColor ?? '#26a641') : '#26a641';\n const downColor = 'downColor' in options ? (options.downColor ?? '#f85149') : '#f85149';\n const wickUpColor = 'wickUpColor' in options ? (options.wickUpColor ?? upColor) : upColor;\n const wickDownColor =\n 'wickDownColor' in options ? (options.wickDownColor ?? downColor) : downColor;\n const borderVisible = 'borderVisible' in options ? (options.borderVisible ?? false) : false;\n\n const plotW = rect.width - 70; // price axis reserved\n const plotH = rect.height - 30; // time axis reserved\n\n // ── Bar pitch: pixels per candle ─────────────────────────────────────────\n // IMPORTANT: must be derived from the visible time range + candle interval,\n // NOT from total bar count. Using bar count means pitch shrinks as you pan\n // into history (more bars → narrower candles) and widens as you pan forward\n // (fewer bars visible → wider candles with gaps), which is wrong.\n\n // Infer candle interval from the median gap between consecutive bars.\n let candleInterval = 0;\n if (plotData.length >= 2) {\n const deltas: number[] = [];\n for (let i = 1; i < Math.min(plotData.length, 20); i++) {\n const d = plotData[i]!.time - plotData[i - 1]!.time;\n if (d > 0) deltas.push(d);\n }\n if (deltas.length > 0) {\n deltas.sort((a, b) => a - b);\n candleInterval = deltas[Math.floor(deltas.length / 2)]!;\n }\n }\n\n const visibleSpan = viewport.timeRange.to - viewport.timeRange.from;\n const pixelsPerSecond = visibleSpan > 0 ? plotW / visibleSpan : 1;\n const barPitch = candleInterval > 0\n ? candleInterval * pixelsPerSecond // correct: interval-based\n : plotW / Math.max(1, plotData.length); // fallback for edge cases\n\n const minBarWidth = 1;\n const maxBarWidth = 20;\n const gap = Math.max(1, Math.round(barPitch * 0.15));\n const barWidth = Math.min(\n maxBarWidth,\n Math.max(minBarWidth, Math.floor(barPitch) - gap),\n );\n const halfBar = Math.max(0.5, barWidth / 2);\n\n for (const bar of plotData) {\n const x = mapRange(\n bar.time,\n viewport.timeRange.from,\n viewport.timeRange.to,\n 0,\n plotW,\n );\n\n if (x < -barWidth || x > plotW + barWidth) continue;\n\n const yOpen = mapRange(bar.open, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);\n const yClose = mapRange(bar.close, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);\n const yHigh = mapRange(bar.high, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);\n const yLow = mapRange(bar.low, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);\n\n const bullish = bar.close >= bar.open;\n const bodyColor = bullish ? upColor : downColor;\n const bodyTop = Math.min(yOpen, yClose);\n const bodyBottom = Math.max(yOpen, yClose);\n const bodyH = Math.max(1, bodyBottom - bodyTop);\n\n // Wick\n ctx.beginPath();\n ctx.strokeStyle = bullish ? wickUpColor : wickDownColor;\n ctx.lineWidth = 1;\n ctx.moveTo(x, yHigh);\n ctx.lineTo(x, bodyTop);\n ctx.moveTo(x, bodyBottom);\n ctx.lineTo(x, yLow);\n ctx.stroke();\n\n // Body\n ctx.fillStyle = bodyColor;\n ctx.fillRect(x - halfBar, bodyTop, barWidth, bodyH);\n\n if (borderVisible) {\n ctx.strokeStyle = bodyColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x - halfBar, bodyTop, barWidth, bodyH);\n }\n }\n }\n\n private _toHeikinAshi(bars: readonly OHLCV[]): OHLCV[] {\n const result: OHLCV[] = [];\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i]!;\n const prev = result[i - 1] ?? bar;\n const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;\n const haOpen = (prev.open + prev.close) / 2;\n const haHigh = Math.max(bar.high, haOpen, haClose);\n const haLow = Math.min(bar.low, haOpen, haClose);\n result.push({ time: bar.time, open: haOpen, high: haHigh, low: haLow, close: haClose, volume: bar.volume });\n }\n return result;\n }\n}\n","import type { OHLCV, SeriesOptions, Viewport, Rect, ChartColors } from '@forgecharts/types';\nimport type { IRenderer } from '../types/IRenderer';\nimport { mapRange } from '@forgecharts/utils';\nimport { hexToRgba } from '@forgecharts/utils';\n\n/**\n * LineRenderer — draws close prices as a line or area series.\n */\nexport class LineRenderer implements IRenderer {\n private readonly _colors: ChartColors;\n\n constructor(colors: ChartColors) {\n this._colors = colors;\n }\n\n draw(\n ctx: CanvasRenderingContext2D,\n bars: readonly OHLCV[],\n viewport: Viewport,\n rect: Rect,\n options: SeriesOptions,\n ): void {\n if (options.type !== 'line' && options.type !== 'area') return;\n if (bars.length < 2) return;\n\n const color = options.color ?? '#58a6ff';\n const lineWidth = options.lineWidth ?? 2;\n const isArea = options.type === 'area';\n\n const plotW = rect.width - 70;\n const plotH = rect.height - 30;\n\n const points = bars.map((bar) => ({\n x: mapRange(bar.time, viewport.timeRange.from, viewport.timeRange.to, 0, plotW),\n y: mapRange(bar.close, viewport.priceRange.max, viewport.priceRange.min, 0, plotH),\n }));\n\n // Line path\n ctx.beginPath();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n this._applyLineStyle(ctx, options.lineStyle ?? 'solid');\n\n const first = points[0]!;\n ctx.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i]!.x, points[i]!.y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Area fill\n if (isArea) {\n ctx.beginPath();\n ctx.moveTo(first.x, plotH);\n ctx.lineTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i]!.x, points[i]!.y);\n }\n const last = points[points.length - 1]!;\n ctx.lineTo(last.x, plotH);\n ctx.closePath();\n\n const gradient = ctx.createLinearGradient(0, 0, 0, plotH);\n gradient.addColorStop(0, hexToRgba(color, 0.3));\n gradient.addColorStop(1, hexToRgba(color, 0.0));\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n }\n\n private _applyLineStyle(ctx: CanvasRenderingContext2D, style: string): void {\n if (style === 'dashed') ctx.setLineDash([6, 3]);\n else if (style === 'dotted') ctx.setLineDash([2, 3]);\n else ctx.setLineDash([]);\n }\n}\n","import type { OHLCV, SeriesOptions, Viewport, Rect, ChartColors } from '@forgecharts/types';\nimport type { IRenderer } from '../types/IRenderer';\nimport { mapRange } from '@forgecharts/utils';\n\n/**\n * HistogramRenderer — draws volume or indicator values as vertical bars.\n */\nexport class HistogramRenderer implements IRenderer {\n private readonly _colors: ChartColors;\n\n constructor(colors: ChartColors) {\n this._colors = colors;\n }\n\n draw(\n ctx: CanvasRenderingContext2D,\n bars: readonly OHLCV[],\n viewport: Viewport,\n rect: Rect,\n options: SeriesOptions,\n ): void {\n if (options.type !== 'histogram') return;\n\n const color = options.color ?? '#8b949e';\n const plotW = rect.width - 70;\n const plotH = rect.height - 30;\n\n // Derive pitch from candle interval × pixels-per-second (same fix as CandlestickRenderer)\n let candleInterval = 0;\n if (bars.length >= 2) {\n const deltas: number[] = [];\n for (let i = 1; i < Math.min(bars.length, 20); i++) {\n const d = bars[i]!.time - bars[i - 1]!.time;\n if (d > 0) deltas.push(d);\n }\n if (deltas.length > 0) {\n deltas.sort((a, b) => a - b);\n candleInterval = deltas[Math.floor(deltas.length / 2)]!;\n }\n }\n const visibleSpan = viewport.timeRange.to - viewport.timeRange.from;\n const pixelsPerSecond = visibleSpan > 0 ? plotW / visibleSpan : 1;\n const barPitch = candleInterval > 0\n ? candleInterval * pixelsPerSecond\n : plotW / Math.max(1, bars.length);\n const barWidth = Math.max(1, Math.floor(barPitch) - 1);\n const halfBar = barWidth / 2;\n const baseline = plotH; // draws from bottom up\n\n for (const bar of bars) {\n const x = mapRange(bar.time, viewport.timeRange.from, viewport.timeRange.to, 0, plotW);\n if (x < -barWidth || x > plotW + barWidth) continue;\n\n const y = mapRange(bar.volume, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);\n const barH = Math.max(1, baseline - y);\n\n ctx.fillStyle = bar.close >= bar.open ? '#26a641' : '#f85149';\n ctx.fillRect(x - halfBar, y, barWidth, barH);\n }\n\n void color; // unused when per-bar coloring is active\n }\n}\n","import type { OHLCV, SeriesOptions, Viewport, Rect, ChartColors } from '@forgecharts/types';\nimport type { ISeries } from '../types/ISeries';\nimport type { IRenderer } from '../types/IRenderer';\nimport { CandlestickRenderer } from '../renderers/CandlestickRenderer';\nimport { LineRenderer } from '../renderers/LineRenderer';\nimport { HistogramRenderer } from '../renderers/HistogramRenderer';\n\n/**\n * Series holds a dataset (OHLCV[]) and delegates pixel-level rendering\n * to the appropriate IRenderer implementation.\n */\nexport class Series implements ISeries {\n private _data: OHLCV[] = [];\n private _options: SeriesOptions;\n private readonly _renderer: IRenderer;\n\n /**\n * Optional callback invoked after `setData()` or `update()` mutates the dataset.\n * Used by `PixiChart` to mark the PriceSeries layer dirty without polling.\n */\n onDataChanged?: () => void;\n\n constructor(options: SeriesOptions, colors: ChartColors) {\n this._options = options;\n this._renderer = Series._createRenderer(options, colors);\n }\n\n // ─── ISeries implementation ──────────────────────────────────────────────────\n\n setData(data: readonly OHLCV[]): void {\n this._data = [...data].sort((a, b) => a.time - b.time);\n this.onDataChanged?.();\n }\n\n /**\n * Apply a real-time OHLCV tick to the series.\n *\n * Rules (mirrors TradingView / Binance behaviour):\n * - time normalisation : if > 1e12 it is milliseconds → convert to seconds\n * - same candle (time === last.time):\n * open → unchanged (preserved from first tick of this candle)\n * high → max(prev.high, incoming.high, incoming.close)\n * low → min(prev.low, incoming.low, incoming.close)\n * close → incoming.close\n * volume → incoming.volume\n * - new candle (time > last.time) → append\n * - out-of-order (time < last.time) → silently ignored\n */\n update(bar: OHLCV): void {\n // ── 1. Normalise timestamp: ms → s ────────────────────────────────────────\n const t = bar.time > 1e12 ? Math.floor(bar.time / 1000) : bar.time;\n\n // ── 2. First bar ever ────────────────────────────────────────────────────\n if (this._data.length === 0) {\n this._data.push({ ...bar, time: t });\n this.onDataChanged?.();\n return;\n }\n\n const last = this._data[this._data.length - 1]!;\n\n if (t === last.time) {\n // ── 3a. Same candle: replace last element (OHLCV properties are readonly)\n // open stays untouched — never replace the candle's original open\n this._data[this._data.length - 1] = {\n time: last.time,\n open: last.open,\n high: Math.max(last.high, bar.high, bar.close),\n low: Math.min(last.low, bar.low, bar.close),\n close: bar.close,\n volume: bar.volume,\n };\n } else if (t > last.time) {\n // ── 3b. New candle: append ───────────────────────────────────────────────\n this._data.push({ ...bar, time: t });\n }\n // ── 3c. Out-of-order (t < last.time): silently discard ──────────────────\n\n this.onDataChanged?.();\n }\n\n data(): readonly OHLCV[] {\n return this._data;\n }\n\n applyOptions(options: Partial<SeriesOptions>): void {\n this._options = { ...this._options, ...options } as SeriesOptions;\n }\n\n options(): SeriesOptions {\n return this._options;\n }\n\n // ─── Rendering (called by Chart) ────────────────────────────────────────────\n\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, rect: Rect): void {\n if (this._data.length === 0) return;\n const visible = this._options.visible ?? true;\n if (!visible) return;\n\n const visibleData = this._getVisibleData(viewport);\n if (visibleData.length === 0) return;\n\n this._renderer.draw(ctx, visibleData, viewport, rect, this._options);\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n private _getVisibleData(viewport: Viewport): OHLCV[] {\n const { from, to } = viewport.timeRange;\n // Small margin so partial bars at edges are included\n return this._data.filter((b) => b.time >= from - 1 && b.time <= to + 1);\n }\n\n private static _createRenderer(options: SeriesOptions, colors: ChartColors): IRenderer {\n switch (options.type) {\n case 'candlestick':\n case 'heikinashi':\n case 'bar':\n return new CandlestickRenderer(colors);\n case 'line':\n case 'area':\n return new LineRenderer(colors);\n case 'histogram':\n return new HistogramRenderer(colors);\n default: {\n const _exhaustive: never = options;\n throw new Error(`[ForgeCharts] Unknown series type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n }\n}\n","import type { Drawing, DrawingType, OHLCV, HitTestResult, ChartKeyAction, KeyModifiers } from '@forgecharts/types';\nimport type { CoordTransform } from './CoordTransform';\n\n// ─── Public handler bag ───────────────────────────────────────────────────────\n\n/**\n * Callbacks injected by the owning chart engine.\n * Every handler is optional; omit the ones your engine doesn't need.\n */\nexport type InteractionHandlers = {\n /** User dragged the chart. Apply `transform.pan(dx, dy)` and mark dirty. */\n onPan?: (dx: number, dy: number) => void;\n /**\n * User scrolled the wheel or pressed +/-.\n * `factor > 1` = zoom out (more bars visible); `factor < 1` = zoom in.\n * Apply `transform.zoomTime(factor, originX)` and mark dirty.\n */\n onZoom?: (factor: number, originX: number) => void;\n /** Mouse moved while not dragging — update the crosshair. */\n onCrosshairMove?: (x: number, y: number, hit: HitTestResult) => void;\n /** Mouse left the chart area — hide the crosshair. */\n onCrosshairHide?: () => void;\n /**\n * Left-click without drag (click threshold not exceeded).\n * Selection state is updated internally before this fires.\n */\n onSelect?: (x: number, y: number, hit: HitTestResult) => void;\n /** User clicked empty space — selection cleared. */\n onDeselect?: () => void;\n /** Right-click / contextmenu. `e.preventDefault()` is already called. */\n onContextMenu?: (x: number, y: number, hit: HitTestResult) => void;\n /** Recognised keyboard shortcut. */\n onKeyAction?: (action: ChartKeyAction, modifiers: KeyModifiers) => void;\n /**\n * Double-click on the price axis — reset price scale to fit visible bars\n * and scroll to the latest bar.\n */\n onFitContent?: () => void;\n /** User scrolled the wheel over the price axis — zoom the price scale. */\n onPriceScaleZoom?: (factor: number, originY: number) => void;\n /** User dragged up/down on the price axis strip — drag down expands, up compresses. */\n onPriceAxisDrag?: (dy: number) => void;\n // ── Drawing tool handlers ─────────────────────────────────────────────────\n /** Called when the user clicks while a drawing tool is active. */\n onDrawClick?: (x: number, y: number) => void;\n /** Called on every mousemove while a drawing tool is active (preview). */\n onDrawPointerMove?: (x: number, y: number) => void;\n /** Handle drag start — anchor `handleIndex` of drawing `id`. */\n onHandleDragStart?: (id: string, handleIndex: number) => void;\n /** Handle dragged to new pixel position. */\n onHandleDragMove?: (id: string, handleIndex: number, x: number, y: number) => void;\n /** Handle drag released. */\n onHandleDragEnd?: (id: string, handleIndex: number) => void;\n /** Body of drawing `id` grabbed for move. */\n onBodyMoveStart?: (id: string) => void;\n /** Body dragged by (dx, dy) pixel delta. */\n onBodyMoveMove?: (id: string, dx: number, dy: number) => void;\n /** Body move released. */\n onBodyMoveEnd?: (id: string) => void;\n};\n\n// ─── Construction options ─────────────────────────────────────────────────────\n\nexport type InteractionOptions = {\n /** Allow click-drag panning. Defaults to `true`. */\n readonly enablePan?: boolean;\n /** Allow mouse-wheel zooming. Defaults to `true`. */\n readonly enableZoom?: boolean;\n /**\n * Pointer travel distance (px) below which mousedown + mouseup is treated\n * as a click rather than a pan gesture. Defaults to `4`.\n */\n readonly clickThreshold?: number;\n /**\n * Zoom multiplier per wheel step.\n * `factor > 1` = zoom out on scroll-down. Defaults to `1.1`.\n */\n readonly zoomStep?: number;\n /** Pixels to scroll per arrow-key press. Defaults to `40`. */\n readonly keyPanStep?: number;\n /** Zoom multiplier per keyboard +/- press. Defaults to `1.1`. */\n readonly keyZoomStep?: number;\n};\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** Tolerated pixel distance for drawing hit detection. */\nconst DRAWING_HIT_PX = 6;\n/** Tolerated pixel distance for handle hit detection. */\nconst HANDLE_HIT_PX = 8;\n\n// ─── InteractionManager ───────────────────────────────────────────────────────\n\n/**\n * InteractionManager — the single owner of all DOM input events for a chart.\n *\n * Responsibilities:\n * - Mouse: pan (left-drag), crosshair tracking, click detection\n * - Wheel: zoom\n * - Right-click: contextmenu routing\n * - Keyboard: arrow-key pan, +/- zoom, Esc / Delete shortcuts\n * - Hit-testing: drawings → bars → axis zones\n * - Selection state: tracks the currently selected drawing id\n *\n * Usage:\n * ```ts\n * const interaction = new InteractionManager(\n * canvasElement,\n * chart.transform(),\n * {\n * onPan: (dx, dy) => { transform.pan(dx, dy); markDirty(); },\n * onZoom: (f, ox) => { transform.zoomTime(f, ox); markDirty(); },\n * onCrosshairMove: (x, y) => { crosshair.update(x, y); markDirty(); },\n * onCrosshairHide: () => { crosshair.hide(); markDirty(); },\n * onContextMenu: (x, y, hit) => showMenu(x, y, hit),\n * onKeyAction: (action) => handleKey(action),\n * },\n * );\n *\n * // Call on chart resize:\n * interaction.setTransform(chart.transform());\n *\n * // Feed visible bars for bar-snap hit-testing:\n * interaction.setBars(series.data());\n *\n * // Feed drawings for drawing hit-testing:\n * interaction.setDrawings(drawingManager.all());\n *\n * // Teardown:\n * interaction.destroy();\n * ```\n */\nexport class InteractionManager {\n private readonly _el: HTMLElement;\n private _transform: CoordTransform;\n private readonly _handlers: InteractionHandlers;\n private readonly _opts: Required<InteractionOptions>;\n\n // ── Hit-test data feeds ───────────────────────────────────────────────────\n private _drawings: readonly Drawing[] = [];\n private _bars: readonly OHLCV[] = [];\n\n // ── Mouse state ───────────────────────────────────────────────────────────\n private _isDragging = false;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _lastDragX = 0;\n private _lastDragY = 0;\n /** True once the pointer has moved past `clickThreshold` during a drag. */\n private _hasMoved = false;\n /** True while the user is dragging on the price axis strip. */\n private _priceAxisDragging = false;\n\n // ── Selection state ───────────────────────────────────────────────────────\n private _selectedDrawingId: string | null = null;\n\n // ── Drawing tool state ────────────────────────────────────────────────────\n private _drawingMode = false;\n /** True when the native cursor should be hidden (crosshair / dot / demonstration). */\n private _hideCursor = false;\n\n /** Sets cursor style, respecting _hideCursor — 'none' always wins when hiding. */\n private _setCursor(style: string): void {\n this._el.style.cursor = this._hideCursor ? 'none' : style;\n }\n /** Set when a drawing is committed mid-mousedown; prevents the paired mouseup from auto-selecting it. */\n private _suppressNextClick = false;\n private _handleDragId: string | null = null;\n private _handleDragIdx = -1;\n private _bodyMoveId: string | null = null;\n private _bodyMovePrevX = 0;\n private _bodyMovePrevY = 0;\n\n constructor(\n element: HTMLElement,\n transform: CoordTransform,\n handlers: InteractionHandlers,\n options: InteractionOptions = {},\n ) {\n this._el = element;\n this._transform = transform;\n this._handlers = handlers;\n\n this._opts = {\n enablePan: options.enablePan ?? true,\n enableZoom: options.enableZoom ?? true,\n clickThreshold: options.clickThreshold ?? 4,\n zoomStep: options.zoomStep ?? 1.1,\n keyPanStep: options.keyPanStep ?? 40,\n keyZoomStep: options.keyZoomStep ?? 1.1,\n };\n\n // Make container keyboard-focusable so `keydown` fires on it\n if (element.tabIndex < 0) element.tabIndex = 0;\n element.style.outline = 'none'; // suppress browser focus ring\n\n this._attach();\n }\n\n // ─── Data feeds (call after every data / drawing change) ──────────────────\n\n /** Swap the transform reference after a resize. */\n setTransform(transform: CoordTransform): void {\n this._transform = transform;\n }\n\n /** Provide the current drawing list for hit-testing. */\n setDrawings(drawings: readonly Drawing[]): void {\n this._drawings = drawings;\n }\n\n /**\n * Provide the visible bars for bar-snap hit-testing on the primary series.\n * Passing `series.data()` is fine; the manager filters by visible range.\n */\n setBars(bars: readonly OHLCV[]): void {\n this._bars = bars;\n }\n\n // ─── Selection ────────────────────────────────────────────────────────────\n\n /** Id of the currently selected drawing, or `null`. */\n get selectedDrawingId(): string | null {\n return this._selectedDrawingId;\n }\n\n /** Programmatically deselect (e.g. on symbol / timeframe change). */\n clearSelection(): void {\n this._selectedDrawingId = null;\n }\n\n /**\n * Switches between drawing-tool mode (crosshair cursor, click fires onDrawClick)\n * and normal cursor mode. Also resets any in-progress drag state.\n */\n /** Hides (`true`) or shows (`false`) the native OS cursor. Used by crosshair, dot, and demonstration modes. */\n setHideCursor(hidden: boolean): void {\n this._hideCursor = hidden;\n if (!this._drawingMode) {\n this._el.style.cursor = hidden ? 'none' : 'default';\n }\n }\n\n setDrawingMode(active: boolean): void {\n if (this._drawingMode && !active) {\n // Drawing was committed during a mousedown — suppress the paired mouseup click\n // so it doesn't immediately auto-select the newly placed drawing.\n this._suppressNextClick = true;\n }\n this._drawingMode = active;\n this._el.style.cursor = active ? 'crosshair' : (this._hideCursor ? 'none' : 'default');\n this._isDragging = false;\n this._hasMoved = false;\n this._handleDragId = null;\n this._handleDragIdx = -1;\n this._bodyMoveId = null;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────\n\n /** Removes all DOM event listeners. Must be called in the chart's `destroy()`. */\n destroy(): void {\n this._detach();\n }\n\n // ─── DOM listener registry ────────────────────────────────────────────────\n\n private _attach(): void {\n const el = this._el;\n\n // Mouse — always registered so crosshair works even with pan disabled\n el.addEventListener('mousedown', this._onMouseDown);\n el.addEventListener('mousemove', this._onMouseMove);\n el.addEventListener('mouseup', this._onMouseUp);\n el.addEventListener('mouseleave', this._onMouseLeave);\n\n if (this._opts.enableZoom) {\n el.addEventListener('wheel', this._onWheel, { passive: false });\n }\n\n el.addEventListener('contextmenu', this._onContextMenu);\n el.addEventListener('keydown', this._onKeyDown);\n el.addEventListener('dblclick', this._onDblClick);\n }\n\n private _detach(): void {\n const el = this._el;\n el.removeEventListener('mousedown', this._onMouseDown);\n el.removeEventListener('mousemove', this._onMouseMove);\n el.removeEventListener('mouseup', this._onMouseUp);\n el.removeEventListener('mouseleave', this._onMouseLeave);\n el.removeEventListener('wheel', this._onWheel);\n el.removeEventListener('contextmenu', this._onContextMenu);\n el.removeEventListener('keydown', this._onKeyDown);\n el.removeEventListener('dblclick', this._onDblClick);\n }\n\n // ─── Mouse handlers ───────────────────────────────────────────────────────\n\n private _onMouseDown = (e: MouseEvent): void => {\n if (e.button !== 0) return; // left button only\n this._el.focus({ preventScroll: true });\n\n const x = e.offsetX;\n const y = e.offsetY;\n\n // Drawing tool mode: route click to drawing placement\n if (this._drawingMode) {\n this._handlers.onDrawClick?.(x, y);\n return;\n }\n\n // Cursor mode: check handles of the selected drawing first (highest priority)\n if (this._selectedDrawingId !== null) {\n for (const drawing of this._drawings) {\n if (drawing.id !== this._selectedDrawingId || drawing.visible === false) continue;\n const hi = this._hitTestHandles(x, y, drawing);\n if (hi >= 0) {\n this._handleDragId = drawing.id;\n this._handleDragIdx = hi;\n this._setCursor('grabbing');\n this._handlers.onHandleDragStart?.(drawing.id, hi);\n return;\n }\n break; // handles checked — move on\n }\n }\n\n // Auto-select + immediately start body drag on ANY hovered drawing.\n // This means one mousedown is all that's needed — no separate\n // \"click to select, then click+drag\" two-step required.\n const drawingBodyHit = this._hitTestDrawings(x, y);\n if (drawingBodyHit !== null) {\n this._selectedDrawingId = drawingBodyHit.id;\n this._bodyMoveId = drawingBodyHit.id;\n this._bodyMovePrevX = x;\n this._bodyMovePrevY = y;\n this._setCursor('grabbing');\n this._handlers.onBodyMoveStart?.(drawingBodyHit.id);\n return;\n }\n\n // Price axis — start vertical drag to stretch/compress price scale\n if (x >= this._transform.plotWidth && y < this._transform.plotHeight) {\n this._priceAxisDragging = true;\n this._lastDragY = y;\n this._setCursor('ns-resize');\n return;\n }\n\n // Normal pan\n this._isDragging = true;\n this._hasMoved = false;\n this._dragStartX = x;\n this._dragStartY = y;\n this._lastDragX = x;\n this._lastDragY = y;\n };\n\n private _onMouseMove = (e: MouseEvent): void => {\n const x = e.offsetX;\n const y = e.offsetY;\n\n // Drawing-tool preview\n if (this._drawingMode) {\n this._handlers.onDrawPointerMove?.(x, y);\n this._handlers.onCrosshairMove?.(x, y, this._hitTest(x, y));\n return;\n }\n\n // Handle drag\n if (this._handleDragId !== null) {\n this._setCursor('grabbing');\n this._handlers.onHandleDragMove?.(this._handleDragId, this._handleDragIdx, x, y);\n return;\n }\n\n // Body move\n if (this._bodyMoveId !== null) {\n const dx = x - this._bodyMovePrevX;\n const dy = y - this._bodyMovePrevY;\n this._bodyMovePrevX = x;\n this._bodyMovePrevY = y;\n this._setCursor('grabbing');\n this._handlers.onBodyMoveMove?.(this._bodyMoveId, dx, dy);\n return;\n }\n\n // Price axis drag — zoom price scale vertically\n if (this._priceAxisDragging) {\n const dy = y - this._lastDragY;\n this._lastDragY = y;\n if (dy !== 0) this._handlers.onPriceAxisDrag?.(dy);\n this._setCursor('ns-resize');\n return;\n }\n\n if (this._isDragging) {\n const dx = x - this._lastDragX;\n const dy = y - this._lastDragY;\n\n const totalDist = Math.hypot(x - this._dragStartX, y - this._dragStartY);\n if (totalDist > this._opts.clickThreshold) {\n this._hasMoved = true;\n }\n\n if (this._hasMoved && this._opts.enablePan) {\n this._handlers.onPan?.(dx, dy);\n }\n\n this._lastDragX = x;\n this._lastDragY = y;\n }\n\n // Crosshair + cursor feedback\n const hit = this._hitTest(x, y);\n this._handlers.onCrosshairMove?.(x, y, hit);\n\n if (!this._isDragging) {\n if (x >= this._transform.plotWidth && y < this._transform.plotHeight) {\n this._setCursor('ns-resize');\n } else if (hit.kind === 'drawingHandle') {\n this._setCursor('grab');\n } else if (hit.kind === 'drawing') {\n this._setCursor('grab');\n } else {\n this._setCursor('default');\n }\n }\n };\n\n private _onMouseUp = (e: MouseEvent): void => {\n if (e.button !== 0) return;\n\n // Finish price axis drag\n if (this._priceAxisDragging) {\n this._priceAxisDragging = false;\n this._setCursor('default');\n return;\n }\n\n // Finish handle drag\n if (this._handleDragId !== null) {\n const id = this._handleDragId;\n const idx = this._handleDragIdx;\n this._handleDragId = null;\n this._handleDragIdx = -1;\n this._setCursor('grab');\n this._handlers.onHandleDragEnd?.(id, idx);\n return;\n }\n\n // Finish body move\n if (this._bodyMoveId !== null) {\n const id = this._bodyMoveId;\n this._bodyMoveId = null;\n this._setCursor('grab');\n this._handlers.onBodyMoveEnd?.(id);\n return;\n }\n\n const wasClick = !this._hasMoved;\n this._isDragging = false;\n this._hasMoved = false;\n\n if (wasClick) {\n if (this._suppressNextClick) {\n this._suppressNextClick = false;\n } else {\n const x = e.offsetX;\n const y = e.offsetY;\n const hit = this._hitTest(x, y);\n this._handleClick(x, y, hit);\n }\n }\n };\n\n private _onMouseLeave = (): void => {\n this._isDragging = false;\n this._hasMoved = false;\n this._priceAxisDragging = false;\n this._handleDragId = null;\n this._handleDragIdx = -1;\n this._bodyMoveId = null;\n this._handlers.onCrosshairHide?.();\n };\n\n // ─── Wheel / zoom ─────────────────────────────────────────────────────────\n\n private _onWheel = (e: WheelEvent): void => {\n e.preventDefault();\n const x = e.offsetX;\n const y = e.offsetY;\n const plotW = this._transform.plotWidth;\n const plotH = this._transform.plotHeight;\n\n // Proportional zoom: normalise deltaY against one standard notch (120 px).\n // High-resolution trackpads send many small deltas; mice send 120 at a time.\n // Range: 0.8% per tiny trackpad nudge → 4% per full mouse-wheel notch.\n // This keeps one notch feeling gentle while fast spinning still zooms quickly.\n const rawAbs = Math.abs(e.deltaY);\n const speed = Math.min(rawAbs / 120, 1); // 0–1; 1 = one standard notch\n const magnitude = 0.008 + speed * 0.032; // 0.8% minimum → 4% per notch\n const baseZoom = 1 + magnitude;\n const factor = e.deltaY > 0 ? baseZoom : 1 / baseZoom;\n\n // Price axis strip (right side) — zoom price scale\n if (x >= plotW && y < plotH) {\n this._handlers.onPriceScaleZoom?.(factor, y);\n return;\n }\n\n // Time axis strip (bottom) — zoom time scale (expand/contract left-right)\n if (y >= plotH) {\n // Zoom around the horizontal centre of the plot so the chart expands\n // and contracts symmetrically rather than anchored to the cursor.\n this._handlers.onZoom?.(factor, plotW / 2);\n return;\n }\n\n // Chart plot area — zoom time axis\n this._handlers.onZoom?.(factor, x);\n };\n\n // ─── Double-click — price axis fit ──────────────────────────────────────\n\n private _onDblClick = (e: MouseEvent): void => {\n // Fire onFitContent when the double-click lands on the price axis (right)\n // or the time axis (bottom) — both reset to the default viewport.\n const onPriceAxis = e.offsetX >= this._transform.plotWidth;\n const onTimeAxis = e.offsetY >= this._transform.plotHeight;\n if (onPriceAxis || onTimeAxis) {\n e.preventDefault();\n this._handlers.onFitContent?.();\n }\n };\n\n // ─── Context menu ─────────────────────────────────────────────────────────\n\n private _onContextMenu = (e: MouseEvent): void => {\n e.preventDefault();\n const x = e.offsetX;\n const y = e.offsetY;\n const hit = this._hitTest(x, y);\n this._handlers.onContextMenu?.(x, y, hit);\n };\n\n // ─── Keyboard ─────────────────────────────────────────────────────────────\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const action = this._keyToAction(e.key);\n if (action === null) return;\n\n // Suppress browser scroll / zoom for chart keys\n e.preventDefault();\n\n const modifiers: KeyModifiers = {\n shift: e.shiftKey,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n meta: e.metaKey,\n };\n\n this._handlers.onKeyAction?.(action, modifiers);\n };\n\n private _keyToAction(key: string): ChartKeyAction | null {\n switch (key) {\n case 'ArrowLeft': return 'panLeft';\n case 'ArrowRight': return 'panRight';\n case 'ArrowUp': return 'panUp';\n case 'ArrowDown': return 'panDown';\n case '+':\n case '=': return 'zoomIn';\n case '-':\n case '_': return 'zoomOut';\n case 'Home': return 'scrollToStart';\n case 'End': return 'scrollToEnd';\n case 'Escape': return 'deselect';\n case 'Delete':\n case 'Backspace': return 'deleteSelection';\n default: return null;\n }\n }\n\n // ─── Click → selection ────────────────────────────────────────────────────\n\n private _handleClick(x: number, y: number, hit: HitTestResult): void {\n if (hit.kind === 'drawing') {\n this._selectedDrawingId = hit.id;\n this._handlers.onSelect?.(x, y, hit);\n } else if (hit.kind === 'bar') {\n this._selectedDrawingId = null;\n this._handlers.onSelect?.(x, y, hit);\n } else {\n this._selectedDrawingId = null;\n this._handlers.onDeselect?.();\n }\n }\n\n // ─── Hit-testing ─────────────────────────────────────────────────────────\n\n private _hitTest(x: number, y: number): HitTestResult {\n const t = this._transform;\n\n // Price axis zone (right strip)\n if (x >= t.plotWidth) {\n return { kind: 'priceAxis' };\n }\n\n // Time axis zone (bottom strip)\n if (y >= t.plotHeight) {\n return { kind: 'timeAxis' };\n }\n\n // Handles of selected drawing — highest priority\n if (this._selectedDrawingId !== null) {\n for (const drawing of this._drawings) {\n if (drawing.id !== this._selectedDrawingId || drawing.visible === false) continue;\n const hi = this._hitTestHandles(x, y, drawing);\n if (hi >= 0) {\n return { kind: 'drawingHandle', id: drawing.id, type: drawing.type, handleIndex: hi };\n }\n }\n }\n\n // Drawings — higher priority than bars\n const drawingHit = this._hitTestDrawings(x, y);\n if (drawingHit !== null) {\n return { kind: 'drawing', id: drawingHit.id, type: drawingHit.type };\n }\n\n // Nearest visible bar\n const barHit = this._hitTestBar(x);\n if (barHit !== null) {\n return { kind: 'bar', index: barHit.index, bar: barHit.bar };\n }\n\n return { kind: 'none' };\n }\n\n private _hitTestHandles(x: number, y: number, drawing: Drawing): number {\n const t = this._transform;\n for (let i = 0; i < drawing.points.length; i++) {\n const p = drawing.points[i]!;\n if (Math.hypot(x - t.timeToX(p.time), y - t.priceToY(p.price)) < HANDLE_HIT_PX) {\n return i;\n }\n }\n return -1;\n }\n\n private _hitTestDrawings(x: number, y: number): { id: string; type: DrawingType } | null {\n let bestId: string | null = null;\n let bestType: DrawingType | null = null;\n let bestDist = DRAWING_HIT_PX + 1;\n\n for (const drawing of this._drawings) {\n if (drawing.visible === false) continue;\n\n const rawDist = this._distToDrawing(x, y, drawing);\n // Small bias for the selected drawing so it \"sticks\" under the cursor\n const dist = rawDist + (drawing.id === this._selectedDrawingId ? -2 : 0);\n\n if (dist < bestDist) {\n bestDist = dist;\n bestId = drawing.id;\n bestType = drawing.type;\n }\n }\n\n return bestId !== null && bestType !== null ? { id: bestId, type: bestType } : null;\n }\n\n private _distToDrawing(mx: number, my: number, drawing: Drawing): number {\n const t = this._transform;\n\n switch (drawing.type) {\n case 'horizontal': {\n const p0 = drawing.points[0];\n if (!p0) return Infinity;\n return Math.abs(my - t.priceToY(p0.price));\n }\n\n case 'vertical': {\n const p0 = drawing.points[0];\n if (!p0) return Infinity;\n return Math.abs(mx - t.timeToX(p0.time));\n }\n\n case 'trendline':\n case 'fibRetracement': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n if (!p0 || !p1) return Infinity;\n return this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p0.price),\n t.timeToX(p1.time), t.priceToY(p1.price),\n );\n }\n\n case 'ray': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n if (!p0 || !p1) return Infinity;\n const x0 = t.timeToX(p0.time);\n const y0 = t.priceToY(p0.price);\n const dx = t.timeToX(p1.time) - x0;\n const dy = t.priceToY(p1.price) - y0;\n // Compute exit using the same formula as the renderer\n const pw = t.plotWidth;\n const ph = t.plotHeight;\n let tMin = Infinity;\n if (dx > 0) tMin = Math.min(tMin, (pw - x0) / dx);\n else if (dx < 0) tMin = Math.min(tMin, -x0 / dx);\n if (dy > 0) tMin = Math.min(tMin, (ph - y0) / dy);\n else if (dy < 0) tMin = Math.min(tMin, -y0 / dy);\n const ex = tMin === Infinity ? x0 : x0 + dx * tMin;\n const ey = tMin === Infinity ? y0 : y0 + dy * tMin;\n return this._distPointToSegment(mx, my, x0, y0, ex, ey);\n }\n\n case 'rectangle': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n if (!p0 || !p1) return Infinity;\n const rx = Math.min(t.timeToX(p0.time), t.timeToX(p1.time));\n const ry = Math.min(t.priceToY(p0.price), t.priceToY(p1.price));\n const rw = Math.abs(t.timeToX(p1.time) - t.timeToX(p0.time));\n const rh = Math.abs(t.priceToY(p1.price) - t.priceToY(p0.price));\n return this._distToRect(mx, my, rx, ry, rw, rh);\n }\n\n case 'text': {\n const p0 = drawing.points[0];\n if (!p0) return Infinity;\n const px = t.timeToX(p0.time);\n const py = t.priceToY(p0.price);\n // Approximate bounding box\n const fs = drawing.fontSize ?? 13;\n return this._distToRect(mx, my, px, py - fs - 8, 80, fs + 8);\n }\n\n // ── new line types (two-anchor, infinite or extended) ──────────────\n\n case 'infoLine':\n case 'extendedLine':\n case 'trendAngle': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n if (!p0 || !p1) return Infinity;\n // Approximate by segment; close enough for hit-testing\n return this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p0.price),\n t.timeToX(p1.time), t.priceToY(p1.price),\n );\n }\n\n case 'horizontalRay': {\n const p0 = drawing.points[0];\n if (!p0) return Infinity;\n const x0 = t.timeToX(p0.time);\n const y = t.priceToY(p0.price);\n if (mx < x0) return Infinity;\n return Math.abs(my - y);\n }\n\n case 'crossLine': {\n const p0 = drawing.points[0];\n if (!p0) return Infinity;\n const x = t.timeToX(p0.time);\n const y = t.priceToY(p0.price);\n return Math.min(Math.abs(my - y), Math.abs(mx - x));\n }\n\n // ── channels ──────────────────────────────────────────────────────\n\n case 'parallelChannel':\n case 'flatTopBottom':\n case 'regressionTrend':\n case 'disjointChannel': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n if (!p0 || !p1) return Infinity;\n const d0 = this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p0.price),\n t.timeToX(p1.time), t.priceToY(p1.price),\n );\n const p2 = drawing.points[2];\n if (!p2) return d0;\n const d1 = this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p2.price),\n t.timeToX(p1.time), t.priceToY(p2.price),\n );\n return Math.min(d0, d1);\n }\n\n // ── pitchforks ────────────────────────────────────────────────────\n\n case 'pitchfork':\n case 'schiffPitchfork':\n case 'modifiedSchiffPitchfork':\n case 'insidePitchfork': {\n const p0 = drawing.points[0];\n const p1 = drawing.points[1];\n const p2 = drawing.points[2];\n if (!p0 || !p1) return Infinity;\n let best = this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p0.price),\n t.timeToX(p1.time), t.priceToY(p1.price),\n );\n if (p2) {\n best = Math.min(best, this._distPointToSegment(\n mx, my,\n t.timeToX(p0.time), t.priceToY(p0.price),\n t.timeToX(p2.time), t.priceToY(p2.price),\n ));\n }\n return best;\n }\n\n default:\n // Fib/Gann and future drawing types are not hit-testable yet.\n return Infinity;\n }\n }\n\n /**\n * Returns the nearest visible bar to x-coordinate `mx`, or `null` if no bar\n * falls within half a bar-width.\n */\n private _hitTestBar(mx: number): { index: number; bar: OHLCV } | null {\n const t = this._transform;\n const { from, to } = t.timeRange;\n const visibleSeconds = Math.max(1, to - from);\n const barHalfPx = (t.plotWidth / visibleSeconds) / 2;\n\n let bestIndex = -1;\n let bestDist = Infinity;\n\n for (let i = 0; i < this._bars.length; i++) {\n const bar = this._bars[i];\n if (!bar || bar.time < from || bar.time > to) continue;\n const dist = Math.abs(mx - t.timeToX(bar.time));\n if (dist < bestDist) {\n bestDist = dist;\n bestIndex = i;\n }\n }\n\n if (bestIndex < 0 || bestDist > barHalfPx) return null;\n\n const bar = this._bars[bestIndex];\n if (!bar) return null;\n return { index: bestIndex, bar };\n }\n\n // ─── Geometry helpers ────────────────────────────────────────────────────\n\n /** Distance from point (px, py) to line segment (x1,y1)→(x2,y2). */\n private _distPointToSegment(\n px: number, py: number,\n x1: number, y1: number,\n x2: number, y2: number,\n ): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n }\n\n /**\n * Minimum distance from point (px, py) to the perimeter of an\n * axis-aligned rectangle. Returns 0 if the point is inside.\n */\n private _distToRect(\n px: number, py: number,\n rx: number, ry: number,\n rw: number, rh: number,\n ): number {\n const inside =\n px >= rx && px <= rx + rw &&\n py >= ry && py <= ry + rh;\n if (inside) return 0;\n return Math.min(\n this._distPointToSegment(px, py, rx, ry, rx + rw, ry),\n this._distPointToSegment(px, py, rx + rw, ry, rx + rw, ry + rh),\n this._distPointToSegment(px, py, rx + rw, ry + rh, rx, ry + rh),\n this._distPointToSegment(px, py, rx, ry + rh, rx, ry),\n );\n }\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\n\n// ─── Handle appearance ────────────────────────────────────────────────────────\nexport const HANDLE_HALF = 5;\nexport const HANDLE_FILL = '#2196f3';\nexport const HANDLE_STROKE = 'rgba(255,255,255,0.9)';\n\n// ─── Ray exit helper ──────────────────────────────────────────────────────────\nexport function rayExit(\n plotW: number,\n plotH: number,\n px: number,\n py: number,\n dx: number,\n dy: number,\n): { x: number; y: number } {\n if (dx === 0 && dy === 0) return { x: px, y: py };\n let tMin = Infinity;\n if (dx > 0) tMin = Math.min(tMin, (plotW - px) / dx);\n else if (dx < 0) tMin = Math.min(tMin, -px / dx);\n if (dy > 0) tMin = Math.min(tMin, (plotH - py) / dy);\n else if (dy < 0) tMin = Math.min(tMin, -py / dy);\n return tMin === Infinity\n ? { x: px, y: py }\n : { x: px + dx * tMin, y: py + dy * tMin };\n}\n\n// ─── Timeframe seconds map ────────────────────────────────────────────────────\nexport const TF_SECS: Record<string, number> = {\n '1s': 1, '5s': 5, '10s': 10, '30s': 30,\n '1m': 60, '3m': 180, '5m': 300, '15m': 900, '30m': 1800,\n '1h': 3600, '2h': 7200, '4h': 14400, '6h': 21600, '12h': 43200,\n '1d': 86400, '3d': 259200, '1w': 604800, '1M': 2592000,\n};\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) { const m = Math.floor(seconds / 60); return `${m}m`; }\n const h = Math.floor(seconds / 3600);\n const m = Math.round((seconds % 3600) / 60);\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\n}\n\n// ─── Pitchfork helpers ────────────────────────────────────────────────────────\nexport type PF3 = {\n x0: number; y0: number;\n x1: number; y1: number;\n x2: number; y2: number;\n};\n\nexport function getPF3(d: Drawing, t: CoordTransform): PF3 | null {\n const p0 = d.points[0], p1 = d.points[1], p2 = d.points[2];\n if (!p0 || !p1 || !p2) return null;\n return {\n x0: t.timeToX(p0.time), y0: t.priceToY(p0.price),\n x1: t.timeToX(p1.time), y1: t.priceToY(p1.price),\n x2: t.timeToX(p2.time), y2: t.priceToY(p2.price),\n };\n}\n\nexport function drawPitchforkLines(\n ctx: CanvasRenderingContext2D,\n t: CoordTransform,\n pivotX: number, pivotY: number,\n midX: number, midY: number,\n x1: number, y1: number,\n x2: number, y2: number,\n): void {\n const dx = midX - pivotX, dy = midY - pivotY;\n const medExit = rayExit(t.plotWidth, t.plotHeight, midX, midY, dx, dy);\n ctx.beginPath(); ctx.moveTo(pivotX, pivotY); ctx.lineTo(medExit.x, medExit.y); ctx.stroke();\n const upExit = rayExit(t.plotWidth, t.plotHeight, x1, y1, dx, dy);\n ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(upExit.x, upExit.y); ctx.stroke();\n const dnExit = rayExit(t.plotWidth, t.plotHeight, x2, y2, dx, dy);\n ctx.beginPath(); ctx.moveTo(x2, y2); ctx.lineTo(dnExit.x, dnExit.y); ctx.stroke();\n ctx.save(); ctx.globalAlpha = 0.4;\n ctx.beginPath(); ctx.moveTo(pivotX, pivotY); ctx.lineTo(x1, y1); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(x2, y2); ctx.lineTo(pivotX, pivotY); ctx.stroke();\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderTrendline(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n ctx.beginPath();\n ctx.moveTo(t.timeToX(p0.time), t.priceToY(p0.price));\n ctx.lineTo(t.timeToX(p1.time), t.priceToY(p1.price));\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { rayExit } from '../../drawingUtils';\n\nexport function renderRay(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0) return;\n const x0 = t.timeToX(p0.time);\n const y0 = t.priceToY(p0.price);\n if (!p1) {\n ctx.beginPath();\n ctx.arc(x0, y0, 3, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n const dx = t.timeToX(p1.time) - x0;\n const dy = t.priceToY(p1.price) - y0;\n const exit = rayExit(t.plotWidth, t.plotHeight, x0, y0, dx, dy);\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(exit.x, exit.y);\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { TF_SECS, formatDuration } from '../../drawingUtils';\n\nexport function renderInfoLine(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n interval = '1h',\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n const dx = x1 - x0;\n const dy = y1 - y0;\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n\n const color = d.color ?? '#2196f3';\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n\n // ── Line segment from p0 to p1 ────────────────────────────────────────────\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n\n // ── Stats banner ─────────────────────────────────────────────────────────\n const priceDiff = p1.price - p0.price;\n const pctChange = p0.price !== 0 ? (priceDiff / p0.price) * 100 : 0;\n const timeDiff = Math.abs(p1.time - p0.time);\n const tfSecs = TF_SECS[interval] ?? 3600;\n const bars = Math.round(timeDiff / tfSecs);\n const duration = formatDuration(timeDiff);\n const pixDist = Math.round(len);\n const angleRad = Math.atan2(-(y1 - y0), x1 - x0);\n const angleDeg = (angleRad * 180 / Math.PI).toFixed(2);\n const sign = priceDiff >= 0 ? '+' : '';\n const decimals = p0.price < 1 ? 6 : 2;\n const priceStr = `${sign}${priceDiff.toFixed(decimals)} (${sign}${pctChange.toFixed(2)}%)`;\n const barsStr = `\\u2194 ${bars} bars (${duration}), distance: ${pixDist} px`;\n const angleStr = `\\u25b3 ${angleDeg}\\u00b0`;\n const labels = [priceStr, barsStr, angleStr];\n const icons = ['\\u21d5', '', ''];\n\n const PAD_X = 8;\n const PAD_Y = 6;\n const LINE_H = 16;\n const BANNER_W = 240;\n const BANNER_H = PAD_Y * 2 + labels.length * LINE_H;\n\n // Place banner perpendicular to the line, offset from the midpoint\n const midX = (x0 + x1) / 2;\n const midY = (y0 + y1) / 2;\n // Perpendicular unit vector (rotated 90° counter-clockwise)\n const px = -uy;\n const py = ux;\n const OFFSET = BANNER_H / 2 + 12; // enough to clear the line\n\n // Try offset in the \"up\" perpendicular direction first\n let bx = midX + px * OFFSET - BANNER_W / 2;\n let by = midY + py * OFFSET - BANNER_H / 2;\n\n // If that clips vertically, flip to the other side\n if (by < 2 || by + BANNER_H > t.plotHeight - 2) {\n bx = midX - px * OFFSET - BANNER_W / 2;\n by = midY - py * OFFSET - BANNER_H / 2;\n }\n\n // Clamp to plot area\n bx = Math.max(2, Math.min(bx, t.plotWidth - BANNER_W - 2));\n by = Math.max(2, Math.min(by, t.plotHeight - BANNER_H - 2));\n\n ctx.save();\n\n const hex = color.replace('#', '');\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n // Background\n ctx.fillStyle = `rgba(${r},${g},${b},0.12)`;\n ctx.beginPath();\n const radius = 4;\n ctx.moveTo(bx + radius, by);\n ctx.lineTo(bx + BANNER_W - radius, by);\n ctx.arcTo(bx + BANNER_W, by, bx + BANNER_W, by + radius, radius);\n ctx.lineTo(bx + BANNER_W, by + BANNER_H - radius);\n ctx.arcTo(bx + BANNER_W, by + BANNER_H, bx + BANNER_W - radius, by + BANNER_H, radius);\n ctx.lineTo(bx + radius, by + BANNER_H);\n ctx.arcTo(bx, by + BANNER_H, bx, by + BANNER_H - radius, radius);\n ctx.lineTo(bx, by + radius);\n ctx.arcTo(bx, by, bx + radius, by, radius);\n ctx.closePath();\n ctx.fill();\n\n // Border\n ctx.strokeStyle = `rgba(${r},${g},${b},0.5)`;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n\n // Text rows\n const FONT = '11px -apple-system, BlinkMacSystemFont, sans-serif';\n ctx.font = FONT;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n labels.forEach((line, i) => {\n const ty = by + PAD_Y + i * LINE_H;\n if (icons[i]) {\n ctx.fillStyle = `rgba(${r},${g},${b},0.7)`;\n ctx.fillText(icons[i], bx + PAD_X, ty + 1);\n ctx.fillStyle = color;\n ctx.fillText(line, bx + PAD_X + 14, ty + 1);\n } else {\n ctx.fillStyle = color;\n ctx.fillText(line, bx + PAD_X, ty + 1);\n }\n });\n\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { rayExit } from '../../drawingUtils';\n\nexport function renderExtendedLine(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n const dx = x1 - x0, dy = y1 - y0;\n const exitFwd = rayExit(t.plotWidth, t.plotHeight, x1, y1, dx, dy);\n const exitBack = rayExit(t.plotWidth, t.plotHeight, x0, y0, -dx, -dy);\n ctx.beginPath();\n ctx.moveTo(exitBack.x, exitBack.y);\n ctx.lineTo(exitFwd.x, exitFwd.y);\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { renderTrendline } from './trendline';\n\nexport function renderTrendAngle(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n\n const angleRad = Math.atan2(-(y1 - y0), x1 - x0);\n const angleDeg = (angleRad * 180 / Math.PI).toFixed(2);\n const color = d.color ?? '#2196f3';\n\n // Main trendline\n renderTrendline(ctx, d, t);\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n\n // Dotted horizontal baseline from p0 to p1's x-position\n ctx.beginPath();\n ctx.setLineDash([3, 3]);\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y0);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Arc at p0 sweeping from baseline to the trendline\n const ARC_R = Math.min(36, Math.abs(x1 - x0) * 0.35);\n if (ARC_R > 6) {\n const goingRight = x1 >= x0;\n const startAngle = goingRight ? 0 : Math.PI;\n const lineAngle = Math.atan2(y1 - y0, x1 - x0);\n ctx.beginPath();\n ctx.lineWidth = 1;\n if (goingRight) {\n ctx.arc(x0, y0, ARC_R, startAngle, lineAngle, lineAngle < 0);\n } else {\n ctx.arc(x0, y0, ARC_R, startAngle, lineAngle, lineAngle > Math.PI);\n }\n ctx.stroke();\n }\n\n // Angle label near p0, just outside the arc\n const labelR = ARC_R + 6;\n const halfAngle = Math.atan2(y1 - y0, x1 - x0) / 2;\n const lx = x0 + labelR * Math.cos(halfAngle);\n const ly = y0 + labelR * Math.sin(halfAngle);\n\n ctx.font = '11px -apple-system, BlinkMacSystemFont, sans-serif';\n ctx.textAlign = x1 >= x0 ? 'left' : 'right';\n ctx.textBaseline = y1 <= y0 ? 'top' : 'bottom';\n ctx.fillText(`${angleDeg}\\u00b0`, lx + (x1 >= x0 ? 2 : -2), ly);\n\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderHorizontal(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n if (!p0) return;\n const y = t.priceToY(p0.price);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(t.plotWidth, y);\n ctx.stroke();\n // Price label\n ctx.save();\n ctx.font = '10px -apple-system, sans-serif';\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(p0.price.toFixed(2), t.plotWidth + 4, y);\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderVertical(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n if (!p0) return;\n const x = t.timeToX(p0.time);\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, t.plotHeight);\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderHorizontalRay(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n if (!p0) return;\n const x0 = t.timeToX(p0.time);\n const y = t.priceToY(p0.price);\n ctx.beginPath();\n ctx.moveTo(x0, y);\n ctx.lineTo(t.plotWidth, y);\n ctx.stroke();\n // Price label\n ctx.save();\n ctx.font = '10px -apple-system, sans-serif';\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(p0.price.toFixed(2), t.plotWidth + 4, y);\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderCrossLine(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n if (!p0) return;\n const x = t.timeToX(p0.time);\n const y = t.priceToY(p0.price);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(t.plotWidth, y);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, t.plotHeight);\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderParallelChannel(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n const p2 = d.points[2];\n if (!p2) return;\n // Offset from y1 so dragging from p1 starts with zero width\n const off = t.priceToY(p2.price) - y1;\n // Parallel line\n ctx.beginPath();\n ctx.moveTo(x0, y0 + off);\n ctx.lineTo(x1, y1 + off);\n ctx.stroke();\n // Midline (dashed)\n ctx.save();\n ctx.globalAlpha = 0.5;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(x0, y0 + off / 2);\n ctx.lineTo(x1, y1 + off / 2);\n ctx.stroke();\n ctx.setLineDash([]);\n // Fill\n ctx.globalAlpha = 0.07;\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x1, y1 + off);\n ctx.lineTo(x0, y0 + off);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","import type { Drawing, OHLCV } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\n// ─── OLS linear regression ────────────────────────────────────────────────────\n\ntype RegressionParams = {\n slope: number;\n intercept: number;\n stdDev: number;\n};\n\n/**\n * Ordinary least-squares regression on the close prices of a candle slice.\n *\n * x = candle index (0 … N-1)\n * y = close price\n *\n * m = (N·Σxy − Σx·Σy) / (N·Σx² − (Σx)²)\n * b = (Σy − m·Σx) / N\n */\nfunction calcOLS(closes: readonly number[]): RegressionParams | null {\n const N = closes.length;\n if (N < 2) return null;\n\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;\n for (let i = 0; i < N; i++) {\n const y = closes[i]!;\n sumX += i;\n sumY += y;\n sumXY += i * y;\n sumX2 += i * i;\n }\n\n const denom = N * sumX2 - sumX * sumX;\n if (denom === 0) return null;\n\n const slope = (N * sumXY - sumX * sumY) / denom;\n const intercept = (sumY - slope * sumX) / N;\n\n // Standard deviation of residuals\n let sumRes2 = 0;\n for (let i = 0; i < N; i++) {\n const residual = closes[i]! - (slope * i + intercept);\n sumRes2 += residual * residual;\n }\n const stdDev = Math.sqrt(sumRes2 / N);\n\n return { slope, intercept, stdDev };\n}\n\n// ─── Candle slice helper ──────────────────────────────────────────────────────\n\n/**\n * Returns candles whose timestamps fall within [tStart, tEnd] (inclusive).\n * Assumes the input array is sorted ascending by time (Series guarantees this).\n */\nfunction sliceByTime(candles: readonly OHLCV[], tStart: number, tEnd: number): readonly OHLCV[] {\n let lo = 0, hi = candles.length - 1, start = candles.length;\n // Binary search for first index >= tStart\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n if (candles[mid]!.time < tStart) lo = mid + 1;\n else { start = mid; hi = mid - 1; }\n }\n // Walk forward to find last index <= tEnd\n let end = start - 1;\n for (let i = start; i < candles.length && candles[i]!.time <= tEnd; i++) end = i;\n if (end < start) return [];\n return candles.slice(start, end + 1);\n}\n\n// ─── Renderer ─────────────────────────────────────────────────────────────────\n\nexport function renderRegressionTrend(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n candles: readonly OHLCV[],\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n\n const tStart = Math.min(p0.time, p1.time);\n const tEnd = Math.max(p0.time, p1.time);\n\n const slice = sliceByTime(candles, tStart, tEnd);\n const N = slice.length;\n if (N < 2) return;\n\n const closes = slice.map(c => c.close);\n const reg = calcOLS(closes);\n if (!reg) return;\n\n const { slope, intercept, stdDev } = reg;\n\n // Regression price at the first and last candle of the slice\n const regPriceStart = intercept; // index 0\n const regPriceEnd = slope * (N - 1) + intercept; // index N-1\n\n // Pixel x from actual candle timestamps; y from regression-derived prices\n const x0 = t.timeToX(slice[0]!.time);\n const x1 = t.timeToX(slice[N - 1]!.time);\n const y0 = t.priceToY(regPriceStart);\n const y1 = t.priceToY(regPriceEnd);\n\n const color = d.color ?? '#2196f3';\n\n // ── Regression line ───────────────────────────────────────────────────────\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n\n // ── Deviation bands ───────────────────────────────────────────────────────\n if (stdDev === 0) return; // flat data — no meaningful channel\n\n const mult = d.deviationMultiplier ?? 2;\n const bandOffset = stdDev * mult; // price units\n\n const yUp0 = t.priceToY(regPriceStart + bandOffset);\n const yUp1 = t.priceToY(regPriceEnd + bandOffset);\n const yDn0 = t.priceToY(regPriceStart - bandOffset);\n const yDn1 = t.priceToY(regPriceEnd - bandOffset);\n\n ctx.save();\n ctx.setLineDash([4, 3]);\n ctx.globalAlpha = 0.65;\n\n // Upper band\n ctx.beginPath();\n ctx.moveTo(x0, yUp0);\n ctx.lineTo(x1, yUp1);\n ctx.stroke();\n\n // Lower band\n ctx.beginPath();\n ctx.moveTo(x0, yDn0);\n ctx.lineTo(x1, yDn1);\n ctx.stroke();\n\n ctx.setLineDash([]);\n\n // Fill between bands\n ctx.globalAlpha = 0.07;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x0, yUp0);\n ctx.lineTo(x1, yUp1);\n ctx.lineTo(x1, yDn1);\n ctx.lineTo(x0, yDn0);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n}\n\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderFlatTopBottom(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n const p2 = d.points[2];\n if (!p2) return;\n const yFlat = t.priceToY(p2.price);\n ctx.beginPath();\n ctx.moveTo(x0, yFlat);\n ctx.lineTo(x1, yFlat);\n ctx.stroke();\n ctx.save();\n ctx.globalAlpha = 0.35;\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x0, yFlat);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x1, yFlat);\n ctx.stroke();\n ctx.globalAlpha = 0.07;\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x1, yFlat);\n ctx.lineTo(x0, yFlat);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\n// ─── Renderer ─────────────────────────────────────────────────────────────────\n\n/**\n * Disjoint Channel — two fully independent trend lines forming a channel.\n *\n * Anchors (4 points):\n * p0 — left endpoint of line 1 (top-left)\n * p1 — right endpoint of line 1 (top-right)\n * p2 — left endpoint of line 2 (bottom-left)\n * p3 — right endpoint of line 2 (bottom-right)\n *\n * The tool places p2/p3 automatically when p0→p1 is drawn (offset downward).\n * The user can then drag any of the 4 handles to reshape freely — including\n * crossing the lines to create a bowtie / expanding wedge shape.\n */\nexport function renderDisjointChannel(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n\n const x0 = t.timeToX(p0.time), y0 = t.priceToY(p0.price);\n const x1 = t.timeToX(p1.time), y1 = t.priceToY(p1.price);\n\n const p2 = d.points[2];\n const p3 = d.points[3];\n\n // During drawing (only 2 points placed yet) — show just the first segment\n if (!p2 || !p3) {\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n return;\n }\n\n const x2 = t.timeToX(p2.time), y2 = t.priceToY(p2.price);\n const x3 = t.timeToX(p3.time), y3 = t.priceToY(p3.price);\n\n const color = d.color ?? '#2196f3';\n ctx.strokeStyle = color;\n\n // Fill the quadrilateral first (behind the lines)\n ctx.save();\n ctx.globalAlpha = 0.07;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x3, y3);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n\n // Line 1: p0 → p1\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.stroke();\n\n // Line 2: p2 → p3\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n}\n\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { getPF3, drawPitchforkLines } from '../../drawingUtils';\nimport { renderTrendline } from './trendline';\n\nexport function renderPitchfork(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const pf = getPF3(d, t);\n if (!pf) { renderTrendline(ctx, d, t); return; }\n const { x0, y0, x1, y1, x2, y2 } = pf;\n drawPitchforkLines(ctx, t, x0, y0, (x1 + x2) / 2, (y1 + y2) / 2, x1, y1, x2, y2);\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { getPF3, drawPitchforkLines } from '../../drawingUtils';\nimport { renderTrendline } from './trendline';\n\nexport function renderSchiffPitchfork(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const pf = getPF3(d, t);\n if (!pf) { renderTrendline(ctx, d, t); return; }\n const { x0, y0, x1, y1, x2, y2 } = pf;\n const midX = (x1 + x2) / 2, midY = (y1 + y2) / 2;\n const pivX = (x0 + midX) / 2;\n const pivY = (y0 + midY) / 2;\n drawPitchforkLines(ctx, t, pivX, pivY, midX, midY, x1, y1, x2, y2);\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { getPF3, drawPitchforkLines } from '../../drawingUtils';\nimport { renderTrendline } from './trendline';\n\nexport function renderModifiedSchiffPitchfork(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const pf = getPF3(d, t);\n if (!pf) { renderTrendline(ctx, d, t); return; }\n const { x0, y0, x1, y1, x2, y2 } = pf;\n const midX = (x1 + x2) / 2, midY = (y1 + y2) / 2;\n const pivX = (x0 + x1) / 2;\n const pivY = (y0 + y1) / 2;\n drawPitchforkLines(ctx, t, pivX, pivY, midX, midY, x1, y1, x2, y2);\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\nimport { getPF3 } from '../../drawingUtils';\nimport { renderTrendline } from './trendline';\n\nexport function renderInsidePitchfork(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const pf = getPF3(d, t);\n if (!pf) { renderTrendline(ctx, d, t); return; }\n const { x0, y0, x1, y1, x2, y2 } = pf;\n const midX = (x1 + x2) / 2, midY = (y1 + y2) / 2;\n ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(midX, midY); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x2, y2); ctx.stroke();\n ctx.save(); ctx.globalAlpha = 0.4;\n ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke();\n ctx.restore();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderRectangle(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n const rx = Math.min(t.timeToX(p0.time), t.timeToX(p1.time));\n const ry = Math.min(t.priceToY(p0.price), t.priceToY(p1.price));\n const rw = Math.abs(t.timeToX(p1.time) - t.timeToX(p0.time));\n const rh = Math.abs(t.priceToY(p1.price) - t.priceToY(p0.price));\n ctx.save();\n ctx.fillStyle = d.fillColor ?? (d.color ?? '#2196f3');\n ctx.globalAlpha *= d.fillOpacity ?? 0.1;\n ctx.fillRect(rx, ry, rw, rh);\n ctx.restore();\n ctx.beginPath();\n ctx.rect(rx, ry, rw, rh);\n ctx.stroke();\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n if (!p0) return;\n const label = d.text ?? 'Text';\n const x = t.timeToX(p0.time);\n const y = t.priceToY(p0.price);\n const fs = d.fontSize ?? 13;\n ctx.font = `${fs}px -apple-system, BlinkMacSystemFont, sans-serif`;\n const metrics = ctx.measureText(label);\n const pad = 4;\n const boxW = metrics.width + pad * 2;\n const boxH = fs + pad * 2;\n ctx.save();\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.globalAlpha *= 0.15;\n ctx.fillRect(x, y - boxH, boxW, boxH);\n ctx.restore();\n ctx.font = `${fs}px -apple-system, BlinkMacSystemFont, sans-serif`;\n ctx.fillStyle = d.color ?? '#2196f3';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'bottom';\n ctx.fillText(label, x + pad, y);\n}\n","import type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../../../core/CoordTransform';\n\nexport function renderFibRetracement(\n ctx: CanvasRenderingContext2D,\n d: Drawing,\n t: CoordTransform,\n): void {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return;\n const priceHigh = Math.max(p0.price, p1.price);\n const priceLow = Math.min(p0.price, p1.price);\n const span = priceHigh - priceLow;\n const x0 = Math.min(t.timeToX(p0.time), t.timeToX(p1.time));\n const x1 = Math.max(t.timeToX(p0.time), t.timeToX(p1.time));\n ctx.save();\n for (const ratio of [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1]) {\n const ly = t.priceToY(priceLow + span * (1 - ratio));\n ctx.globalAlpha = 0.6;\n ctx.beginPath();\n ctx.moveTo(x0, ly);\n ctx.lineTo(x1, ly);\n ctx.stroke();\n }\n ctx.restore();\n}\n","import type { Drawing, OHLCV } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\nimport { HANDLE_HALF, HANDLE_FILL, HANDLE_STROKE } from './drawingUtils';\n\nlet _counter = 0;\nfunction nextId(): string {\n return `drawing_${(++_counter).toString().padStart(4, '0')}`;\n}\n\n// ─── Lines menu ───────────────────────────────────────────────────────────────\nimport { renderTrendline } from './drawing tools/lines menu/trendline';\nimport { renderRay } from './drawing tools/lines menu/ray';\nimport { renderInfoLine } from './drawing tools/lines menu/infoLine';\nimport { renderExtendedLine } from './drawing tools/lines menu/extendedLine';\nimport { renderTrendAngle } from './drawing tools/lines menu/trendAngle';\nimport { renderHorizontal } from './drawing tools/lines menu/horizontal';\nimport { renderVertical } from './drawing tools/lines menu/vertical';\nimport { renderHorizontalRay } from './drawing tools/lines menu/horizontalRay';\nimport { renderCrossLine } from './drawing tools/lines menu/crossLine';\n// Channels\nimport { renderParallelChannel } from './drawing tools/lines menu/parallelChannel';\nimport { renderRegressionTrend } from './drawing tools/lines menu/regressionTrend';\nimport { renderFlatTopBottom } from './drawing tools/lines menu/flatTopBottom';\nimport { renderDisjointChannel } from './drawing tools/lines menu/disjointChannel';\n// Pitchforks\nimport { renderPitchfork } from './drawing tools/lines menu/pitchfork';\nimport { renderSchiffPitchfork } from './drawing tools/lines menu/schiffPitchfork';\nimport { renderModifiedSchiffPitchfork } from './drawing tools/lines menu/modifiedSchiffPitchfork';\nimport { renderInsidePitchfork } from './drawing tools/lines menu/insidePitchfork';\n\n// ─── Shapes menu ─────────────────────────────────────────────────────────────\nimport { renderRectangle } from './drawing tools/shapes menu/rectangle';\nimport { renderText } from './drawing tools/shapes menu/text';\n\n// ─── Fib & Gann menu ─────────────────────────────────────────────────────────\nimport { renderFibRetracement } from './drawing tools/fib gann menu/fibRetracement';\n\n// ─── Internal dispatch ────────────────────────────────────────────────────────\n\nfunction _renderOne(ctx: CanvasRenderingContext2D, d: Drawing, t: CoordTransform, interval = '1h', candles: readonly OHLCV[] = []): void {\n switch (d.type) {\n // ── Lines menu ────────────────────────────────────────────────────────\n case 'trendline': renderTrendline(ctx, d, t); break;\n case 'ray': renderRay(ctx, d, t); break;\n case 'infoLine': renderInfoLine(ctx, d, t, interval); break;\n case 'extendedLine': renderExtendedLine(ctx, d, t); break;\n case 'trendAngle': renderTrendAngle(ctx, d, t); break;\n case 'horizontal': renderHorizontal(ctx, d, t); break;\n case 'vertical': renderVertical(ctx, d, t); break;\n case 'horizontalRay': renderHorizontalRay(ctx, d, t); break;\n case 'crossLine': renderCrossLine(ctx, d, t); break;\n // Channels\n case 'parallelChannel': renderParallelChannel(ctx, d, t); break;\n case 'regressionTrend': renderRegressionTrend(ctx, d, t, candles); break;\n case 'flatTopBottom': renderFlatTopBottom(ctx, d, t); break;\n case 'disjointChannel': renderDisjointChannel(ctx, d, t); break;\n // Pitchforks\n case 'pitchfork': renderPitchfork(ctx, d, t); break;\n case 'schiffPitchfork': renderSchiffPitchfork(ctx, d, t); break;\n case 'modifiedSchiffPitchfork': renderModifiedSchiffPitchfork(ctx, d, t); break;\n case 'insidePitchfork': renderInsidePitchfork(ctx, d, t); break;\n // ── Shapes menu ───────────────────────────────────────────────────────\n case 'rectangle': renderRectangle(ctx, d, t); break;\n case 'text': renderText(ctx, d, t); break;\n // ── Fib & Gann menu ───────────────────────────────────────────────────\n case 'fibRetracement': renderFibRetracement(ctx, d, t); break;\n }\n}\n\nfunction _renderHandles(ctx: CanvasRenderingContext2D, d: Drawing, t: CoordTransform): void {\n ctx.save();\n ctx.setLineDash([]);\n ctx.lineWidth = 1.5;\n for (const p of d.points) {\n const px = t.timeToX(p.time);\n const py = t.priceToY(p.price);\n ctx.fillStyle = HANDLE_FILL;\n ctx.strokeStyle = HANDLE_STROKE;\n ctx.beginPath();\n ctx.rect(px - HANDLE_HALF, py - HANDLE_HALF, HANDLE_HALF * 2, HANDLE_HALF * 2);\n ctx.fill();\n ctx.stroke();\n }\n ctx.restore();\n}\n\n// ─── Public API ────────────────────────────────────────────────────────────────\n\nexport class DrawingManager {\n private readonly _map = new Map<string, Drawing>();\n\n // ─── CRUD ──────────────────────────────────────────────────────────────────\n\n add(drawing: Omit<Drawing, 'id'>): string {\n const id = nextId();\n this._map.set(id, { ...drawing, id });\n return id;\n }\n\n remove(id: string): boolean {\n return this._map.delete(id);\n }\n\n update(\n id: string,\n patches: Partial<Pick<Drawing, 'points' | 'color' | 'text' | 'visible' | 'lineWidth' | 'fillColor' | 'fillOpacity' | 'deviationMultiplier'>>,\n ): boolean {\n const d = this._map.get(id);\n if (!d) return false;\n this._map.set(id, { ...d, ...patches });\n return true;\n }\n\n get(id: string): Drawing | undefined {\n return this._map.get(id);\n }\n\n has(id: string): boolean {\n return this._map.has(id);\n }\n\n all(): readonly Drawing[] {\n return [...this._map.values()];\n }\n\n clear(): void {\n this._map.clear();\n }\n\n // ─── Rendering ─────────────────────────────────────────────────────────────\n\n render(\n ctx: CanvasRenderingContext2D,\n transform: CoordTransform,\n selectedId: string | null = null,\n interval = '1h',\n candles: readonly OHLCV[] = [],\n ): void {\n ctx.save();\n for (const d of this._map.values()) {\n if (d.visible === false) continue;\n ctx.strokeStyle = d.color ?? '#2196f3';\n ctx.lineWidth = d.lineWidth ?? 1.5;\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n _renderOne(ctx, d, transform, interval, candles);\n if (d.id === selectedId) {\n // Heavier highlight pass\n ctx.save();\n ctx.strokeStyle = d.color ?? '#2196f3';\n ctx.lineWidth = (d.lineWidth ?? 1.5) + 1;\n ctx.globalAlpha = 0.4;\n _renderOne(ctx, d, transform, interval, candles);\n ctx.restore();\n _renderHandles(ctx, d, transform);\n }\n }\n ctx.restore();\n }\n\n renderPreview(\n ctx: CanvasRenderingContext2D,\n transform: CoordTransform,\n draft: Omit<Drawing, 'id'>,\n interval = '1h',\n candles: readonly OHLCV[] = [],\n ): void {\n const d = { id: '__preview__', ...draft } as Drawing;\n ctx.save();\n ctx.globalAlpha = 0.65;\n ctx.setLineDash([6, 4]);\n ctx.strokeStyle = d.color ?? '#2196f3';\n ctx.lineWidth = d.lineWidth ?? 1.5;\n _renderOne(ctx, d, transform, interval, candles);\n ctx.restore();\n }\n\n /** Returns anchor pixel positions — used by InteractionManager for handle hit-testing. */\n static anchorPixels(\n d: Drawing,\n transform: CoordTransform,\n ): Array<{ x: number; y: number }> {\n return d.points.map((p) => ({\n x: transform.timeToX(p.time),\n y: transform.priceToY(p.price),\n }));\n }\n}\n","import type { ChartColors } from '@forgecharts/types';\n\nexport const DARK_COLORS: ChartColors = {\n background: '#000000',\n backgroundSecondary: '#0a0a0a',\n text: '#ffffff',\n textMuted: '#888888',\n grid: '#2a2a2a',\n border: '#333333',\n crosshair: '#ffffff',\n};\n\nexport const LIGHT_COLORS: ChartColors = {\n background: '#ffffff',\n backgroundSecondary: '#f5f5f5',\n text: '#000000',\n textMuted: '#666666',\n grid: '#e8e8e8',\n border: '#cccccc',\n crosshair: '#000000',\n};\n","import type { ChartOptions, ChartColors, ChartTheme, ChartKeyAction, Drawing, DrawingType, DrawingPoint, OHLCV, Timeframe } from '@forgecharts/types';\nimport type { IChart, IChartPlugin } from '../types/IChart';\nimport type { ISeries } from '../types/ISeries';\nimport { CanvasLayer } from './CanvasLayer';\nimport { TimeScale } from './TimeScale';\nimport { PriceScale } from './PriceScale';\nimport { CoordTransform } from './CoordTransform';\nimport { Crosshair } from './Crosshair';\nimport { Series } from './Series';\nimport { InteractionManager } from './InteractionManager';\nimport { DrawingManager } from '../api/DrawingManager';\nimport { DARK_COLORS, LIGHT_COLORS } from '../theme/colors';\n\n// ─── Last-price helpers (module-level) ────────────────────────────────────────\n\nconst _TF_SECONDS: Record<string, number> = {\n '1s': 1, '5s': 5, '10s': 10, '30s': 30,\n '1m': 60, '3m': 180, '5m': 300, '15m': 900, '30m': 1800,\n '1h': 3600, '2h': 7200, '4h': 14400, '6h': 21600, '12h': 43200,\n '1d': 86400, '3d': 259200, '1w': 604800, '1M': 2592000,\n};\n\nfunction _tfToSeconds(tf: Timeframe): number {\n return _TF_SECONDS[tf] ?? 3600;\n}\n\nfunction _formatLastPrice(price: number): string {\n const decimals = price < 1 ? 6 : price < 1000 ? 4 : 2;\n return price.toFixed(decimals);\n}\n\nfunction _formatCountdown(secs: number): string {\n const h = Math.floor(secs / 3600);\n const m = Math.floor((secs % 3600) / 60);\n const s = secs % 60;\n if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n return `${m}:${String(s).padStart(2, '0')}`; \n}\n\n/**\n * Chart — entry point for the ForgeCharts SDK.\n *\n * Manages the canvas layer stack, time/price scales, all series,\n * and the interaction model. Uses the browser Canvas 2D API directly;\n * no third-party chart library dependencies.\n *\n * @example\n * ```ts\n * const chart = new Chart(containerEl, { theme: 'dark' });\n * const series = chart.addSeries({ type: 'candlestick' });\n * series.setData(ohlcvArray);\n * ```\n */\nexport class Chart implements IChart {\n private readonly _container: HTMLElement;\n private readonly _options: Required<ChartOptions>;\n private readonly _colors: ChartColors;\n\n // Canvas layers (back → front): grid, series, overlay\n private readonly _gridLayer: CanvasLayer;\n private readonly _seriesLayer: CanvasLayer;\n private readonly _overlayLayer: CanvasLayer;\n\n private readonly _timeScale: TimeScale;\n private readonly _priceScale: PriceScale;\n private readonly _transform: CoordTransform;\n private readonly _crosshair: Crosshair;\n\n private _series: Series[] = [];\n private _plugins: IChartPlugin[] = [];\n private _animationFrame: number | null = null;\n private _dirty = true;\n private _indicatorsVisible = true;\n /** When true the user has manually adjusted the price scale; auto-fit is suspended. */\n private _priceScaleManual = false;\n /** Active timeframe — used for last-price countdown. */\n private _interval: Timeframe = '1h';\n /** Last second at which we ticked the countdown to force a re-render. */\n private _lastCountdownSec = 0;\n\n private readonly _resizeObserver: ResizeObserver;\n private readonly _interaction: InteractionManager;\n\n // ── Drawing system ───────────────────────────────────────────────────────────────\n private readonly _drawingMgr: DrawingManager;\n private _drawingTool: DrawingType | null = null;\n private _drawingState: 'idle' | 'placing_second' | 'placing_third' = 'idle';\n private _drawingP0: DrawingPoint | null = null;\n private _drawingP1: DrawingPoint | null = null;\n private _drawingCursorPt: DrawingPoint | null = null;\n /** When false the crosshair is suppressed (e.g. Arrow/cursor mode). */\n private _crosshairEnabled = true;\n\n /** Called whenever a drawing is committed (created or updated). */\n onDrawingCommitted: ((drawing: Drawing) => void) | undefined;\n /** Called whenever a drawing is deleted. */\n onDrawingDeleted: ((id: string) => void) | undefined;\n /** Called when the user right-clicks a drawing. x/y are canvas-relative pixels. */\n onDrawingContextMenu: ((id: string, x: number, y: number) => void) | undefined;\n /**\n * Called after every pan or zoom interaction so external code (e.g. TChart)\n * can check whether the visible time range now extends past the oldest\n * loaded bar and trigger a lazy history fetch.\n */\n onViewportChanged: (() => void) | undefined;\n\n constructor(container: HTMLElement, options: ChartOptions = {}) {\n this._container = container;\n this._container.style.position = 'relative';\n this._container.style.overflow = 'hidden';\n\n this._options = this._resolveOptions(options);\n this._colors = this._resolveColors(this._options.theme, this._options.colors);\n\n const { width, height } = container.getBoundingClientRect();\n const dpr = window.devicePixelRatio ?? 1;\n\n this._gridLayer = new CanvasLayer(container, { width, height, dpr, zIndex: 1 });\n this._seriesLayer = new CanvasLayer(container, { width, height, dpr, zIndex: 2 });\n this._overlayLayer = new CanvasLayer(container, { width, height, dpr, zIndex: 3 });\n\n this._timeScale = new TimeScale(this._gridLayer, this._colors, this._options.timeScale);\n this._priceScale = new PriceScale(this._gridLayer, this._colors, this._options.priceScale);\n\n // CoordTransform is the single source of truth for all pixel ↔ data conversions.\n // Created after the scales so it can hold live references to them.\n this._transform = new CoordTransform(\n this._timeScale,\n this._priceScale,\n this._priceScale.width,\n this._timeScale.height,\n );\n this._transform.update(width, height);\n\n this._crosshair = new Crosshair(this._overlayLayer, this._colors, this._options, this._transform);\n\n // Propagate initial timezone to time axis and crosshair\n if (this._options.timezone) {\n this._timeScale.timezone = this._options.timezone;\n this._crosshair.timezone = this._options.timezone;\n }\n this._drawingMgr = new DrawingManager();\n\n this._interaction = new InteractionManager(\n this._overlayLayer.canvas,\n this._transform,\n {\n onPan: (dx, dy) => {\n this._transform.pan(dx, dy);\n this._dirty = true;\n this.onViewportChanged?.();\n },\n onZoom: (factor, originX) => {\n this._transform.zoomTime(factor, originX);\n this._dirty = true;\n this.onViewportChanged?.();\n },\n onCrosshairMove: (x, y) => {\n if (!this._crosshairEnabled) return;\n // Snap the vertical line to the nearest bar's timestamp so it always\n // sits centred on a candle rather than floating between candles.\n const { x: snappedX, time: snappedTime } = this._snapXToBar(x);\n this._crosshair.update(snappedX, y, snappedTime);\n this._dirty = true;\n },\n onCrosshairHide: () => {\n this._crosshair.hide();\n this._dirty = true;\n },\n onKeyAction: (action) => {\n this._handleKeyAction(action);\n },\n onFitContent: () => {\n this.scrollToEnd();\n },\n onPriceScaleZoom: (factor, originY) => {\n this._priceScaleManual = true;\n this._transform.zoomPrice(factor, originY);\n this._dirty = true;\n },\n onPriceAxisDrag: (dy) => {\n this._priceScaleManual = true;\n // Exponential factor: drag down (dy > 0) = expand range, up = compress\n this._transform.zoomPrice(Math.pow(1.005, dy), this._transform.plotHeight / 2);\n this._dirty = true;\n },\n // Drawing tool callbacks\n onDrawClick: (x, y) => {\n this._handleDrawClick(x, y);\n },\n onDrawPointerMove: (x, y) => {\n this._drawingCursorPt = {\n time: this._transform.xToTime(x),\n price: this._transform.yToPrice(y),\n };\n this._dirty = true;\n },\n onHandleDragStart: (_id, _hi) => {\n this._dirty = true;\n },\n onHandleDragMove: (id, handleIndex, x, y) => {\n const drawing = this._drawingMgr.get(id);\n if (!drawing) return;\n const snapped = this._snapToBar(x, y);\n const newPoints = [...drawing.points] as DrawingPoint[];\n newPoints[handleIndex] = snapped;\n this._drawingMgr.update(id, { points: newPoints });\n this._dirty = true;\n },\n onHandleDragEnd: (id, _hi) => {\n const drawing = this._drawingMgr.get(id);\n if (drawing) this.onDrawingCommitted?.(drawing);\n this._dirty = true;\n },\n onBodyMoveStart: (_id) => {\n this._dirty = true;\n },\n onBodyMoveMove: (id, dx, dy) => {\n const drawing = this._drawingMgr.get(id);\n if (!drawing) return;\n const t = this._transform;\n const newPoints = drawing.points.map((p): DrawingPoint => ({\n time: t.xToTime(t.timeToX(p.time) + dx),\n price: t.yToPrice(t.priceToY(p.price) + dy),\n }));\n this._drawingMgr.update(id, { points: newPoints });\n this._dirty = true;\n },\n onBodyMoveEnd: (id) => {\n const drawing = this._drawingMgr.get(id);\n if (drawing) this.onDrawingCommitted?.(drawing);\n this._dirty = true;\n },\n onContextMenu: (x, y, hit) => {\n // Right-click while a drawing tool is active cancels placement.\n if (this._drawingTool !== null) {\n this.cancelDrawingTool();\n return;\n }\n if (hit.kind === 'drawing') {\n this.onDrawingContextMenu?.(hit.id, x, y);\n }\n },\n },\n {\n enablePan: this._options.handleScroll,\n enableZoom: this._options.handleScale,\n },\n );\n\n this._resizeObserver = new ResizeObserver(() => this._onResize());\n this._resizeObserver.observe(container);\n\n this._scheduleRender();\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────────\n\n addSeries(options: Parameters<IChart['addSeries']>[0]): ISeries {\n const series = new Series(options, this._colors);\n // Wire live-tick repaints: whenever series data changes (WS tick calls\n // series.update()), immediately mark the canvas dirty so the forming bar\n // and last-price label repaint on the very next RAF frame — not once/second.\n series.onDataChanged = () => { this._dirty = true; };\n this._series.push(series);\n this._dirty = true;\n return series;\n }\n\n removeSeries(series: ISeries): void {\n this._series = this._series.filter((s) => s !== series);\n this._dirty = true;\n }\n\n addPlugin(plugin: IChartPlugin): void {\n this._plugins.push(plugin);\n plugin.onAttach(this);\n }\n\n removePlugin(plugin: IChartPlugin): void {\n this._plugins = this._plugins.filter((p) => p !== plugin);\n plugin.onDetach();\n }\n\n /** Set the active timeframe so the last-price countdown is accurate. */\n setInterval(tf: Timeframe): void {\n this._interval = tf;\n this._crosshair.interval = tf;\n this._timeScale.setTimeframe(tf);\n this._dirty = true;\n }\n\n timeScale(): TimeScale {\n return this._timeScale;\n }\n\n priceScale(): PriceScale {\n return this._priceScale;\n }\n\n applyOptions(options: Partial<ChartOptions>): void {\n Object.assign(this._options as Record<string, unknown>, options);\n if (options.timezone !== undefined) {\n this._timeScale.timezone = options.timezone;\n this._crosshair.timezone = options.timezone;\n }\n if (options.colors !== undefined || options.theme !== undefined) {\n const fresh = this._resolveColors(this._options.theme, this._options.colors);\n Object.assign(this._colors as Record<string, unknown>, fresh);\n }\n this._dirty = true;\n }\n\n /** Pans the viewport so the latest bar is visible at the right edge. */\n scrollToEnd(): void {\n this._scrollToLatestBar();\n this._dirty = true;\n }\n\n /** Returns the coordinate transform for this chart. */\n transform(): CoordTransform {\n return this._transform;\n }\n\n resize(width: number, height: number): void {\n const dpr = window.devicePixelRatio ?? 1;\n this._gridLayer.resize(width, height, dpr);\n this._seriesLayer.resize(width, height, dpr);\n this._overlayLayer.resize(width, height, dpr);\n this._transform.update(width, height);\n // Repaint synchronously so the canvas is never left blank between the\n // clear (caused by assigning canvas.width/height) and the next RAF tick.\n this._dirty = true;\n this._render();\n }\n\n destroy(): void {\n if (this._animationFrame !== null) cancelAnimationFrame(this._animationFrame);\n this._resizeObserver.disconnect();\n this._interaction.destroy();\n this._gridLayer.destroy();\n this._seriesLayer.destroy();\n this._overlayLayer.destroy();\n this._crosshair.destroy();\n this._plugins.forEach((p) => p.onDetach());\n this._series = [];\n this._plugins = [];\n }\n\n // ─── Rendering ───────────────────────────────────────────────────────────────\n\n private _scheduleRender(): void {\n this._animationFrame = requestAnimationFrame(() => {\n // Tick the countdown once per second so the label stays current.\n const nowSec = Math.floor(Date.now() / 1000);\n if (this._series.length > 0 && nowSec !== this._lastCountdownSec) {\n this._lastCountdownSec = nowSec;\n this._dirty = true;\n }\n this._render();\n this._scheduleRender();\n });\n }\n\n private _render(): void {\n if (!this._dirty) return;\n this._dirty = false;\n\n // Auto-fit the price scale to the currently visible bars every frame.\n // This keeps the candles in view after panning/zooming the time axis.\n this._autoFitPriceToData();\n\n this._renderGrid();\n this._renderSeries();\n this._renderOverlay();\n\n this._plugins.forEach((p) => p.onRender());\n }\n\n private _renderGrid(): void {\n const ctx = this._gridLayer.context;\n const { width, height } = this._gridLayer;\n ctx.clearRect(0, 0, width, height);\n\n // Background\n ctx.fillStyle = this._colors.background;\n ctx.fillRect(0, 0, width, height);\n\n this._timeScale.render(ctx, width, height);\n this._priceScale.render(ctx, width, height);\n }\n\n setAllDrawingsVisible(v: boolean): void {\n for (const d of this._drawingMgr.all()) {\n this._drawingMgr.update(d.id, { visible: v });\n }\n this._dirty = true;\n }\n\n setIndicatorsVisible(v: boolean): void {\n this._indicatorsVisible = v;\n this._dirty = true;\n }\n\n private _renderSeries(): void {\n const ctx = this._seriesLayer.context;\n const { width, height } = this._seriesLayer;\n ctx.clearRect(0, 0, width, height);\n\n if (!this._indicatorsVisible) return;\n\n const viewport = this._computeViewport();\n for (const series of this._series) {\n series.render(ctx, viewport, { x: 0, y: 0, width, height });\n }\n }\n\n private _renderOverlay(): void {\n const ctx = this._overlayLayer.context;\n const { width, height } = this._overlayLayer;\n ctx.clearRect(0, 0, width, height);\n\n // Committed drawings\n const selectedId = this._interaction.selectedDrawingId;\n const candles = this._series[0]?.data() ?? [];\n this._drawingMgr.render(ctx, this._transform, selectedId, this._interval, candles);\n this._interaction.setDrawings(this._drawingMgr.all());\n\n // In-progress placement preview\n if (this._drawingTool !== null && this._drawingCursorPt !== null) {\n const draft = this._buildDraftPreview();\n if (draft) this._drawingMgr.renderPreview(ctx, this._transform, draft, this._interval, candles);\n }\n\n // Last-price dotted line + countdown\n this._renderLastPriceLine(ctx);\n\n this._crosshair.render(ctx, width, height);\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n /**\n * Snaps a pixel X coordinate to the nearest bar's centre pixel.\n * If no bars are loaded, or the nearest bar is more than SNAP_PX pixels away,\n * returns the original x so the crosshair always renders at the cursor position.\n */\n private _snapXToBar(x: number): { x: number; time: number } {\n const SNAP_PX = 20; // only snap when within this many pixels of a bar\n\n // Collect all bar timestamps from the first series that has data.\n let times: number[] | null = null;\n for (const s of this._series) {\n const data = s.data();\n if (data.length > 0) {\n times = data.map((b) => b.time);\n break;\n }\n }\n if (!times || times.length === 0) return { x, time: this._transform.xToTime(x) };\n\n // Find the nearest bar in pixel space (not time space) so the snap radius is\n // consistent regardless of timeframe or zoom level.\n let nearestTime = times[0]!;\n let minPixDist = Math.abs(this._transform.timeToX(nearestTime) - x);\n for (let i = 1; i < times.length; i++) {\n const px = this._transform.timeToX(times[i]!);\n const d = Math.abs(px - x);\n if (d < minPixDist) { minPixDist = d; nearestTime = times[i]!; }\n }\n\n // If the nearest bar is within SNAP_PX, snap to it; otherwise keep raw cursor x.\n if (minPixDist <= SNAP_PX) {\n return { x: this._transform.timeToX(nearestTime), time: nearestTime };\n }\n return { x, time: this._transform.xToTime(x) };\n }\n\n private _computeViewport() {\n return {\n timeRange: this._timeScale.visibleRange,\n priceRange: this._priceScale.visibleRange,\n };\n }\n\n private _onResize(): void {\n const { width, height } = this._container.getBoundingClientRect();\n this.resize(width, height);\n }\n\n private _handleKeyAction(action: ChartKeyAction): void {\n const step = 40;\n const zf = 1.1;\n const cx = this._transform.plotWidth / 2;\n\n switch (action) {\n case 'panLeft': this._transform.pan( step, 0); break;\n case 'panRight': this._transform.pan(-step, 0); break;\n case 'panUp': this._transform.pan(0, step); break;\n case 'panDown': this._transform.pan(0, -step); break;\n case 'zoomIn': this._transform.zoomTime(1 / zf, cx); break;\n case 'zoomOut': this._transform.zoomTime(zf, cx); break;\n case 'scrollToEnd': this._scrollToLatestBar(); break;\n case 'scrollToStart': break;\n case 'deselect':\n if (this._drawingTool !== null) {\n this.cancelDrawingTool();\n } else {\n this._interaction.clearSelection();\n }\n break;\n case 'deleteSelection':\n this.deleteSelectedDrawing();\n break;\n }\n this._dirty = true;\n }\n\n /**\n * Fits the price scale to the high/low range of bars visible in the current\n * time window. Called every render frame so the scale tracks panning/zooming.\n */\n private _autoFitPriceToData(): void {\n if (this._priceScaleManual) return;\n const { from, to } = this._timeScale.visibleRange;\n let low = Infinity, high = -Infinity;\n for (const series of this._series) {\n for (const bar of series.data()) {\n if (bar.time < from || bar.time > to) continue;\n if (bar.low < low) low = bar.low;\n if (bar.high > high) high = bar.high;\n }\n }\n if (!isFinite(low) || !isFinite(high)) return;\n const pad = (high - low) * 0.05;\n this._priceScale.setVisibleRange({ min: low - pad, max: high + pad });\n }\n\n /**\n * Renders the last-price dotted line, price label, and countdown timer.\n * Drawn on the overlay canvas above all series but below the crosshair.\n */\n private _renderLastPriceLine(ctx: CanvasRenderingContext2D): void {\n if (this._series.length === 0) return;\n const data = this._series[0]!.data();\n if (data.length === 0) return;\n const lastBar = data[data.length - 1]!;\n\n const plotWidth = this._transform.plotWidth;\n const plotHeight = this._transform.plotHeight;\n const psWidth = this._transform.priceScaleWidth;\n const price = lastBar.close;\n const y = this._transform.priceToY(price);\n\n if (y < 0 || y > plotHeight) return;\n\n const isUp = lastBar.close >= lastBar.open;\n const lineColor = isUp ? '#26a641' : '#f85149';\n\n ctx.save();\n\n // Dotted horizontal line across the plot area\n ctx.beginPath();\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = 1;\n ctx.setLineDash([2, 3]);\n ctx.moveTo(0, y);\n ctx.lineTo(plotWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Countdown calculation\n const tfSecs = _tfToSeconds(this._interval);\n const now = Math.floor(Date.now() / 1000);\n const remaining = lastBar.time + tfSecs - now;\n const showCd = remaining > 0 && remaining <= tfSecs;\n\n // Label box — taller when countdown is shown\n const priceLabel = _formatLastPrice(price);\n const lineH = 15;\n const boxH = showCd ? lineH * 2 + 1 : lineH;\n const boxY = y - lineH / 2;\n\n ctx.fillStyle = lineColor;\n ctx.fillRect(plotWidth, boxY, psWidth, boxH);\n\n ctx.fillStyle = '#ffffff';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.font = 'bold 11px system-ui, sans-serif';\n ctx.fillText(priceLabel, plotWidth + 5, boxY + lineH / 2);\n\n if (showCd) {\n ctx.font = '10px system-ui, sans-serif';\n ctx.fillStyle = 'rgba(255,255,255,0.85)';\n ctx.fillText(_formatCountdown(remaining), plotWidth + 5, boxY + lineH + 1 + lineH / 2);\n }\n\n ctx.restore();\n }\n\n /** Pans the viewport so the latest bar sits near the right edge. */\n private _scrollToLatestBar(): void {\n let latestTime = -Infinity;\n for (const s of this._series) {\n const data = s.data();\n const last = data[data.length - 1];\n if (last && last.time > latestTime) latestTime = last.time;\n }\n if (!isFinite(latestTime)) return;\n const pad = this._transform.plotWidth * 0.05;\n const px = this._transform.timeToX(latestTime);\n this._transform.pan(-(px - (this._transform.plotWidth - pad)), 0);\n }\n\n /**\n * Returns the current visible time and price ranges.\n */\n getViewport(): import('@forgecharts/types').Viewport {\n return {\n timeRange: this._timeScale.visibleRange,\n priceRange: this._priceScale.visibleRange,\n };\n }\n\n /**\n * Restores a previously saved viewport (time range + manual price range).\n */\n restoreViewport(v: import('@forgecharts/types').Viewport): void {\n this._timeScale.setVisibleRange(v.timeRange);\n this._priceScale.setVisibleRange(v.priceRange);\n this._priceScaleManual = true;\n this._dirty = true;\n }\n\n /**\n * Clears the manual-price-scale flag so the price axis returns to auto-fit mode.\n * Call this after restoring a saved viewport so stale price ranges don't persist.\n */\n resetPriceScale(): void {\n this._priceScaleManual = false;\n this._dirty = true;\n }\n\n /**\n * Sets the default viewport: shows 10 days of price history with the latest\n * bar positioned near the right edge (5% right margin for breathing room).\n * Also resets the price scale to auto-fit so prices center vertically.\n * Called on initial data load and when the user double-clicks either axis.\n */\n fitDefaultView(): void {\n let latestTime = -Infinity;\n for (const s of this._series) {\n const data = s.data();\n const last = data[data.length - 1];\n if (last && last.time > latestTime) latestTime = last.time;\n }\n if (!isFinite(latestTime)) return;\n // Show ~150 candles worth of history, scaled to the current timeframe.\n // Latest bar sits at the 90% position (10% breathing room on the right).\n const tfSec = _tfToSeconds(this._interval);\n const WINDOW = tfSec * 150;\n this._timeScale.setVisibleRange({\n from: latestTime - WINDOW * 0.9,\n to: latestTime + WINDOW * 0.1,\n });\n // Reset manual price scale so prices auto-fit to visible bars\n this._priceScaleManual = false;\n this._dirty = true;\n }\n\n // ─── Drawing tool API ──────────────────────────────────────────────────────\n\n /** Returns the DrawingManager owned by this chart. */\n drawingManager(): DrawingManager {\n return this._drawingMgr;\n }\n\n /** Force a redraw on the next animation frame. */\n markDirty(): void {\n this._dirty = true;\n }\n\n /**\n * Activates a drawing tool. While active, mouse clicks place anchors.\n * The tool auto-cancels after each commit. Press Escape to cancel mid-placement.\n */\n startDrawingTool(type: DrawingType): void {\n this._drawingTool = type;\n this._drawingState = 'idle';\n this._drawingP0 = null;\n this._drawingP1 = null;\n this._drawingCursorPt = null;\n this._interaction.setDrawingMode(true);\n this._dirty = true;\n }\n\n /** Cancels any in-progress drawing and returns to cursor mode. */\n cancelDrawingTool(): void {\n this._drawingTool = null;\n this._drawingState = 'idle';\n this._drawingP0 = null;\n this._drawingP1 = null;\n this._drawingCursorPt = null;\n this._interaction.setDrawingMode(false);\n this._dirty = true;\n }\n\n /**\n * Show or hide the interactive crosshair lines.\n * Pass `false` for Arrow/cursor mode; `true` for crosshair / dot / demonstration.\n */\n setCrosshairEnabled(enabled: boolean): void {\n this._crosshairEnabled = enabled;\n this._interaction.setHideCursor(enabled);\n if (!enabled) {\n this._crosshair.hide();\n this._dirty = true;\n }\n }\n\n /**\n * Hides (`true`) or restores (`false`) the native OS cursor.\n * Call with `true` for dot and demonstration pointer modes whose visuals\n * come from PointerOverlay rather than the SDK crosshair.\n */\n setNativeCursorHidden(hidden: boolean): void {\n this._interaction.setHideCursor(hidden);\n }\n\n /** Deletes the currently selected drawing (if any). */\n deleteSelectedDrawing(): void {\n const id = this._interaction.selectedDrawingId;\n if (!id) return;\n this._drawingMgr.remove(id);\n this._interaction.clearSelection();\n this.onDrawingDeleted?.(id);\n this._dirty = true;\n }\n\n // ─── Drawing placement state machine ──────────────────────────────────────\n\n private _handleDrawClick(x: number, y: number): void {\n const tool = this._drawingTool;\n if (!tool) return;\n\n const snapped = this._snapToBar(x, y);\n\n const isSingleAnchor =\n tool === 'horizontal' || tool === 'vertical' || tool === 'text' ||\n tool === 'horizontalRay' || tool === 'crossLine';\n\n if (isSingleAnchor) {\n let label: string | undefined;\n if (tool === 'text') {\n const input = window.prompt('Enter text:');\n if (input === null) return; // cancelled\n label = input || 'Text';\n }\n const id = this._drawingMgr.add({\n type: tool,\n points: [snapped],\n color: this._colors.crosshair,\n ...(label !== undefined ? { text: label } : {}),\n });\n const drawing = this._drawingMgr.get(id)!;\n this.onDrawingCommitted?.(drawing);\n this.cancelDrawingTool();\n return;\n }\n\n const isThreeAnchor =\n tool === 'parallelChannel' || tool === 'flatTopBottom' ||\n tool === 'pitchfork' || tool === 'schiffPitchfork' ||\n tool === 'modifiedSchiffPitchfork' || tool === 'insidePitchfork';\n\n if (isThreeAnchor) {\n if (this._drawingState === 'idle') {\n this._drawingP0 = snapped;\n this._drawingState = 'placing_second';\n this._dirty = true;\n } else if (this._drawingState === 'placing_second') {\n this._drawingP1 = snapped;\n this._drawingState = 'placing_third';\n this._dirty = true;\n } else {\n // For parallel channel, only the cursor's Y/price matters for the offset;\n // lock p2.time to p1.time so the handle sits at the channel corner.\n const p2: DrawingPoint = tool === 'parallelChannel'\n ? { time: this._drawingP1!.time, price: snapped.price }\n : snapped;\n const id = this._drawingMgr.add({\n type: tool,\n points: [this._drawingP0!, this._drawingP1!, p2],\n color: this._colors.crosshair,\n });\n const drawing = this._drawingMgr.get(id)!;\n this.onDrawingCommitted?.(drawing);\n this.cancelDrawingTool();\n }\n return;\n }\n\n // Two-anchor tools\n if (this._drawingState === 'idle') {\n this._drawingP0 = snapped;\n this._drawingState = 'placing_second';\n this._dirty = true;\n } else {\n const p0 = this._drawingP0!;\n\n if (tool === 'disjointChannel') {\n // Auto-place the second line below the first by a default pixel offset.\n // This gives an immediate wedge shape the user can then drag to reshape.\n const DEFAULT_OFFSET_PX = 60;\n const p2: DrawingPoint = {\n time: p0.time,\n price: this._transform.yToPrice(this._transform.priceToY(p0.price) + DEFAULT_OFFSET_PX),\n };\n const p3: DrawingPoint = {\n time: snapped.time,\n price: this._transform.yToPrice(this._transform.priceToY(snapped.price) + DEFAULT_OFFSET_PX),\n };\n const id = this._drawingMgr.add({\n type: tool,\n points: [p0, snapped, p2, p3],\n color: this._colors.crosshair,\n });\n const drawing = this._drawingMgr.get(id)!;\n this.onDrawingCommitted?.(drawing);\n this.cancelDrawingTool();\n } else {\n const id = this._drawingMgr.add({ type: tool, points: [p0, snapped], color: this._colors.crosshair });\n const drawing = this._drawingMgr.get(id)!;\n this.onDrawingCommitted?.(drawing);\n this.cancelDrawingTool();\n }\n }\n }\n\n private _buildDraftPreview(): Omit<Drawing, 'id'> | null {\n const tool = this._drawingTool;\n const cursor = this._drawingCursorPt;\n if (!tool || !cursor) return null;\n\n const isSingleAnchor =\n tool === 'horizontal' || tool === 'vertical' || tool === 'text' ||\n tool === 'horizontalRay' || tool === 'crossLine';\n\n if (isSingleAnchor) {\n return { type: tool, points: [cursor], color: this._colors.crosshair };\n }\n\n if (this._drawingState === 'placing_third' && this._drawingP0 && this._drawingP1) {\n // For parallel channel, lock p2 to p1's time so the cursor tracks the channel corner\n const p2 = tool === 'parallelChannel'\n ? { time: this._drawingP1.time, price: cursor.price }\n : cursor;\n return { type: tool, points: [this._drawingP0, this._drawingP1, p2], color: this._colors.crosshair };\n }\n if (this._drawingState === 'placing_second' && this._drawingP0) {\n return { type: tool, points: [this._drawingP0, cursor], color: this._colors.crosshair };\n }\n if (this._drawingP0 === null) {\n return { type: tool, points: [cursor], color: this._colors.crosshair };\n }\n return null;\n }\n\n /**\n * Snaps the pixel position to the nearest bar's time within SNAP_PX.\n * Returns a DrawingPoint with the snapped time and the raw price at y.\n */\n private _snapToBar(x: number, y: number): DrawingPoint {\n const SNAP_PX = 10;\n const t = this._transform;\n const price = t.yToPrice(y);\n const time = t.xToTime(x);\n\n let bestBar: OHLCV | null = null;\n let bestDist = SNAP_PX;\n\n for (const series of this._series) {\n for (const bar of series.data()) {\n const bx = t.timeToX(bar.time);\n const dist = Math.abs(bx - x);\n if (dist < bestDist) {\n bestDist = dist;\n bestBar = bar;\n }\n }\n }\n\n return { time: bestBar ? bestBar.time : time, price };\n }\n\n private _resolveOptions(opts: ChartOptions): Required<ChartOptions> {\n return {\n theme: opts.theme ?? 'dark',\n colors: opts.colors ?? {},\n timeScale: opts.timeScale ?? {},\n priceScale: opts.priceScale ?? {},\n crosshair: opts.crosshair ?? {},\n handleScroll: opts.handleScroll ?? true,\n handleScale: opts.handleScale ?? true,\n timezone: opts.timezone ?? 'UTC',\n };\n }\n\n private _resolveColors(\n theme: ChartTheme,\n overrides: Partial<import('@forgecharts/types').ChartColors>,\n ): ChartColors {\n const base = theme === 'dark' ? DARK_COLORS : LIGHT_COLORS;\n return { ...base, ...overrides };\n }\n}\n","import type { ChartEventMap } from '@forgecharts/types';\n\ntype Handler<T> = (payload: T) => void;\n\n/**\n * EventBus — internal typed pub/sub used by TChart.\n *\n * All event keys are constrained to `keyof ChartEventMap`, giving\n * full type inference on payload shapes at every call site.\n */\nexport class EventBus {\n private readonly _listeners = new Map<\n keyof ChartEventMap,\n Set<Handler<unknown>>\n >();\n\n on<K extends keyof ChartEventMap>(event: K, handler: Handler<ChartEventMap[K]>): void {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(handler as Handler<unknown>);\n }\n\n off<K extends keyof ChartEventMap>(event: K, handler: Handler<ChartEventMap[K]>): void {\n this._listeners.get(event)?.delete(handler as Handler<unknown>);\n }\n\n once<K extends keyof ChartEventMap>(event: K, handler: Handler<ChartEventMap[K]>): void {\n const wrapper = (payload: ChartEventMap[K]): void => {\n handler(payload);\n this.off(event, wrapper);\n };\n this.on(event, wrapper);\n }\n\n emit<K extends keyof ChartEventMap>(event: K, payload: ChartEventMap[K]): void {\n const handlers = this._listeners.get(event);\n if (!handlers) return;\n for (const h of handlers) {\n try {\n (h as Handler<ChartEventMap[K]>)(payload);\n } catch (err) {\n // Prevent one bad handler from breaking the others\n console.error(`[ForgeCharts] Unhandled error in \"${event}\" listener`, err);\n }\n }\n }\n\n /** Removes all listeners — called on chart destruction. */\n clear(): void {\n this._listeners.clear();\n }\n}\n","import type { IndicatorConfig, IndicatorInstance } from '@forgecharts/types';\n\nlet _counter = 0;\nfunction nextId(): string {\n return `indicator_${(++_counter).toString().padStart(4, '0')}`;\n}\n\n/**\n * IndicatorRegistry — tracks active indicator instances for a chart.\n * Rendering is a separate concern (handled by sub-pane renderers, out of SDK scope).\n */\nexport class IndicatorRegistry {\n private readonly _map = new Map<string, IndicatorInstance>();\n\n /**\n * Registers a new indicator and returns its opaque id.\n */\n add(config: IndicatorConfig): string {\n const id = nextId();\n this._map.set(id, { id, config });\n return id;\n }\n\n /**\n * Removes an indicator by id.\n * @returns `true` if the indicator existed and was removed.\n */\n remove(id: string): boolean {\n return this._map.delete(id);\n }\n\n get(id: string): IndicatorInstance | undefined {\n return this._map.get(id);\n }\n\n has(id: string): boolean {\n return this._map.has(id);\n }\n\n all(): readonly IndicatorInstance[] {\n return [...this._map.values()];\n }\n\n clear(): void {\n this._map.clear();\n }\n}\n","import type {\n ChartLayout,\n ChartInterval,\n ChartTheme,\n IndicatorInstance,\n Drawing,\n Viewport,\n PaneDescriptor,\n} from '@forgecharts/types';\n\n/**\n * LayoutManager — pure serialisation / deserialisation of chart state.\n * No side effects; state mutations are the caller's responsibility.\n */\nexport class LayoutManager {\n /**\n * Produces a serialisable snapshot of the current chart state.\n */\n static save(params: {\n symbol: string;\n interval: ChartInterval;\n theme: ChartTheme;\n indicators: readonly IndicatorInstance[];\n drawings: readonly Drawing[];\n viewport?: Viewport;\n panes?: readonly PaneDescriptor[];\n }): ChartLayout {\n return {\n symbol: params.symbol,\n interval: params.interval,\n theme: params.theme,\n indicators: [...params.indicators],\n drawings: [...params.drawings],\n ...(params.viewport !== undefined ? { viewport: params.viewport } : {}),\n ...(params.panes !== undefined && params.panes.length > 0 ? { panes: [...params.panes] } : {}),\n savedAt: Date.now(),\n };\n }\n\n /**\n * Serialises a layout to a JSON string safe for `localStorage` / remote persistence.\n */\n static toJSON(layout: ChartLayout): string {\n return JSON.stringify(layout);\n }\n\n /**\n * Parses a JSON string back into a ChartLayout.\n * Throws if the string is malformed.\n */\n static fromJSON(raw: string): ChartLayout {\n const parsed: unknown = JSON.parse(raw);\n if (!LayoutManager._isLayout(parsed)) {\n throw new Error('[ForgeCharts] LayoutManager.fromJSON: invalid layout schema');\n }\n return parsed;\n }\n\n private static _isLayout(v: unknown): v is ChartLayout {\n if (typeof v !== 'object' || v === null) return false;\n const l = v as Record<string, unknown>;\n return (\n typeof l['symbol'] === 'string' &&\n typeof l['interval'] === 'string' &&\n typeof l['theme'] === 'string' &&\n Array.isArray(l['indicators']) &&\n Array.isArray(l['drawings']) &&\n typeof l['savedAt'] === 'number' &&\n (l['panes'] === undefined || Array.isArray(l['panes']))\n );\n }\n}\n","import type { PaneDescriptor } from '@forgecharts/types';\n\nlet _paneId = 0;\nfunction _nextId(): string {\n return `pane-${(++_paneId).toString()}`;\n}\n\n/**\n * PaneManager — manages the collection of sub-pane (indicator panel) descriptors.\n *\n * Each `PaneDescriptor` carries:\n * - a stable `id`\n * - a `heightFraction` (0–1, all panes sum to 1)\n * - the `indicatorIds` assigned to that pane\n *\n * Height redistribution is proportional: when a pane is added/removed/resized,\n * the remaining panes absorb or donate height proportionally to their current sizes.\n */\nexport class PaneManager {\n private _panes: PaneDescriptor[] = [];\n\n getPanes(): readonly PaneDescriptor[] {\n return this._panes;\n }\n\n /**\n * Creates a new pane, distributing total height evenly across all panes.\n * @returns The new pane's id.\n */\n createPane(label?: string): string {\n const id = _nextId();\n const newFraction = 1 / (this._panes.length + 1);\n // Shrink existing panes proportionally\n this._panes = this._panes.map((p) => ({\n ...p,\n heightFraction: p.heightFraction * (1 - newFraction),\n }));\n this._panes.push({\n id,\n heightFraction: newFraction,\n indicatorIds: [],\n ...(label !== undefined ? { label } : {}),\n });\n return id;\n }\n\n /**\n * Removes a pane and redistributes its height fraction to remaining panes.\n */\n removePane(id: string): void {\n const idx = this._panes.findIndex((p) => p.id === id);\n if (idx === -1) return;\n const freed = this._panes[idx]!.heightFraction;\n this._panes.splice(idx, 1);\n if (this._panes.length > 0) {\n const total = this._panes.reduce((s, p) => s + p.heightFraction, 0);\n if (total > 0) {\n this._panes = this._panes.map((p) => ({\n ...p,\n heightFraction: p.heightFraction + freed * (p.heightFraction / total),\n }));\n } else {\n const even = 1 / this._panes.length;\n this._panes = this._panes.map((p) => ({ ...p, heightFraction: even }));\n }\n }\n }\n\n /**\n * Assigns an indicator to a pane, removing it from any previous pane first.\n */\n assignIndicator(indicatorId: string, paneId: string): void {\n // Remove from every pane first (mutual exclusion)\n this._panes = this._panes.map((p) => ({\n ...p,\n indicatorIds: p.indicatorIds.filter((iid) => iid !== indicatorId),\n }));\n const idx = this._panes.findIndex((p) => p.id === paneId);\n if (idx === -1) return;\n const pane = this._panes[idx]!;\n this._panes[idx] = { ...pane, indicatorIds: [...pane.indicatorIds, indicatorId] };\n }\n\n /**\n * Unassigns an indicator from whichever pane currently holds it.\n */\n unassignIndicator(indicatorId: string): void {\n this._panes = this._panes.map((p) => ({\n ...p,\n indicatorIds: p.indicatorIds.filter((iid) => iid !== indicatorId),\n }));\n }\n\n /**\n * Resizes a pane by setting its `heightFraction`, clamped to [0.05, 0.9].\n * Remaining panes absorb the difference proportionally.\n */\n resizePane(id: string, newFraction: number): void {\n const clamped = Math.min(Math.max(newFraction, 0.05), 0.9);\n const idx = this._panes.findIndex((p) => p.id === id);\n if (idx === -1) return;\n const old = this._panes[idx]!.heightFraction;\n const delta = clamped - old;\n const othersTotal = this._panes.reduce(\n (s, p, i) => (i !== idx ? s + p.heightFraction : s),\n 0,\n );\n this._panes = this._panes.map((p, i) => {\n if (i === idx) return { ...p, heightFraction: clamped };\n const share =\n othersTotal > 0\n ? p.heightFraction / othersTotal\n : 1 / Math.max(1, this._panes.length - 1);\n return { ...p, heightFraction: Math.max(0.05, p.heightFraction - delta * share) };\n });\n }\n\n serialize(): readonly PaneDescriptor[] {\n return [...this._panes];\n }\n\n restore(panes: readonly PaneDescriptor[]): void {\n this._panes = [...panes];\n }\n\n clear(): void {\n this._panes = [];\n }\n}\n","/**\n * Canonical Timeframe Registry\n *\n * Single source of truth for every timeframe the platform supports.\n *\n * Rules encoded here:\n * - `fixed` — a constant millisecond interval; ms is always present.\n * - `calendar_week` — Monday-aligned ISO week; ms is NOT set.\n * - `calendar_month` — first day of calendar month UTC; ms is NOT set.\n *\n * DO NOT approximate 1w as 604_800_000 ms or 1M as 2_592_000_000 ms anywhere\n * in the codebase. Use `calendar_week` / `calendar_month` and the functions\n * in timeUtils.ts to compute bucket boundaries correctly.\n *\n * Timeframes intentionally excluded:\n * - 3h, 8h — orphaned: present in bars.ts but absent from the TV API\n * TF_MAP and from timeframeUtils.TF_MS. Excluded from the\n * canonical registry; will be removed from bars.ts in the next\n * refactor phase.\n * - 1s/5s/10s/30s — no data pipeline support; reserved for a future\n * tick-based feed.\n */\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TimeframeKind = 'fixed' | 'calendar_week' | 'calendar_month';\n\n/**\n * Describes one supported timeframe.\n *\n * `ms` is present **only** on `fixed` timeframes. It is intentionally absent\n * on `calendar_week` and `calendar_month` to prevent callers from treating\n * them as fixed-interval buckets.\n */\nexport type TimeframeDefinition =\n | { key: string; kind: 'fixed'; ms: number }\n | { key: string; kind: 'calendar_week'; ms?: never }\n | { key: string; kind: 'calendar_month'; ms?: never };\n\n// ─── Registry ─────────────────────────────────────────────────────────────────\n\n/**\n * Canonical timeframe registry, keyed by the internal label string.\n *\n * @example\n * import { TIMEFRAMES } from '@forgecharts/shared/time';\n * const def = TIMEFRAMES['1h']; // { key: '1h', kind: 'fixed', ms: 3_600_000 }\n * const weekly = TIMEFRAMES['1w']; // { key: '1w', kind: 'calendar_week' }\n * const isFixed = def.kind === 'fixed'; // true\n */\nexport const TIMEFRAMES: Readonly<Record<string, TimeframeDefinition>> = {\n // ── Sub-hour ──────────────────────────────────────────────────────────────\n '1m': { key: '1m', kind: 'fixed', ms: 60_000 },\n '2m': { key: '2m', kind: 'fixed', ms: 120_000 },\n '3m': { key: '3m', kind: 'fixed', ms: 180_000 },\n '4m': { key: '4m', kind: 'fixed', ms: 240_000 },\n '5m': { key: '5m', kind: 'fixed', ms: 300_000 },\n '10m': { key: '10m', kind: 'fixed', ms: 600_000 },\n '15m': { key: '15m', kind: 'fixed', ms: 900_000 },\n '20m': { key: '20m', kind: 'fixed', ms: 1_200_000 },\n '30m': { key: '30m', kind: 'fixed', ms: 1_800_000 },\n '45m': { key: '45m', kind: 'fixed', ms: 2_700_000 },\n\n // ── Hourly ────────────────────────────────────────────────────────────────\n '1h': { key: '1h', kind: 'fixed', ms: 3_600_000 },\n '2h': { key: '2h', kind: 'fixed', ms: 7_200_000 },\n '4h': { key: '4h', kind: 'fixed', ms: 14_400_000 },\n '6h': { key: '6h', kind: 'fixed', ms: 21_600_000 },\n '12h': { key: '12h', kind: 'fixed', ms: 43_200_000 },\n\n // ── Daily ─────────────────────────────────────────────────────────────────\n '1d': { key: '1d', kind: 'fixed', ms: 86_400_000 },\n '3d': { key: '3d', kind: 'fixed', ms: 259_200_000 },\n\n // ── Calendar — MUST NOT have a fixed ms value ──────────────────────────\n '1w': { key: '1w', kind: 'calendar_week' },\n '1M': { key: '1M', kind: 'calendar_month' },\n} as const;\n\n// ─── Derived helpers ──────────────────────────────────────────────────────────\n\n/**\n * All canonical timeframe keys in display order (shortest → longest).\n *\n * @example\n * import { TIMEFRAME_KEYS } from '@forgecharts/shared/time';\n * // ['1m', '2m', '3m', '4m', '5m', '10m', '15m', '20m', '30m', '45m',\n * // '1h', '2h', '4h', '6h', '12h', '1d', '3d', '1w', '1M']\n */\nexport const TIMEFRAME_KEYS: readonly string[] = Object.keys(TIMEFRAMES);\n\n/**\n * Return `true` when `key` is a recognised canonical timeframe label.\n *\n * @example\n * isKnownTimeframe('4h') // true\n * isKnownTimeframe('3h') // false — orphaned timeframe, excluded from registry\n */\nexport function isKnownTimeframe(key: string): key is keyof typeof TIMEFRAMES {\n return Object.prototype.hasOwnProperty.call(TIMEFRAMES, key);\n}\n","/**\n * Canonical Time Utilities\n *\n * The ONE place in the entire codebase that implements candle-bucket maths.\n *\n * Rules:\n * - All functions operate in Unix **milliseconds** internally.\n * - `normalizeTimestamp` is the mandatory entry-point for any external value\n * (WebSocket tick, REST response, user input) before it enters the engine.\n * - `getBucketStart` is the only permitted bucket-floor implementation.\n * No other file may re-implement floor(t / interval) or similar.\n * - Weekly buckets are Monday-aligned (ISO 8601). Never use epoch / 604800.\n * - Monthly buckets are the UTC 1st-of-month. Never approximate as 30 days.\n *\n * Usage:\n * import { normalizeTimestamp, getBucketStart, isSameBucket } from '@forgecharts/shared/time';\n */\n\nimport { TIMEFRAMES } from './timeframeRegistry';\n\n// ─── Internal constants ───────────────────────────────────────────────────────\n\n/**\n * Milliseconds from the Unix epoch (1970-01-01 Thursday UTC) to the first\n * Monday of the epoch (1970-01-05 UTC).\n *\n * Every weekly bucket boundary is an integer multiple of WEEK_MS offset from\n * this anchor. Using this constant instead of dividing the raw timestamp by\n * WEEK_MS is what makes weekly buckets start on Mondays.\n */\nconst MONDAY_EPOCH_OFFSET_MS = 345_600_000; // 4 * 24 * 60 * 60 * 1000 ms (1970-01-05 UTC)\nconst WEEK_MS = 604_800_000; // 7 * 24 * 60 * 60 * 1000 ms\n\n// ─── normalizeTimestamp ───────────────────────────────────────────────────────\n\n/**\n * Convert any time representation to a Unix millisecond timestamp.\n *\n * Detection rules for `number` and numeric `string` inputs:\n * - value > 1e12 → already in milliseconds (year 2001+ in ms is > 1e12)\n * - value ≤ 1e12 → treated as Unix seconds, multiplied by 1000\n *\n * Non-numeric strings are parsed via `new Date(input)` (ISO 8601 or any\n * Date-constructor-recognised format).\n *\n * @throws {RangeError} if the input produces a non-finite or NaN result.\n *\n * @example\n * normalizeTimestamp(1_741_527_524) // → 1_741_527_524_000 (seconds → ms)\n * normalizeTimestamp(1_741_527_524_000) // → 1_741_527_524_000 (already ms)\n * normalizeTimestamp('1741527524') // → 1_741_527_524_000\n * normalizeTimestamp(new Date('2025-01-01T00:00:00Z')) // → 1_735_689_600_000\n */\nexport function normalizeTimestamp(input: number | string | Date): number {\n if (input instanceof Date) {\n const ms = input.getTime();\n if (!Number.isFinite(ms)) throw new RangeError(`normalizeTimestamp: invalid Date`);\n return ms;\n }\n\n if (typeof input === 'string') {\n const n = Number(input);\n if (Number.isFinite(n)) {\n return n > 1e12 ? n : n * 1000;\n }\n // ISO / human-readable string\n const ms = new Date(input).getTime();\n if (!Number.isFinite(ms)) throw new RangeError(`normalizeTimestamp: unparseable string \"${input}\"`);\n return ms;\n }\n\n // number\n if (!Number.isFinite(input)) throw new RangeError(`normalizeTimestamp: non-finite number ${input}`);\n return input > 1e12 ? input : input * 1000;\n}\n\n// ─── timeframeToMs ────────────────────────────────────────────────────────────\n\n/**\n * Return the fixed duration of a timeframe in milliseconds.\n *\n * Returns `null` for:\n * - `'1w'` — calendar_week (duration varies; use `getWeekBucketStart`)\n * - `'1M'` — calendar_month (duration varies; use `getMonthBucketStart`)\n * - Unknown timeframe keys\n *\n * Never use the return value as a month or week approximation.\n *\n * @example\n * timeframeToMs('1h') // → 3_600_000\n * timeframeToMs('4h') // → 14_400_000\n * timeframeToMs('1w') // → null — use getWeekBucketStart instead\n * timeframeToMs('1M') // → null — use getMonthBucketStart instead\n * timeframeToMs('3h') // → null — not a canonical timeframe\n */\nexport function timeframeToMs(tf: string): number | null {\n const def = TIMEFRAMES[tf];\n if (!def || def.kind !== 'fixed') return null;\n return def.ms;\n}\n\n// ─── getBucketStart ───────────────────────────────────────────────────────────\n\n/**\n * Floor a millisecond timestamp to the **open time** of the candle bucket it\n * falls in.\n *\n * Dispatches to the correct implementation based on the timeframe's `kind`:\n * - `fixed` → epoch floor: `Math.floor(t / intervalMs) * intervalMs`\n * - `calendar_week` → Monday-aligned ISO week (see `getWeekBucketStart`)\n * - `calendar_month` → UTC 1st of calendar month (see `getMonthBucketStart`)\n *\n * If `timeframe` is not in the canonical registry, falls back to 1-minute\n * epoch-floor so callers always receive a valid number rather than NaN.\n *\n * @param timeMs Unix milliseconds (use `normalizeTimestamp` first if unsure)\n * @param timeframe Canonical timeframe label, e.g. `'1h'`, `'4h'`, `'1w'`\n *\n * @example\n * getBucketStart(1_700_000_062_000, '1m') // → 1_700_000_060_000 (second minute)\n * getBucketStart(1_700_000_062_000, '1h') // → 1_699_999_200_000 (hour boundary)\n * getBucketStart(1_700_000_062_000, '1w') // → Monday of that week, 00:00 UTC\n * getBucketStart(1_700_000_062_000, '1M') // → First of that month, 00:00 UTC\n */\nexport function getBucketStart(timeMs: number, timeframe: string): number {\n const def = TIMEFRAMES[timeframe];\n\n if (!def) {\n // Unknown timeframe — 1m fallback ensures a finite result\n return Math.floor(timeMs / 60_000) * 60_000;\n }\n\n if (def.kind === 'calendar_week') return getWeekBucketStart(timeMs);\n if (def.kind === 'calendar_month') return getMonthBucketStart(timeMs);\n\n // fixed — def.ms is guaranteed present by the TimeframeDefinition discriminant\n return Math.floor(timeMs / def.ms) * def.ms;\n}\n\n// ─── isSameBucket ─────────────────────────────────────────────────────────────\n\n/**\n * Return `true` when two millisecond timestamps fall within the same candle\n * bucket for `timeframe`.\n *\n * Uses `getBucketStart` so it correctly handles weekly and monthly boundaries.\n *\n * @example\n * // Two timestamps in the same 1-hour candle\n * isSameBucket(1_700_003_600_000, 1_700_007_000_000, '1h') // → true\n * // Timestamps in different hours\n * isSameBucket(1_700_003_599_000, 1_700_003_601_000, '1h') // → false\n */\nexport function isSameBucket(a: number, b: number, timeframe: string): boolean {\n return getBucketStart(a, timeframe) === getBucketStart(b, timeframe);\n}\n\n// ─── getWeekBucketStart ───────────────────────────────────────────────────────\n\n/**\n * Floor a millisecond timestamp to the **Monday 00:00 UTC** that opens the\n * ISO week it falls in.\n *\n * Monday-alignment is achieved by subtracting `MONDAY_EPOCH_OFFSET_MS`\n * (the ms count from the Unix epoch to 1970-01-05, the first Monday) before\n * performing the epoch-floor, then adding it back.\n *\n * ❌ Never compute weekly buckets as: `Math.floor(timeMs / 604_800_000) * 604_800_000`\n * That anchors to Thursday (the day of the Unix epoch).\n *\n * @example\n * // 2025-03-09 (Sunday) → previous Monday 2025-03-03 00:00 UTC\n * getWeekBucketStart(new Date('2025-03-09T12:00:00Z').getTime())\n * // → new Date('2025-03-03T00:00:00Z').getTime()\n */\nexport function getWeekBucketStart(timeMs: number): number {\n return (\n Math.floor((timeMs - MONDAY_EPOCH_OFFSET_MS) / WEEK_MS) * WEEK_MS\n + MONDAY_EPOCH_OFFSET_MS\n );\n}\n\n// ─── getMonthBucketStart ──────────────────────────────────────────────────────\n\n/**\n * Floor a millisecond timestamp to UTC midnight of the first day of its\n * calendar month.\n *\n * ❌ Never approximate as: `Math.floor(timeMs / 2_592_000_000) * 2_592_000_000`\n * Months have 28–31 days; any fixed approximation will drift.\n *\n * @example\n * // 2025-03-15 → 2025-03-01 00:00 UTC\n * getMonthBucketStart(new Date('2025-03-15T18:30:00Z').getTime())\n * // → new Date('2025-03-01T00:00:00Z').getTime()\n */\nexport function getMonthBucketStart(timeMs: number): number {\n const d = new Date(timeMs);\n return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);\n}\n","/**\n * Timeframe utilities — thin compatibility wrappers over `@forgecharts/shared/time`.\n *\n * All bucket-alignment logic now lives in the canonical shared module.\n * These exports keep the existing `CandleEngine` and `DatafeedConnector` import\n * surface stable while delegating every calculation to the single source of truth.\n *\n * Migration note:\n * New code should import directly from `@forgecharts/shared/time`:\n * import { getBucketStart, getWeekBucketStart, getMonthBucketStart } from '@forgecharts/shared/time';\n *\n * Legacy imports from this file continue to work unchanged.\n */\n\nimport {\n getBucketStart as sharedGetBucketStart,\n timeframeToMs as sharedTimeframeToMs,\n} from '@forgecharts/shared/time';\n\n// ─── timeframeToMs ────────────────────────────────────────────────────────────\n\n/**\n * Convert a timeframe label to its duration in milliseconds.\n *\n * Returns `60_000` (1 minute) for calendar timeframes (`1w`, `1M`) and unknown\n * labels — preserving the previous behaviour that `CandleEngine` depended on.\n * New code should use `sharedTimeframeToMs` (which returns `null` for those\n * cases) and handle `null` explicitly.\n *\n * @example\n * timeframeToMs('1m') // → 60_000\n * timeframeToMs('4h') // → 14_400_000\n * timeframeToMs('1w') // → 60_000 (calendar — no fixed duration; fallback)\n */\nexport function timeframeToMs(timeframe: string): number {\n return sharedTimeframeToMs(timeframe) ?? 60_000;\n}\n\n// ─── getBucketStart (interval-based) ─────────────────────────────────────────\n\n/**\n * Floor a millisecond timestamp to the start of its fixed-interval bucket.\n *\n * This overload takes an explicit `intervalMs` and is used internally by\n * `aggregateToBucket` for sub-daily custom timeframe synthesis.\n *\n * For timeframe-label–based alignment (including 1w / 1M calendar logic)\n * use `getCalendarBucketStart` or import `getBucketStart` from `@forgecharts/shared`.\n *\n * @example\n * getBucketStart(62_000, 60_000) // → 60_000\n * getBucketStart(3_720_000, 3_600_000) // → 3_600_000\n */\nexport function getBucketStart(timeMs: number, intervalMs: number): number {\n return Math.floor(timeMs / intervalMs) * intervalMs;\n}\n\n// ─── getCalendarBucketStart ───────────────────────────────────────────────────\n\n/**\n * Floor a millisecond timestamp to the candle-open boundary for the given\n * timeframe label, with correct calendar alignment:\n *\n * `1w` — Monday-aligned week (ISO 8601, UTC) via `getWeekBucketStart`\n * `1M` — first of calendar month, UTC via `getMonthBucketStart`\n * all others — plain epoch-floor via `getBucketStart`\n *\n * Delegates entirely to the canonical shared module.\n */\nexport function getCalendarBucketStart(timeMs: number, tf: string): number {\n return sharedGetBucketStart(timeMs, tf);\n}\n\n// ─── aggregateToBucket ────────────────────────────────────────────────────────\n\n/**\n * Build a custom timeframe by aggregating base-timeframe candles into larger buckets.\n * Returns the aggregated candles for all buckets covered by `subBars`.\n *\n * This is the building block for synthesising e.g. 3m from 1m feeds.\n *\n * @param subBars Candles from the base timeframe, sorted ascending by timeMs.\n * @param targetMs Target timeframe duration in ms (e.g. 180_000 for 3m).\n *\n * @throws {Error} If `targetMs` corresponds to a calendar-irregular timeframe\n * (`1w` / `1M`). Use `getCalendarBucketStart` for those directly.\n */\nexport function aggregateToBucket(\n subBars: ReadonlyArray<{\n timeMs: number; open: number; high: number; low: number; close: number; volume: number;\n }>,\n targetMs: number,\n): Array<{ timeMs: number; open: number; high: number; low: number; close: number; volume: number }> {\n // 1w is 7 days exactly; 1M has no fixed duration and can never equal a targetMs.\n // Guard prevents accidentally using fixed-interval bucketing for weekly candles\n // where DST can make weeks slightly unequal (though UTC avoids this).\n const WEEK_MS = 7 * 24 * 60 * 60 * 1000; // 604_800_000\n if (targetMs === WEEK_MS) {\n throw new Error('aggregateToBucket: use getCalendarBucketStart for 1w/1M aggregation');\n }\n\n const buckets = new Map<number, { timeMs: number; open: number; high: number; low: number; close: number; volume: number }>();\n\n for (const bar of subBars) {\n const bucket = getBucketStart(bar.timeMs, targetMs);\n const existing = buckets.get(bucket);\n if (!existing) {\n buckets.set(bucket, { timeMs: bucket, open: bar.open, high: bar.high, low: bar.low, close: bar.close, volume: bar.volume });\n } else {\n existing.high = Math.max(existing.high, bar.high);\n existing.low = Math.min(existing.low, bar.low);\n existing.close = bar.close;\n existing.volume += bar.volume;\n }\n }\n\n return Array.from(buckets.values()).sort((a, b) => a.timeMs - b.timeMs);\n}\n","/**\n * Merge / reconciliation helpers for the candle engine.\n *\n * These utilities operate on plain data objects and have no side-effects,\n * making them easy to test and reuse.\n */\n\n/**\n * Normalised candle shape. Defined here so that mergeUtils has no dependency\n * on CandleEngine (avoids circular imports). CandleEngine re-exports this type.\n */\nexport interface CandleBar {\n /** Candle open-time in milliseconds — the primary bucket key. */\n timeMs: number;\n /** Candle open-time in seconds — passed directly to the chart library. */\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n /** True once the next candle has started and this bar is fully formed. */\n isClosed: boolean;\n}\n\n/**\n * Count the number of missing candle buckets between two consecutive bar times.\n *\n * Returns 0 when bars are adjacent (no gap), ≥1 when candles are missing.\n *\n * @example\n * getMissingBarCount(60_000, 120_000, 60_000) // → 0 (consecutive 1m bars)\n * getMissingBarCount(60_000, 240_000, 60_000) // → 2 (10:01 and 10:02 missing)\n * getMissingBarCount(60_000, 3_660_000, 60_000) // → 59 (whole hour gap)\n */\nexport function getMissingBarCount(\n lastTimeMs: number,\n nextTimeMs: number,\n intervalMs: number,\n): number {\n return Math.max(0, Math.floor((nextTimeMs - lastTimeMs) / intervalMs) - 1);\n}\n\n/**\n * Merge two candle arrays into a single deduplicated, time-sorted array.\n *\n * Conflict resolution when both arrays contain a bar with the same `timeMs`:\n * - Closed bars from `incoming` always override `existing` candles —\n * REST-fetched data is treated as authoritative for finished candles.\n * - The live (open) candle: `incoming` also wins — it is the freshest tick.\n *\n * This covers both gap backfill (REST data fills missing closed bars) and\n * reconnect reconciliation (recent REST window corrects stale candles).\n *\n * @param existing Current engine bar array (read-only — not mutated).\n * @param incoming New bars to merge in (read-only — not mutated).\n * @returns A new sorted array with duplicates removed.\n */\nexport function mergeBars(\n existing: readonly CandleBar[],\n incoming: readonly CandleBar[],\n): CandleBar[] {\n const map = new Map<number, CandleBar>();\n\n // Load existing bars first\n for (const bar of existing) {\n map.set(bar.timeMs, bar);\n }\n\n // Incoming bars override based on conflict resolution rules\n for (const bar of incoming) {\n const prev = map.get(bar.timeMs);\n // Incoming wins when:\n // a) no previous bar at this time (simple insert)\n // b) previous bar is closed — REST data is authoritative for closed candles\n // c) incoming bar is open (live) — always prefer the latest live tick\n if (!prev || prev.isClosed || !bar.isClosed) {\n map.set(bar.timeMs, bar);\n }\n }\n\n return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);\n}\n\n/**\n * Deduplicate a single sorted array by `timeMs`, keeping the last occurrence\n * of any duplicate (latest data wins).\n */\nexport function deduplicateBars(bars: CandleBar[]): CandleBar[] {\n const map = new Map<number, CandleBar>();\n for (const bar of bars) map.set(bar.timeMs, bar);\n return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);\n}\n","/**\n * Candle Invariant Guards\n *\n * Defensive assertions for the CandleEngine update pipeline.\n * All guards are no-ops in production (`NODE_ENV === 'production'`).\n *\n * Design principles:\n * - Each guard checks exactly ONE invariant and logs a descriptive warning.\n * - Guards never throw by default — they warn so streaming data is never blocked.\n * - Call sites pass a `context` string that identifies where the check ran.\n * - A test harness can replace `_reporter` to assert on violations.\n *\n * Usage:\n * import { assertOhlcRelationships, assertNotFinalized } from './candleInvariants';\n */\n\nimport type { CandleBar } from './CandleEngine';\nimport { getCalendarBucketStart } from './timeframeUtils';\n\n// ─── Reporter (swappable in tests) ───────────────────────────────────────────\n\n/** Called for every invariant violation. Replaced in unit tests. */\nexport let _reporter: (message: string) => void = (msg) => console.warn(msg);\n\n/** Replace the violation reporter (for unit-test assertions). */\nexport function _setReporter(fn: (message: string) => void): void {\n _reporter = fn;\n}\n\n/** Re-install the default console.warn reporter. */\nexport function _resetReporter(): void {\n _reporter = (msg) => console.warn(msg);\n}\n\n// ─── Dev guard ───────────────────────────────────────────────────────────────\n\nfunction isDevMode(): boolean {\n // Access process via globalThis to avoid relying on @types/node in browser builds\n const nodeEnv = (globalThis as { process?: { env?: { NODE_ENV?: string } } })\n .process?.env?.['NODE_ENV'];\n return nodeEnv !== 'production';\n}\n\nfunction violation(context: string, message: string): void {\n _reporter(`[CANDLE_INVARIANT] ${context}: ${message}`);\n}\n\n// ─── Guards ───────────────────────────────────────────────────────────────────\n\n/**\n * Verify that `high >= open, close, low` and `low <= open, close`.\n *\n * Floats from external feeds can occasionally violate these due to rounding.\n * This guard surfaces them immediately rather than silently corrupting the chart.\n */\nexport function assertOhlcRelationships(bar: CandleBar, context: string): void {\n if (!isDevMode()) return;\n\n const { open, high, low, close, timeMs } = bar;\n\n if (high < open) violation(context, `high(${high}) < open(${open}) at timeMs=${timeMs}`);\n if (high < close) violation(context, `high(${high}) < close(${close}) at timeMs=${timeMs}`);\n if (high < low) violation(context, `high(${high}) < low(${low}) at timeMs=${timeMs}`);\n if (low > open) violation(context, `low(${low}) > open(${open}) at timeMs=${timeMs}`);\n if (low > close) violation(context, `low(${low}) > close(${close}) at timeMs=${timeMs}`);\n}\n\n/**\n * Verify that `bar.timeMs` is exactly equal to the candle-open boundary for the\n * given timeframe. If it is not, `normalizeOhlcv` or `getCalendarBucketStart`\n * has a bug.\n */\nexport function assertBucketAlignment(bar: CandleBar, tf: string, context: string): void {\n if (!isDevMode()) return;\n\n const expected = getCalendarBucketStart(bar.timeMs, tf);\n if (bar.timeMs !== expected) {\n violation(\n context,\n `timeMs(${bar.timeMs}) ≠ bucketStart(${expected}) for tf=${tf} ` +\n `(delta=${bar.timeMs - expected} ms)`,\n );\n }\n}\n\n/**\n * Verify that we are NOT about to mutate a candle that has already been finalised\n * (`isClosed === true`). Mutating a closed candle corrupts the historical record.\n *\n * Triggers on: same-bucket update landing on a bar already marked closed.\n */\nexport function assertNotFinalized(bar: CandleBar, context: string): void {\n if (!isDevMode()) return;\n\n if (bar.isClosed) {\n violation(\n context,\n `attempted to mutate a finalized (isClosed=true) candle at timeMs=${bar.timeMs}`,\n );\n }\n}\n\n/**\n * Verify that a same-bucket update did NOT silently overwrite the candle's `open`.\n *\n * The first tick's open is authoritative; subsequent updates for the same bucket\n * must preserve it. Call this AFTER the in-place mutation with the captured\n * `prevOpen` value.\n */\nexport function assertOpenImmutability(\n prevOpen: number,\n bar: CandleBar,\n context: string,\n): void {\n if (!isDevMode()) return;\n\n if (bar.open !== prevOpen) {\n violation(\n context,\n `open changed from ${prevOpen} → ${bar.open} on same-bucket update ` +\n `at timeMs=${bar.timeMs} — first-tick open is authoritative`,\n );\n }\n}\n\n/**\n * Verify that a same-bucket update does NOT append a new bar instead of\n * updating the existing one.\n *\n * Call after an in-place update with the pre- and post-update bar counts.\n */\nexport function assertNoDuplicateAppend(\n prevCount: number,\n nextCount: number,\n context: string,\n): void {\n if (!isDevMode()) return;\n\n if (nextCount > prevCount) {\n violation(\n context,\n `same-bucket update incremented bar count from ${prevCount} → ${nextCount} ` +\n `(should have updated in-place, not appended)`,\n );\n }\n}\n\n/**\n * Verify that a new-bucket append does NOT reduce the bar count or silently\n * overwrite a finalized candle (would require bar count to stay the same while\n * the last bar's timeMs changes, which the engine never does).\n *\n * Call after appending a new bar with the previous last bar for comparison.\n */\nexport function assertFinalizedUnchanged(\n prevLastBar: Readonly<CandleBar>,\n currentBars: readonly CandleBar[],\n context: string,\n): void {\n if (!isDevMode()) return;\n\n const prevIndex = currentBars.findIndex(b => b.timeMs === prevLastBar.timeMs);\n if (prevIndex === -1) return; // bar may have been legitimately removed by merge\n\n const preserved = currentBars[prevIndex]!;\n if (!preserved.isClosed) {\n violation(\n context,\n `bar at timeMs=${prevLastBar.timeMs} should be isClosed=true after new-bucket append`,\n );\n }\n}\n","/**\n * CandleEngine — the single source of truth for live candle data.\n *\n * Architecture:\n *\n * WebSocket feed\n * ↓\n * Market Data Normalizer (normalizeOhlcv — handles strings, ms vs s)\n * ↓\n * CandleEngine (applyCandleUpdate — O(1) update path)\n * ↓\n * Chart Update Adapter (onBarUpdated / onResync callbacks)\n * ↓\n * Chart Library (series.update / series.setData)\n *\n * Guarantees:\n * - open is never overwritten on an existing live candle\n * - high can only increase within a candle\n * - low can only decrease within a candle\n * - close updates on every tick\n * - out-of-order ticks are silently discarded\n * - gaps are detected and reported for async REST backfill\n * - the engine is framework-agnostic (no DOM, React, or chart-lib imports)\n */\n\nimport type { Timeframe } from '@forgecharts/types';\nimport { timeframeToMs, getBucketStart, getCalendarBucketStart } from './timeframeUtils';\nimport { getMissingBarCount, mergeBars } from './mergeUtils';\nimport {\n assertOhlcRelationships,\n assertBucketAlignment,\n assertNotFinalized,\n assertOpenImmutability,\n assertNoDuplicateAppend,\n assertFinalizedUnchanged,\n} from './candleInvariants';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\n/**\n * Normalised candle shape used throughout the engine.\n *\n * `timeMs` — millisecond timestamp (used for bucket identity comparisons)\n * `time` — second timestamp (used for chart library rendering)\n */\nexport interface CandleBar {\n /** Candle open-time in milliseconds — the primary bucket key. */\n timeMs: number;\n /** Candle open-time in seconds — passed directly to the chart library. */\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n /** True once the next candle has started and this bar is fully formed. */\n isClosed: boolean;\n}\n\n/**\n * Raw OHLCV input accepted by the engine.\n * Values may be number or numeric string; `time` may be milliseconds or seconds.\n */\nexport interface RawOHLCV {\n time: number | string;\n open: number | string;\n high: number | string;\n low: number | string;\n close: number | string;\n volume?: number | string;\n isClosed?: boolean;\n}\n\n/** Describes what the engine did with a live update. */\nexport type UpdateResult =\n | { type: 'update'; bar: CandleBar }\n | { type: 'append'; bar: CandleBar; previousBarClosed: boolean }\n | { type: 'gap'; bar: CandleBar; missingCount: number }\n | { type: 'ignore' };\n\n/** Gap information emitted via `onGapDetected`. */\nexport interface GapInfo {\n fromTimeMs: number;\n toTimeMs: number;\n missingCount: number;\n}\n\nexport interface CandleEngineOptions {\n /**\n * Enable structured debug logging to the console.\n * Log every incoming tick with action, timestamps, and resulting OHLCV.\n */\n debug?: boolean;\n\n /**\n * Fired when the live stream skips one or more candle buckets.\n * Use this to trigger an async REST backfill; do not block the live stream.\n */\n onGapDetected?: (info: GapInfo) => void;\n\n /**\n * Fired after every bar mutation (update or append).\n * The chart adapter should call `series.update(bar)` here.\n */\n onBarUpdated?: (bar: CandleBar, result: UpdateResult) => void;\n\n /** Fired when a candle is finalised — the next candle's first tick arrived. */\n onBarClosed?: (bar: CandleBar) => void;\n\n /**\n * Fired after the full bar array changes (backfillGap / handleReconnect).\n * The chart adapter should call `series.setData(bars)` here to fully resync.\n */\n onResync?: (bars: readonly CandleBar[]) => void;\n}\n\n// ─── Internal normalizer ─────────────────────────────────────────────────────\n\n/**\n * Normalise a raw OHLCV object into a CandleBar.\n *\n * - Coerces all fields to `number` (handles numeric strings from the feed).\n * - Auto-detects ms vs s timestamps: values > 1e12 are treated as milliseconds.\n * - Aligns `timeMs` to the correct candle-open boundary, with calendar\n * alignment for `1w` (Monday) and `1M` (first of month).\n *\n * Never use `Date.now()` for candle time — always use the feed-provided value.\n */\nfunction normalizeOhlcv(raw: RawOHLCV, intervalMs: number, tf: string): CandleBar {\n const rawTime = Number(raw.time);\n\n // Auto-detect: Unix ms timestamps are > 1e12 (year 2001+).\n // If the value is smaller, treat it as seconds and convert.\n const timeMs = rawTime > 1e12 ? rawTime : rawTime * 1000;\n\n // Calendar-aware bucket alignment (handles 1w/1M specially)\n const bucketMs = getCalendarBucketStart(timeMs, tf);\n const timeSec = Math.floor(bucketMs / 1000);\n\n return {\n timeMs: bucketMs,\n time: timeSec,\n open: Number(raw.open),\n high: Number(raw.high),\n low: Number(raw.low),\n close: Number(raw.close),\n volume: Number(raw.volume ?? 0),\n isClosed: raw.isClosed ?? false,\n };\n}\n\n// ─── CandleEngine ─────────────────────────────────────────────────────────────\n\nexport class CandleEngine {\n /** Authoritative ordered bar array. Only the rightmost bar may be open. */\n private _bars: CandleBar[] = [];\n private _timeframe: Timeframe = '1m';\n private _intervalMs: number = 60_000;\n private readonly _opts: CandleEngineOptions;\n\n constructor(options: CandleEngineOptions = {}) {\n this._opts = options;\n }\n\n // ── Initialisation ──────────────────────────────────────────────────────────\n\n /**\n * Seed the engine with historical bars and set the active timeframe.\n * All existing bars are replaced.\n *\n * Historical bars loaded from REST are assumed closed, except possibly\n * the last one (which may represent the still-forming candle).\n *\n * @param history Raw bars from a REST endpoint (oldest → newest).\n * @param timeframe The active timeframe label (e.g. '1m', '1h').\n */\n initialize(history: RawOHLCV[], timeframe: Timeframe): void {\n this._timeframe = timeframe;\n this._intervalMs = timeframeToMs(timeframe);\n\n // Normalise, deduplicate by timeMs (latest entry wins), sort newest-last\n const seen = new Map<number, CandleBar>();\n for (const raw of history) {\n const bar = normalizeOhlcv(raw, this._intervalMs, this._timeframe);\n seen.set(bar.timeMs, bar);\n }\n this._bars = Array.from(seen.values()).sort((a, b) => a.timeMs - b.timeMs);\n\n // Mark all bars except the last as closed\n for (let i = 0; i < this._bars.length - 1; i++) {\n this._bars[i]!.isClosed = true;\n }\n\n this._debugLog('initialize', {\n timeframe,\n intervalMs: this._intervalMs,\n barCount: this._bars.length,\n firstTime: this._bars[0]?.timeMs,\n lastTime: this._bars[this._bars.length - 1]?.timeMs,\n });\n }\n\n // ── Live updates ────────────────────────────────────────────────────────────\n\n /**\n * Process a single live OHLCV tick from the WebSocket feed.\n *\n * Algorithm (mirrors TradingView / Binance candle engine behaviour):\n *\n * 1. Normalise: coerce strings to numbers, detect ms vs s, align to bucket.\n * 2. Empty array → append as first bar.\n * 3. incoming.timeMs === last.timeMs → SAME CANDLE (update in-place):\n * open = unchanged (first tick's open is authoritative)\n * high = max(last.high, inc.high, inc.close)\n * low = min(last.low, inc.low, inc.close)\n * close = inc.close\n * volume = inc.volume\n * 4. incoming.timeMs > last.timeMs → NEW CANDLE:\n * - Detect and report any gap (missing buckets between last and incoming).\n * - Mark last bar as closed, fire onBarClosed.\n * - Append incoming as a fresh live candle.\n * 5. incoming.timeMs < last.timeMs → OUT-OF-ORDER: discard silently.\n *\n * @returns UpdateResult indicating what was done — the chart adapter uses\n * this to choose between series.update() and series.setData().\n */\n applyLiveUpdate(raw: RawOHLCV): UpdateResult {\n const incoming = normalizeOhlcv(raw, this._intervalMs, this._timeframe);\n\n // Invariant: incoming bar must be bucket-aligned and OHLC-valid\n assertBucketAlignment(incoming, this._timeframe, 'applyLiveUpdate:normalize');\n assertOhlcRelationships(incoming, 'applyLiveUpdate:normalize');\n\n // ── First bar ever ─────────────────────────────────────────────────────\n if (this._bars.length === 0) {\n this._bars.push(incoming);\n const result: UpdateResult = { type: 'append', bar: incoming, previousBarClosed: false };\n this._debugLog('append:first', incoming);\n this._opts.onBarUpdated?.(incoming, result);\n return result;\n }\n\n const last = this._bars[this._bars.length - 1]!;\n\n // ── Same candle: update in-place (O(1)) ────────────────────────────────\n if (incoming.timeMs === last.timeMs) {\n // Invariant: must not mutate a finalized candle\n assertNotFinalized(last, 'applyLiveUpdate:same-bucket');\n\n const prevOpen = last.open;\n const prevCount = this._bars.length;\n\n // open is intentionally not updated — the first tick's open is correct\n last.high = Math.max(last.high, incoming.high, incoming.close);\n last.low = Math.min(last.low, incoming.low, incoming.close);\n last.close = incoming.close;\n last.volume = incoming.volume;\n\n // Invariant: open must be unchanged, no spurious append must have occurred\n assertOpenImmutability(prevOpen, last, 'applyLiveUpdate:same-bucket');\n assertOhlcRelationships(last, 'applyLiveUpdate:same-bucket');\n assertNoDuplicateAppend(prevCount, this._bars.length, 'applyLiveUpdate:same-bucket');\n\n const result: UpdateResult = { type: 'update', bar: last };\n this._debugLog('update', last);\n this._opts.onBarUpdated?.(last, result);\n return result;\n }\n\n // ── Out-of-order: older than the current live candle ──────────────────\n if (incoming.timeMs < last.timeMs) {\n this._debugLog('ignore', {\n incomingTimeMs: incoming.timeMs,\n lastTimeMs: last.timeMs,\n delta: last.timeMs - incoming.timeMs,\n });\n return { type: 'ignore' };\n }\n\n // ── New candle (incoming.timeMs > last.timeMs) ─────────────────────────\n\n // Gap detection: how many candle buckets are missing between last and new?\n const missingCount = getMissingBarCount(last.timeMs, incoming.timeMs, this._intervalMs);\n if (missingCount > 0) {\n const gapInfo: GapInfo = { fromTimeMs: last.timeMs, toTimeMs: incoming.timeMs, missingCount };\n this._debugLog('gap', gapInfo);\n this._opts.onGapDetected?.(gapInfo);\n }\n\n // Finalise the previous live candle\n const prevLastBar = { ...last }; // snapshot for post-append invariant check\n last.isClosed = true;\n this._opts.onBarClosed?.(last);\n\n // Append the new candle\n this._bars.push(incoming);\n\n // Invariant: previous bar must be closed and not mutated after the append\n assertFinalizedUnchanged(prevLastBar, this._bars, 'applyLiveUpdate:new-bucket');\n assertOhlcRelationships(incoming, 'applyLiveUpdate:new-bucket');\n\n const result: UpdateResult = missingCount > 0\n ? { type: 'gap', bar: incoming, missingCount }\n : { type: 'append', bar: incoming, previousBarClosed: true };\n\n this._debugLog(result.type, incoming);\n this._opts.onBarUpdated?.(incoming, result);\n return result;\n }\n\n // ── Gap backfill ────────────────────────────────────────────────────────────\n\n /**\n * Merge REST-fetched bars into the engine to fill a detected gap.\n *\n * Incoming bars are treated as authoritative closed candles.\n * The current live candle is preserved if present.\n *\n * After calling this, `onResync` fires — the chart adapter must call\n * `series.setData(engine.getBars())` to fully resync the chart.\n *\n * @param rawBars Historical bars from the REST endpoint covering the gap.\n */\n backfillGap(rawBars: RawOHLCV[]): void {\n const incoming = rawBars.map(r => {\n const bar = normalizeOhlcv(r, this._intervalMs, this._timeframe);\n bar.isClosed = true; // REST bars are closed and authoritative\n return bar;\n });\n\n // Preserve the live candle's open state after merge\n const liveBefore = this._bars[this._bars.length - 1];\n\n this._bars = mergeBars(this._bars, incoming);\n\n // Re-apply live candle's isClosed=false if it survived the merge\n if (liveBefore && !liveBefore.isClosed) {\n const last = this._bars[this._bars.length - 1];\n if (last && last.timeMs === liveBefore.timeMs) {\n last.isClosed = false;\n }\n }\n\n this._debugLog('backfillGap', { filled: rawBars.length, totalBars: this._bars.length });\n this._opts.onResync?.(this._bars);\n }\n\n // ── Reconnect reconciliation ────────────────────────────────────────────────\n\n /**\n * Reconcile after a WebSocket reconnect.\n *\n * Fetch a rolling overlap window from REST (e.g. last 50 bars or 2 hours)\n * and pass them here. The engine merges them with the existing bar array,\n * correcting any candles that were missed or corrupted during the outage.\n *\n * After reconciliation, `onResync` fires so the chart adapter can resync\n * the chart series with `series.setData(engine.getBars())`.\n *\n * @param recentBars REST bars covering the reconnect overlap window.\n */\n handleReconnect(recentBars: RawOHLCV[]): void {\n const incoming = recentBars.map(r => normalizeOhlcv(r, this._intervalMs, this._timeframe));\n this._bars = mergeBars(this._bars, incoming);\n this._debugLog('handleReconnect', { count: recentBars.length, totalBars: this._bars.length });\n this._opts.onResync?.(this._bars);\n }\n\n // ── Trade-tick stub ─────────────────────────────────────────────────────────\n\n /**\n * Stub for future tick/trade-based candle construction.\n *\n * When implemented, this will:\n * - Assign the trade to its bucket using `getBucketStart(timeMs, intervalMs)`.\n * - Create a new candle if the bucket is absent.\n * - Update OHLCV: open/close from trade price, high/low expanded, volume summed.\n *\n * Not yet implemented — structure is in place for future extension.\n */\n applyTradeTick(\n _trade: { time: number | string; price: number | string; size?: number | string },\n ): void {\n // TODO: implement tick-based candle construction\n }\n\n // ── Read access ─────────────────────────────────────────────────────────────\n\n /**\n * Returns a readonly view of the authoritative bar array.\n * Do not mutate — call `applyLiveUpdate`, `backfillGap`, etc. instead.\n */\n getBars(): readonly CandleBar[] {\n return this._bars;\n }\n\n /** Returns the most recent (possibly still live) bar, or null if empty. */\n getLastBar(): CandleBar | null {\n return this._bars[this._bars.length - 1] ?? null;\n }\n\n /**\n * Prepend older historical bars fetched during a lazy scroll-left page load.\n * Only bars older than the current oldest bar are accepted; duplicates and\n * out-of-range bars are silently dropped.\n * Fires `onResync` so the chart adapter updates the series with `setData`.\n *\n * @param rawBars Historical bars from the REST endpoint, oldest → newest.\n */\n prependHistory(rawBars: RawOHLCV[]): void {\n const oldest = this._bars[0];\n const cutoff = oldest ? oldest.timeMs : Infinity;\n\n const incoming = rawBars\n .map(r => {\n const bar = normalizeOhlcv(r, this._intervalMs, this._timeframe);\n bar.isClosed = true;\n return bar;\n })\n .filter(bar => bar.timeMs < cutoff);\n\n if (incoming.length === 0) return;\n\n incoming.sort((a, b) => a.timeMs - b.timeMs);\n this._bars = [...incoming, ...this._bars];\n\n this._debugLog('prependHistory', {\n prepended: incoming.length,\n firstTime: this._bars[0]?.timeMs,\n });\n\n this._opts.onResync?.(this._bars);\n }\n\n /**\n * Clear all state.\n * Call before switching symbol or timeframe, or on a hard disconnect.\n */\n reset(): void {\n this._bars = [];\n this._debugLog('reset', { timeframe: this._timeframe });\n }\n\n // ── Private helpers ──────────────────────────────────────────────────────────\n\n private _debugLog(action: string, data: object): void {\n if (!this._opts.debug) return;\n console.debug('[CANDLE_ENGINE]', {\n action,\n timeframe: this._timeframe,\n barCount: this._bars.length,\n liveBar: this._bars[this._bars.length - 1]\n ? { open: this._bars[this._bars.length - 1]!.open, high: this._bars[this._bars.length - 1]!.high, low: this._bars[this._bars.length - 1]!.low, close: this._bars[this._bars.length - 1]!.close }\n : null,\n ...data,\n });\n }\n}\n","import type { IDatafeed, OHLCV, Timeframe } from '@forgecharts/types';\nimport type { ISeries } from '../types/ISeries';\nimport { CandleEngine } from '../engine/CandleEngine';\nimport type { CandleBar, RawOHLCV } from '../engine/CandleEngine';\n\n/** Strip engine-only fields so the value is a plain OHLCV the chart series accepts. */\nfunction toOHLCV(bar: CandleBar): OHLCV {\n return { time: bar.time, open: bar.open, high: bar.high, low: bar.low, close: bar.close, volume: bar.volume };\n}\n\n/**\n * Initial history window per timeframe — controls how much data the chart\n * requests on first connect.\n *\n * TWO-LAYER ARCHITECTURE — these two concerns are independent:\n * • CLIENT (this table): how many bars are fetched and held in memory for the\n * initial view + scroll buffer. Larger = more data in the browser.\n * • SERVER DB fill (bars.ts MAX_DB_SECONDS): the server always fills a full\n * 12 months of 1m data (and all available daily history) into the DB cache\n * in the background, regardless of the client window size. This means\n * scroll-left lazy-loading hits the DB, not the upstream TV API.\n *\n * For sub-hour timeframes a large display window is impractical:\n * 12 months of 1m = 525 600 bars — impossible to render, slow to transfer.\n * For 4h and above, 12 months is a manageable bar count so we load it all\n * upfront; the server will have it cached or will fill it synchronously.\n */\nconst HISTORY_WINDOWS: Partial<Record<Timeframe, number>> = {\n // Sub-hour: small display window; DB fills 12 months in background for scrollback.\n '1m': 3 * 24 * 3600, // 3 days → ~4 320 bars\n '3m': 7 * 24 * 3600, // 7 days → ~3 360 bars\n '5m': 10 * 24 * 3600, // 10 days → ~2 880 bars\n '15m': 30 * 24 * 3600, // 30 days → ~2 880 bars\n '30m': 60 * 24 * 3600, // 60 days → ~2 880 bars\n '1h': 90 * 24 * 3600, // 90 days → ~2 160 bars\n // 4h and above: 12 months — bar counts are small enough to load in full.\n '2h': 365 * 86400, // 12 months → ~4 380 bars\n '4h': 365 * 86400, // 12 months → ~2 190 bars\n '6h': 365 * 86400, // 12 months → ~1 460 bars\n '12h': 365 * 86400, // 12 months → ~730 bars\n '1d': 365 * 86400, // 12 months → ~365 bars\n '3d': 365 * 86400, // 12 months → ~122 bars\n '1w': 365 * 86400, // 12 months → ~52 bars\n '1M': 365 * 86400, // 12 months → ~12 bars\n};\nconst DEFAULT_HISTORY_WINDOW = 90 * 24 * 3600; // 90-day fallback (~200 bars at 1h)\n\n/**\n * How many seconds of history to fetch per lazy-load page (~500 candles).\n * Used by `loadMoreHistory()` when the user pans past the oldest loaded bar.\n */\nconst PAGE_SIZES: Partial<Record<Timeframe, number>> = {\n '1m': 500 * 60,\n '5m': 500 * 300,\n '15m': 500 * 900,\n '30m': 500 * 1800,\n '1h': 500 * 3600,\n '4h': 500 * 4 * 3600,\n '1d': 500 * 86400,\n '1w': 500 * 7 * 86400,\n '1M': 500 * 30 * 86400,\n};\nconst DEFAULT_PAGE_SIZE = 500 * 3600;\n\n/** Monotonic counter so every subscriber UID is unique within the process. */\nlet _uidCounter = 0;\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\n/**\n * Lifecycle callbacks injected by TChart so it can relay data-load state\n * as EventBus events without coupling DatafeedConnector to the bus.\n */\nexport type ConnectorCallbacks = {\n onLoading(symbol: string, interval: Timeframe): void;\n onLoaded(symbol: string, interval: Timeframe, count: number): void;\n onError(symbol: string, interval: Timeframe, error: string): void;\n /** Called on every real-time tick after the series is updated. Optional. */\n onUpdate?: (bar: OHLCV) => void;\n};\n\n// ─── DatafeedConnector ────────────────────────────────────────────────────────\n\n/**\n * DatafeedConnector wires an {@link IDatafeed} to an {@link ISeries}.\n *\n * Responsibilities:\n * - Generates stable, unique subscriber UIDs (`forgecharts-<symbol>-<tf>-<n>`).\n * - Calls `getHistoricalBars` and pushes the result into `series.setData()`.\n * - Calls `subscribeBars` so real-time ticks flow into `series.update()`.\n * - Guards against stale async responses after a reconnect or destroy.\n * - Tears down the active subscription cleanly on `disconnect()` / `destroy()`.\n *\n * @example\n * ```ts\n * const connector = new DatafeedConnector(datafeed, series, {\n * onLoading: (s, tf) => console.log('loading', s, tf),\n * onLoaded: (s, tf, n) => console.log('loaded', n, 'bars'),\n * onError: (s, tf, e) => console.error(e),\n * });\n *\n * connector.connect('BTCUSDT', '1h');\n * // ...later, on symbol change:\n * connector.reconnect('ETHUSDT', '1h');\n * // ...on unmount:\n * connector.destroy();\n * ```\n */\nexport class DatafeedConnector {\n private readonly _datafeed: IDatafeed;\n private readonly _series: ISeries;\n private readonly _cb: ConnectorCallbacks;\n\n /**\n * UID of the outstanding subscription.\n * `null` means nothing is subscribed / all responses for older UIDs are stale.\n */\n private _activeUID: string | null = null;\n private _activeEngine: CandleEngine | null = null;\n private _destroyed = false;\n\n /** True while an async `loadMoreHistory()` request is in-flight. */\n private _isLoadingMore = false;\n /** True once the datafeed returned 0 bars for a backwards page — no point fetching older. */\n private _noMoreHistory = false;\n\n constructor(datafeed: IDatafeed, series: ISeries, callbacks: ConnectorCallbacks) {\n this._datafeed = datafeed;\n this._series = series;\n this._cb = callbacks;\n }\n\n // ─── Public API ───────────────────────────────────────────────────────────────\n\n /**\n * Loads historical bars then subscribes for real-time updates.\n * Safe to call while a previous subscription is still active — it will be\n * cancelled first (same as calling `disconnect()` then `connect()`).\n */\n connect(symbol: string, timeframe: Timeframe): void {\n if (this._destroyed) return;\n\n // Cancel any in-flight request / active subscription before starting fresh\n this._cancelActive();\n\n const uid = `forgecharts-${symbol}-${timeframe}-${++_uidCounter}`;\n this._activeUID = uid;\n\n this._cb.onLoading(symbol, timeframe);\n\n const to = Math.floor(Date.now() / 1000);\n const from = to - (HISTORY_WINDOWS[timeframe] ?? DEFAULT_HISTORY_WINDOW);\n\n // Build the engine for this subscription. Close over `uid` for stale-guard.\n const engine = new CandleEngine({\n // Every live tick mutates the engine's bar array and the chart series.\n onBarUpdated: (bar) => {\n if (this._activeUID !== uid) return;\n const ohlcv = toOHLCV(bar);\n this._series.update(ohlcv);\n this._cb.onUpdate?.(ohlcv);\n },\n // When a gap is detected, fetch the missing range from REST and backfill.\n // backfillGap() will call onResync which re-syncs the full chart series.\n onGapDetected: (gapInfo) => {\n if (this._activeUID !== uid) return;\n const gapFrom = Math.floor(gapInfo.fromTimeMs / 1000);\n const gapTo = Math.ceil(gapInfo.toTimeMs / 1000);\n this._datafeed.getHistoricalBars(symbol, timeframe, gapFrom, gapTo)\n .then(({ bars }) => {\n if (this._activeUID !== uid) return;\n engine.backfillGap(bars as RawOHLCV[]);\n })\n .catch(() => {\n // Gap backfill errors are non-fatal — chart continues with live data\n });\n },\n // Full re-paint after gap fill or reconnect reconciliation.\n onResync: (bars) => {\n if (this._activeUID !== uid) return;\n this._series.setData(bars.map(toOHLCV));\n },\n });\n\n this._activeEngine = engine;\n\n this._datafeed\n .getHistoricalBars(symbol, timeframe, from, to)\n .then((result) => {\n // Guard: another connect() / destroy() may have superseded this request\n if (this._activeUID !== uid) return;\n\n engine.initialize(result.bars as RawOHLCV[], timeframe);\n this._series.setData(engine.getBars().map(toOHLCV));\n this._cb.onLoaded(symbol, timeframe, engine.getBars().length);\n\n // Double-check still active before subscribing (setData callback could\n // have triggered a synchronous reconnect in pathological code)\n if (this._activeUID !== uid) return;\n\n this._datafeed.subscribeBars(symbol, timeframe, (bar: OHLCV) => {\n if (this._activeUID === uid) {\n engine.applyLiveUpdate(bar as RawOHLCV);\n }\n }, uid);\n })\n .catch((err: unknown) => {\n if (this._activeUID !== uid) return;\n const message = err instanceof Error ? err.message : String(err);\n this._cb.onError(symbol, timeframe, message);\n });\n }\n\n /**\n * Cancels the active subscription without starting a new one.\n * Historical-bar `Promise` results arriving after this call are silently\n * discarded via the UID guard.\n */\n disconnect(): void {\n this._cancelActive();\n }\n\n /**\n * Convenience shorthand: `disconnect()` then `connect()`.\n * Use this for symbol or timeframe changes.\n */\n reconnect(symbol: string, timeframe: Timeframe): void {\n this.disconnect();\n this.connect(symbol, timeframe);\n }\n\n /**\n * Permanently deactivates the connector.\n * Any subscription or in-flight request is cancelled; subsequent calls to\n * `connect()` / `reconnect()` are no-ops.\n */\n destroy(): void {\n this._cancelActive();\n this._destroyed = true;\n }\n\n // ─── Private ─────────────────────────────────────────────────────────────────\n\n /**\n * Fetches a page of older history (up to ~500 candles) and prepends it to\n * the loaded dataset. Safe to call on every pan event — it is internally\n * debounced by the `_isLoadingMore` flag and stops permanently once the\n * datafeed signals no more history (`_noMoreHistory = true`).\n *\n * The series is updated automatically via the engine's `onResync` callback.\n */\n loadMoreHistory(symbol: string, timeframe: Timeframe): void {\n if (this._destroyed || this._isLoadingMore || this._noMoreHistory) return;\n if (!this._activeEngine || !this._activeUID) return;\n\n const engine = this._activeEngine;\n const oldest = engine.getBars()[0];\n if (!oldest) return;\n\n const uid = this._activeUID;\n const to = Math.floor(oldest.timeMs / 1000);\n const page = PAGE_SIZES[timeframe] ?? DEFAULT_PAGE_SIZE;\n const from = to - page;\n\n this._isLoadingMore = true;\n\n this._datafeed.getHistoricalBars(symbol, timeframe, from, to - 1)\n .then(({ bars }) => {\n if (this._activeUID !== uid) return;\n if (bars.length === 0) {\n this._noMoreHistory = true;\n } else {\n engine.prependHistory(bars as RawOHLCV[]);\n }\n })\n .catch(() => {\n // Non-fatal — user can scroll again to retry\n })\n .finally(() => {\n if (this._activeUID === uid) this._isLoadingMore = false;\n });\n }\n\n private _cancelActive(): void {\n if (this._activeUID !== null) {\n try {\n this._datafeed.unsubscribeBars(this._activeUID);\n } catch {\n // Best-effort teardown — datafeed may already be closed\n }\n this._activeUID = null;\n }\n if (this._activeEngine !== null) {\n this._activeEngine.reset();\n this._activeEngine = null;\n }\n this._isLoadingMore = false;\n this._noMoreHistory = false;\n }\n}\n","/**\n * TradingOverlayStore\n *\n * Shared, mode-agnostic store for trade overlay state.\n * Used by both unmanaged mode (externally supplied data) and managed mode\n * (internally generated data from the managed trading service).\n *\n * Supports:\n * - Full replace (setOrders / setPositions)\n * - Incremental (upsertOrder / upsertPosition / pushExecution)\n * - Remove by id (removeOrder / removePosition)\n *\n * Subscribers are notified via callbacks registered with onChange().\n * The store is intentionally free of React/DOM dependencies so it can be\n * consumed from any rendering layer (canvas, React, etc.).\n *\n * @example\n * ```ts\n * const store = new TradingOverlayStore();\n *\n * // Subscribe to changes (e.g. trigger a canvas repaint)\n * store.onChange(() => chart.markDirty());\n *\n * // Feed data\n * store.setOrders([...]);\n * store.upsertOrder({ id: 'o1', role: 'entry', side: 'buy', ... });\n * store.removeOrder('o1');\n * ```\n */\n\nimport type { ChartOrder, ChartPosition, ExecutionFill } from './tradingTypes';\n\ntype ChangeListener = () => void;\n\nexport class TradingOverlayStore {\n private _orders = new Map<string, ChartOrder>();\n private _positions = new Map<string, ChartPosition>();\n private _fills: ExecutionFill[] = [];\n\n private _listeners: ChangeListener[] = [];\n\n // ── Change subscription ──────────────────────────────────────────────────────\n\n /**\n * Register a callback that fires whenever any state changes.\n * Returns an unsubscribe function.\n */\n onChange(listener: ChangeListener): () => void {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n private _notify(): void {\n for (const l of this._listeners) l();\n }\n\n // ── Orders ───────────────────────────────────────────────────────────────────\n\n /** Replace the entire order set. */\n setOrders(orders: ChartOrder[]): void {\n this._orders.clear();\n for (const o of orders) this._orders.set(o.id, o);\n this._notify();\n }\n\n /**\n * Insert or replace a single order.\n * Matching is done by `order.id`.\n */\n upsertOrder(order: ChartOrder): void {\n this._orders.set(order.id, order);\n this._notify();\n }\n\n /** Remove an order by id. Silent no-op if not found. */\n removeOrder(orderId: string): void {\n if (this._orders.delete(orderId)) this._notify();\n }\n\n /** Returns a snapshot of all orders as an array (insertion order). */\n getOrders(): ChartOrder[] {\n return Array.from(this._orders.values());\n }\n\n /** Returns orders that share the given `groupId`. */\n getOrdersByGroup(groupId: string): ChartOrder[] {\n return this.getOrders().filter(o => o.groupId === groupId);\n }\n\n // ── Positions ────────────────────────────────────────────────────────────────\n\n /** Replace the entire position set. */\n setPositions(positions: ChartPosition[]): void {\n this._positions.clear();\n for (const p of positions) this._positions.set(p.id, p);\n this._notify();\n }\n\n /**\n * Insert or replace a single position.\n * Matching is done by `position.id`.\n */\n upsertPosition(position: ChartPosition): void {\n this._positions.set(position.id, position);\n this._notify();\n }\n\n /** Remove a position by id. Silent no-op if not found. */\n removePosition(positionId: string): void {\n if (this._positions.delete(positionId)) this._notify();\n }\n\n /** Returns a snapshot of all positions as an array (insertion order). */\n getPositions(): ChartPosition[] {\n return Array.from(this._positions.values());\n }\n\n // ── Fills ────────────────────────────────────────────────────────────────────\n\n /**\n * Append an execution fill to the fill log.\n * Fills are append-only — they are never updated or removed.\n */\n pushExecution(fill: ExecutionFill): void {\n this._fills.push(fill);\n this._notify();\n }\n\n /** Returns all fills in insertion (chronological) order. */\n getFills(): readonly ExecutionFill[] {\n return this._fills;\n }\n\n /** Returns fills associated with a specific order id. */\n getFillsByOrder(orderId: string): ExecutionFill[] {\n return this._fills.filter(f => f.orderId === orderId);\n }\n\n // ── Bulk clear ───────────────────────────────────────────────────────────────\n\n /** Wipes all overlay state (orders, positions, fills). */\n clear(): void {\n this._orders.clear();\n this._positions.clear();\n this._fills = [];\n this._notify();\n }\n\n // ── Snapshot ─────────────────────────────────────────────────────────────────\n\n /** Returns the full overlay state as a plain object — useful for debug / serialisation. */\n snapshot(): { orders: ChartOrder[]; positions: ChartPosition[]; fills: readonly ExecutionFill[] } {\n return {\n orders: this.getOrders(),\n positions: this.getPositions(),\n fills: this.getFills(),\n };\n }\n}\n","import type { LicenseFeatures, LicenseMode, LicensePayload } from './licenseTypes';\n\nconst DEFAULT_MODE: LicenseMode = 'unmanaged';\nconst DEFAULT_FEATURES: LicenseFeatures = {};\n\n/**\n * LicenseManager — single source of truth for chart mode and feature access.\n *\n * Usage:\n * const lm = LicenseManager.getInstance();\n * await lm.validateLicense('my-key');\n * lm.getMode(); // 'managed' | 'unmanaged'\n * lm.hasFeature('orderEntry');\n */\nexport class LicenseManager {\n private static instance: LicenseManager | null = null;\n\n private payload: LicensePayload | null = null;\n private readonly subscribers: Set<() => void> = new Set();\n\n private constructor() {}\n\n /**\n * Subscribe to license state changes (loadLicense, validateLicense, clear).\n * Returns an unsubscribe function — call it to stop receiving notifications.\n *\n * @example\n * const unsub = LicenseManager.getInstance().subscribe(() => {\n * console.log('license changed', lm.getMode());\n * });\n * // later:\n * unsub();\n */\n subscribe(cb: () => void): () => void {\n this.subscribers.add(cb);\n return () => this.subscribers.delete(cb);\n }\n\n private notify(): void {\n this.subscribers.forEach((cb) => {\n try { cb(); } catch { /* subscriber errors must not affect license state */ }\n });\n }\n\n static getInstance(): LicenseManager {\n if (!LicenseManager.instance) {\n LicenseManager.instance = new LicenseManager();\n }\n return LicenseManager.instance;\n }\n\n /**\n * Validate a license key against the licensing endpoint.\n *\n * @param key The raw license key entered by the user.\n * @param verifyUrl Full URL of the forgecharts-admin verify endpoint,\n * e.g. \"http://licenses.example.com:4100/api/public/license/verify\"\n */\n async validateLicense(key: string, verifyUrl: string): Promise<LicensePayload> {\n if (!key || !key.trim()) {\n throw new Error('LicenseManager: license key must not be empty');\n }\n if (!verifyUrl) {\n throw new Error('LicenseManager: verifyUrl is required');\n }\n\n const res = await fetch(verifyUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ licenseKey: key.trim().toUpperCase() }),\n });\n\n if (!res.ok) {\n throw new Error(`License server error: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json() as { valid: boolean; reason?: string; licenseKey?: string; mode?: string; plan?: string; expiresAt?: string | null; features?: Record<string, boolean> };\n\n if (!data.valid) {\n throw new Error(data.reason ?? 'License invalid');\n }\n\n const payload: LicensePayload = {\n licenseKey: data.licenseKey ?? key.trim().toUpperCase(),\n mode: (data.mode ?? 'unmanaged') as LicensePayload['mode'],\n ...(data.plan != null && { plan: data.plan }),\n ...(data.expiresAt != null && { expires: data.expiresAt }),\n ...(data.features != null && { features: data.features as LicenseFeatures }),\n };\n\n this.payload = payload;\n this.notify();\n return payload;\n }\n\n /** Load a pre-validated payload (e.g. from cache / localStorage). */\n loadLicense(payload: LicensePayload): void {\n this.payload = payload;\n this.notify();\n }\n\n /** Return the currently loaded payload, or null if none. */\n getLicense(): LicensePayload | null {\n return this.payload;\n }\n\n /**\n * The chart mode driven by the active license.\n * Defaults to 'unmanaged' so no managed features appear without a valid\n * managed license.\n */\n getMode(): LicenseMode {\n return this.payload?.mode ?? DEFAULT_MODE;\n }\n\n /** Return the feature flags for the active license. */\n getFeatures(): LicenseFeatures {\n return this.payload?.features ?? DEFAULT_FEATURES;\n }\n\n /** Check whether a specific feature is enabled on the active license. */\n hasFeature(name: keyof LicenseFeatures): boolean {\n return this.getFeatures()[name] === true;\n }\n\n /** Clear the current license state (returns to safe unmanaged defaults). */\n clear(): void {\n this.payload = null;\n this.notify();\n }\n}\n","/**\n * ChartRuntimeResolver\n *\n * Single source of truth for runtime capability queries.\n * Mode is always derived from the installed LicenseManager state — it is\n * never passed in by chart config, ensuring clients cannot bypass the\n * license-driven mode selection.\n *\n * Usage:\n * import { ChartRuntimeResolver } from '@forgecharts/sdk';\n * const resolver = ChartRuntimeResolver.getInstance();\n *\n * resolver.isManagedMode() // true when a managed license is active\n * resolver.isUnmanagedMode() // true when no license or unmanaged license\n * resolver.canUseOrderEntry() // built-in order entry UI\n * resolver.canUseExternalIngestion() // external data ingestion APIs\n * resolver.canRenderOverlays() // overlay rendering\n * resolver.canUseIndicators() // indicator panel\n * resolver.canUseManagedTrading() // managed broker / execution hooks\n * resolver.canUseDraggableOrders() // drag-to-price order placement\n * resolver.canUseBracketOrders() // bracket / OCO order support\n *\n * Capability matrix\n * ─────────────────────────────────────────────────────\n * Capability unmanaged managed\n * ─────────────────────────────────────────────────────\n * externalIngestion ✓ ✗ (managed feed owns data)\n * overlays ✓ ✓ (both modes render overlays)\n * indicators ✓ ✓\n * orderEntry ✗ ✓ (requires managed license)\n * managedTrading ✗ ✓\n * draggableOrders ✗ ✓\n * bracketOrders ✗ ✓\n * ─────────────────────────────────────────────────────\n *\n * Feature flags in the LicensePayload can further restrict capabilities\n * within a mode. A managed license with `orderEntry: false` will still\n * return false from canUseOrderEntry().\n */\n\nimport { LicenseManager } from './LicenseManager';\nimport type { LicenseFeatures } from './licenseTypes';\n\nexport class ChartRuntimeResolver {\n private static instance: ChartRuntimeResolver | null = null;\n\n /** Always read from the singleton LicenseManager — never store a copy. */\n private get lm(): LicenseManager {\n return LicenseManager.getInstance();\n }\n\n private constructor() {}\n\n static getInstance(): ChartRuntimeResolver {\n if (!ChartRuntimeResolver.instance) {\n ChartRuntimeResolver.instance = new ChartRuntimeResolver();\n }\n return ChartRuntimeResolver.instance;\n }\n\n // ── Mode checks ─────────────────────────────────────────────────────────────\n\n /** True when the active license is in managed mode. */\n isManagedMode(): boolean {\n return this.lm.getMode() === 'managed';\n }\n\n /** True when no license is installed or the license is in unmanaged mode. */\n isUnmanagedMode(): boolean {\n return this.lm.getMode() === 'unmanaged';\n }\n\n // ── Capability queries ───────────────────────────────────────────────────────\n\n /**\n * External data ingestion APIs (e.g. pushing tick data from an external broker).\n * Available in unmanaged mode only — in managed mode the built-in feed owns data.\n * Override via `unmanagedIngestion` feature flag on a managed license if needed.\n */\n canUseExternalIngestion(): boolean {\n if (this.isUnmanagedMode()) return true;\n // A managed license can explicitly opt-in to external ingestion\n return this.#featureOrDefault('unmanagedIngestion', false);\n }\n\n /**\n * Overlay rendering from external state (price levels, zones, signals).\n * Enabled in both modes by default; can be restricted via feature flag.\n */\n canRenderOverlays(): boolean {\n return this.#featureOrDefault('overlays', true);\n }\n\n /**\n * Indicator panel / computations.\n * Enabled in both modes by default; can be restricted via feature flag.\n */\n canUseIndicators(): boolean {\n return this.#featureOrDefault('indicators', true);\n }\n\n /**\n * Built-in order entry UI hooks.\n * Requires managed mode AND the `orderEntry` feature flag (or no flag restriction).\n */\n canUseOrderEntry(): boolean {\n if (this.isUnmanagedMode()) return false;\n return this.#featureOrDefault('orderEntry', true);\n }\n\n /**\n * Managed trading service hooks (broker execution, position management).\n * Requires managed mode AND the `managedTrading` feature flag (or no flag restriction).\n */\n canUseManagedTrading(): boolean {\n if (this.isUnmanagedMode()) return false;\n return this.#featureOrDefault('managedTrading', true);\n }\n\n /**\n * Drag-to-price order placement.\n * Requires managed mode AND the `draggableOrders` feature flag (or no flag restriction).\n */\n canUseDraggableOrders(): boolean {\n if (this.isUnmanagedMode()) return false;\n return this.#featureOrDefault('draggableOrders', true);\n }\n\n /**\n * Bracket / OCO order support.\n * Requires managed mode AND the `bracketOrders` feature flag (or no flag restriction).\n */\n canUseBracketOrders(): boolean {\n if (this.isUnmanagedMode()) return false;\n return this.#featureOrDefault('bracketOrders', true);\n }\n\n // ── UI render capability checks ──────────────────────────────────────────────\n // These are component-level gates. They derive from the feature-level checks\n // above and are the checks that toolbar / panel components should consume.\n\n /**\n * Whether to render the order entry tool in the toolbar.\n * Hidden in unmanaged mode — requires managed license with order entry.\n */\n canRenderOrderEntry(): boolean {\n return this.canUseOrderEntry();\n }\n\n /**\n * Whether to render Buy / Sell action buttons on the chart or toolbar.\n * Hidden in unmanaged mode — order placement requires managed license.\n */\n canRenderBuySellButtons(): boolean {\n return this.canUseOrderEntry();\n }\n\n /**\n * Whether to render the order ticket panel (entry form / DOM entry).\n * Requires managed mode with order entry enabled.\n */\n canRenderOrderTicket(): boolean {\n return this.canUseOrderEntry();\n }\n\n /**\n * Whether to render bracket order controls (TP, SL, OCO).\n * Requires managed mode with order entry AND the bracketOrders feature flag.\n * If order entry itself is disabled, bracket controls are also hidden.\n */\n canRenderBracketControls(): boolean {\n if (!this.canUseOrderEntry()) return false;\n return this.canUseBracketOrders();\n }\n\n /**\n * Whether to render order modification controls (drag-to-modify, edit panel).\n * Requires managed mode with order entry AND the draggableOrders feature flag.\n * If order entry itself is disabled, modification controls are also hidden.\n */\n canRenderOrderModificationControls(): boolean {\n if (!this.canUseOrderEntry()) return false;\n return this.canUseDraggableOrders();\n }\n\n /**\n * Whether to render the managed trading control panel as a whole.\n * Guards the container that holds buy/sell, order ticket, bracket controls, etc.\n */\n canRenderManagedTradingControls(): boolean {\n return this.canUseManagedTrading();\n }\n\n /**\n * True when the chart is in external-overlay-only (unmanaged) mode.\n * Drives rendering of the external data overlay panel while suppressing\n * all order entry UI elements.\n */\n canRenderExternalOverlayOnlyMode(): boolean {\n return this.isUnmanagedMode();\n }\n\n /**\n * Positions are always rendered regardless of license mode.\n * Data flows from TradingOverlayStore (host-pushed in unmanaged,\n * ManagedTradingController-driven in managed).\n */\n canRenderPositions(): boolean {\n return true;\n }\n\n /**\n * Execution fills are always rendered regardless of license mode.\n */\n canRenderFills(): boolean {\n return true;\n }\n\n /**\n * Candles are always rendered — unaffected by license mode.\n * The RapidAPI datafeed remains active in all modes.\n */\n canRenderCandles(): boolean {\n return true;\n }\n\n /**\n * Indicator panel follows the `indicators` feature flag.\n * Enabled in both modes by default.\n */\n canRenderIndicators(): boolean {\n return this.canUseIndicators();\n }\n\n /**\n * Drawing tools are always available regardless of license mode.\n */\n canRenderDrawings(): boolean {\n return true;\n }\n\n // ── Convenience snapshot ────────────────────────────────────────────────────\n\n /**\n * Returns the full capability set as a plain object — useful for logging,\n * debug panels, or passing state to React context in one call.\n */\n getCapabilities(): ChartCapabilities {\n return {\n // ── Mode & feature-level flags ──────────────────────────────────────\n mode: this.lm.getMode(),\n externalIngestion: this.canUseExternalIngestion(),\n overlays: this.canRenderOverlays(),\n indicators: this.canUseIndicators(),\n orderEntry: this.canUseOrderEntry(),\n managedTrading: this.canUseManagedTrading(),\n draggableOrders: this.canUseDraggableOrders(),\n bracketOrders: this.canUseBracketOrders(),\n // ── UI render flags ─────────────────────────────────────────────────\n renderOrderEntry: this.canRenderOrderEntry(),\n renderBuySellButtons: this.canRenderBuySellButtons(),\n renderOrderTicket: this.canRenderOrderTicket(),\n renderBracketControls: this.canRenderBracketControls(),\n renderOrderModificationControls: this.canRenderOrderModificationControls(),\n renderManagedTradingControls: this.canRenderManagedTradingControls(),\n renderExternalOverlayOnly: this.canRenderExternalOverlayOnlyMode(),\n renderPositions: this.canRenderPositions(),\n renderFills: this.canRenderFills(),\n renderCandles: this.canRenderCandles(),\n renderIndicators: this.canRenderIndicators(),\n renderDrawings: this.canRenderDrawings(),\n };\n }\n\n // ── Private helpers ─────────────────────────────────────────────────────────\n\n /**\n * If the active license has an explicit feature flag, use it.\n * Otherwise fall back to `defaultValue` (allows capability even without an\n * explicit flag, matching the \"omitted = allowed\" convention).\n */\n #featureOrDefault(name: keyof LicenseFeatures, defaultValue: boolean): boolean {\n const features = this.lm.getFeatures();\n const flag = features[name];\n return flag === undefined ? defaultValue : flag === true;\n }\n}\n\n// ── Capability snapshot type ─────────────────────────────────────────────────\n\nexport interface ChartCapabilities {\n // ── Mode & feature-level flags ────────────────────────────────────────────\n mode: 'managed' | 'unmanaged';\n externalIngestion: boolean;\n overlays: boolean;\n indicators: boolean;\n orderEntry: boolean;\n managedTrading: boolean;\n draggableOrders: boolean;\n bracketOrders: boolean;\n // ── UI render flags ───────────────────────────────────────────────────────\n /** Show the order entry tool in toolbars (managed only). */\n renderOrderEntry: boolean;\n /** Show Buy / Sell action buttons (managed only). */\n renderBuySellButtons: boolean;\n /** Show the order ticket / entry form (managed only). */\n renderOrderTicket: boolean;\n /** Show bracket order controls — TP, SL, OCO (managed + bracketOrders). */\n renderBracketControls: boolean;\n /** Show order modification controls — drag handles, edit panel (managed + draggableOrders). */\n renderOrderModificationControls: boolean;\n /** Show the entire managed trading panel as a composite gate. */\n renderManagedTradingControls: boolean;\n /** True when operating in external-overlay-only (unmanaged) mode. */\n renderExternalOverlayOnly: boolean;\n /** Positions always rendered — data controlled by TradingOverlayStore. */\n renderPositions: boolean;\n /** Execution fills always rendered. */\n renderFills: boolean;\n /** Candles always rendered — RapidAPI datafeed unaffected by mode. */\n renderCandles: boolean;\n /** Indicators follow the `indicators` feature flag (both modes). */\n renderIndicators: boolean;\n /** Drawing tools always available regardless of license mode. */\n renderDrawings: boolean;\n}\n\n// ── Module-level convenience functions ───────────────────────────────────────\n// These mirror the instance methods and are the recommended import style for\n// non-class consumers.\n\nconst resolver = () => ChartRuntimeResolver.getInstance();\n\n/** True when a managed license is active. */\nexport const isManagedMode = (): boolean => resolver().isManagedMode();\n/** True when no license or unmanaged license is active (safe default). */\nexport const isUnmanagedMode = (): boolean => resolver().isUnmanagedMode();\n/** External data ingestion APIs (unmanaged mode only by default). */\nexport const canUseExternalIngestion = (): boolean => resolver().canUseExternalIngestion();\n/** Overlay rendering — enabled in both modes. */\nexport const canRenderOverlays = (): boolean => resolver().canRenderOverlays();\n/** Indicator computations — enabled in both modes. */\nexport const canUseIndicators = (): boolean => resolver().canUseIndicators();\n/** Built-in order entry UI — managed mode only. */\nexport const canUseOrderEntry = (): boolean => resolver().canUseOrderEntry();\n/** Managed trading service hooks — managed mode only. */\nexport const canUseManagedTrading = (): boolean => resolver().canUseManagedTrading();\n/** Drag-to-price order placement — managed mode only. */\nexport const canUseDraggableOrders = (): boolean => resolver().canUseDraggableOrders();\n/** Bracket / OCO order support — managed mode only. */\nexport const canUseBracketOrders = (): boolean => resolver().canUseBracketOrders();\n/** Full capability snapshot as a plain object. */\nexport const getCapabilities = (): ChartCapabilities => resolver().getCapabilities();\n\n// ── UI render convenience functions ──────────────────────────────────────────\n\n/** Whether to render the order entry tool in toolbars (managed only). */\nexport const canRenderOrderEntry = (): boolean => resolver().canRenderOrderEntry();\n/** Whether to render Buy/Sell buttons (managed only). */\nexport const canRenderBuySellButtons = (): boolean => resolver().canRenderBuySellButtons();\n/** Whether to render the order ticket panel (managed only). */\nexport const canRenderOrderTicket = (): boolean => resolver().canRenderOrderTicket();\n/** Whether to render bracket / OCO controls (managed + bracketOrders feature). */\nexport const canRenderBracketControls = (): boolean => resolver().canRenderBracketControls();\n/** Whether to render drag/edit order modification controls (managed + draggableOrders). */\nexport const canRenderOrderModificationControls = (): boolean => resolver().canRenderOrderModificationControls();\n/** Whether to render the managed trading control panel (managed only). */\nexport const canRenderManagedTradingControls = (): boolean => resolver().canRenderManagedTradingControls();\n/** True when in external-overlay-only (unmanaged) mode — hides all order-entry UI. */\nexport const canRenderExternalOverlayOnlyMode = (): boolean => resolver().canRenderExternalOverlayOnlyMode();\n/** Positions always rendered regardless of mode. */\nexport const canRenderPositions = (): boolean => resolver().canRenderPositions();\n/** Execution fills always rendered regardless of mode. */\nexport const canRenderFills = (): boolean => resolver().canRenderFills();\n/** Candles always rendered — RapidAPI datafeed unaffected by mode. */\nexport const canRenderCandles = (): boolean => resolver().canRenderCandles();\n/** Indicators follow the indicators feature flag (both modes by default). */\nexport const canRenderIndicators = (): boolean => resolver().canRenderIndicators();\n/** Drawing tools always available regardless of license mode. */\nexport const canRenderDrawings = (): boolean => resolver().canRenderDrawings();\n","/**\n * UnmanagedIngestion\n *\n * External candle data ingestion for unmanaged mode.\n *\n * In unmanaged mode the client owns their data pipeline. They pass\n * normalised candle data to us; this layer validates the license gate,\n * delegates to the existing CandleEngine for bucket management, and\n * notifies callers via callbacks mirroring the CandleEngine contract.\n *\n * Critical constraint: the default RapidAPI-backed datafeed is completely\n * untouched. UnmanagedIngestion is an additive, opt-in path.\n *\n * Candle rules (matches CandleEngine behaviour):\n * same timeMs → update current candle\n * newer timeMs → append / new bucket\n * older timeMs → silently ignored (logged in debug mode)\n *\n * @example\n * ```ts\n * const ingestion = new UnmanagedIngestion('1m', {\n * onBarUpdated: (bar) => series.update(bar),\n * onResync: (bars) => series.setData(bars),\n * });\n *\n * // Feed a full history snapshot first\n * ingestion.setHistory(historicalBars);\n *\n * // Then stream live ticks\n * ingestion.pushCandle(latestBar);\n * ```\n */\n\nimport { CandleEngine } from '../engine/CandleEngine';\nimport type { CandleBar, UpdateResult, GapInfo } from '../engine/CandleEngine';\nimport { isUnmanagedMode } from '../licensing/ChartRuntimeResolver';\nimport type { CandleInput } from './tradingTypes';\nimport type { Timeframe } from '@forgecharts/types';\n\nexport interface UnmanagedIngestionOptions {\n /** Enable debug logging on the underlying CandleEngine. */\n debug?: boolean;\n\n /**\n * Fired after every bar mutation (update or append from a live push).\n * Corresponds to CandleEngine.onBarUpdated.\n */\n onBarUpdated?: (bar: CandleBar, result: UpdateResult) => void;\n\n /**\n * Fired when the full bar array changes (after setHistory or gap backfill).\n * The chart adapter should call `series.setData(bars)`.\n */\n onResync?: (bars: readonly CandleBar[]) => void;\n\n /** Fired when a candle bucket closes. */\n onBarClosed?: (bar: CandleBar) => void;\n\n /** Fired when the engine detects skipped buckets in the live stream. */\n onGapDetected?: (info: GapInfo) => void;\n}\n\nexport class UnmanagedIngestion {\n private readonly _engine: CandleEngine;\n private readonly _opts: UnmanagedIngestionOptions;\n private _timeframe: Timeframe;\n\n constructor(timeframe: Timeframe, opts: UnmanagedIngestionOptions = {}) {\n this._opts = opts;\n this._timeframe = timeframe;\n this._engine = new CandleEngine({\n ...(opts.debug !== undefined ? { debug: opts.debug } : {}),\n ...(opts.onBarUpdated !== undefined ? { onBarUpdated: opts.onBarUpdated } : {}),\n ...(opts.onBarClosed !== undefined ? { onBarClosed: opts.onBarClosed } : {}),\n ...(opts.onGapDetected !== undefined ? { onGapDetected: opts.onGapDetected } : {}),\n ...(opts.onResync !== undefined ? { onResync: opts.onResync } : {}),\n });\n // Prime the engine so it knows its timeframe before any data arrives\n this._engine.initialize([], timeframe);\n }\n\n // ── Guard ────────────────────────────────────────────────────────────────────\n\n private _assertUnmanaged(): void {\n if (!isUnmanagedMode()) {\n throw new Error(\n '[ForgeCharts] External data ingestion is only available in unmanaged mode. ' +\n 'The active license is in managed mode.',\n );\n }\n }\n\n // ── History ──────────────────────────────────────────────────────────────────\n\n /**\n * Load a full historical bar snapshot.\n * Replaces the engine's bar array and triggers `onResync` so the chart\n * series is fully redrawn.\n *\n * Call this once at startup (or on symbol/interval change) before\n * streaming live candles via `pushCandle`.\n *\n * @throws If the active license is not in unmanaged mode.\n */\n setHistory(bars: CandleInput[]): void {\n this._assertUnmanaged();\n\n // Sort ascending — initialize expects oldest → newest\n const sorted = [...bars].sort((a, b) => a.time - b.time);\n this._engine.initialize(sorted, this._timeframe);\n // CandleEngine.initialize() does not fire onResync — invoke it explicitly\n this._opts.onResync?.(this._engine.getBars());\n }\n\n // ── Live push ────────────────────────────────────────────────────────────────\n\n /**\n * Push a single live candle tick.\n *\n * Behaviour follows CandleEngine rules:\n * - same bucket → updates existing bar (OHLCV merging)\n * - new bucket → appends a new bar (previous bar is finalised)\n * - older bucket → silently ignored; debug-logged when `debug: true`\n *\n * @throws If the active license is not in unmanaged mode.\n */\n pushCandle(bar: CandleInput): UpdateResult {\n this._assertUnmanaged();\n return this._engine.applyLiveUpdate(bar);\n }\n\n // ── Accessors ────────────────────────────────────────────────────────────────\n\n /** Returns the current bar array (chronological, ascending). */\n getBars(): readonly CandleBar[] {\n return this._engine.getBars();\n }\n\n /** Returns the latest candle, or null if no data has been loaded. */\n getLatestBar(): CandleBar | null {\n const bars = this._engine.getBars();\n return bars.length > 0 ? bars[bars.length - 1]! : null;\n }\n\n /** Changes the active timeframe and clears all bar data. */\n setTimeframe(timeframe: Timeframe): void {\n this._timeframe = timeframe;\n // Re-initialise with empty history — caller must follow up with setHistory()\n this._engine.initialize([], timeframe);\n }\n\n /** Clears all bars (e.g. on symbol change before calling setHistory again). */\n reset(): void {\n this._engine.reset();\n }\n}\n","/**\n * managedCapabilities.ts\n *\n * Feature-gate helpers specific to managed trading.\n * Thin wrappers around ChartRuntimeResolver that produce clear, actionable\n * error messages when a managed method is called without a suitable license.\n *\n * Usage (inside a managed trading method):\n *\n * assertManagedMode(); // throws if not in managed mode\n * assertCanPlaceOrders(); // throws if orderEntry flag is off\n * assertCanUseBrackets(); // throws if bracketOrders flag is off\n * assertCanUseDraggableOrders(); // throws if draggableOrders flag is off\n */\n\nimport { ChartRuntimeResolver } from '../../licensing/ChartRuntimeResolver';\n\nconst resolver = () => ChartRuntimeResolver.getInstance();\n\n// ── Guard helpers (throw on failure) ─────────────────────────────────────────\n\n/**\n * Asserts that the active license is in managed mode.\n * @throws {Error} with a clear message if mode is unmanaged.\n */\nexport function assertManagedMode(): void {\n if (!resolver().isManagedMode()) {\n throw new Error(\n '[ForgeCharts] This feature requires a managed-mode license. ' +\n 'The current license is in unmanaged mode (or no license is installed). ' +\n 'Install a managed license via LicenseManager.validateLicense().',\n );\n }\n}\n\n/**\n * Asserts that the license permits order placement (orderEntry feature).\n * Implicitly checks managed mode first.\n */\nexport function assertCanPlaceOrders(): void {\n assertManagedMode();\n if (!resolver().canUseOrderEntry()) {\n throw new Error(\n '[ForgeCharts] Order entry is not enabled on the active license. ' +\n 'Contact your license provider to enable the orderEntry feature.',\n );\n }\n}\n\n/**\n * Asserts that the license permits bracket / OCO orders.\n * Implicitly checks managed mode and order entry first.\n */\nexport function assertCanUseBrackets(): void {\n assertCanPlaceOrders();\n if (!resolver().canUseBracketOrders()) {\n throw new Error(\n '[ForgeCharts] Bracket orders are not enabled on the active license. ' +\n 'Contact your license provider to enable the bracketOrders feature.',\n );\n }\n}\n\n/**\n * Asserts that the license permits drag-to-price order placement.\n * Implicitly checks managed mode and order entry first.\n */\nexport function assertCanUseDraggableOrders(): void {\n assertCanPlaceOrders();\n if (!resolver().canUseDraggableOrders()) {\n throw new Error(\n '[ForgeCharts] Draggable orders are not enabled on the active license. ' +\n 'Contact your license provider to enable the draggableOrders feature.',\n );\n }\n}\n\n/**\n * Asserts that the license permits the managed trading service hooks.\n * Implicitly checks managed mode first.\n */\nexport function assertCanUseManagedTrading(): void {\n assertManagedMode();\n if (!resolver().canUseManagedTrading()) {\n throw new Error(\n '[ForgeCharts] Managed trading is not enabled on the active license. ' +\n 'Contact your license provider to enable the managedTrading feature.',\n );\n }\n}\n\n// ── Boolean helpers (for conditional rendering, no throw) ────────────────────\n\nexport const isManagedCapable = (): boolean => resolver().isManagedMode();\nexport const canPlaceOrders = (): boolean => resolver().isManagedMode() && resolver().canUseOrderEntry();\nexport const canPlaceBrackets = (): boolean => canPlaceOrders() && resolver().canUseBracketOrders();\nexport const canUseDraggable = (): boolean => canPlaceOrders() && resolver().canUseDraggableOrders();\nexport const canUseManagedTradingHook = (): boolean => resolver().isManagedMode() && resolver().canUseManagedTrading();\n","/**\n * ManagedTradingController\n *\n * The single managed-mode entry point for order routing.\n *\n * Responsibilities:\n * 1. Enforce license/capability gates before any action.\n * 2. Delegate execution to the registered IExecutionProvider.\n * 3. Write results (orders, fills, positions) into the shared TradingOverlayStore\n * so managed and unmanaged modes share one visual layer.\n *\n * STUB STATUS\n * ──────────────────────────────────────────────────────────────────────────────\n * All execution methods are implemented as stubs that:\n * a) enforce license gates (will throw today if called without managed mode)\n * b) throw NotImplementedError when no provider is registered\n * c) are annotated with TODO markers for the implementation phase\n *\n * To implement a real provider, create a class implementing IExecutionProvider\n * and call:\n * controller.registerProvider(new MyBrokerProvider(...));\n *\n * The controller will then delegate to it automatically.\n * ──────────────────────────────────────────────────────────────────────────────\n */\n\nimport type { TradingOverlayStore } from '../TradingOverlayStore';\nimport type { ChartOrder, ExecutionFill } from '../tradingTypes';\nimport type {\n IExecutionProvider,\n PlaceOrderInput,\n ModifyOrderInput,\n PlaceBracketOrderInput,\n OrderAck,\n BracketOrderAck,\n} from './managedTypes';\nimport {\n assertCanPlaceOrders,\n assertCanUseBrackets,\n assertCanUseManagedTrading,\n} from './managedCapabilities';\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction notImplemented(method: string): never {\n throw new Error(\n `[ForgeCharts:ManagedTrading] ${method} — no execution provider is registered. ` +\n 'Call controller.registerProvider(provider) before using managed trading methods.',\n );\n}\n\nfunction makeId(): string {\n return `order_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ── Controller ────────────────────────────────────────────────────────────────\n\nexport class ManagedTradingController {\n\n private _provider: IExecutionProvider | null = null;\n private readonly _store: TradingOverlayStore;\n\n constructor(store: TradingOverlayStore) {\n this._store = store;\n }\n\n // ── Provider registration ─────────────────────────────────────────────────\n\n /**\n * Register the execution provider that will handle order routing.\n *\n * Call this before any order placement methods. Only one provider may be\n * active at a time — calling this again replaces the previous provider.\n *\n * @example\n * ```ts\n * import { RithmicProvider } from '@forgecharts/rithmic';\n * controller.registerProvider(new RithmicProvider(credentials));\n * ```\n */\n registerProvider(provider: IExecutionProvider): void {\n assertCanUseManagedTrading();\n this._provider = provider;\n }\n\n /** Returns the id of the currently registered provider, or null if none. */\n getProviderId(): string | null {\n return this._provider?.providerId ?? null;\n }\n\n /** True when a provider is registered and managed trading is licensed. */\n isReady(): boolean {\n return this._provider !== null;\n }\n\n // ── Order placement ───────────────────────────────────────────────────────\n\n /**\n * Place a single order via the registered execution provider.\n *\n * On success:\n * - Upserts a ChartOrder into the overlay store (status: 'pending' → 'open').\n * - Returns the provider acknowledgement.\n *\n * @throws If not in managed mode, orderEntry feature is off, or no provider.\n *\n * TODO: After provider.placeOrder resolves, subscribe to order status updates\n * (provider event stream) and call _store.upsertOrder() as status changes.\n */\n async placeOrder(input: PlaceOrderInput): Promise<OrderAck> {\n assertCanPlaceOrders();\n if (!this._provider) notImplemented('placeOrder');\n\n // Create an optimistic overlay entry immediately\n const clientId = makeId();\n const overlayOrder: ChartOrder = {\n id: clientId,\n role: input.type === 'stop_market' || input.type === 'stop_limit' ? 'stop' : 'entry',\n side: input.side,\n status: 'pending',\n price: input.limitPrice ?? input.stopPrice ?? 0,\n qty: input.qty,\n timestamp: Date.now(),\n ...(input.groupId !== undefined ? { groupId: input.groupId } : {}),\n ...(input.label !== undefined ? { label: input.label } : {}),\n ...(input.meta !== undefined ? { meta: input.meta } : {}),\n };\n this._store.upsertOrder(overlayOrder);\n\n try {\n // TODO: provider.placeOrder should also start streaming status updates\n const ack = await this._provider.placeOrder(input);\n\n // Update overlay with provider-assigned id\n this._store.upsertOrder({ ...overlayOrder, id: ack.orderId, status: 'open' });\n // Remove the optimistic entry now the real id is known\n if (ack.orderId !== clientId) this._store.removeOrder(clientId);\n\n return ack;\n } catch (err) {\n // Roll back optimistic entry on placement failure\n this._store.upsertOrder({ ...overlayOrder, status: 'rejected' });\n throw err;\n }\n }\n\n /**\n * Cancel a working order by its provider-assigned id.\n *\n * On success:\n * - Updates the order status in the overlay store to 'cancelled'.\n *\n * @throws If not in managed mode, orderEntry feature is off, or no provider.\n *\n * TODO: Remove the overlay entry after a configurable delay (so the line\n * visually fades out rather than disappearing instantly).\n */\n async cancelOrder(orderId: string): Promise<void> {\n assertCanPlaceOrders();\n if (!this._provider) notImplemented('cancelOrder');\n\n await this._provider.cancelOrder(orderId);\n\n // Reflect cancellation in overlay\n const existing = this._store.getOrders().find(o => o.id === orderId);\n if (existing) {\n this._store.upsertOrder({ ...existing, status: 'cancelled' });\n }\n }\n\n /**\n * Modify a working order in place.\n *\n * On success:\n * - Updates the ChartOrder price/qty in the overlay store.\n *\n * @throws If not in managed mode, orderEntry feature is off, or no provider.\n *\n * TODO: Validate that the modified price is within instrument tick constraints\n * before forwarding to the provider.\n */\n async modifyOrder(orderId: string, updates: ModifyOrderInput): Promise<OrderAck> {\n assertCanPlaceOrders();\n if (!this._provider) notImplemented('modifyOrder');\n\n const ack = await this._provider.modifyOrder(orderId, updates);\n\n // Reflect modifications in overlay\n const existing = this._store.getOrders().find(o => o.id === orderId);\n if (existing) {\n this._store.upsertOrder({\n ...existing,\n ...(updates.limitPrice !== undefined ? { price: updates.limitPrice } : {}),\n ...(updates.qty !== undefined ? { qty: updates.qty } : {}),\n ...(updates.label !== undefined ? { label: updates.label } : {}),\n });\n }\n\n return ack;\n }\n\n /**\n * Place a bracket order: entry + stop-loss + optional take-profit.\n *\n * On success:\n * - Upserts all bracket legs as ChartOrders sharing the same groupId.\n * - Returns acknowledgements for each leg.\n *\n * @throws If not in managed mode, bracketOrders feature is off, or no provider.\n *\n * TODO: Expose drag handles for each bracket leg in the chart overlay so\n * users can adjust prices before confirming.\n */\n async placeBracketOrder(input: PlaceBracketOrderInput): Promise<BracketOrderAck> {\n assertCanUseBrackets();\n if (!this._provider) notImplemented('placeBracketOrder');\n\n const groupId = input.entry.groupId ?? makeId();\n\n const ack = await this._provider.placeBracketOrder({\n ...input,\n entry: { ...input.entry, groupId },\n });\n\n // Upsert all bracket legs into the overlay store\n this._store.upsertOrder({\n id: ack.entry.orderId,\n role: 'entry',\n side: input.entry.side,\n status: 'open',\n price: input.entry.limitPrice ?? input.entry.stopPrice ?? 0,\n qty: input.entry.qty,\n groupId,\n label: input.entry.label ?? 'Entry',\n timestamp: ack.entry.timestamp,\n });\n\n this._store.upsertOrder({\n id: ack.stopLoss.orderId,\n role: 'stop_loss',\n side: input.entry.side === 'buy' ? 'sell' : 'buy',\n status: 'open',\n price: input.stopLossPrice,\n qty: input.entry.qty,\n groupId,\n label: 'Stop Loss',\n timestamp: ack.stopLoss.timestamp,\n });\n\n if (ack.takeProfit && input.takeProfitPrice !== undefined) {\n this._store.upsertOrder({\n id: ack.takeProfit.orderId,\n role: 'take_profit',\n side: input.entry.side === 'buy' ? 'sell' : 'buy',\n status: 'open',\n price: input.takeProfitPrice,\n qty: input.entry.qty,\n groupId,\n label: 'Take Profit',\n timestamp: ack.takeProfit.timestamp,\n });\n }\n\n return ack;\n }\n\n // ── Fill reporting ─────────────────────────────────────────────────────────\n\n /**\n * Report an execution fill received from the provider's event stream.\n *\n * Writes the fill into the overlay store and updates the parent order status.\n * Called by the provider adapter whenever a fill notification arrives.\n *\n * TODO: Also update the related ChartPosition (create new or update qty/avgPrice).\n */\n reportFill(fill: ExecutionFill): void {\n assertCanUseManagedTrading();\n this._store.pushExecution(fill);\n\n // Update parent order status if fill is total\n if (fill.orderId) {\n const order = this._store.getOrders().find(o => o.id === fill.orderId);\n if (order) {\n // TODO: track partially-filled qty; use 'partial' when qty > fill.qty\n this._store.upsertOrder({ ...order, status: 'filled' });\n }\n }\n\n // TODO: upsert ChartPosition based on fill side/qty/price\n }\n}\n","import type {\n ChartConfig,\n ChartInterval,\n ChartTheme,\n ChartEventMap,\n ChartLayout,\n Drawing,\n IDatafeed,\n IndicatorConfig,\n IndicatorInstance,\n IPlugin,\n IPublicChart,\n OHLCV,\n PaneDescriptor,\n} from '@forgecharts/types';\nimport { Chart } from '../core/Chart';\nimport { EventBus } from './EventBus';\nimport { IndicatorRegistry } from './IndicatorRegistry';\nimport { DrawingManager } from './DrawingManager';\nimport { LayoutManager } from './LayoutManager';\nimport { PaneManager } from './PaneManager';\nimport { DatafeedConnector } from '../datafeed/DatafeedConnector';\nimport type { ISeries } from '../types/ISeries';\nimport type { CoordTransform } from '../core/CoordTransform';\nimport { TradingOverlayStore } from '../trading/TradingOverlayStore';\nimport { UnmanagedIngestion } from '../trading/UnmanagedIngestion';\nimport { isUnmanagedMode } from '../licensing/ChartRuntimeResolver';\nimport type { CandleInput, ChartOrder, ChartPosition, ExecutionFill } from '../trading/tradingTypes';\nimport { ManagedTradingController } from '../trading/managed/ManagedTradingController';\n\n/** Candle duration in seconds per timeframe — used for the history-prefetch threshold. */\nconst _TF_SECS: Partial<Record<string, number>> = {\n '1s': 1, '5s': 5, '10s': 10, '30s': 30,\n '1m': 60, '3m': 180, '5m': 300, '15m': 900, '30m': 1800,\n '1h': 3600, '2h': 7200, '4h': 14400, '6h': 21600, '12h': 43200,\n '1d': 86400, '3d': 259200, '1w': 604800, '1M': 2592000,\n};\n\n/**\n * TChart — the stable public chart instance returned by `createChart()`.\n *\n * Wraps the internal canvas `Chart` engine and exposes the documented\n * public API. Application code and plugins should only interact with\n * `TChart`/`IPublicChart`; never with the internal `Chart` class directly.\n *\n * @example\n * ```ts\n * import { createChart } from '@forgecharts/sdk';\n *\n * const chart = createChart({\n * container: document.getElementById('chart')!,\n * symbol: 'BTCUSDT',\n * interval: '5m',\n * });\n *\n * chart.on('symbolChanged', ({ symbol }) => console.log('Symbol:', symbol));\n *\n * chart.setTheme('light');\n * const id = chart.addIndicator({ type: 'ema', params: { period: 20 } });\n * chart.removeIndicator(id);\n *\n * const layout = chart.saveLayout(); // portable JSON-ready object\n * chart.loadLayout(layout); // restore\n *\n * chart.destroy();\n * ```\n */\nexport class TChart implements IPublicChart {\n private readonly _core: Chart;\n private readonly _bus: EventBus;\n private readonly _indicators: IndicatorRegistry;\n private readonly _drawings: DrawingManager;\n private readonly _panes: PaneManager;\n private readonly _plugins: IPlugin[] = [];\n\n /** Primary price series — created once; fed by the datafeed or directly. */\n private readonly _series: ISeries;\n /** Datafeed connector — null when no datafeed was provided. */\n private _connector: DatafeedConnector | null = null;\n\n private _symbol: string;\n private _interval: ChartInterval;\n private _theme: ChartTheme;\n private _destroyed = false;\n\n /**\n * In-memory auth token. Set via constructor `getAuthToken` callback or\n * directly via `setAuthToken()`. Takes precedence over localStorage.\n */\n private _authToken: string | null = null;\n private readonly _getAuthToken: (() => string | Promise<string>) | null = null;\n private readonly _apiUrl: string;\n\n // ─ Shared trading overlay store (used by both unmanaged and managed modes) ──\n private readonly _overlayStore: TradingOverlayStore = new TradingOverlayStore();\n /** Lazy-initialised; only created when first unmanaged ingestion method is called. */\n private _unmanagedIngestion: UnmanagedIngestion | null = null;\n /** Lazy-initialised; only created when getManagedTrading() is first called. */\n private _managedTrading: ManagedTradingController | null = null;\n\n /**\n * Returns a Bearer token for API calls. Resolution order:\n * 1. In-memory `_authToken` (set via `setAuthToken()`).\n * 2. `getAuthToken` callback from config (embedder-managed).\n * 3. `localStorage[\"forgecharts-token\"]` (built-in frontend fallback).\n *\n * Returns `null` when no token is available — API calls will be unauthenticated.\n */\n async resolveAuthToken(): Promise<string | null> {\n if (this._authToken) return this._authToken;\n if (this._getAuthToken) {\n try { return await this._getAuthToken(); } catch { return null; }\n }\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem('forgecharts-token');\n }\n return null;\n }\n\n constructor(config: ChartConfig) {\n this._symbol = config.symbol;\n this._apiUrl = config.apiUrl ?? '';\n if (config.getAuthToken) this._getAuthToken = config.getAuthToken;\n this._interval = config.interval ?? '1h';\n this._theme = config.theme ?? 'dark';\n\n this._bus = new EventBus();\n this._indicators = new IndicatorRegistry();\n this._panes = new PaneManager();\n\n this._core = new Chart(config.container, {\n theme: this._theme,\n handleScroll: !(config.disableScroll ?? false),\n handleScale: !(config.disableZoom ?? false),\n ...(config.crosshair !== undefined ? { crosshair: config.crosshair } : {}),\n });\n\n // Use the Chart's own DrawingManager so drawings are rendered automatically\n this._drawings = this._core.drawingManager();\n\n // Wire drawing callbacks\n this._core.onDrawingCommitted = (drawing) => {\n this._bus.emit('drawingCreated', drawing);\n };\n this._core.onDrawingDeleted = (id) => {\n this._bus.emit('drawingRemoved', { id });\n };\n this._core.onDrawingContextMenu = (id, x, y) => {\n this._bus.emit('drawingContextMenu', { id, x, y });\n };\n\n // Prime the chart with a default candlestick series and retain the reference\n this._series = this._core.addSeries({ type: 'candlestick' });\n\n // Tell the core chart which timeframe is active (for last-price countdown)\n this._core.setInterval(this._interval);\n\n // Wire datafeed if provided\n if (config.datafeed !== undefined) {\n this._connector = this._buildConnector(config.datafeed);\n this._connector.connect(this._symbol, this._interval);\n }\n\n // Lazy-load older history when the user pans/zooms the left edge into view.\n // Fires on every pan/zoom; debounced internally by DatafeedConnector._isLoadingMore.\n this._core.onViewportChanged = () => {\n const connector = this._connector;\n if (!connector) return;\n const bars = this._series.data();\n if (bars.length === 0) return;\n const oldestBarTime = bars[0]!.time;\n const { from } = this._core.getViewport().timeRange;\n // Trigger when the viewport left edge is within 30 candles of the oldest loaded bar\n const tfSec = _TF_SECS[this._interval] ?? 3600;\n if (from < oldestBarTime + tfSec * 30) {\n connector.loadMoreHistory(this._symbol, this._interval);\n }\n };\n\n // Attach plugins provided at construction time\n for (const plugin of config.plugins ?? []) {\n this._attachPlugin(plugin);\n }\n }\n\n // ─── Getters ─────────────────────────────────────────────────────────────────\n\n /** Currently displayed symbol. */\n get symbol(): string {\n return this._symbol;\n }\n\n /** Currently active interval. */\n get interval(): ChartInterval {\n return this._interval;\n }\n\n /** Currently active theme. */\n get theme(): ChartTheme {\n return this._theme;\n }\n\n // ─── Data access ─────────────────────────────────────────────────────────────\n\n /** Returns the current bar dataset (sorted ascending by time). */\n getBars(): readonly OHLCV[] {\n return this._series.data();\n }\n\n /** Returns the coordinate transform used for pixel ⇔ data conversions. */\n getTransform(): CoordTransform {\n return this._core.transform();\n }\n\n /** Returns the current sub-pane descriptors. */\n getPanes(): readonly PaneDescriptor[] {\n return this._panes.getPanes();\n }\n\n /** Returns all active indicator instances. */\n getIndicators(): readonly IndicatorInstance[] {\n return this._indicators.all();\n }\n\n /**\n * Resizes a sub-pane by setting its height fraction.\n * Remaining panes absorb the difference proportionally.\n */\n resizePane(id: string, newFraction: number): void {\n this._assertAlive();\n this._panes.resizePane(id, newFraction);\n }\n\n // ─── Auth ─────────────────────────────────────────────────────────────────────\n\n /**\n * Sets a static Bearer token for API calls (layouts, etc.).\n *\n * Call this after your user authenticates. If you prefer token refresh,\n * supply `getAuthToken` in `ChartConfig` instead — that callback is invoked\n * on every API request so you can return a fresh token each time.\n *\n * @example\n * ```ts\n * // After your own login succeeds:\n * const { forgechartsToken } = await myBackend.login(email, password);\n * chart.setAuthToken(forgechartsToken);\n * ```\n */\n setAuthToken(token: string): void {\n this._authToken = token;\n }\n\n /**\n * Clears the in-memory auth token (e.g. on logout).\n * After calling this the SDK falls back to `getAuthToken` or localStorage.\n */\n clearAuthToken(): void {\n this._authToken = null;\n }\n\n // ─── Setters ─────────────────────────────────────────────────────────────────\n\n /**\n * Changes the displayed symbol.\n * No-ops if the symbol is unchanged.\n * Emits `symbolChanged`.\n */\n setSymbol(symbol: string): void {\n this._assertAlive();\n if (symbol === this._symbol) return;\n this._symbol = symbol;\n this._bus.emit('symbolChanged', { symbol });\n this._connector?.reconnect(symbol, this._interval);\n }\n\n /**\n * Changes the active interval.\n * No-ops if the interval is unchanged.\n * Emits `intervalChanged`.\n */\n setInterval(interval: ChartInterval): void {\n this._assertAlive();\n if (interval === this._interval) return;\n this._interval = interval;\n this._core.setInterval(interval);\n this._bus.emit('intervalChanged', { interval });\n this._connector?.reconnect(this._symbol, interval);\n }\n\n /**\n * Switches the colour theme.\n * No-ops if the theme is unchanged.\n * Emits `themeChanged`.\n */\n setTheme(theme: ChartTheme): void {\n this._assertAlive();\n if (theme === this._theme) return;\n this._theme = theme;\n this._core.applyOptions({ theme });\n this._bus.emit('themeChanged', { theme });\n }\n\n /** Updates the timezone used for all time-axis labels. */\n setTimezone(timezone: string): void {\n this._assertAlive();\n this._core.applyOptions({ timezone });\n }\n\n /**\n * Applies low-level chart options (colors, theme, scales, etc.).\n * Pass `{ colors: { background: '#fff' } }` to change individual canvas colors.\n */\n applyOptions(options: Partial<import('@forgecharts/types').ChartOptions>): void {\n this._assertAlive();\n this._core.applyOptions(options);\n }\n\n /** Scrolls the viewport so the latest bar is visible at the right edge. */\n scrollToEnd(): void {\n this._assertAlive();\n this._core.scrollToEnd();\n }\n\n /**\n * Sets the default viewport: 10 days visible with the latest bar near the\n * right edge (5% empty space on the right for future price action).\n */\n fitDefaultView(): void {\n this._assertAlive();\n this._core.fitDefaultView();\n }\n\n /**\n * Resets the price axis to auto-fit mode without changing the time range.\n * Use this after restoring a saved viewport to prevent a stale priceRange\n * from locking the scale at a wrong value (e.g. the default 0–100).\n */\n resetPriceScale(): void {\n this._assertAlive();\n this._core.resetPriceScale();\n }\n\n /** Returns the current visible time and price ranges. */\n getViewport(): import('@forgecharts/types').Viewport {\n this._assertAlive();\n return this._core.getViewport();\n }\n\n /** Restores a previously saved viewport (time + price ranges). */\n restoreViewport(v: import('@forgecharts/types').Viewport): void {\n this._assertAlive();\n this._core.restoreViewport(v);\n }\n\n // ─── Indicators ──────────────────────────────────────────────────────────────\n\n /**\n * Registers an indicator and returns its opaque id.\n * Emits `indicatorAdded`.\n *\n * @example\n * ```ts\n * const rsiId = chart.addIndicator({ type: 'rsi', params: { period: 14 } });\n * ```\n */\n addIndicator(config: IndicatorConfig): string {\n this._assertAlive();\n const id = this._indicators.add(config);\n // Non-overlay indicators get their own dedicated sub-pane\n if (config.overlay !== true) {\n const label = _indicatorTypeLabel(config.type);\n const paneId = this._panes.createPane(label);\n this._panes.assignIndicator(id, paneId);\n }\n this._bus.emit('indicatorAdded', { id, config });\n return id;\n }\n\n /**\n * Removes a previously added indicator.\n * Silently no-ops if the id is unknown.\n * Emits `indicatorRemoved`.\n */\n removeIndicator(id: string): void {\n this._assertAlive();\n // Find which pane holds this indicator before removal\n const paneId = this._panes.getPanes().find((p) => p.indicatorIds.includes(id))?.id;\n const removed = this._indicators.remove(id);\n if (removed) {\n this._panes.unassignIndicator(id);\n // Remove the pane if it is now empty\n if (paneId !== undefined) {\n const pane = this._panes.getPanes().find((p) => p.id === paneId);\n if (pane !== undefined && pane.indicatorIds.length === 0) {\n this._panes.removePane(paneId);\n }\n }\n this._bus.emit('indicatorRemoved', { id });\n }\n }\n\n // ─── Drawings ────────────────────────────────────────────────────────────────\n\n /**\n * Adds a drawing to the chart and returns its generated id.\n * Emits `drawingCreated`.\n *\n * @example\n * ```ts\n * const id = chart.addDrawing({\n * type: 'trendline',\n * points: [\n * { time: 1700000000, price: 45000 },\n * { time: 1700003600, price: 46000 },\n * ],\n * });\n * ```\n */\n addDrawing(drawing: Omit<Drawing, 'id'>): string {\n this._assertAlive();\n const id = this._drawings.add(drawing);\n const full = this._drawings.get(id);\n if (!full) throw new Error('[ForgeCharts] DrawingManager failed to store drawing');\n this._bus.emit('drawingCreated', full);\n this._core.markDirty();\n return id;\n }\n\n /**\n * Removes a single drawing by id.\n * Emits `drawingRemoved`.\n */\n removeDrawing(id: string): void {\n this._assertAlive();\n if (!this._drawings.has(id)) return;\n this._drawings.remove(id);\n this._bus.emit('drawingRemoved', { id });\n this._core.markDirty();\n }\n\n /**\n * Activates a drawing tool. Clicks will place anchors on the chart.\n * The tool remains active after each commit (auto-repeat). Press Escape to cancel.\n */\n startDrawingTool(type: import('@forgecharts/types').DrawingType): void {\n this._assertAlive();\n this._core.startDrawingTool(type);\n }\n\n /** Cancels an active drawing tool and returns to cursor mode. */\n cancelDrawingTool(): void {\n this._assertAlive();\n this._core.cancelDrawingTool();\n }\n\n /**\n * Show or hide the SDK crosshair lines.\n * Call with `false` for Arrow mode; `true` for crosshair / dot / demonstration.\n */\n setCrosshairEnabled(enabled: boolean): void {\n this._assertAlive();\n this._core.setCrosshairEnabled(enabled);\n }\n\n /** Hides (`true`) or restores (`false`) the native OS cursor for dot / demonstration pointer modes. */\n setNativeCursorHidden(hidden: boolean): void {\n this._assertAlive();\n this._core.setNativeCursorHidden(hidden);\n }\n\n /** Deletes the currently selected drawing (if any). */\n deleteSelectedDrawing(): void {\n this._assertAlive();\n this._core.deleteSelectedDrawing();\n }\n\n /** Shows or hides all drawings on the chart. */\n setAllDrawingsVisible(v: boolean): void {\n this._assertAlive();\n this._core.setAllDrawingsVisible(v);\n }\n\n /** Shows or hides all indicators/series on the chart. */\n setIndicatorsVisible(v: boolean): void {\n this._assertAlive();\n this._core.setIndicatorsVisible(v);\n }\n\n /**\n * Removes all drawings from the chart.\n * Emits `drawingsCleared`.\n */\n clearDrawings(): void {\n this._assertAlive();\n this._drawings.clear();\n this._bus.emit('drawingsCleared', {});\n }\n\n // ─── Layout ──────────────────────────────────────────────────────────────────\n\n /**\n * Restores a previously saved layout.\n * Replaces current symbol, interval, theme, indicators, and drawings.\n * Emits `layoutLoaded`.\n */\n loadLayout(layout: ChartLayout): void {\n this._assertAlive();\n\n this._symbol = layout.symbol;\n this._interval = layout.interval;\n\n // Theme (use internal setter to propagate to canvas)\n if (layout.theme !== this._theme) {\n this._theme = layout.theme;\n this._core.applyOptions({ theme: layout.theme });\n }\n\n // Indicators\n this._indicators.clear();\n for (const inst of layout.indicators) {\n this._indicators.add(inst.config);\n }\n\n // Drawings — strip old ids and re-add (DrawingManager assigns new ids)\n this._drawings.clear();\n for (const { id: _discarded, ...rest } of layout.drawings) {\n this._drawings.add(rest as Omit<Drawing, 'id'>);\n }\n this._core.markDirty();\n\n // Panes\n this._panes.clear();\n if (layout.panes !== undefined) {\n this._panes.restore(layout.panes);\n }\n\n // Viewport — restore time range so the chart opens at the same position.\n // Price is also restored so custom scales are preserved.\n if (layout.viewport) {\n this._core.restoreViewport(layout.viewport);\n }\n\n this._bus.emit('layoutLoaded', layout);\n }\n\n /**\n * Serialises the current chart state to a portable layout object.\n * Safe to `JSON.stringify()` for persistence.\n * Emits `layoutSaved`.\n */\n saveLayout(): ChartLayout {\n this._assertAlive();\n const panes = this._panes.serialize();\n const layout = LayoutManager.save({\n symbol: this._symbol,\n interval: this._interval,\n theme: this._theme,\n indicators: this._indicators.all(),\n drawings: this._drawings.all(),\n viewport: this._core.getViewport(),\n ...(panes.length > 0 ? { panes } : {}),\n });\n this._bus.emit('layoutSaved', layout);\n return layout;\n }\n\n // ─── Plugin API ───────────────────────────────────────────────────────────────\n\n /**\n * Attaches a plugin at runtime.\n *\n * @example\n * ```ts\n * chart.use(new WatermarkPlugin({ text: 'ForgeCharts' }));\n * ```\n */\n use(plugin: IPlugin): this {\n this._assertAlive();\n this._attachPlugin(plugin);\n return this;\n }\n\n /**\n * Detaches a plugin by its `id` property.\n * Silently no-ops if the plugin is not attached.\n */\n eject(pluginId: string): this {\n const idx = this._plugins.findIndex((p) => p.id === pluginId);\n if (idx === -1) return this;\n const [removed] = this._plugins.splice(idx, 1) as [IPlugin];\n removed.onDetach();\n return this;\n }\n\n // ─── Event bus ────────────────────────────────────────────────────────────────\n\n /**\n * Subscribes to a chart event.\n *\n * @example\n * ```ts\n * chart.on('symbolChanged', ({ symbol }) => {\n * document.title = symbol;\n * });\n * ```\n */\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (payload: ChartEventMap[K]) => void,\n ): this {\n this._bus.on(event, handler);\n return this;\n }\n\n /**\n * Unsubscribes a previously registered handler.\n * The handler reference must be the same function passed to `on()`.\n */\n off<K extends keyof ChartEventMap>(\n event: K,\n handler: (payload: ChartEventMap[K]) => void,\n ): this {\n this._bus.off(event, handler);\n return this;\n }\n\n /**\n * Subscribes to an event for a single invocation.\n * The handler is automatically removed after it fires once.\n */\n once<K extends keyof ChartEventMap>(\n event: K,\n handler: (payload: ChartEventMap[K]) => void,\n ): this {\n this._bus.once(event, handler);\n return this;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────────\n\n /**\n * Tears down the chart instance:\n * 1. Detaches all plugins\n * 2. Destroys the canvas engine (removes DOM elements)\n * 3. Emits `destroyed`\n * 4. Clears all event listeners\n *\n * After `destroy()` every further method call throws `[ForgeCharts] destroyed`.\n */\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n\n // Tear down datafeed before destroying the canvas so no tick can arrive\n // after series / canvas are gone\n this._connector?.destroy();\n this._connector = null;\n\n for (const plugin of [...this._plugins]) {\n plugin.onDetach();\n }\n this._plugins.length = 0;\n\n this._core.destroy();\n this._bus.emit('destroyed', {});\n this._bus.clear();\n }\n\n // ─── Private ──────────────────────────────────────────────────────────────\n\n // ─── Unmanaged ingestion ───────────────────────────────────────────────────\n\n /**\n * Load a full historical bar snapshot in unmanaged mode.\n * Replaces the ingestion engine’s bar array and triggers a chart resync.\n *\n * **Only available in unmanaged mode.** Throws if the active license is managed.\n *\n * Call this once at startup (or after a symbol/interval change) before\n * streaming live candles via `pushCandle()`.\n *\n * @param bars Chronologically ordered (oldest → newest) candle array.\n */\n setHistory(bars: CandleInput[]): void {\n this._assertAlive();\n this._getIngestion().setHistory(bars);\n }\n\n /**\n * Push a single live candle in unmanaged mode.\n * Follows standard OHLCV merge rules:\n * - same timestamp → update existing bar\n * - newer timestamp → append new bar\n * - older timestamp → silently ignored\n *\n * **Only available in unmanaged mode.** Throws if the active license is managed.\n */\n pushCandle(bar: CandleInput): void {\n this._assertAlive();\n this._getIngestion().pushCandle(bar);\n }\n\n // ─── Trading overlay ─────────────────────────────────────────────────────\n // Shared between unmanaged and managed modes. In unmanaged mode the client\n // provides state externally; in managed mode the managed trading service\n // will drive these via the same store.\n\n /** Returns the shared trading overlay store (read access for renderers). */\n getOverlayStore(): TradingOverlayStore {\n return this._overlayStore;\n }\n\n /**\n * Alias for {@link getOverlayStore} — canonical name used in documentation\n * and the public SDK contract.\n */\n getTradingOverlayStore(): TradingOverlayStore {\n return this._overlayStore;\n }\n\n // ─ Orders ──\n\n /** Replace the entire order set on the chart overlay. */\n setOrders(orders: ChartOrder[]): void {\n this._assertAlive();\n this._overlayStore.setOrders(orders);\n this._core.markDirty();\n }\n\n /** Insert or update a single order (matched by `order.id`). */\n upsertOrder(order: ChartOrder): void {\n this._assertAlive();\n this._overlayStore.upsertOrder(order);\n this._core.markDirty();\n }\n\n /** Remove an order line by id. Silent no-op if not found. */\n removeOrder(orderId: string): void {\n this._assertAlive();\n this._overlayStore.removeOrder(orderId);\n this._core.markDirty();\n }\n\n // ─ Positions ──\n\n /** Replace the entire position set on the chart overlay. */\n setPositions(positions: ChartPosition[]): void {\n this._assertAlive();\n this._overlayStore.setPositions(positions);\n this._core.markDirty();\n }\n\n /** Insert or update a single position (matched by `position.id`). */\n upsertPosition(position: ChartPosition): void {\n this._assertAlive();\n this._overlayStore.upsertPosition(position);\n this._core.markDirty();\n }\n\n /** Remove a position marker by id. Silent no-op if not found. */\n removePosition(positionId: string): void {\n this._assertAlive();\n this._overlayStore.removePosition(positionId);\n this._core.markDirty();\n }\n\n // ─ Fills ──\n\n /** Append an execution fill marker to the chart. Fills are append-only. */\n pushExecution(fill: ExecutionFill): void {\n this._assertAlive();\n this._overlayStore.pushExecution(fill);\n this._core.markDirty();\n }\n\n // ─── Managed trading ────────────────────────────────────────────────────\n\n /**\n * Returns the managed trading controller for this chart instance.\n *\n * The controller is lazily created the first time this is called.\n * It is bound to this chart’s shared overlay store so all managed trades\n * flow into the same visual layer as unmanaged overlays.\n *\n * Call `chart.getManagedTrading().registerProvider(myProvider)` to wire\n * up an execution backend.\n *\n * **Requires a managed-mode license.** The controller’s methods will throw\n * if called without appropriate capability.\n *\n * @example\n * ```ts\n * const mgd = chart.getManagedTrading();\n * mgd.registerProvider(new RithmicProvider(credentials));\n * await mgd.placeOrder({ symbol: 'ES', side: 'buy', type: 'limit', limitPrice: 5200, qty: 1 });\n * ```\n */\n getManagedTrading(): ManagedTradingController {\n this._assertAlive();\n if (!this._managedTrading) {\n this._managedTrading = new ManagedTradingController(this._overlayStore);\n }\n return this._managedTrading;\n }\n\n private _attachPlugin(plugin: IPlugin): void {\n this._plugins.push(plugin);\n plugin.onAttach(this);\n }\n\n private _assertAlive(): void {\n if (this._destroyed) {\n throw new Error('[ForgeCharts] Method called on a destroyed chart instance.');\n }\n }\n\n /**\n * Returns the UnmanagedIngestion instance, lazily creating it on first call.\n * Wires the ingestion callbacks so live candle updates flow into the chart series.\n */\n private _getIngestion(): UnmanagedIngestion {\n if (!this._unmanagedIngestion) {\n if (!isUnmanagedMode()) {\n throw new Error(\n '[ForgeCharts] External data ingestion is only available in unmanaged mode.',\n );\n }\n this._unmanagedIngestion = new UnmanagedIngestion(this._interval, {\n onBarUpdated: (bar) => {\n this._series.update(bar);\n this._bus.emit('barsUpdated', { count: this._series.data().length });\n },\n onResync: (bars) => {\n this._series.setData(bars as unknown as OHLCV[]);\n this._bus.emit('barsUpdated', { count: bars.length });\n },\n });\n }\n return this._unmanagedIngestion;\n }\n\n // ─── Datafeed ─────────────────────────────────────────────────────────────────\n\n private _buildConnector(datafeed: IDatafeed): DatafeedConnector {\n return new DatafeedConnector(datafeed, this._series, {\n onLoading: (symbol, interval) => {\n this._bus.emit('dataLoading', { symbol, interval });\n },\n onLoaded: (symbol, interval, count) => {\n this._bus.emit('dataLoaded', { symbol, interval, count });\n this._bus.emit('barsUpdated', { count });\n },\n onError: (symbol, interval, error) => {\n this._bus.emit('dataError', { symbol, interval, error });\n },\n onUpdate: (_bar) => {\n this._bus.emit('barsUpdated', { count: this._series.data().length });\n },\n });\n }\n}\n\n// ─── Module helpers ───────────────────────────────────────────────────────────\n\nfunction _indicatorTypeLabel(type: IndicatorConfig['type']): string {\n switch (type) {\n case 'rsi': return 'RSI';\n case 'macd': return 'MACD';\n case 'volume': return 'Volume';\n case 'sma': return 'SMA';\n case 'ema': return 'EMA';\n case 'wma': return 'WMA';\n case 'bbands': return 'BB';\n case 'stochastic': return 'Stoch';\n case 'atr': return 'ATR';\n case 'obv': return 'OBV';\n case 'script': return 'Script';\n default: return type;\n }\n}\n","import type { ChartConfig } from '@forgecharts/types';\nimport { TChart } from './TChart';\n\n/**\n * Creates a new ForgeCharts chart instance and mounts it into the provided container.\n *\n * This is the primary entry point for the ForgeCharts SDK. The returned `TChart`\n * instance exposes the full public API — including data loading hooks, indicators,\n * drawings, layout persistence, and the typed event bus.\n *\n * @param config - Chart configuration. `container` and `symbol` are required.\n * @returns A fully initialised `TChart` instance.\n *\n * @example\n * ```ts\n * import { createChart } from '@forgecharts/sdk';\n *\n * const chart = createChart({\n * container: document.getElementById('chart')!,\n * symbol: 'BTCUSDT',\n * interval: '5m',\n * theme: 'dark',\n * });\n *\n * chart.on('symbolChanged', ({ symbol }) => {\n * document.title = symbol;\n * });\n *\n * chart.addIndicator({ type: 'ema', params: { period: 20 }, overlay: true });\n *\n * const layout = chart.saveLayout();\n * localStorage.setItem('layout', JSON.stringify(layout));\n *\n * // Later...\n * chart.destroy();\n * ```\n */\nexport function createChart(config: ChartConfig): TChart {\n if (!config.container) {\n throw new Error('[ForgeCharts] createChart() requires a valid container element.');\n }\n return new TChart(config);\n}\n","import type {\n RefMarket,\n RefExchange,\n RefSymbol,\n SymbolSearchFilters,\n SymbolSearchResult,\n} from '@forgecharts/types';\n\nexport type ReferenceAPIConfig = {\n /** Base URL of the ForgeCharts API server (e.g. \"https://charts.myapp.com\"). Defaults to current origin. */\n apiUrl?: string;\n /** Called to retrieve a Bearer token for authenticated endpoints. Falls back to localStorage['forgecharts-token']. */\n getAuthToken?: () => string | Promise<string>;\n};\n\ntype ProviderMapping = {\n providerCode: string;\n providerSymbol: string;\n providerExchange: string | null;\n metadata: unknown;\n};\n\n/**\n * ReferenceAPI — headless SDK client for the Global Reference Data Platform.\n *\n * Provides symbol lookup, search, market/exchange browsing,\n * provider mapping resolution, plus per-user favorites and recents.\n *\n * @example\n * ```ts\n * const ref = new ReferenceAPI();\n * const { symbols } = await ref.searchSymbols('BTC');\n * const popular = await ref.getPopularSymbols('crypto', 10);\n * ```\n */\nexport class ReferenceAPI {\n private readonly _base: string;\n private readonly _getToken: (() => string | Promise<string>) | undefined;\n\n constructor(config: ReferenceAPIConfig = {}) {\n this._base = (config.apiUrl ?? '').replace(/\\/$/, '') + '/api/reference';\n this._getToken = config.getAuthToken;\n }\n\n // ── Internals ──────────────────────────────────────────────────────────────\n\n private async _authHeaders(): Promise<Record<string, string>> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n let token: string | null = null;\n\n if (this._getToken) {\n token = await this._getToken();\n } else if (typeof localStorage !== 'undefined') {\n token = localStorage.getItem('forgecharts-token');\n }\n\n if (token) h['Authorization'] = `Bearer ${token}`;\n return h;\n }\n\n private async _get<T>(path: string, params?: Record<string, string | number | undefined>): Promise<T> {\n let url = this._base + path;\n if (params) {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) qs.set(k, String(v));\n }\n const str = qs.toString();\n if (str) url += '?' + str;\n }\n const res = await fetch(url, { headers: await this._authHeaders() });\n if (!res.ok) throw new Error(`ReferenceAPI GET ${path} → HTTP ${res.status}`);\n return res.json() as Promise<T>;\n }\n\n private async _post(path: string, body: unknown): Promise<void> {\n const res = await fetch(this._base + path, {\n method: 'POST',\n headers: await this._authHeaders(),\n body: JSON.stringify(body),\n });\n if (!res.ok && res.status !== 204) {\n throw new Error(`ReferenceAPI POST ${path} → HTTP ${res.status}`);\n }\n }\n\n private async _delete(path: string): Promise<void> {\n const res = await fetch(this._base + path, {\n method: 'DELETE',\n headers: await this._authHeaders(),\n });\n if (!res.ok && res.status !== 204) {\n throw new Error(`ReferenceAPI DELETE ${path} → HTTP ${res.status}`);\n }\n }\n\n // ── Markets & Exchanges ────────────────────────────────────────────────────\n\n /** Returns all active market categories (crypto, stocks, forex, …). */\n async getMarkets(): Promise<RefMarket[]> {\n return this._get<RefMarket[]>('/markets');\n }\n\n /** Returns all active exchanges / venues. */\n async getExchanges(): Promise<RefExchange[]> {\n return this._get<RefExchange[]>('/exchanges');\n }\n\n // ── Symbol catalogue ───────────────────────────────────────────────────────\n\n /**\n * Full-text search across symbol tickers, names, and aliases.\n * @param query Search term (minimum 1 character).\n * @param filters Optional market / exchange / limit / offset filters.\n */\n async searchSymbols(query: string, filters?: SymbolSearchFilters): Promise<SymbolSearchResult> {\n return this._get<SymbolSearchResult>('/symbols/search', {\n q: query,\n market: filters?.market,\n exchange: filters?.exchange,\n limit: filters?.limit,\n offset: filters?.offset,\n });\n }\n\n /**\n * Browse the symbol catalogue with optional filters.\n * Returns symbols ordered alphabetically.\n */\n async getSymbols(filters?: SymbolSearchFilters): Promise<SymbolSearchResult> {\n return this._get<SymbolSearchResult>('/symbols', {\n market: filters?.market,\n exchange: filters?.exchange,\n assetType: (filters as Record<string, unknown>)?.['assetType'] as string | undefined,\n limit: filters?.limit,\n offset: filters?.offset,\n });\n }\n\n /**\n * Returns the most popular / trending symbols.\n * @param market Optional market code to restrict results (e.g. \"crypto\").\n * @param limit Maximum results to return. Defaults to 20.\n */\n async getPopularSymbols(market?: string, limit = 20): Promise<RefSymbol[]> {\n return this._get<RefSymbol[]>('/symbols/popular', { market, limit });\n }\n\n /**\n * Fetches full metadata for a single symbol by its global symbol key.\n * @param symbolKey e.g. \"CRYPTO:BINANCE:BTCUSDT\"\n */\n async getSymbol(symbolKey: string): Promise<RefSymbol> {\n return this._get<RefSymbol>(`/symbols/${encodeURIComponent(symbolKey)}`);\n }\n\n /**\n * Returns all provider-specific mappings for a symbol.\n * Useful for resolving the correct datafeed symbol string at runtime.\n */\n async getProviderMapping(symbolKey: string): Promise<ProviderMapping[]> {\n return this._get<ProviderMapping[]>(\n `/symbols/${encodeURIComponent(symbolKey)}/provider-mapping`,\n );\n }\n\n // ── User: Recents (requires auth) ─────────────────────────────────────────\n\n /** Returns the authenticated user's recently viewed symbols (newest first). */\n async getRecentSymbols(): Promise<RefSymbol[]> {\n return this._get<RefSymbol[]>('/me/recents');\n }\n\n /** Records a symbol as recently viewed for the authenticated user. */\n async recordRecentSymbol(symbolKey: string): Promise<void> {\n return this._post('/me/recents', { symbolKey });\n }\n\n // ── User: Favorites (requires auth) ───────────────────────────────────────\n\n /** Returns the authenticated user's favorite symbols. */\n async getFavoriteSymbols(): Promise<RefSymbol[]> {\n return this._get<RefSymbol[]>('/me/favorites');\n }\n\n /** Adds a symbol to the authenticated user's favorites. */\n async addFavoriteSymbol(symbolKey: string): Promise<void> {\n return this._post('/me/favorites', { symbolKey });\n }\n\n /** Removes a symbol from the authenticated user's favorites. */\n async removeFavoriteSymbol(symbolKey: string): Promise<void> {\n return this._delete(`/me/favorites/${encodeURIComponent(symbolKey)}`);\n }\n}\n","/**\n * IndicatorEngine — pure, stateless computation functions.\n *\n * All functions accept a readonly OHLCV array and operation-specific\n * parameters, and return plain value arrays. No side effects, no\n * class instances. Safe to call from any renderer or React component.\n */\n\nimport type { OHLCV, PriceField } from '@forgecharts/types';\n\n// ─── Output point types ───────────────────────────────────────────────────────\n\nexport type IndicatorPoint = {\n readonly time: number;\n readonly value: number;\n};\n\nexport type MACDPoint = {\n readonly time: number;\n readonly macd: number;\n readonly signal: number;\n readonly histogram: number;\n};\n\n// ─── Internals ────────────────────────────────────────────────────────────────\n\n/**\n * Exponential moving average over an arbitrary number array.\n * Uses the standard multiplier k = 2 / (period + 1).\n * The very first value seeds the EMA (warm-start).\n */\nfunction _ema(values: readonly number[], period: number): number[] {\n if (values.length === 0) return [];\n const k = 2 / (period + 1);\n const result: number[] = [values[0]!];\n for (let i = 1; i < values.length; i++) {\n result.push(values[i]! * k + result[i - 1]! * (1 - k));\n }\n return result;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/** Simple Moving Average over bar close prices. */\nexport function computeSMA(bars: readonly OHLCV[], period: number): IndicatorPoint[] {\n if (period < 1 || bars.length < period) return [];\n const result: IndicatorPoint[] = [];\n let windowSum = 0;\n for (let i = 0; i < period; i++) windowSum += bars[i]!.close;\n result.push({ time: bars[period - 1]!.time, value: windowSum / period });\n for (let i = period; i < bars.length; i++) {\n windowSum += bars[i]!.close - bars[i - period]!.close;\n result.push({ time: bars[i]!.time, value: windowSum / period });\n }\n return result;\n}\n\n/** Exponential Moving Average over bar close prices. */\nexport function computeEMA(bars: readonly OHLCV[], period: number): IndicatorPoint[] {\n if (period < 1 || bars.length < period) return [];\n const closes = bars.map((b) => b.close);\n return _ema(closes, period).map((value, i) => ({ time: bars[i]!.time, value }));\n}\n\n/**\n * Relative Strength Index using Wilder's smoothing.\n * Returns values in [0, 100].\n * Requires at least `period + 1` bars; returns [] otherwise.\n */\nexport function computeRSI(bars: readonly OHLCV[], period = 14): IndicatorPoint[] {\n if (bars.length < period + 1) return [];\n\n // Seed: simple average of first `period` up/down moves\n let avgGain = 0;\n let avgLoss = 0;\n for (let i = 1; i <= period; i++) {\n const d = bars[i]!.close - bars[i - 1]!.close;\n if (d > 0) avgGain += d;\n else avgLoss -= d;\n }\n avgGain /= period;\n avgLoss /= period;\n\n const result: IndicatorPoint[] = [];\n result.push({\n time: bars[period]!.time,\n value: avgLoss === 0 ? 100 : 100 - 100 / (1 + avgGain / avgLoss),\n });\n\n // Wilder's smoothing for remaining bars\n for (let i = period + 1; i < bars.length; i++) {\n const d = bars[i]!.close - bars[i - 1]!.close;\n const gain = d > 0 ? d : 0;\n const loss = d < 0 ? -d : 0;\n avgGain = (avgGain * (period - 1) + gain) / period;\n avgLoss = (avgLoss * (period - 1) + loss) / period;\n result.push({\n time: bars[i]!.time,\n value: avgLoss === 0 ? 100 : 100 - 100 / (1 + avgGain / avgLoss),\n });\n }\n return result;\n}\n\n/**\n * MACD — Moving Average Convergence/Divergence.\n * Returns MACD line, Signal line, and Histogram.\n * Standard defaults: fast=12, slow=26, signal=9.\n */\nexport function computeMACD(\n bars: readonly OHLCV[],\n fastPeriod = 12,\n slowPeriod = 26,\n signalPeriod = 9,\n): MACDPoint[] {\n if (bars.length < slowPeriod) return [];\n\n const closes = bars.map((b) => b.close);\n const fastEMAs = _ema(closes, fastPeriod);\n const slowEMAs = _ema(closes, slowPeriod);\n\n // MACD line starts at index slowPeriod - 1 (first bar where slow EMA is meaningful)\n const macdLine: number[] = [];\n const macdTimes: number[] = [];\n for (let i = slowPeriod - 1; i < bars.length; i++) {\n macdLine.push(fastEMAs[i]! - slowEMAs[i]!);\n macdTimes.push(bars[i]!.time);\n }\n\n if (macdLine.length < signalPeriod) return [];\n\n const signalLine = _ema(macdLine, signalPeriod);\n return signalLine.map((sig, i) => ({\n time: macdTimes[i]!,\n macd: macdLine[i]!,\n signal: sig,\n histogram: macdLine[i]! - sig,\n }));\n}\n\n/** Volume bars — raw volume values keyed by bar time. */\nexport function computeVolume(bars: readonly OHLCV[]): IndicatorPoint[] {\n return bars.map((b) => ({ time: b.time, value: b.volume }));\n}\n\n// ─── Field extraction & series-based variants (for DAG chaining) ─────────────\n\n/** Extracts a single numeric value from an OHLCV bar by named price field. */\nexport function extractField(bar: OHLCV, field: PriceField): number {\n switch (field) {\n case 'open': return bar.open;\n case 'high': return bar.high;\n case 'low': return bar.low;\n case 'close': return bar.close;\n case 'volume': return bar.volume;\n case 'hl2': return (bar.high + bar.low) / 2;\n case 'hlc3': return (bar.high + bar.low + bar.close) / 3;\n case 'ohlc4': return (bar.open + bar.high + bar.low + bar.close) / 4;\n }\n}\n\n/**\n * SMA over an arbitrary `IndicatorPoint[]` series (not just OHLCV close).\n * Enables chains such as EMA(SMA(close, 20), 10).\n */\nexport function computeSMAFromSeries(\n input: readonly IndicatorPoint[],\n period: number,\n): IndicatorPoint[] {\n if (period < 1 || input.length < period) return [];\n const result: IndicatorPoint[] = [];\n let sum = 0;\n for (let i = 0; i < period; i++) sum += input[i]!.value;\n result.push({ time: input[period - 1]!.time, value: sum / period });\n for (let i = period; i < input.length; i++) {\n sum += input[i]!.value - input[i - period]!.value;\n result.push({ time: input[i]!.time, value: sum / period });\n }\n return result;\n}\n\n/**\n * EMA over an arbitrary `IndicatorPoint[]` series.\n * Seeds the EMA from the first input value.\n */\nexport function computeEMAFromSeries(\n input: readonly IndicatorPoint[],\n period: number,\n): IndicatorPoint[] {\n if (period < 1 || input.length === 0) return [];\n const k = 2 / (period + 1);\n const result: IndicatorPoint[] = [{ time: input[0]!.time, value: input[0]!.value }];\n for (let i = 1; i < input.length; i++) {\n result.push({\n time: input[i]!.time,\n value: input[i]!.value * k + result[i - 1]!.value * (1 - k),\n });\n }\n return result;\n}\n\n/** WMA (Weighted Moving Average) over an arbitrary `IndicatorPoint[]` series. */\nexport function computeWMAFromSeries(\n input: readonly IndicatorPoint[],\n period: number,\n): IndicatorPoint[] {\n if (period < 1 || input.length < period) return [];\n const denom = (period * (period + 1)) / 2;\n const result: IndicatorPoint[] = [];\n for (let i = period - 1; i < input.length; i++) {\n let sum = 0;\n for (let j = 0; j < period; j++) sum += input[i - j]!.value * (period - j);\n result.push({ time: input[i]!.time, value: sum / denom });\n }\n return result;\n}\n","/**\n * TScript Series — fixed-capacity ring buffer for historical bar data.\n *\n * Access pattern mirrors Pine Script:\n * series.value — current (bar 0) value\n * series.get(0) — same as .value\n * series.get(1) — 1 bar ago\n * series.get(n) — n bars ago (returns NaN if out of range)\n *\n * Internally the ring buffer stores the `capacity` most recent values in a\n * circular array, so `.push()` is O(1) with no allocation after warm-up.\n *\n * @example\n * ```ts\n * const s = new Series(500);\n * s.push(1); s.push(2); s.push(3);\n * s.get(0); // 3 (current)\n * s.get(1); // 2 (one bar ago)\n * s.get(2); // 1 (two bars ago)\n * ```\n */\nexport class Series {\n private readonly _buf: Float64Array;\n private readonly _cap: number;\n private _head: number = 0; // index of the NEXT write slot\n private _len: number = 0; // number of values stored so far\n\n constructor(capacity = 1000) {\n this._cap = capacity;\n this._buf = new Float64Array(capacity).fill(NaN);\n }\n\n /** Append a new value at the current bar position. */\n push(value: number): void {\n this._buf[this._head] = value;\n this._head = (this._head + 1) % this._cap;\n if (this._len < this._cap) this._len++;\n }\n\n /**\n * Retrieve a historical value.\n * @param lookback 0 = current bar, 1 = previous bar, etc.\n */\n get(lookback: number): number {\n if (lookback < 0 || lookback >= this._len) return NaN;\n // Head points to NEXT slot, so current value is at head-1\n const idx = (this._head - 1 - lookback + this._cap * 2) % this._cap;\n return this._buf[idx]!;\n }\n\n /** Alias for get(0). */\n get value(): number {\n return this.get(0);\n }\n\n /** Number of values stored (up to capacity). */\n get length(): number {\n return this._len;\n }\n\n /** Ring-buffer capacity. */\n get capacity(): number {\n return this._cap;\n }\n\n /**\n * Snapshot: returns all stored values in chronological order\n * (oldest first, newest last).\n */\n toArray(): number[] {\n const out: number[] = new Array(this._len);\n for (let i = 0; i < this._len; i++) {\n out[i] = this.get(this._len - 1 - i);\n }\n return out;\n }\n\n /** Reset the buffer (e.g. on symbol change). */\n reset(): void {\n this._buf.fill(NaN);\n this._head = 0;\n this._len = 0;\n }\n}\n","/**\n * TScript Lexer — converts source text into a flat token stream.\n *\n * Token types:\n * NUMBER — 42, 3.14, .5\n * STRING — \"hello\" or 'hello'\n * BOOL — true / false\n * IDENT — identifier or keyword\n * OP — single/double-char operator\n * LPAREN, RPAREN, LBRACKET, RBRACKET, COMMA, EQ, NEWLINE\n * EOF\n */\n\nexport type TokenKind =\n | 'NUMBER' | 'STRING' | 'BOOL' | 'IDENT'\n | 'PLUS' | 'MINUS' | 'STAR' | 'SLASH' | 'PERCENT'\n | 'LT' | 'GT' | 'LTE' | 'GTE' | 'EQEQ' | 'NEQ'\n | 'QMARK' | 'COLON'\n | 'LPAREN' | 'RPAREN' | 'LBRACKET' | 'RBRACKET'\n | 'COMMA' | 'EQ'\n | 'NEWLINE' | 'EOF';\n\nexport type Token = {\n kind: TokenKind;\n value: string; // raw matched text\n line: number;\n col: number;\n};\n\n// Keywords that are NOT identifiers\nconst KEYWORDS = new Set(['true', 'false', 'and', 'or', 'not', 'indicator', 'input', 'plot', 'na']);\n\nexport class Lexer {\n private _src: string;\n private _pos: number = 0;\n private _line: number = 1;\n private _col: number = 1;\n\n constructor(src: string) {\n this._src = src;\n }\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n while (this._pos < this._src.length) {\n this._skipWhitespaceAndComments();\n if (this._pos >= this._src.length) break;\n\n const ch = this._src[this._pos]!;\n\n // Newline as statement separator\n if (ch === '\\n') {\n tokens.push(this._make('NEWLINE', '\\n'));\n this._pos++;\n this._line++;\n this._col = 1;\n continue;\n }\n\n // Numbers\n if (ch >= '0' && ch <= '9' || (ch === '.' && this._peek(1) >= '0' && this._peek(1) <= '9')) {\n tokens.push(this._readNumber());\n continue;\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n tokens.push(this._readString(ch));\n continue;\n }\n\n // Identifiers / keywords\n if (this._isAlpha(ch)) {\n tokens.push(this._readIdent());\n continue;\n }\n\n // Two-char operators first\n const two = this._src.slice(this._pos, this._pos + 2);\n if (two === '<=' ) { tokens.push(this._make('LTE', two)); this._pos += 2; this._col += 2; continue; }\n if (two === '>=' ) { tokens.push(this._make('GTE', two)); this._pos += 2; this._col += 2; continue; }\n if (two === '==' ) { tokens.push(this._make('EQEQ', two)); this._pos += 2; this._col += 2; continue; }\n if (two === '!=' ) { tokens.push(this._make('NEQ', two)); this._pos += 2; this._col += 2; continue; }\n\n // Single-char operators\n const ops: Record<string, TokenKind> = {\n '+': 'PLUS', '-': 'MINUS', '*': 'STAR', '/': 'SLASH', '%': 'PERCENT',\n '<': 'LT', '>': 'GT',\n '?': 'QMARK', ':': 'COLON',\n '(': 'LPAREN', ')': 'RPAREN',\n '[': 'LBRACKET', ']': 'RBRACKET',\n ',': 'COMMA',\n '=': 'EQ',\n };\n if (ch in ops) {\n tokens.push(this._make(ops[ch]!, ch));\n this._pos++;\n this._col++;\n continue;\n }\n\n throw new SyntaxError(`[TScript] Unexpected character '${ch}' at ${this._line}:${this._col}`);\n }\n tokens.push(this._make('EOF', ''));\n return tokens;\n }\n\n // ─── Private helpers ────────────────────────────────────────────────────────\n\n private _make(kind: TokenKind, value: string): Token {\n return { kind, value, line: this._line, col: this._col };\n }\n\n private _peek(offset: number): string {\n return this._src[this._pos + offset] ?? '';\n }\n\n private _isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';\n }\n\n private _isAlphaNum(ch: string): boolean {\n return this._isAlpha(ch) || (ch >= '0' && ch <= '9');\n }\n\n private _skipWhitespaceAndComments(): void {\n while (this._pos < this._src.length) {\n const ch = this._src[this._pos]!;\n // Skip spaces/tabs/carriage-returns but NOT newlines (they are tokens)\n if (ch === ' ' || ch === '\\t' || ch === '\\r') {\n this._pos++; this._col++;\n continue;\n }\n // Line comment: // ... to end of line\n if (ch === '/' && this._peek(1) === '/') {\n while (this._pos < this._src.length && this._src[this._pos] !== '\\n') {\n this._pos++; this._col++;\n }\n continue;\n }\n break;\n }\n }\n\n private _readNumber(): Token {\n const start = this._pos;\n const startCol = this._col;\n while (this._pos < this._src.length) {\n const c = this._src[this._pos]!;\n if ((c >= '0' && c <= '9') || c === '.') { this._pos++; this._col++; }\n else break;\n }\n const raw = this._src.slice(start, this._pos);\n return { kind: 'NUMBER', value: raw, line: this._line, col: startCol };\n }\n\n private _readString(quote: string): Token {\n const startCol = this._col;\n this._pos++; this._col++; // skip opening quote\n let result = '';\n while (this._pos < this._src.length && this._src[this._pos] !== quote) {\n if (this._src[this._pos] === '\\\\') {\n this._pos++; this._col++;\n const esc = this._src[this._pos] ?? '';\n result += esc === 'n' ? '\\n' : esc === 't' ? '\\t' : esc;\n } else {\n result += this._src[this._pos];\n }\n this._pos++; this._col++;\n }\n this._pos++; this._col++; // skip closing quote\n return { kind: 'STRING', value: result, line: this._line, col: startCol };\n }\n\n private _readIdent(): Token {\n const start = this._pos;\n const startCol = this._col;\n while (this._pos < this._src.length && this._isAlphaNum(this._src[this._pos]!)) {\n this._pos++; this._col++;\n }\n const name = this._src.slice(start, this._pos);\n if (name === 'true' || name === 'false') {\n return { kind: 'BOOL', value: name, line: this._line, col: startCol };\n }\n // Keywords like 'and', 'or', 'not', 'indicator' stay as IDENT so parser can\n // recognise them by value rather than needing dedicated token kinds.\n void KEYWORDS; // referenced for documentation only\n return { kind: 'IDENT', value: name, line: this._line, col: startCol };\n }\n}\n","/**\n * TScript Parser — recursive-descent, produces a typed AST.\n *\n * Precedence (low → high):\n * ternary ? :\n * or\n * and\n * not\n * comparison < > <= >= == !=\n * addition + -\n * multiply * / %\n * unary - (prefix)\n * primary literals, identifiers, index [], call()\n */\n\nimport type {\n Program, Stmt, Expr,\n IndicatorDecl, AssignStmt, ExprStmt,\n NumberLit, StringLit, BoolLit, Identifier,\n IndexExpr, CallExpr, BinaryExpr, UnaryExpr,\n TernaryExpr, LogicalExpr,\n} from './ast';\nimport { Lexer } from './lexer';\nimport type { Token, TokenKind } from './lexer';\n\nexport class Parser {\n private _tokens: Token[];\n private _pos: number = 0;\n\n constructor(src: string) {\n this._tokens = new Lexer(src).tokenize().filter((t) => t.kind !== 'NEWLINE' || this._isStatementBoundary(t));\n // Re-filter: keep NEWLINEs as statement separators but collapse runs\n this._tokens = this._collapseNewlines(new Lexer(src).tokenize());\n }\n\n parse(): Program {\n const stmts: Stmt[] = [];\n this._skipNewlines();\n while (!this._check('EOF')) {\n stmts.push(this._stmt());\n this._skipNewlines();\n }\n return { kind: 'Program', stmts };\n }\n\n // ─── Statements ─────────────────────────────────────────────────────────────\n\n private _stmt(): Stmt {\n // indicator(\"title\")\n if (this._checkIdent('indicator')) {\n return this._indicatorDecl();\n }\n\n // assignment: IDENT = expr (but not IDENT == ...)\n if (this._check('IDENT') && this._peekKind(1) === 'EQ') {\n return this._assign();\n }\n\n return this._exprStmt();\n }\n\n private _indicatorDecl(): IndicatorDecl {\n this._consumeIdent('indicator');\n this._consume('LPAREN', \"Expected '(' after 'indicator'\");\n const title = this._consume('STRING', \"Expected string title in indicator()\").value;\n this._consume('RPAREN', \"Expected ')' after indicator title\");\n this._consumeNewlineOrEOF();\n return { kind: 'IndicatorDecl', title };\n }\n\n private _assign(): AssignStmt {\n const name = this._consume('IDENT', 'Expected identifier').value;\n this._consume('EQ', \"Expected '='\");\n const value = this._expr();\n this._consumeNewlineOrEOF();\n return { kind: 'AssignStmt', name, value };\n }\n\n private _exprStmt(): ExprStmt {\n const expr = this._expr();\n this._consumeNewlineOrEOF();\n return { kind: 'ExprStmt', expr };\n }\n\n // ─── Expressions ────────────────────────────────────────────────────────────\n\n private _expr(): Expr {\n return this._ternary();\n }\n\n private _ternary(): Expr {\n let left = this._or();\n if (this._match('QMARK')) {\n const consequent = this._expr();\n this._consume('COLON', \"Expected ':' in ternary expression\");\n const alternate = this._expr();\n const node: TernaryExpr = { kind: 'TernaryExpr', condition: left, consequent, alternate };\n left = node;\n }\n return left;\n }\n\n private _or(): Expr {\n let left = this._and();\n while (this._checkIdent('or')) {\n this._advance();\n const right = this._and();\n const node: LogicalExpr = { kind: 'LogicalExpr', op: 'or', left, right };\n left = node;\n }\n return left;\n }\n\n private _and(): Expr {\n let left = this._not();\n while (this._checkIdent('and')) {\n this._advance();\n const right = this._not();\n const node: LogicalExpr = { kind: 'LogicalExpr', op: 'and', left, right };\n left = node;\n }\n return left;\n }\n\n private _not(): Expr {\n if (this._checkIdent('not')) {\n this._advance();\n const operand = this._comparison();\n const node: UnaryExpr = { kind: 'UnaryExpr', op: 'not', operand };\n return node;\n }\n return this._comparison();\n }\n\n private _comparison(): Expr {\n let left = this._addition();\n while (true) {\n if (this._match('LTE')) { left = this._binop('<=', left, this._addition()); continue; }\n if (this._match('GTE')) { left = this._binop('>=', left, this._addition()); continue; }\n if (this._match('EQEQ')) { left = this._binop('==', left, this._addition()); continue; }\n if (this._match('NEQ')) { left = this._binop('!=', left, this._addition()); continue; }\n if (this._match('LT')) { left = this._binop('<', left, this._addition()); continue; }\n if (this._match('GT')) { left = this._binop('>', left, this._addition()); continue; }\n break;\n }\n return left;\n }\n\n private _addition(): Expr {\n let left = this._multiplication();\n while (true) {\n if (this._match('PLUS')) { left = this._binop('+', left, this._multiplication()); continue; }\n if (this._match('MINUS')) { left = this._binop('-', left, this._multiplication()); continue; }\n break;\n }\n return left;\n }\n\n private _multiplication(): Expr {\n let left = this._unary();\n while (true) {\n if (this._match('STAR')) { left = this._binop('*', left, this._unary()); continue; }\n if (this._match('SLASH')) { left = this._binop('/', left, this._unary()); continue; }\n if (this._match('PERCENT')) { left = this._binop('%', left, this._unary()); continue; }\n break;\n }\n return left;\n }\n\n private _unary(): Expr {\n if (this._match('MINUS')) {\n const operand = this._unary();\n const node: UnaryExpr = { kind: 'UnaryExpr', op: '-', operand };\n return node;\n }\n return this._primary();\n }\n\n private _primary(): Expr {\n const tok = this._current();\n\n // Number literal\n if (tok.kind === 'NUMBER') {\n this._advance();\n const node: NumberLit = { kind: 'NumberLit', value: parseFloat(tok.value) };\n return node;\n }\n\n // String literal\n if (tok.kind === 'STRING') {\n this._advance();\n const node: StringLit = { kind: 'StringLit', value: tok.value };\n return node;\n }\n\n // Bool literal\n if (tok.kind === 'BOOL') {\n this._advance();\n const node: BoolLit = { kind: 'BoolLit', value: tok.value === 'true' };\n return node;\n }\n\n // na (special NaN constant)\n if (tok.kind === 'IDENT' && tok.value === 'na') {\n this._advance();\n const node: NumberLit = { kind: 'NumberLit', value: NaN };\n return node;\n }\n\n // Function call: IDENT '(' args ')'\n if (tok.kind === 'IDENT' && this._peekKind(1) === 'LPAREN') {\n return this._callExpr();\n }\n\n // Identifier (and optional series index)\n if (tok.kind === 'IDENT') {\n this._advance();\n let node: Expr = { kind: 'Identifier', name: tok.value } satisfies Identifier;\n // Series index: ident[expr]\n while (this._check('LBRACKET')) {\n this._advance();\n const index = this._expr();\n this._consume('RBRACKET', \"Expected ']'\");\n const indexNode: IndexExpr = { kind: 'IndexExpr', series: node, index };\n node = indexNode;\n }\n return node;\n }\n\n // Grouped: '(' expr ')'\n if (tok.kind === 'LPAREN') {\n this._advance();\n const inner = this._expr();\n this._consume('RPAREN', \"Expected ')'\");\n return inner;\n }\n\n throw new SyntaxError(\n `[TScript] Unexpected token '${tok.value}' (${tok.kind}) at ${tok.line}:${tok.col}`,\n );\n }\n\n private _callExpr(): CallExpr {\n const callee = this._consume('IDENT', 'Expected function name').value;\n this._consume('LPAREN', \"Expected '('\");\n const args: Expr[] = [];\n if (!this._check('RPAREN')) {\n args.push(this._expr());\n while (this._match('COMMA')) {\n args.push(this._expr());\n }\n }\n this._consume('RPAREN', \"Expected ')'\");\n return { kind: 'CallExpr', callee, args };\n }\n\n // ─── Utility helpers ────────────────────────────────────────────────────────\n\n private _binop(\n op: BinaryExpr['op'],\n left: Expr,\n right: Expr,\n ): BinaryExpr {\n return { kind: 'BinaryExpr', op, left, right };\n }\n\n private _current(): Token {\n return this._tokens[this._pos]!;\n }\n\n private _advance(): Token {\n return this._tokens[this._pos++]!;\n }\n\n private _check(kind: TokenKind): boolean {\n return this._current().kind === kind;\n }\n\n private _checkIdent(name: string): boolean {\n const t = this._current();\n return t.kind === 'IDENT' && t.value === name;\n }\n\n private _peekKind(offset: number): TokenKind {\n return this._tokens[this._pos + offset]?.kind ?? 'EOF';\n }\n\n private _match(kind: TokenKind): boolean {\n if (this._check(kind)) { this._advance(); return true; }\n return false;\n }\n\n private _consume(kind: TokenKind, msg: string): Token {\n if (this._check(kind)) return this._advance();\n const t = this._current();\n throw new SyntaxError(`[TScript] ${msg} — got '${t.value}' at ${t.line}:${t.col}`);\n }\n\n private _consumeIdent(name: string): Token {\n if (this._checkIdent(name)) return this._advance();\n const t = this._current();\n throw new SyntaxError(`[TScript] Expected '${name}' — got '${t.value}' at ${t.line}:${t.col}`);\n }\n\n private _consumeNewlineOrEOF(): void {\n // Silently accept NEWLINE or EOF; required at end of every statement.\n if (this._check('NEWLINE') || this._check('EOF')) {\n if (this._check('NEWLINE')) this._advance();\n }\n // If neither, we just continue (expression statements don't need semicolons)\n }\n\n private _skipNewlines(): void {\n while (this._check('NEWLINE')) this._advance();\n }\n\n private _collapseNewlines(tokens: Token[]): Token[] {\n const out: Token[] = [];\n let lastWasNL = false;\n for (const t of tokens) {\n if (t.kind === 'NEWLINE') {\n if (!lastWasNL) out.push(t);\n lastWasNL = true;\n } else {\n lastWasNL = false;\n out.push(t);\n }\n }\n return out;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private _isStatementBoundary(_t: Token): boolean { return true; }\n}\n","/**\n * TScript Runtime — tree-walking interpreter.\n *\n * Execution model\n * ───────────────\n * A TScript program is executed once per compiled bar in left-to-right,\n * top-to-bottom statement order. The runtime keeps a persistent `Scope`\n * so that `Series` variables accumulate history across bars.\n *\n * Built-in series (available in every script):\n * open, high, low, close, volume, hl2, hlc3, ohlc4, bar_index\n *\n * Built-in TA functions:\n * sma(src, length) — simple moving average\n * ema(src, length) — exponential moving average\n * wma(src, length) — weighted moving average\n * rma(src, length) — Wilder's (RMA) moving average\n * stdev(src, length) — rolling standard deviation\n * highest(src, n) — rolling max over n bars\n * lowest(src, n) — rolling min over n bars\n * change(src, n?) — src - src[n] (default n=1)\n * mom(src, length) — momentum = change(src, length)\n * atr(length) — Average True Range\n * crossover(a, b) — a crosses above b\n * crossunder(a, b) — a crosses below b\n * nz(x, y?) — replace NaN with y (default 0)\n * na(x) — true if x is NaN\n * abs(x) — Math.abs\n * max(...) — Math.max over args\n * min(...) — Math.min over args\n * round(x) — Math.round\n * floor(x) — Math.floor\n * ceil(x) — Math.ceil\n * sqrt(x) — Math.sqrt\n * log(x) — Math.log\n * pow(x, y) — Math.pow\n * sign(x) — Math.sign\n *\n * Built-in utility functions:\n * input(default, ...) — returns the default value (params resolved externally)\n * plot(value, ...) — records a value for the current bar\n * barssince(cond) — bars since condition was true\n */\n\nimport type { OHLCV } from '@forgecharts/types';\nimport { Series } from './series';\nimport { Parser } from './parser';\nimport type {\n Program, Stmt, Expr,\n AssignStmt, ExprStmt, IndicatorDecl,\n NumberLit, StringLit, BoolLit, Identifier,\n IndexExpr, CallExpr, BinaryExpr, UnaryExpr,\n TernaryExpr, LogicalExpr,\n} from './ast';\nimport type { IndicatorPoint } from '../core/IndicatorEngine';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** A TScript value is a number, boolean, string, or Series. */\nexport type TValue = number | boolean | string | Series;\n\n/** Scope maps variable names to their TScript values. */\nexport type Scope = Map<string, TValue>;\n\n/** Result produced by a single script execution run. */\nexport type ScriptResult = {\n /** Title from indicator(\"...\") declaration. */\n title: string;\n /** Collected plot() calls for this run, in declaration order. */\n plots: IndicatorPoint[][];\n};\n\n// ─── Scope helpers ────────────────────────────────────────────────────────────\n\nfunction _num(v: TValue, ctx: string): number {\n if (v instanceof Series) return v.value;\n if (typeof v === 'number') return v;\n if (typeof v === 'boolean') return v ? 1 : 0;\n throw new TypeError(`[TScript] ${ctx}: expected number, got ${typeof v}`);\n}\n\nfunction _bool(v: TValue): boolean {\n if (v instanceof Series) return !isNaN(v.value) && v.value !== 0;\n if (typeof v === 'number') return !isNaN(v) && v !== 0;\n if (typeof v === 'boolean') return v;\n return Boolean(v);\n}\n\n// ─── TScriptRuntime ───────────────────────────────────────────────────────────\n\nexport class TScriptRuntime {\n private readonly _program: Program;\n private readonly _scope: Scope = new Map();\n private readonly _plotSeries: Series[] = []; // one entry per plot() call order\n\n // Public metadata set by indicator() declaration\n title: string = 'Script';\n\n constructor(src: string) {\n this._program = new Parser(src).parse();\n\n // Extract title from first IndicatorDecl if present\n for (const stmt of this._program.stmts) {\n if (stmt.kind === 'IndicatorDecl') {\n this.title = stmt.title;\n break;\n }\n }\n }\n\n /**\n * Execute one bar.\n *\n * Call this in chronological order for every OHLCV bar.\n * The runtime updates all built-in series with the bar's OHLCV values,\n * then re-executes the full program body.\n *\n * @returns the current values of all `plot()` series after this bar.\n */\n execBar(bar: OHLCV, barIndex: number): void {\n // ── Push OHLCV values into built-in series ────────────────────────────────\n this._pushBuiltin('open', bar.open);\n this._pushBuiltin('high', bar.high);\n this._pushBuiltin('low', bar.low);\n this._pushBuiltin('close', bar.close);\n this._pushBuiltin('volume', bar.volume);\n this._pushBuiltin('hl2', (bar.high + bar.low) / 2);\n this._pushBuiltin('hlc3', (bar.high + bar.low + bar.close) / 3);\n this._pushBuiltin('ohlc4', (bar.open + bar.high + bar.low + bar.close) / 4);\n this._pushBuiltin('bar_index', barIndex);\n\n // ── Reset per-bar plot accumulators ───────────────────────────────────────\n this._plotIdx = 0;\n\n // ── Execute all statements (skipping IndicatorDecl) ──────────────────────\n for (const stmt of this._program.stmts) {\n this._execStmt(stmt);\n }\n }\n\n /**\n * Run the full bar history and return IndicatorPoint arrays indexed by\n * plot() call order.\n *\n * @param bars chronologically ordered OHLCV array\n */\n run(bars: readonly OHLCV[]): IndicatorPoint[][] {\n this.reset();\n for (let i = 0; i < bars.length; i++) {\n this.execBar(bars[i]!, i);\n }\n return this.getPlots(bars);\n }\n\n /**\n * Snapshot the current plot series as IndicatorPoint arrays.\n * Must be called after `run()` or after the last `execBar()`.\n * @param bars the same bar array passed to run() — used for timestamps.\n */\n getPlots(bars: readonly OHLCV[]): IndicatorPoint[][] {\n return this._plotSeries.map((series) => {\n const values = series.toArray(); // oldest→newest\n const offset = bars.length - values.length;\n return values\n .map((value, i) => ({\n time: bars[offset + i]!.time,\n value,\n }))\n .filter((p) => !isNaN(p.value));\n });\n }\n\n /** Reset all persistent series state (call on symbol/timeframe change). */\n reset(): void {\n for (const v of this._scope.values()) {\n if (v instanceof Series) v.reset();\n }\n for (const s of this._plotSeries) s.reset();\n this._plotIdx = 0;\n }\n\n // ─── Private: statement execution ───────────────────────────────────────────\n\n private _execStmt(stmt: Stmt): void {\n switch (stmt.kind) {\n case 'IndicatorDecl': break; // handled at construction\n case 'AssignStmt': this._execAssign(stmt); break;\n case 'ExprStmt': this._evalExpr(stmt.expr); break;\n }\n }\n\n private _execAssign(stmt: AssignStmt): void {\n const rhs = this._evalExpr(stmt.value);\n const existing = this._scope.get(stmt.name);\n\n if (existing instanceof Series) {\n // Persist a series variable: push the new value each bar\n existing.push(_num(rhs, `assignment to '${stmt.name}'`));\n } else {\n // First assignment: if RHS is a number, wrap in a Series for history\n if (typeof rhs === 'number' || rhs instanceof Series) {\n const series = new Series(1000);\n series.push(rhs instanceof Series ? rhs.value : rhs);\n this._scope.set(stmt.name, series);\n } else {\n this._scope.set(stmt.name, rhs);\n }\n }\n }\n\n // ─── Private: expression evaluation ─────────────────────────────────────────\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _evalExpr(expr: Expr): TValue {\n switch (expr.kind) {\n case 'NumberLit': return (expr as NumberLit).value;\n case 'StringLit': return (expr as StringLit).value;\n case 'BoolLit': return (expr as BoolLit).value;\n case 'Identifier': return this._evalIdent(expr as Identifier);\n case 'IndexExpr': return this._evalIndex(expr as IndexExpr);\n case 'CallExpr': return this._evalCall(expr as CallExpr);\n case 'BinaryExpr': return this._evalBinary(expr as BinaryExpr);\n case 'UnaryExpr': return this._evalUnary(expr as UnaryExpr);\n case 'TernaryExpr':return this._evalTernary(expr as TernaryExpr);\n case 'LogicalExpr':return this._evalLogical(expr as LogicalExpr);\n }\n }\n\n private _evalIdent(expr: Identifier): TValue {\n const v = this._scope.get(expr.name);\n if (v === undefined) {\n throw new ReferenceError(`[TScript] Undefined variable '${expr.name}'`);\n }\n // Return the Series itself; callers use _num() to coerce if needed.\n return v;\n }\n\n private _evalIndex(expr: IndexExpr): number {\n const series = this._evalExpr(expr.series);\n const idx = _num(this._evalExpr(expr.index), 'series index');\n if (!(series instanceof Series)) {\n throw new TypeError('[TScript] Index operator [] can only be applied to a series');\n }\n return series.get(Math.round(idx));\n }\n\n private _evalBinary(expr: BinaryExpr): TValue {\n const l = _num(this._evalExpr(expr.left), `left of '${expr.op}'`);\n const r = _num(this._evalExpr(expr.right), `right of '${expr.op}'`);\n switch (expr.op) {\n case '+': return l + r;\n case '-': return l - r;\n case '*': return l * r;\n case '/': return r === 0 ? NaN : l / r;\n case '%': return l % r;\n case '<': return l < r;\n case '>': return l > r;\n case '<=': return l <= r;\n case '>=': return l >= r;\n case '==': return l === r;\n case '!=': return l !== r;\n }\n }\n\n private _evalUnary(expr: UnaryExpr): TValue {\n if (expr.op === 'not') return !_bool(this._evalExpr(expr.operand));\n return -_num(this._evalExpr(expr.operand), 'unary -');\n }\n\n private _evalTernary(expr: TernaryExpr): TValue {\n return _bool(this._evalExpr(expr.condition))\n ? this._evalExpr(expr.consequent)\n : this._evalExpr(expr.alternate);\n }\n\n private _evalLogical(expr: LogicalExpr): TValue {\n const l = _bool(this._evalExpr(expr.left));\n if (expr.op === 'and') return l ? _bool(this._evalExpr(expr.right)) : false;\n return l ? true : _bool(this._evalExpr(expr.right));\n }\n\n // ─── Built-in function dispatch ──────────────────────────────────────────────\n\n private _plotIdx = 0;\n\n private _evalCall(expr: CallExpr): TValue {\n const fn = expr.callee;\n const args = expr.args;\n\n switch (fn) {\n // ── Utility ────────────────────────────────────────────────────────────\n case 'input': {\n // input(default) — return default value; full param resolution is external\n if (args.length === 0) return 0;\n const def = this._evalExpr(args[0]!);\n return typeof def === 'string' ? parseFloat(def) || 0 : _num(def, 'input()');\n }\n\n case 'plot': {\n const value = _num(this._evalExpr(args[0]!), 'plot()');\n const idx = this._plotIdx++;\n if (idx >= this._plotSeries.length) {\n this._plotSeries.push(new Series(1000));\n }\n this._plotSeries[idx]!.push(value);\n return value;\n }\n\n case 'na': {\n if (args.length > 0) {\n const v = this._evalExpr(args[0]!);\n return typeof v === 'number' ? isNaN(v) : v instanceof Series ? isNaN(v.value) : false;\n }\n return NaN;\n }\n\n case 'nz': {\n const v = _num(this._evalExpr(args[0]!), 'nz()');\n const fallback = args.length > 1 ? _num(this._evalExpr(args[1]!), 'nz() fallback') : 0;\n return isNaN(v) ? fallback : v;\n }\n\n case 'abs': return Math.abs(_num(this._evalExpr(args[0]!), 'abs()'));\n case 'round': return Math.round(_num(this._evalExpr(args[0]!), 'round()'));\n case 'floor': return Math.floor(_num(this._evalExpr(args[0]!), 'floor()'));\n case 'ceil': return Math.ceil(_num(this._evalExpr(args[0]!), 'ceil()'));\n case 'sqrt': return Math.sqrt(_num(this._evalExpr(args[0]!), 'sqrt()'));\n case 'log': return Math.log(_num(this._evalExpr(args[0]!), 'log()'));\n case 'sign': return Math.sign(_num(this._evalExpr(args[0]!), 'sign()'));\n case 'pow': {\n const base = _num(this._evalExpr(args[0]!), 'pow() base');\n const exp = _num(this._evalExpr(args[1]!), 'pow() exponent');\n return Math.pow(base, exp);\n }\n case 'max': return Math.max(...args.map((a) => _num(this._evalExpr(a), 'max()')));\n case 'min': return Math.min(...args.map((a) => _num(this._evalExpr(a), 'min()')));\n\n // ── TA functions ────────────────────────────────────────────────────────\n case 'sma': return this._ta_sma(args);\n case 'ema': return this._ta_ema(args);\n case 'wma': return this._ta_wma(args);\n case 'rma': return this._ta_rma(args);\n case 'stdev': return this._ta_stdev(args);\n case 'highest':return this._ta_rolling(args, Math.max);\n case 'lowest': return this._ta_rolling(args, Math.min);\n case 'change': return this._ta_change(args);\n case 'mom': return this._ta_change(args);\n case 'atr': return this._ta_atr(args);\n case 'crossover': return this._ta_crossover(args);\n case 'crossunder': return this._ta_crossunder(args);\n case 'barssince': return this._ta_barssince(args);\n\n default:\n throw new ReferenceError(`[TScript] Unknown function '${fn}'`);\n }\n }\n\n // ─── TA helpers ──────────────────────────────────────────────────────────────\n\n /** Resolve a call argument as a Series (wrapping scalar if needed). */\n private _argSeries(arg: Expr, ctx: string): Series {\n const v = this._evalExpr(arg);\n if (v instanceof Series) return v;\n if (typeof v === 'number') {\n // Inline scalar: treat as a constant series with only the current value\n const s = new Series(2);\n s.push(v);\n return s;\n }\n throw new TypeError(`[TScript] ${ctx}: expected a series`);\n }\n\n private _argInt(arg: Expr, ctx: string): number {\n return Math.round(_num(this._evalExpr(arg), ctx));\n }\n\n private _ta_sma(args: Expr[]): number {\n const src = this._argSeries(args[0]!, 'sma(src)');\n const period = this._argInt(args[1]!, 'sma(length)');\n if (src.length < period) return NaN;\n let sum = 0;\n for (let i = 0; i < period; i++) sum += src.get(i);\n return sum / period;\n }\n\n private _ta_ema(args: Expr[]): number {\n const src = this._argSeries(args[0]!, 'ema(src)');\n const period = this._argInt(args[1]!, 'ema(length)');\n if (src.length < period) return NaN;\n // Persistent EMA state: store the last EMA value in a named internal Series\n const stateKey = `__ema_${args[0]!.kind}_${period}`;\n let prevEMA = this._getInternalNum(stateKey);\n const k = 2 / (period + 1);\n const cur = src.get(0);\n const newEMA = isNaN(prevEMA)\n ? this._smaOfSeries(src, period) // seed with SMA on first valid bar\n : cur * k + prevEMA * (1 - k);\n this._setInternal(stateKey, newEMA);\n return newEMA;\n }\n\n private _ta_wma(args: Expr[]): number {\n const src = this._argSeries(args[0]!, 'wma(src)');\n const period = this._argInt(args[1]!, 'wma(length)');\n if (src.length < period) return NaN;\n const denom = (period * (period + 1)) / 2;\n let sum = 0;\n for (let i = 0; i < period; i++) sum += src.get(i) * (period - i);\n return sum / denom;\n }\n\n private _ta_rma(args: Expr[]): number {\n // Wilder's RMA: alpha = 1/period\n const src = this._argSeries(args[0]!, 'rma(src)');\n const period = this._argInt(args[1]!, 'rma(length)');\n if (src.length < period) return NaN;\n const stateKey = `__rma_${args[0]!.kind}_${period}`;\n let prev = this._getInternalNum(stateKey);\n const alpha = 1 / period;\n const cur = src.get(0);\n const result = isNaN(prev) ? this._smaOfSeries(src, period) : alpha * cur + (1 - alpha) * prev;\n this._setInternal(stateKey, result);\n return result;\n }\n\n private _ta_stdev(args: Expr[]): number {\n const src = this._argSeries(args[0]!, 'stdev(src)');\n const period = this._argInt(args[1]!, 'stdev(length)');\n if (src.length < period) return NaN;\n const mean = this._smaOfSeries(src, period);\n let variance = 0;\n for (let i = 0; i < period; i++) {\n const diff = src.get(i) - mean;\n variance += diff * diff;\n }\n return Math.sqrt(variance / period);\n }\n\n private _ta_rolling(args: Expr[], fn: (...v: number[]) => number): number {\n const src = this._argSeries(args[0]!, 'highest/lowest(src)');\n const period = this._argInt(args[1]!, 'highest/lowest(length)');\n if (src.length < period) return NaN;\n let result = src.get(0);\n for (let i = 1; i < period; i++) result = fn(result, src.get(i));\n return result;\n }\n\n private _ta_change(args: Expr[]): number {\n const src = this._argSeries(args[0]!, 'change(src)');\n const period = args.length > 1 ? this._argInt(args[1]!, 'change(length)') : 1;\n if (src.length <= period) return NaN;\n return src.get(0) - src.get(period);\n }\n\n private _ta_atr(args: Expr[]): number {\n const period = this._argInt(args[0]!, 'atr(length)');\n const high = this._scope.get('high');\n const low = this._scope.get('low');\n const close = this._scope.get('close');\n if (!(high instanceof Series) || !(low instanceof Series) || !(close instanceof Series)) {\n return NaN;\n }\n if (high.length < 2) return NaN;\n const h = high.get(0);\n const l = low.get(0);\n const pc = close.get(1); // previous close\n const tr = Math.max(h - l, Math.abs(h - pc), Math.abs(l - pc));\n const stateKey = `__atr_${period}`;\n let prev = this._getInternalNum(stateKey);\n const alpha = 1 / period;\n const result = isNaN(prev) ? tr : alpha * tr + (1 - alpha) * prev;\n this._setInternal(stateKey, result);\n return result;\n }\n\n private _ta_crossover(args: Expr[]): boolean {\n const a = this._argSeries(args[0]!, 'crossover(a)');\n const b = this._argSeries(args[1]!, 'crossover(b)');\n return a.get(0) > b.get(0) && a.get(1) <= b.get(1);\n }\n\n private _ta_crossunder(args: Expr[]): boolean {\n const a = this._argSeries(args[0]!, 'crossunder(a)');\n const b = this._argSeries(args[1]!, 'crossunder(b)');\n return a.get(0) < b.get(0) && a.get(1) >= b.get(1);\n }\n\n private _ta_barssince(args: Expr[]): number {\n const cond = this._argSeries(args[0]!, 'barssince(cond)');\n for (let i = 0; i < cond.length; i++) {\n if (_bool(cond.get(i))) return i;\n }\n return NaN;\n }\n\n // ─── Internal state helpers ──────────────────────────────────────────────────\n\n /** Persistent scalar state for stateful TA functions (EMA, RMA, ATR). */\n private readonly _internalState = new Map<string, number>();\n\n private _getInternalNum(key: string): number {\n return this._internalState.get(key) ?? NaN;\n }\n\n private _setInternal(key: string, value: number): void {\n this._internalState.set(key, value);\n }\n\n /** Push a value into a named built-in Series, creating it if needed. */\n private _pushBuiltin(name: string, value: number): void {\n let series = this._scope.get(name);\n if (!(series instanceof Series)) {\n series = new Series(1000);\n this._scope.set(name, series);\n }\n series.push(value);\n }\n\n /** Compute a simple rolling average directly from a Series (no state). */\n private _smaOfSeries(src: Series, period: number): number {\n let sum = 0;\n for (let i = 0; i < period; i++) sum += src.get(i);\n return sum / period;\n }\n}\n","/**\n * TScriptIndicator — compiles and executes a TScript program, exposing its\n * plot() outputs as IndicatorPoint arrays compatible with the DAG DAGResult format.\n *\n * @example\n * ```ts\n * const ind = new TScriptIndicator(`\n * indicator(\"My SMA\")\n * length = input(14)\n * value = sma(close, length)\n * plot(value)\n * `);\n *\n * const plots = ind.run(bars);\n * // plots[0] → IndicatorPoint[] for the first plot() call\n * ```\n */\n\nimport type { OHLCV } from '@forgecharts/types';\nimport { TScriptRuntime } from './runtime';\nimport type { IndicatorPoint } from '../core/IndicatorEngine';\n\nexport class TScriptIndicator {\n private readonly _runtime: TScriptRuntime;\n\n /** Title from the `indicator(\"...\")` declaration, or `'Script'` if absent. */\n readonly title: string;\n\n constructor(src: string) {\n this._runtime = new TScriptRuntime(src);\n this.title = this._runtime.title;\n }\n\n /**\n * Execute the script over the full bar history.\n *\n * Each call resets internal state and replays every bar from scratch,\n * ensuring the output is deterministic regardless of prior calls.\n *\n * @returns array of plot series — `plots[0]` corresponds to the first\n * `plot()` call in source, `plots[1]` to the second, etc.\n */\n run(bars: readonly OHLCV[]): IndicatorPoint[][] {\n return this._runtime.run(bars);\n }\n\n /**\n * Reset all persistent series state (ring buffers) without re-parsing.\n * Call when the chart symbol or timeframe changes.\n */\n reset(): void {\n this._runtime.reset();\n }\n}\n","/**\n * IndicatorDAG — Directed Acyclic Graph for indicator computation.\n *\n * Allows indicators to be chained: e.g. EMA can consume SMA's output instead\n * of raw OHLCV prices. Circular dependencies are rejected at registration time.\n * Results are cached and recomputed only when inputs actually change.\n *\n * Incremental fast-path: when a single bar is appended, SMA and EMA extend\n * their result by exactly one point in O(1) time.\n *\n * @example\n * ```ts\n * const dag = new IndicatorDAG();\n * dag.addNode('sma1', { type: 'sma', params: { period: 20 } });\n * dag.addNode('ema1', { type: 'ema', params: { period: 10 }, sourceId: 'sma1' });\n *\n * dag.execute(bars); // SMA first, then EMA(SMA)\n * const result = dag.getResult('ema1'); // { kind: 'series', points: [...] }\n * ```\n */\n\nimport type { OHLCV, IndicatorConfig, PriceField } from '@forgecharts/types';\nimport type { IndicatorPoint, MACDPoint } from '../core/IndicatorEngine';\nimport {\n extractField,\n computeSMAFromSeries,\n computeEMAFromSeries,\n computeWMAFromSeries,\n computeRSI,\n computeMACD,\n computeVolume,\n} from '../core/IndicatorEngine';\nimport { TScriptIndicator } from '../tscript/TScriptIndicator';\n\n// ─── Public result type ────────────────────────────────────────────────────────\n\n/** Computed output of a single DAG node. */\nexport type DAGResult =\n | { readonly kind: 'series'; readonly points: readonly IndicatorPoint[] }\n | { readonly kind: 'macd'; readonly points: readonly MACDPoint[] };\n\n// ─── Internal ─────────────────────────────────────────────────────────────────\n\ntype Node = {\n id: string;\n config: IndicatorConfig;\n result: DAGResult | null;\n /** `bars.length` at the last successful execution. */\n lastBarsLen: number;\n /** Source `IndicatorPoint[]` length at the last successful execution. */\n lastInputLen: number;\n /** Close price of the last bar at the last successful execution — detects forming-bar live ticks. */\n lastBarClose: number;\n dirty: boolean;\n /** Compiled TScript instance (only for type === 'script'). */\n scriptRuntime?: TScriptIndicator;\n};\n\nfunction _configEqual(a: IndicatorConfig, b: IndicatorConfig): boolean {\n return (\n a.type === b.type &&\n a.sourceId === b.sourceId &&\n a.sourceField === b.sourceField &&\n JSON.stringify(a.params) === JSON.stringify(b.params)\n );\n}\n\n// ─── IndicatorDAG ─────────────────────────────────────────────────────────────\n\nexport class IndicatorDAG {\n private readonly _nodes = new Map<string, Node>();\n\n // ─── Registration ───────────────────────────────────────────────────────────\n\n /**\n * Registers a node for `id`.\n * If the node already exists its config is updated if changed.\n * Throws `'[IndicatorDAG] Circular dependency detected'` if adding `id`\n * would form a cycle.\n */\n addNode(id: string, config: IndicatorConfig): void {\n const existing = this._nodes.get(id);\n if (existing) {\n if (!_configEqual(existing.config, config)) {\n existing.config = config;\n existing.dirty = true;\n existing.result = null;\n this._markDependentsDirty(id);\n }\n return;\n }\n\n this._nodes.set(id, {\n id,\n config,\n result: null,\n lastBarsLen: -1,\n lastInputLen: -1,\n lastBarClose: NaN,\n dirty: true,\n });\n\n // Validate immediately — undo and rethrow if a cycle is formed.\n try {\n this._topoSort();\n } catch (e) {\n this._nodes.delete(id);\n throw e;\n }\n }\n\n /** Removes `id` and marks any indicators that depended on it as dirty. */\n removeNode(id: string): void {\n this._nodes.delete(id);\n this._markDependentsDirty(id);\n }\n\n /**\n * Syncs the DAG to exactly the provided indicator list.\n * Adds new nodes, removes obsolete ones, updates changed configs.\n * Throws if the resulting graph contains a cycle.\n */\n sync(\n indicators: ReadonlyArray<{ readonly id: string; readonly config: IndicatorConfig }>,\n ): void {\n const incoming = new Set(indicators.map((i) => i.id));\n\n // Remove nodes no longer present.\n for (const id of [...this._nodes.keys()]) {\n if (!incoming.has(id)) {\n this._nodes.delete(id);\n this._markDependentsDirty(id);\n }\n }\n\n // Add or refresh nodes.\n for (const { id, config } of indicators) {\n const node = this._nodes.get(id);\n if (!node) {\n this._nodes.set(id, {\n id,\n config,\n result: null,\n lastBarsLen: -1,\n lastInputLen: -1,\n lastBarClose: NaN,\n dirty: true,\n });\n } else if (!_configEqual(node.config, config)) {\n node.config = config;\n node.dirty = true;\n node.result = null;\n this._markDependentsDirty(id);\n }\n }\n\n // Validate the whole graph (after all additions) — throws on cycle.\n this._topoSort();\n }\n\n // ─── Execution ──────────────────────────────────────────────────────────────\n\n /**\n * Runs all dirty nodes in topological order.\n *\n * When the OHLCV array grew by exactly one bar since a node's last run and\n * its input series also grew by one, SMA and EMA use an O(1) incremental\n * append path. All other types fall back to a full recompute.\n *\n * @returns `true` if any node was executed.\n */\n execute(bars: readonly OHLCV[]): boolean {\n const order = this._topoSort();\n let executed = false;\n\n for (const id of order) {\n const node = this._nodes.get(id)!;\n if (!this._needsRun(node, bars)) continue;\n\n executed = true;\n const input = this._resolveSource(node, bars);\n\n const canIncremental =\n node.result !== null &&\n node.result.kind === 'series' &&\n node.result.points.length > 0 &&\n input.length === node.lastInputLen + 1 &&\n bars.length === node.lastBarsLen + 1;\n\n node.result = canIncremental\n ? this._appendOne(node, input, node.result!.points as readonly IndicatorPoint[], bars)\n : this._computeFull(node, input, bars);\n\n node.dirty = false;\n node.lastBarsLen = bars.length;\n node.lastInputLen = input.length;\n node.lastBarClose = bars.length > 0 ? bars[bars.length - 1]!.close : NaN;\n }\n\n return executed;\n }\n\n /** Forces every node to recompute on the next `execute()` call. */\n invalidateAll(): void {\n for (const node of this._nodes.values()) {\n node.dirty = true;\n }\n }\n\n isDirty(): boolean {\n return [...this._nodes.values()].some((n) => n.dirty);\n }\n\n // ─── Results ────────────────────────────────────────────────────────────────\n\n getResult(id: string): DAGResult | null {\n return this._nodes.get(id)?.result ?? null;\n }\n\n getAllResults(): ReadonlyMap<string, DAGResult> {\n const out = new Map<string, DAGResult>();\n for (const [id, node] of this._nodes) {\n if (node.result !== null) out.set(id, node.result);\n }\n return out;\n }\n\n // ─── Topological sort (Kahn's algorithm) ────────────────────────────────────\n\n /**\n * Returns node ids in topological execution order.\n * Throws `'[IndicatorDAG] Circular dependency detected'` when a cycle exists.\n */\n private _topoSort(): string[] {\n const inDeg = new Map<string, number>();\n const adj = new Map<string, string[]>(); // sourceId → dependent ids\n\n for (const node of this._nodes.values()) {\n if (!inDeg.has(node.id)) inDeg.set(node.id, 0);\n const src = node.config.sourceId;\n if (src !== undefined && this._nodes.has(src)) {\n if (!adj.has(src)) adj.set(src, []);\n adj.get(src)!.push(node.id);\n inDeg.set(node.id, (inDeg.get(node.id) ?? 0) + 1);\n }\n }\n\n const queue = [...this._nodes.keys()].filter((id) => (inDeg.get(id) ?? 0) === 0);\n const order: string[] = [];\n\n while (queue.length > 0) {\n const curr = queue.shift()!;\n order.push(curr);\n for (const dep of adj.get(curr) ?? []) {\n const d = (inDeg.get(dep) ?? 0) - 1;\n inDeg.set(dep, d);\n if (d === 0) queue.push(dep);\n }\n }\n\n if (order.length !== this._nodes.size) {\n throw new Error('[IndicatorDAG] Circular dependency detected');\n }\n return order;\n }\n\n // ─── Private helpers ────────────────────────────────────────────────────────\n\n private _needsRun(node: Node, bars: readonly OHLCV[]): boolean {\n if (node.dirty || node.result === null) return true;\n if (bars.length !== node.lastBarsLen) return true;\n // Rerun when the forming bar's close has changed (live WS tick updating in-place).\n if (bars.length > 0 && bars[bars.length - 1]!.close !== node.lastBarClose) return true;\n // Rerun if the source indicator has newer data.\n const srcId = node.config.sourceId;\n if (srcId !== undefined) {\n const src = this._nodes.get(srcId);\n if (src && src.lastBarsLen !== node.lastBarsLen) return true;\n }\n return false;\n }\n\n /** Returns the ordered input series for `node` — either from a source indicator or raw price field. */\n private _resolveSource(node: Node, bars: readonly OHLCV[]): readonly IndicatorPoint[] {\n const srcId = node.config.sourceId;\n if (srcId !== undefined) {\n const src = this._nodes.get(srcId);\n if (src?.result?.kind === 'series') return src.result.points;\n // Source is missing, MACD, or not yet computed — fall through to raw bars.\n }\n const field: PriceField = node.config.sourceField ?? 'close';\n return bars.map((b) => ({ time: b.time, value: extractField(b, field) }));\n }\n\n /** Full recompute of a node's result. */\n private _computeFull(\n node: Node,\n input: readonly IndicatorPoint[],\n bars: readonly OHLCV[],\n ): DAGResult {\n const p = (node.config.params ?? {}) as Record<string, number>;\n switch (node.config.type) {\n case 'sma':\n return { kind: 'series', points: computeSMAFromSeries(input, p['period'] ?? 20) };\n case 'ema':\n return { kind: 'series', points: computeEMAFromSeries(input, p['period'] ?? 20) };\n case 'wma':\n return { kind: 'series', points: computeWMAFromSeries(input, p['period'] ?? 20) };\n case 'rsi':\n return { kind: 'series', points: computeRSI(bars, p['period'] ?? 14) };\n case 'volume':\n return { kind: 'series', points: computeVolume(bars) };\n case 'macd':\n return {\n kind: 'macd',\n points: computeMACD(bars, p['fast'] ?? 12, p['slow'] ?? 26, p['signal'] ?? 9),\n };\n case 'bbands': {\n // Bollinger Bands — represented as three series; store middle band as primary.\n const period = p['period'] ?? 20;\n const sma = computeSMAFromSeries(input, period);\n return { kind: 'series', points: sma }; // renderer handles bbands specially\n }\n case 'script': {\n const src = node.config.script;\n if (!src) return { kind: 'series', points: [] };\n // Compile once, reuse across bars.\n if (!node.scriptRuntime) {\n node.scriptRuntime = new TScriptIndicator(src);\n }\n const plots = node.scriptRuntime.run(bars);\n // First plot() call becomes the primary series.\n return { kind: 'series', points: plots[0] ?? [] };\n }\n default:\n // Identity passthrough for unknown / future types.\n return { kind: 'series', points: [...input] };\n }\n }\n\n /**\n * O(1) append of a single new point.\n * Only called when `canIncremental` is true (input grew by exactly one element).\n * Falls back to `_computeFull` for types that have no O(1) path.\n */\n private _appendOne(\n node: Node,\n input: readonly IndicatorPoint[],\n prev: readonly IndicatorPoint[],\n bars: readonly OHLCV[],\n ): DAGResult {\n const p = (node.config.params ?? {}) as Record<string, number>;\n const last = input[input.length - 1]!;\n\n switch (node.config.type) {\n case 'sma': {\n const period = p['period'] ?? 20;\n if (input.length < period || prev.length === 0) {\n return this._computeFull(node, input, bars);\n }\n // O(1): newSMA = (prevSMA * period - outgoing + incoming) / period\n const prevSMA = prev[prev.length - 1]!.value;\n const outgoing = input[input.length - 1 - period]?.value ?? 0;\n const newValue = (prevSMA * period - outgoing + last.value) / period;\n return { kind: 'series', points: [...prev, { time: last.time, value: newValue }] };\n }\n case 'ema': {\n const period = p['period'] ?? 20;\n const k = 2 / (period + 1);\n const prevEMA = prev[prev.length - 1]!.value;\n const newValue = last.value * k + prevEMA * (1 - k);\n return { kind: 'series', points: [...prev, { time: last.time, value: newValue }] };\n }\n default:\n return this._computeFull(node, input, bars);\n }\n }\n\n /** Recursively marks all indicators that depend on `sourceId` as dirty. */\n private _markDependentsDirty(sourceId: string): void {\n for (const node of this._nodes.values()) {\n if (node.config.sourceId === sourceId && !node.dirty) {\n node.dirty = true;\n node.result = null;\n this._markDependentsDirty(node.id);\n }\n }\n }\n}\n","/**\n * Pine Script Lexer — tokenises a Pine v5 source string.\n *\n * Differences vs TScript lexer:\n * - `//@version=N` comment is parsed for the version number\n * - `color.red`, `ta.sma`, `math.abs` — namespace.member chains\n * - `:=` reassignment operator\n * - Indentation-based block structure (INDENT / DEDENT tokens)\n * - `var` / `varip` keywords\n * - `=>` (function body arrow, for single-line user functions — recognised\n * but not fully transpiled; emits an diagnostic)\n */\n\nexport type PineTok =\n | 'NUMBER' | 'STRING' | 'BOOL' | 'COLOR'\n | 'IDENT'\n | 'PLUS' | 'MINUS' | 'STAR' | 'SLASH' | 'PERCENT'\n | 'LT' | 'GT' | 'LTE' | 'GTE' | 'EQEQ' | 'NEQ'\n | 'QMARK' | 'COLON' | 'ARROW' // ?: =>\n | 'ASSIGN' | 'REASSIGN' // = :=\n | 'DOT'\n | 'LPAREN' | 'RPAREN' | 'LBRACKET' | 'RBRACKET'\n | 'COMMA'\n | 'INDENT' | 'DEDENT' | 'NEWLINE'\n | 'EOF';\n\nexport type PineToken = {\n kind: PineTok;\n value: string;\n line: number;\n col: number;\n};\n\nexport class PineLexer {\n private _src: string;\n private _pos: number = 0;\n private _line: number = 1;\n private _col: number = 1;\n\n /** Version extracted from `//@version=N` */\n version = 5;\n\n constructor(src: string) {\n this._src = src.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n tokenize(): PineToken[] {\n // First pass: raw tokens (with raw NEWLINEs and spaces preserved)\n const raw = this._rawTokenize();\n // Second pass: inject INDENT / DEDENT for indented blocks\n return this._injectIndents(raw);\n }\n\n // ─── Raw tokenisation ────────────────────────────────────────────────────────\n\n private _rawTokenize(): PineToken[] {\n const tokens: PineToken[] = [];\n\n while (this._pos < this._src.length) {\n const ch = this._src[this._pos]!;\n\n // Handle newline\n if (ch === '\\n') {\n tokens.push(this._make('NEWLINE', '\\n'));\n this._pos++; this._line++; this._col = 1;\n continue;\n }\n\n // Skip horizontal whitespace (not newlines — needed for indent tracking)\n if (ch === ' ' || ch === '\\t') {\n this._pos++; this._col++;\n continue;\n }\n\n // Line comment\n if (ch === '/' && this._peek(1) === '/') {\n // Check for version annotation\n const commentStart = this._pos;\n while (this._pos < this._src.length && this._src[this._pos] !== '\\n') {\n this._pos++; this._col++;\n }\n const comment = this._src.slice(commentStart, this._pos);\n const vMatch = comment.match(/\\/\\/@version\\s*=\\s*(\\d+)/);\n if (vMatch) this.version = parseInt(vMatch[1]!, 10);\n continue;\n }\n\n // Numbers\n if ((ch >= '0' && ch <= '9') || (ch === '.' && this._isDigit(this._peek(1)))) {\n tokens.push(this._readNumber());\n continue;\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n tokens.push(this._readString(ch));\n continue;\n }\n\n // Identifiers / keywords\n if (this._isAlpha(ch)) {\n const tok = this._readIdent();\n tokens.push(tok);\n continue;\n }\n\n // Two-char operators\n const two = this._src.slice(this._pos, this._pos + 2);\n if (two === '<=') { tokens.push(this._make('LTE', two)); this._adv(2); continue; }\n if (two === '>=') { tokens.push(this._make('GTE', two)); this._adv(2); continue; }\n if (two === '==') { tokens.push(this._make('EQEQ', two)); this._adv(2); continue; }\n if (two === '!=') { tokens.push(this._make('NEQ', two)); this._adv(2); continue; }\n if (two === ':=') { tokens.push(this._make('REASSIGN', two)); this._adv(2); continue; }\n if (two === '=>') { tokens.push(this._make('ARROW', two)); this._adv(2); continue; }\n\n // Single-char operators\n const singleOps: Record<string, PineTok> = {\n '+': 'PLUS', '-': 'MINUS', '*': 'STAR', '/': 'SLASH', '%': 'PERCENT',\n '<': 'LT', '>': 'GT',\n '?': 'QMARK', ':': 'COLON',\n '(': 'LPAREN', ')': 'RPAREN', '[': 'LBRACKET', ']': 'RBRACKET',\n ',': 'COMMA', '.': 'DOT',\n '=': 'ASSIGN',\n };\n if (ch in singleOps) {\n tokens.push(this._make(singleOps[ch]!, ch));\n this._pos++; this._col++;\n continue;\n }\n\n throw new SyntaxError(`[Pine] Unexpected character '${ch}' at ${this._line}:${this._col}`);\n }\n\n tokens.push(this._make('EOF', ''));\n return tokens;\n }\n\n // ─── Indent/Dedent injection ─────────────────────────────────────────────────\n\n private _injectIndents(raw: PineToken[]): PineToken[] {\n const out: PineToken[] = [];\n const indentStack: number[] = [0];\n let i = 0;\n\n while (i < raw.length) {\n const tok = raw[i]!;\n\n if (tok.kind !== 'NEWLINE') {\n out.push(tok);\n i++;\n continue;\n }\n\n // After a NEWLINE, measure the indentation of the next non-empty line\n out.push(tok); // keep the NEWLINE token\n i++;\n\n // Count leading spaces of the next real line\n let spaces = 0;\n let j = i;\n while (j < raw.length && (raw[j]!.kind === 'NEWLINE')) {\n // blank line — skip\n out.push(raw[j]!);\n j++;\n }\n i = j;\n\n if (i >= raw.length || raw[i]!.kind === 'EOF') break;\n\n // Compute indent width from the column of the next token\n const nextTok = raw[i]!;\n spaces = nextTok.col - 1; // col is 1-based\n\n const currentIndent = indentStack[indentStack.length - 1]!;\n\n if (spaces > currentIndent) {\n indentStack.push(spaces);\n out.push({ kind: 'INDENT', value: '', line: nextTok.line, col: 1 });\n } else {\n while (spaces < indentStack[indentStack.length - 1]!) {\n indentStack.pop();\n out.push({ kind: 'DEDENT', value: '', line: nextTok.line, col: 1 });\n }\n }\n }\n\n // Close any remaining open indents\n while (indentStack.length > 1) {\n indentStack.pop();\n out.push({ kind: 'DEDENT', value: '', line: 0, col: 0 });\n }\n\n out.push({ kind: 'EOF', value: '', line: this._line, col: this._col });\n return out;\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────────────────\n\n private _make(kind: PineTok, value: string): PineToken {\n return { kind, value, line: this._line, col: this._col };\n }\n\n private _peek(offset: number): string {\n return this._src[this._pos + offset] ?? '';\n }\n\n private _adv(n = 1): void {\n this._pos += n;\n this._col += n;\n }\n\n private _isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9';\n }\n\n private _isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';\n }\n\n private _isAlphaNum(ch: string): boolean {\n return this._isAlpha(ch) || this._isDigit(ch);\n }\n\n private _readNumber(): PineToken {\n const start = this._pos;\n const startCol = this._col;\n while (this._pos < this._src.length) {\n const c = this._src[this._pos]!;\n if (this._isDigit(c) || c === '.') { this._pos++; this._col++; }\n else break;\n }\n return { kind: 'NUMBER', value: this._src.slice(start, this._pos), line: this._line, col: startCol };\n }\n\n private _readString(quote: string): PineToken {\n const startCol = this._col;\n this._pos++; this._col++;\n let result = '';\n while (this._pos < this._src.length && this._src[this._pos] !== quote) {\n if (this._src[this._pos] === '\\\\') {\n this._pos++; this._col++;\n const esc = this._src[this._pos] ?? '';\n result += esc === 'n' ? '\\n' : esc === 't' ? '\\t' : esc;\n } else {\n result += this._src[this._pos];\n }\n this._pos++; this._col++;\n }\n this._pos++; this._col++;\n return { kind: 'STRING', value: result, line: this._line, col: startCol };\n }\n\n private _readIdent(): PineToken {\n const start = this._pos;\n const startCol = this._col;\n while (this._pos < this._src.length && this._isAlphaNum(this._src[this._pos]!)) {\n this._pos++; this._col++;\n }\n const name = this._src.slice(start, this._pos);\n if (name === 'true' || name === 'false') {\n return { kind: 'BOOL', value: name, line: this._line, col: startCol };\n }\n return { kind: 'IDENT', value: name, line: this._line, col: startCol };\n }\n}\n","/**\n * Pine Script Parser — recursive-descent, produces a PineProgram AST.\n *\n * Handles the supported Pine v5 subset:\n * indicator(), input.*(), ta.*(), math.*(), plot(), plotshape()\n * var / varip declarations\n * := reassignment\n * if / else (indented blocks)\n * ternary a ? b : c\n * namespace.member and namespace.call(...)\n */\n\nimport { PineLexer } from './pine-lexer';\nimport type { PineToken, PineTok } from './pine-lexer';\nimport type {\n PineProgram, PineStmt, PineExpr,\n PineIndicatorDecl, PineVarDecl, PineAssign, PineExprStmt, PineIf,\n PineNumberLit, PineStringLit, PineBoolLit, PineNa,\n PineIdent, PineNsCall, PineCall, PineIndex,\n PineBinary, PineUnary, PineTernary, PineMember,\n Loc,\n} from './pine-ast';\n\n\nexport class PineParser {\n private _tokens: PineToken[];\n private _pos = 0;\n readonly version: number;\n\n constructor(src: string) {\n const lexer = new PineLexer(src);\n this._tokens = lexer.tokenize();\n this.version = lexer.version;\n }\n\n parse(): PineProgram {\n const stmts: PineStmt[] = [];\n this._skipNL();\n while (!this._check('EOF')) {\n const s = this._stmt();\n if (s !== null) stmts.push(s);\n this._skipNL();\n }\n return { kind: 'PineProgram', version: this.version, stmts };\n }\n\n // ─── Statements ─────────────────────────────────────────────────────────────\n\n private _stmt(): PineStmt | null {\n const t = this._cur();\n const loc: Loc = { line: t.line, col: t.col };\n\n // var / varip declaration\n if (t.kind === 'IDENT' && (t.value === 'var' || t.value === 'varip')) {\n return this._varDecl();\n }\n\n // if statement\n if (t.kind === 'IDENT' && t.value === 'if') {\n return this._ifStmt();\n }\n\n // Assignment: IDENT = expr or IDENT := expr\n // Also handles \"IDENT type_hint = expr\" e.g. \"float x = 1.0\" — skip type hints\n if (t.kind === 'IDENT') {\n // Peek ahead skipping possible type-hint token\n const p1 = this._peekKind(1);\n const p2 = this._peekKind(2);\n const isAssign = p1 === 'ASSIGN' || p1 === 'REASSIGN';\n const isTyped = p1 === 'IDENT' && (p2 === 'ASSIGN' || p2 === 'REASSIGN');\n if (isAssign || isTyped) {\n return this._assignStmt();\n }\n }\n\n // indicator() special top-level\n if (t.kind === 'IDENT' && t.value === 'indicator') {\n return this._indicatorDecl();\n }\n\n // Expression statement (plot, function calls, etc.)\n const expr = this._expr();\n this._consumeNLorEOF();\n return { kind: 'PineExprStmt', expr, loc };\n }\n\n private _varDecl(): PineVarDecl {\n const tok = this._advance();\n const modifier = tok.value as 'var' | 'varip';\n const loc: Loc = { line: tok.line, col: tok.col };\n\n // optional type hint (float, int, bool, string, color, ...)\n let typeHint: string | undefined;\n if (this._check('IDENT') && this._peekKind(1) === 'ASSIGN') {\n // possible: \"var float x = ...\"\n const maybeType = this._cur().value;\n if (['float','int','bool','string','color','series','simple','const'].includes(maybeType)) {\n typeHint = maybeType;\n this._advance();\n }\n }\n\n const name = this._consume('IDENT', \"Expected variable name after 'var'\").value;\n this._consume('ASSIGN', \"Expected '=' in var declaration\");\n const value = this._expr();\n this._consumeNLorEOF();\n return typeHint !== undefined\n ? { kind: 'PineVarDecl', modifier, name, typeHint, value, loc }\n : { kind: 'PineVarDecl', modifier, name, value, loc } as PineVarDecl;\n }\n\n private _assignStmt(): PineAssign {\n const nameTok = this._advance();\n const loc: Loc = { line: nameTok.line, col: nameTok.col };\n const name = nameTok.value;\n\n // Skip type hint if present: \"float x = ...\"\n let op: '=' | ':=' = '=';\n if (this._check('IDENT')) {\n // type hint token — consume silently\n this._advance();\n }\n if (this._check('REASSIGN')) {\n op = ':=';\n this._advance();\n } else {\n this._consume('ASSIGN', \"Expected '=' or ':='\");\n }\n\n const value = this._expr();\n this._consumeNLorEOF();\n return { kind: 'PineAssign', name, op, value, loc };\n }\n\n private _indicatorDecl(): PineIndicatorDecl {\n const tok = this._advance(); // consume 'indicator'\n const loc: Loc = { line: tok.line, col: tok.col };\n this._consume('LPAREN', \"Expected '(' after 'indicator'\");\n const { args, namedArgs } = this._argList();\n this._consume('RPAREN', \"Expected ')' after indicator args\");\n this._consumeNLorEOF();\n return { kind: 'PineIndicatorDecl', args, namedArgs, loc };\n }\n\n private _ifStmt(): PineIf {\n const tok = this._advance(); // consume 'if'\n const loc: Loc = { line: tok.line, col: tok.col };\n\n const condition = this._expr();\n this._consumeNLorEOF();\n\n const then: PineStmt[] = this._indentedBlock();\n const else_: PineStmt[] = [];\n\n // optional 'else'\n if (this._check('IDENT') && this._cur().value === 'else') {\n this._advance();\n this._consumeNLorEOF();\n else_.push(...this._indentedBlock());\n }\n\n return { kind: 'PineIf', condition, then, else_, loc };\n }\n\n private _indentedBlock(): PineStmt[] {\n const stmts: PineStmt[] = [];\n if (!this._check('INDENT')) return stmts;\n this._advance(); // consume INDENT\n this._skipNL();\n while (!this._check('DEDENT') && !this._check('EOF')) {\n const s = this._stmt();\n if (s !== null) stmts.push(s);\n this._skipNL();\n }\n if (this._check('DEDENT')) this._advance(); // consume DEDENT\n return stmts;\n }\n\n // ─── Expressions ────────────────────────────────────────────────────────────\n\n private _expr(): PineExpr { return this._ternary(); }\n\n private _ternary(): PineExpr {\n let left = this._or();\n if (this._match('QMARK')) {\n const consequent = this._expr();\n this._consume('COLON', \"Expected ':' in ternary\");\n const alternate = this._expr();\n const node: PineTernary = {\n kind: 'PineTernary', condition: left, consequent, alternate,\n loc: this._locOf(left),\n };\n return node;\n }\n return left;\n }\n\n private _or(): PineExpr {\n let left = this._and();\n while (this._checkIdent('or')) {\n this._advance();\n const right = this._and();\n left = this._bin('or', left, right);\n }\n return left;\n }\n\n private _and(): PineExpr {\n let left = this._not();\n while (this._checkIdent('and')) {\n this._advance();\n const right = this._not();\n left = this._bin('and', left, right);\n }\n return left;\n }\n\n private _not(): PineExpr {\n if (this._checkIdent('not')) {\n const loc = this._locOfCur();\n this._advance();\n const operand = this._comparison();\n const node: PineUnary = { kind: 'PineUnary', op: 'not', operand, loc };\n return node;\n }\n return this._comparison();\n }\n\n private _comparison(): PineExpr {\n let left = this._addition();\n while (true) {\n if (this._match('LTE')) { left = this._bin('<=', left, this._addition()); continue; }\n if (this._match('GTE')) { left = this._bin('>=', left, this._addition()); continue; }\n if (this._match('EQEQ')) { left = this._bin('==', left, this._addition()); continue; }\n if (this._match('NEQ')) { left = this._bin('!=', left, this._addition()); continue; }\n if (this._match('LT')) { left = this._bin('<', left, this._addition()); continue; }\n if (this._match('GT')) { left = this._bin('>', left, this._addition()); continue; }\n break;\n }\n return left;\n }\n\n private _addition(): PineExpr {\n let left = this._multiply();\n while (true) {\n if (this._match('PLUS')) { left = this._bin('+', left, this._multiply()); continue; }\n if (this._match('MINUS')) { left = this._bin('-', left, this._multiply()); continue; }\n break;\n }\n return left;\n }\n\n private _multiply(): PineExpr {\n let left = this._unary();\n while (true) {\n if (this._match('STAR')) { left = this._bin('*', left, this._unary()); continue; }\n if (this._match('SLASH')) { left = this._bin('/', left, this._unary()); continue; }\n if (this._match('PERCENT')) { left = this._bin('%', left, this._unary()); continue; }\n break;\n }\n return left;\n }\n\n private _unary(): PineExpr {\n if (this._match('MINUS')) {\n const operand = this._unary();\n const node: PineUnary = { kind: 'PineUnary', op: '-', operand, loc: this._locOfCur() };\n return node;\n }\n return this._postfix();\n }\n\n private _postfix(): PineExpr {\n let expr = this._primary();\n // Series indexing: expr[n]\n while (this._check('LBRACKET')) {\n const loc = this._locOfCur();\n this._advance();\n const index = this._expr();\n this._consume('RBRACKET', \"Expected ']'\");\n const node: PineIndex = { kind: 'PineIndex', series: expr, index, loc };\n expr = node;\n }\n return expr;\n }\n\n private _primary(): PineExpr {\n const t = this._cur();\n const loc: Loc = { line: t.line, col: t.col };\n\n if (t.kind === 'NUMBER') {\n this._advance();\n const node: PineNumberLit = { kind: 'PineNumberLit', value: parseFloat(t.value), loc };\n return node;\n }\n\n if (t.kind === 'STRING') {\n this._advance();\n const node: PineStringLit = { kind: 'PineStringLit', value: t.value, loc };\n return node;\n }\n\n if (t.kind === 'BOOL') {\n this._advance();\n const node: PineBoolLit = { kind: 'PineBoolLit', value: t.value === 'true', loc };\n return node;\n }\n\n // na constant\n if (t.kind === 'IDENT' && t.value === 'na') {\n this._advance();\n const node: PineNa = { kind: 'PineNa', loc };\n return node;\n }\n\n // IDENT '.' IDENT → namespace member or namespaced call\n if (t.kind === 'IDENT' && this._peekKind(1) === 'DOT') {\n const ns = t.value;\n this._advance(); // consume ns\n this._advance(); // consume .\n const member = this._consume('IDENT', \"Expected member name after '.'\").value;\n\n // Namespaced call: ns.fn(...)\n if (this._check('LPAREN')) {\n this._advance();\n const { args, namedArgs } = this._argList();\n this._consume('RPAREN', \"Expected ')'\");\n const node: PineNsCall = { kind: 'PineNsCall', namespace: ns, fn: member, args, namedArgs, loc };\n return node;\n }\n\n // Namespaced member: color.red, bar_index, etc.\n const node: PineMember = { kind: 'PineMember', object: ns, prop: member, loc };\n return node;\n }\n\n // Plain function call: IDENT '(' ... ')'\n if (t.kind === 'IDENT' && this._peekKind(1) === 'LPAREN') {\n const fn = t.value;\n this._advance();\n this._advance(); // consume (\n const { args, namedArgs } = this._argList();\n this._consume('RPAREN', \"Expected ')'\");\n const node: PineCall = { kind: 'PineCall', fn, args, namedArgs, loc };\n return node;\n }\n\n // Plain identifier\n if (t.kind === 'IDENT') {\n this._advance();\n const node: PineIdent = { kind: 'PineIdent', name: t.value, loc };\n return node;\n }\n\n // Grouped expression\n if (t.kind === 'LPAREN') {\n this._advance();\n const inner = this._expr();\n this._consume('RPAREN', \"Expected ')'\");\n return inner;\n }\n\n throw new SyntaxError(`[Pine] Unexpected token '${t.value}' (${t.kind}) at ${t.line}:${t.col}`);\n }\n\n // ─── Arg list helper ────────────────────────────────────────────────────────\n\n private _argList(): { args: PineExpr[]; namedArgs: Map<string, PineExpr> } {\n const args: PineExpr[] = [];\n const namedArgs = new Map<string, PineExpr>();\n\n if (this._check('RPAREN')) return { args, namedArgs };\n\n // First arg\n this._parseOneArg(args, namedArgs);\n\n while (this._match('COMMA')) {\n if (this._check('RPAREN')) break; // trailing comma\n this._parseOneArg(args, namedArgs);\n }\n\n return { args, namedArgs };\n }\n\n private _parseOneArg(\n args: PineExpr[],\n namedArgs: Map<string, PineExpr>,\n ): void {\n // Named arg: name = value ? (peek: IDENT = non-'=')\n if (\n this._check('IDENT') &&\n this._peekKind(1) === 'ASSIGN' &&\n this._peekKind(2) !== 'ASSIGN' // not ==\n ) {\n const key = this._advance().value;\n this._advance(); // consume =\n const val = this._expr();\n namedArgs.set(key, val);\n } else {\n args.push(this._expr());\n }\n }\n\n // ─── Token helpers ───────────────────────────────────────────────────────────\n\n private _cur(): PineToken { return this._tokens[this._pos]!; }\n private _advance(): PineToken { return this._tokens[this._pos++]!; }\n private _check(kind: PineTok): boolean { return this._cur().kind === kind; }\n private _checkIdent(name: string): boolean {\n const t = this._cur();\n return t.kind === 'IDENT' && t.value === name;\n }\n private _peekKind(offset: number): PineTok {\n return this._tokens[this._pos + offset]?.kind ?? 'EOF';\n }\n private _match(kind: PineTok): boolean {\n if (this._check(kind)) { this._advance(); return true; }\n return false;\n }\n private _consume(kind: PineTok, msg: string): PineToken {\n if (this._check(kind)) return this._advance();\n const t = this._cur();\n throw new SyntaxError(`[Pine] ${msg} — got '${t.value}' (${t.kind}) at ${t.line}:${t.col}`);\n }\n private _skipNL(): void {\n while (this._check('NEWLINE')) this._advance();\n }\n private _consumeNLorEOF(): void {\n if (this._check('NEWLINE') || this._check('EOF')) {\n if (this._check('NEWLINE')) this._advance();\n }\n }\n private _locOfCur(): Loc { return { line: this._cur().line, col: this._cur().col }; }\n private _locOf(expr: PineExpr): Loc { return (expr as { loc: Loc }).loc; }\n\n private _bin(op: PineBinary['op'], left: PineExpr, right: PineExpr): PineBinary {\n return { kind: 'PineBinary', op, left, right, loc: this._locOf(left) };\n }\n}\n","/**\n * Pine Script → TScript transpiler.\n *\n * Walks a `PineProgram` AST and emits a TScript source string that is\n * directly executable by the existing `TScriptRuntime`.\n */\n\nimport type {\n PineProgram, PineStmt, PineExpr,\n PineIndicatorDecl, PineVarDecl, PineAssign, PineExprStmt, PineIf,\n PineNumberLit, PineStringLit, PineBoolLit, PineNa,\n PineIdent, PineNsCall, PineCall, PineIndex,\n PineBinary, PineUnary, PineTernary, PineMember,\n} from './pine-ast';\nimport { DiagnosticBag } from './diagnostics';\n\n// ─── Namespace → TScript function mappings ───────────────────────────────────\n\nconst TA_MAP: Record<string, string> = {\n sma: 'sma',\n ema: 'ema',\n rsi: 'rsi',\n wma: 'wma',\n rma: 'rma',\n stdev: 'stdev',\n highest: 'highest',\n lowest: 'lowest',\n change: 'change',\n mom: 'mom',\n atr: 'atr',\n crossover: 'crossover',\n crossunder: 'crossunder',\n barssince: 'barssince',\n};\n\nconst MATH_MAP: Record<string, string> = {\n abs: 'abs',\n max: 'max',\n min: 'min',\n round: 'round',\n floor: 'floor',\n ceil: 'ceil',\n sqrt: 'sqrt',\n log: 'log',\n pow: 'pow',\n sign: 'sign',\n exp: 'exp',\n};\n\nconst COLOR_MAP: Record<string, string> = {\n red: '\"#f23645\"',\n green: '\"#26a69a\"',\n blue: '\"#2196f3\"',\n white: '\"#ffffff\"',\n black: '\"#000000\"',\n yellow: '\"#ffeb3b\"',\n orange: '\"#ff9800\"',\n purple: '\"#9c27b0\"',\n aqua: '\"#00bcd4\"',\n gray: '\"#787b86\"',\n silver: '\"#b2b5be\"',\n lime: '\"#4caf50\"',\n maroon: '\"#880000\"',\n navy: '\"#000080\"',\n olive: '\"#808000\"',\n teal: '\"#008080\"',\n fuchsia:'\"#ff00ff\"',\n};\n\n/** Functions that produce no useful TScript equivalent — emit a warning. */\nconst UNSUPPORTED_FN = new Set([\n 'plotshape', 'plotarrow', 'plotbar', 'plotcandle',\n 'barcolor', 'bgcolor', 'alertcondition', 'alert',\n 'strategy', 'label', 'line', 'box', 'table',\n 'request',\n]);\n\nexport class PineTranspiler {\n private _diag: DiagnosticBag;\n private _indent = 0;\n private _out: string[] = [];\n\n constructor(diag: DiagnosticBag) {\n this._diag = diag;\n }\n\n transpile(prog: PineProgram): string {\n this._out = [];\n this._indent = 0;\n for (const stmt of prog.stmts) {\n this._stmt(stmt);\n }\n return this._out.join('');\n }\n\n // ─── Statements ─────────────────────────────────────────────────────────────\n\n private _stmt(s: PineStmt): void {\n switch (s.kind) {\n case 'PineIndicatorDecl': return this._indicatorDecl(s);\n case 'PineVarDecl': return this._varDecl(s);\n case 'PineAssign': return this._assign(s);\n case 'PineExprStmt': return this._exprStmt(s);\n case 'PineIf': return this._ifStmt(s);\n }\n }\n\n private _indicatorDecl(s: PineIndicatorDecl): void {\n // indicator(\"Title\", overlay=true) → indicator(\"Title\")\n const title = s.args[0];\n const titleStr = title ? this._expr(title) : '\"Script\"';\n this._line(`indicator(${titleStr})`);\n }\n\n private _varDecl(s: PineVarDecl): void {\n // var x = expr → x = expr (TScript vars persist by default)\n this._line(`${s.name} = ${this._expr(s.value)}`);\n }\n\n private _assign(s: PineAssign): void {\n // := and = both map to = in TScript\n this._line(`${s.name} = ${this._expr(s.value)}`);\n }\n\n private _exprStmt(s: PineExprStmt): void {\n const expr = s.expr;\n // Check for unsupported top-level calls before emitting\n if (\n (expr.kind === 'PineCall' || expr.kind === 'PineNsCall') &&\n UNSUPPORTED_FN.has(expr.kind === 'PineCall' ? expr.fn : expr.fn)\n ) {\n const name = expr.kind === 'PineCall' ? expr.fn : `${expr.namespace}.${expr.fn}`;\n this._diag.add('warning', `'${name}()' is not supported and will be ignored`, s.loc, 'PINE_UNSUPPORTED_FN');\n this._line(`// ${name}() not supported`);\n return;\n }\n this._line(this._expr(expr));\n }\n\n private _ifStmt(s: PineIf): void {\n this._line(`if ${this._expr(s.condition)}`);\n this._indent++;\n for (const st of s.then) this._stmt(st);\n if (s.then.length === 0) this._line('0'); // empty block guard\n this._indent--;\n if (s.else_.length > 0) {\n this._line('else');\n this._indent++;\n for (const st of s.else_) this._stmt(st);\n this._indent--;\n }\n }\n\n // ─── Expressions ────────────────────────────────────────────────────────────\n\n private _expr(e: PineExpr): string {\n switch (e.kind) {\n case 'PineNumberLit': return this._numLit(e);\n case 'PineStringLit': return `\"${e.value.replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"')}\"`;\n case 'PineBoolLit': return e.value ? 'true' : 'false';\n case 'PineNa': return 'na';\n case 'PineIdent': return e.name;\n case 'PineNsCall': return this._nsCall(e);\n case 'PineCall': return this._call(e);\n case 'PineIndex': return `${this._expr(e.series)}[${this._expr(e.index)}]`;\n case 'PineBinary': return this._binary(e);\n case 'PineUnary': return this._unary(e);\n case 'PineTernary': return `${this._expr(e.condition)} ? ${this._expr(e.consequent)} : ${this._expr(e.alternate)}`;\n case 'PineMember': return this._member(e);\n // PineColorLit is resolved via PineMember for color.red etc\n default: return '0';\n }\n }\n\n private _numLit(e: PineNumberLit): string {\n // Preserve integer formatting when possible\n return Number.isInteger(e.value) ? String(e.value) : String(e.value);\n }\n\n private _nsCall(e: PineNsCall): string {\n const { namespace: ns, fn } = e;\n\n if (ns === 'ta') {\n const mapped = TA_MAP[fn];\n if (mapped) {\n const args = this._positionalArgs(e.args);\n return `${mapped}(${args})`;\n }\n this._diag.add('warning', `'ta.${fn}()' is not supported`, e.loc, 'PINE_UNSUPPORTED_FN');\n return `/* ta.${fn} not supported */ 0`;\n }\n\n if (ns === 'math') {\n const mapped = MATH_MAP[fn];\n if (mapped) {\n const args = this._positionalArgs(e.args);\n return `${mapped}(${args})`;\n }\n this._diag.add('warning', `'math.${fn}()' is not supported`, e.loc, 'PINE_UNSUPPORTED_FN');\n return `/* math.${fn} not supported */ 0`;\n }\n\n if (ns === 'input') {\n return this._inputNsCall(e);\n }\n\n if (ns === 'strategy' || ns === 'label' || ns === 'line' || ns === 'box' || ns === 'table' || ns === 'request') {\n this._diag.add('warning', `'${ns}.${fn}()' is not supported`, e.loc, 'PINE_UNSUPPORTED_FN');\n return `/* ${ns}.${fn} not supported */ 0`;\n }\n\n // Generic fallthrough\n this._diag.add('warning', `'${ns}.${fn}()' is not supported`, e.loc, 'PINE_UNSUPPORTED_FN');\n return `/* ${ns}.${fn} not supported */ 0`;\n }\n\n private _inputNsCall(e: PineNsCall): string {\n // input.int(v, ...) / input.float(v, ...) / input.bool(v, ...) → input(v)\n // input.source(close) → the source arg value\n if (e.fn === 'source') {\n return e.args[0] ? this._expr(e.args[0]) : 'close';\n }\n const defVal = e.args[0] ?? e.namedArgs.get('defval');\n return defVal ? `input(${this._expr(defVal)})` : 'input(0)';\n }\n\n private _call(e: PineCall): string {\n if (UNSUPPORTED_FN.has(e.fn)) {\n this._diag.add('warning', `'${e.fn}()' is not supported and will be ignored`, e.loc, 'PINE_UNSUPPORTED_FN');\n return `/* ${e.fn} not supported */ 0`;\n }\n\n if (e.fn === 'input') {\n const defVal = e.args[0] ?? e.namedArgs.get('defval');\n return defVal ? `input(${this._expr(defVal)})` : 'input(0)';\n }\n\n if (e.fn === 'plot') {\n return this._plotCall(e);\n }\n\n if (e.fn === 'indicator') {\n const title = e.args[0];\n const titleStr = title ? this._expr(title) : '\"Script\"';\n return `indicator(${titleStr})`;\n }\n\n // Generic call — drop unsupported named args, keep positional\n const args = this._positionalArgs(e.args);\n return `${e.fn}(${args})`;\n }\n\n private _plotCall(e: PineCall): string {\n // plot(series, title=\"...\", color=..., linewidth=...) → plot(series)\n // We only pass the first positional arg; named args are cosmetic only\n const series = e.args[0];\n if (!series) return '/* plot() missing series */';\n return `plot(${this._expr(series)})`;\n }\n\n private _member(e: PineMember): string {\n if (e.object === 'color') {\n const hex = COLOR_MAP[e.prop];\n if (hex) return hex;\n this._diag.add('info', `'color.${e.prop}' is not a known color`, e.loc, 'PINE_UNKNOWN_COLOR');\n return '\"#888888\"';\n }\n if (e.object === 'line' || e.object === 'label' || e.object === 'box') {\n // style constants — just return as string\n return `\"${e.prop}\"`;\n }\n // bar_index, time, etc. are plain idents\n if (e.object === 'timeframe' || e.object === 'syminfo' || e.object === 'session') {\n this._diag.add('info', `'${e.object}.${e.prop}' is not supported`, e.loc, 'PINE_UNSUPPORTED_FN');\n return '0';\n }\n return `${e.object}_${e.prop}`; // fallback\n }\n\n private _binary(e: PineBinary): string {\n const l = this._expr(e.left);\n const r = this._expr(e.right);\n return `(${l} ${e.op} ${r})`;\n }\n\n private _unary(e: PineUnary): string {\n if (e.op === 'not') return `not ${this._expr(e.operand)}`;\n return `${e.op}${this._expr(e.operand)}`;\n }\n\n private _positionalArgs(args: PineExpr[]): string {\n return args.map(a => this._expr(a)).join(', ');\n }\n\n // ─── Output helpers ─────────────────────────────────────────────────────────\n\n private _line(code: string): void {\n const pad = ' '.repeat(this._indent);\n this._out.push(`${pad}${code}\\n`);\n }\n}\n","/** Diagnostic emitted by the Pine compiler pipeline. */\nexport type DiagnosticSeverity = 'error' | 'warning' | 'info';\n\nexport interface Diagnostic {\n readonly severity: DiagnosticSeverity;\n readonly message: string;\n readonly line: number;\n readonly col: number;\n /** Machine-readable code, e.g. 'PINE_UNSUPPORTED_FN' */\n readonly code: string;\n}\n\nexport class DiagnosticBag {\n private readonly _diags: Diagnostic[] = [];\n\n add(\n severity: DiagnosticSeverity,\n message: string,\n loc: { line: number; col: number },\n code: string,\n ): void {\n this._diags.push({ severity, message, line: loc.line, col: loc.col, code });\n }\n\n get diagnostics(): readonly Diagnostic[] { return this._diags; }\n\n hasErrors(): boolean {\n return this._diags.some(d => d.severity === 'error');\n }\n}\n","/**\n * PineCompiler — public entry point for the Pine Script compatibility layer.\n *\n * Pipeline:\n * Pine source → PineLexer → PineToken[] → PineParser → PineProgram\n * → PineTranspiler → TScript source → TScriptIndicator runtime\n */\n\nimport { PineParser } from './pine-parser';\nimport { PineTranspiler } from './pine-transpiler';\nimport { DiagnosticBag } from './diagnostics';\nimport type { Diagnostic } from './diagnostics';\nimport { TScriptIndicator } from '../tscript/TScriptIndicator';\nimport type { OHLCV } from '@forgecharts/types';\nimport type { IndicatorPoint } from '../core/IndicatorEngine';\n\nexport type { Diagnostic };\nexport type { DiagnosticSeverity } from './diagnostics';\n\nexport interface PineCompileResult {\n /** The transpiled TScript source string. */\n readonly tscript: string;\n readonly diagnostics: readonly Diagnostic[];\n /** `true` when there are no error-severity diagnostics. */\n readonly ok: boolean;\n}\n\nexport class PineCompiler {\n /**\n * Compile Pine Script source to TScript.\n * Parse errors throw a `SyntaxError`; semantic problems populate diagnostics.\n */\n compile(pineSource: string): PineCompileResult {\n const diag = new DiagnosticBag();\n\n const parser = new PineParser(pineSource);\n const program = parser.parse();\n\n const transpiler = new PineTranspiler(diag);\n const tscript = transpiler.transpile(program);\n\n return {\n tscript,\n diagnostics: diag.diagnostics,\n ok: !diag.hasErrors(),\n };\n }\n\n /**\n * Convenience: compile + run against a bar series.\n * Returns the plot outputs and any diagnostics.\n */\n static run(\n pineSource: string,\n bars: readonly OHLCV[],\n ): { plots: IndicatorPoint[][]; diagnostics: readonly Diagnostic[] } {\n const compiler = new PineCompiler();\n const result = compiler.compile(pineSource);\n\n if (!result.ok) {\n return { plots: [], diagnostics: result.diagnostics };\n }\n\n const indicator = new TScriptIndicator(result.tscript);\n const plots = indicator.run(bars);\n return { plots, diagnostics: result.diagnostics };\n }\n}\n","/**\n * Cursor (Arrow) pointer tool.\n *\n * The default interaction mode — shows the native OS arrow cursor.\n * No custom overlay is rendered; the SDK crosshair is disabled.\n */\n\nexport const CURSOR_LABEL = 'Arrow';\nexport const CURSOR_STYLE = 'default' as const;\n\n/** Descriptor used by the toolbar and tool-selection logic. */\nexport const cursorTool = {\n type: 'cursor' as const,\n label: CURSOR_LABEL,\n cursorStyle: CURSOR_STYLE,\n} as const;\n","/**\n * Crosshair pointer tool.\n *\n * Hides the native cursor (`cursor: none`) and activates the SDK-drawn\n * dashed crosshair lines (vertical + horizontal) via `Chart.setCrosshairEnabled(true)`.\n * No PointerOverlay is rendered for this mode.\n */\n\nexport const CROSSHAIR_LABEL = 'Cross';\nexport const CROSSHAIR_STYLE = 'none' as const;\n\n/** Descriptor used by the toolbar and tool-selection logic. */\nexport const crosshairTool = {\n type: 'crosshair' as const,\n label: CROSSHAIR_LABEL,\n cursorStyle: CROSSHAIR_STYLE,\n} as const;\n","/**\n * Dot pointer tool.\n *\n * Hides the native cursor and renders a PointerOverlay with:\n * - dashed crosshair lines (vertical + horizontal)\n * - a small filled circle at the cursor intersection\n *\n * The SDK crosshair (`Chart.setCrosshairEnabled`) is NOT active in this mode;\n * all visuals come from the SVG overlay.\n */\n\nexport const DOT_LABEL = 'Dot';\nexport const DOT_STYLE = 'none' as const;\n\n/** Radius (px) of the filled dot drawn at the crosshair intersection. */\nexport const DOT_RADIUS = 3;\n\n/** Colour used for both the crosshair lines and the dot fill. */\nexport const DOT_COLOR = 'var(--crosshair-overlay, rgba(255,255,255,0.75))';\n\n/** Descriptor used by the toolbar and tool-selection logic. */\nexport const dotTool = {\n type: 'dot' as const,\n label: DOT_LABEL,\n cursorStyle: DOT_STYLE,\n} as const;\n","/**\n * Demonstration pointer tool.\n *\n * Hides the native cursor and renders a PointerOverlay with:\n * - dashed crosshair lines (vertical + horizontal)\n * - a large semi-transparent circle centred on the cursor\n *\n * Useful for screen-sharing / presentations where the cursor position\n * needs to be clearly visible to an audience.\n *\n * The SDK crosshair (`Chart.setCrosshairEnabled`) is NOT active in this mode;\n * all visuals come from the SVG overlay.\n */\n\nexport const DEMONSTRATION_LABEL = 'Demonstration';\nexport const DEMONSTRATION_STYLE = 'none' as const;\n\n/** Radius (px) of the large highlight circle drawn around the cursor. */\nexport const DEMONSTRATION_RADIUS = 44;\n\n/** Fill colour of the demonstration circle. */\nexport const DEMONSTRATION_FILL = 'rgba(255, 200, 50, 0.18)';\n\n/** Stroke colour of the demonstration circle. */\nexport const DEMONSTRATION_STROKE = 'rgba(255, 200, 50, 0.7)';\n\n/** Colour used for the dashed crosshair lines. */\nexport const DEMONSTRATION_COLOR = 'var(--crosshair-overlay, rgba(255,255,255,0.75))';\n\n/** Descriptor used by the toolbar and tool-selection logic. */\nexport const demonstrationTool = {\n type: 'demonstration' as const,\n label: DEMONSTRATION_LABEL,\n cursorStyle: DEMONSTRATION_STYLE,\n} as const;\n","/**\n * LayerName — ordered Z-index identifiers for the seven render layers.\n *\n * Layers are sorted ascending: lowest = farthest back, highest = topmost.\n * The numeric values are used directly as PixiJS Container `zIndex` values.\n */\nexport const enum LayerName {\n Background = 0,\n PriceSeries = 1,\n Indicator = 2,\n Drawing = 3,\n TradingOverlay = 4,\n Interaction = 5,\n UIOverlay = 6,\n}\n\nexport const LAYER_NAMES = [\n LayerName.Background,\n LayerName.PriceSeries,\n LayerName.Indicator,\n LayerName.Drawing,\n LayerName.TradingOverlay,\n LayerName.Interaction,\n LayerName.UIOverlay,\n] as const;\n\nexport const LAYER_LABEL: Record<LayerName, string> = {\n [LayerName.Background]: 'background',\n [LayerName.PriceSeries]: 'priceSeries',\n [LayerName.Indicator]: 'indicator',\n [LayerName.Drawing]: 'drawing',\n [LayerName.TradingOverlay]: 'tradingOverlay',\n [LayerName.Interaction]: 'interaction',\n [LayerName.UIOverlay]: 'uiOverlay',\n};\n","import { Container } from 'pixi.js';\nimport { LayerName, LAYER_NAMES, LAYER_LABEL } from './LayerName';\n\n/**\n * DirtyFlags — bitmask that tracks which layers need to be redrawn.\n *\n * Call `mark(layer)` whenever data or viewport changes affecting a layer.\n * Call `isDirty(layer)` before redrawing to skip unnecessary work.\n * Call `clear(layer)` after the layer finishes drawing.\n */\nexport class DirtyFlags {\n private _bits = 0;\n\n mark(layer: LayerName): void {\n this._bits |= 1 << layer;\n }\n\n markAll(): void {\n this._bits = (1 << LAYER_NAMES.length) - 1;\n }\n\n isDirty(layer: LayerName): boolean {\n return (this._bits & (1 << layer)) !== 0;\n }\n\n clear(layer: LayerName): void {\n this._bits &= ~(1 << layer);\n }\n\n clearAll(): void {\n this._bits = 0;\n }\n}\n\n/**\n * PixiLayerManager — owns one PixiJS `Container` per layer, stacked by z-index.\n *\n * Responsibilities:\n * - Creates and names seven containers corresponding to `LayerName` values\n * - Attaches all containers to a root `Container` already mounted in the stage\n * - Exposes `get(layer)` so renderers can add display objects to the right layer\n * - Owns a `DirtyFlags` instance for selective redraw signalling\n * - `clear(layer)` removes all children from a layer without destroying the container\n *\n * @example\n * ```ts\n * const layers = new PixiLayerManager(stage);\n *\n * // Direct child access\n * const seriesContainer = layers.get(LayerName.PriceSeries);\n *\n * // Invalidation\n * layers.dirty.mark(LayerName.PriceSeries);\n * if (layers.dirty.isDirty(LayerName.PriceSeries)) {\n * // redraw…\n * layers.dirty.clear(LayerName.PriceSeries);\n * }\n * ```\n */\nexport class PixiLayerManager {\n private readonly _containers = new Map<LayerName, Container>();\n readonly dirty = new DirtyFlags();\n\n constructor(stage: Container) {\n for (const name of LAYER_NAMES) {\n const c = new Container();\n c.label = LAYER_LABEL[name];\n c.zIndex = name;\n stage.addChild(c);\n this._containers.set(name, c);\n }\n\n // PixiJS v8: sortableChildren must be true on the stage so zIndex is respected\n stage.sortableChildren = true;\n }\n\n /** Returns the `Container` for the given layer. */\n get(layer: LayerName): Container {\n const c = this._containers.get(layer);\n if (!c) throw new Error(`[ForgeCharts] Unknown layer: ${layer}`);\n return c;\n }\n\n /** Removes all display objects from a layer (preserves the container itself). */\n clear(layer: LayerName): void {\n this.get(layer).removeChildren();\n }\n\n /** Removes all display objects from every layer. */\n clearAll(): void {\n for (const name of LAYER_NAMES) this.clear(name);\n }\n\n /** Destroys all container children (use on chart destroy). */\n destroy(): void {\n for (const name of LAYER_NAMES) {\n const c = this._containers.get(name);\n c?.destroy({ children: true });\n }\n this._containers.clear();\n }\n}\n","import { Graphics, Container, Text, TextStyle } from 'pixi.js';\nimport type { ChartColors } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\nimport { computeTicks } from '../core/TimeScale';\nimport { formatTimestampLabel } from '@forgecharts/utils';\nimport type { TimeScale } from '../core/TimeScale';\n\nconst TICK_LEN = 4;\n\n/**\n * PixiGridRenderer — draws background fill, horizontal grid lines (price),\n * vertical grid lines (time), and the axis separator borders.\n *\n * All drawing uses PixiJS `Graphics` which is GPU-batched.\n */\nexport class PixiGridRenderer {\n private readonly _gfx: Graphics;\n private readonly _timeLabels: Container;\n private readonly _priceLabels: Container;\n private readonly _timeScale: TimeScale;\n\n constructor(\n layer: Container,\n private readonly _colors: ChartColors,\n timeScale: TimeScale,\n ) {\n this._timeScale = timeScale;\n this._gfx = new Graphics();\n this._timeLabels = new Container();\n this._priceLabels = new Container();\n layer.addChild(this._gfx, this._timeLabels, this._priceLabels);\n }\n\n draw(transform: CoordTransform, width: number, height: number): void {\n const gfx = this._gfx;\n gfx.clear();\n\n const { plotWidth: pw, plotHeight: ph, priceScaleWidth, timeScaleHeight } = transform;\n const { min: priceMin, max: priceMax } = transform.priceRange;\n const { from: timeFrom, to: timeTo } = transform.timeRange;\n\n // ── Background ────────────────────────────────────────────────────────────\n gfx.rect(0, 0, width, height).fill(this._colors.background);\n\n // ── Horizontal price grid ─────────────────────────────────────────────────\n const priceTicks = computeTicks(priceMin, priceMax, Math.max(2, Math.floor(ph / 50)));\n this._priceLabels.removeChildren();\n\n const labelStyle = new TextStyle({\n fontSize: 11,\n fontFamily: 'system-ui, sans-serif',\n fill: this._colors.text,\n });\n\n for (const tick of priceTicks) {\n if (tick < priceMin || tick > priceMax) continue;\n const y = transform.priceToY(tick);\n if (y < 0 || y > ph) continue;\n\n gfx.moveTo(0, y).lineTo(pw, y).stroke({ color: this._colors.grid, width: 1, alpha: 0.5 });\n\n // Tick mark on axis border\n gfx.moveTo(pw, y).lineTo(pw + TICK_LEN, y).stroke({ color: this._colors.border, width: 1 });\n\n // Price label\n const t = new Text({ text: this._formatPrice(tick), style: labelStyle });\n t.x = pw + TICK_LEN + 2;\n t.y = y - t.height / 2;\n this._priceLabels.addChild(t);\n }\n\n // ── Vertical time grid ────────────────────────────────────────────────────\n const approxTicks = Math.max(2, Math.floor(pw / 100));\n const span = timeTo - timeFrom;\n const rawStep = span / approxTicks;\n const step = this._niceTimeStep(rawStep);\n const startTime = Math.ceil(timeFrom / step) * step;\n\n this._timeLabels.removeChildren();\n const timeLabelStyle = new TextStyle({\n fontSize: 11,\n fontFamily: 'system-ui, sans-serif',\n fill: this._colors.text,\n });\n\n for (let t = startTime; t <= timeTo; t += step) {\n const x = transform.timeToX(t);\n if (x < 0 || x > pw) continue;\n\n gfx.moveTo(x, 0).lineTo(x, ph).stroke({ color: this._colors.grid, width: 1, alpha: 0.4 });\n gfx.moveTo(x, ph).lineTo(x, ph + TICK_LEN).stroke({ color: this._colors.border, width: 1 });\n\n const label = formatTimestampLabel(t, step);\n const tl = new Text({ text: label, style: timeLabelStyle });\n tl.x = x - tl.width / 2;\n tl.y = ph + TICK_LEN + 2;\n this._timeLabels.addChild(tl);\n }\n\n // ── Axis separator lines ──────────────────────────────────────────────────\n gfx\n .moveTo(0, ph).lineTo(pw, ph)\n .stroke({ color: this._colors.border, width: 1 });\n gfx\n .moveTo(pw, 0).lineTo(pw, ph)\n .stroke({ color: this._colors.border, width: 1 });\n\n // ── Price axis background fill ────────────────────────────────────────────\n gfx.rect(pw, 0, priceScaleWidth, ph).fill(this._colors.backgroundSecondary);\n\n // ── Time axis background fill ─────────────────────────────────────────────\n gfx.rect(0, ph, pw, timeScaleHeight).fill(this._colors.backgroundSecondary);\n }\n\n private _formatPrice(price: number): string {\n const decimals = price < 1 ? 6 : price < 1000 ? 4 : 2;\n return price.toFixed(decimals);\n }\n\n private _niceTimeStep(rawSeconds: number): number {\n const nice = [\n 1, 5, 10, 30, 60, 300, 600, 900, 1800, 3600, 7200, 14400, 21600, 43200,\n 86400, // 1 day\n 7 * 86400, // 1 week\n 14 * 86400, // 2 weeks\n 30 * 86400, // ~1 month\n 91 * 86400, // ~quarter\n 182 * 86400, // ~half year\n 365 * 86400, // ~1 year\n ];\n for (const s of nice) {\n if (s >= rawSeconds) return s;\n }\n return 365 * 86400 * Math.ceil(rawSeconds / (365 * 86400));\n }\n}\n","import { Graphics } from 'pixi.js';\nimport type { Container } from 'pixi.js';\nimport type { OHLCV } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\n\nconst UP_COLOR = 0x26a641; // green\nconst DOWN_COLOR = 0xf85149; // red\nconst MIN_BODY_H = 1;\nconst MAX_BAR_W = 20;\nconst MIN_BAR_W = 1;\n\n/**\n * PixiCandlestickRenderer — renders OHLCV data as GPU-batched candlesticks.\n *\n * Uses a single re-used `Graphics` object that is fully cleared and redrawn\n * on each invalidation, taking advantage of PixiJS's WebGL batching for\n * high-performance rendering of large datasets.\n */\nexport class PixiCandlestickRenderer {\n private readonly _gfx: Graphics;\n\n constructor(\n layer: Container,\n private readonly _upColor: number = UP_COLOR,\n private readonly _downColor: number = DOWN_COLOR,\n ) {\n this._gfx = new Graphics();\n layer.addChild(this._gfx);\n }\n\n draw(\n bars: readonly OHLCV[],\n transform: CoordTransform,\n ): void {\n const gfx = this._gfx;\n gfx.clear();\n\n if (bars.length === 0) return;\n\n const { plotWidth: pw, plotHeight: ph } = transform;\n const { from, to } = transform.timeRange;\n\n // Infer candle interval from median gap between consecutive bars (seconds)\n let candleInterval = 0;\n if (bars.length >= 2) {\n const deltas: number[] = [];\n for (let i = 1; i < Math.min(bars.length, 20); i++) {\n const d = bars[i]!.time - bars[i - 1]!.time;\n if (d > 0) deltas.push(d);\n }\n if (deltas.length > 0) {\n deltas.sort((a, b) => a - b);\n candleInterval = deltas[Math.floor(deltas.length / 2)]!;\n }\n }\n const visibleSpan = to - from;\n const pps = visibleSpan > 0 ? pw / visibleSpan : 1;\n const barPitch = candleInterval > 0\n ? candleInterval * pps\n : pw / Math.max(1, bars.length);\n\n const gap = Math.max(1, Math.round(barPitch * 0.15));\n const barW = Math.min(MAX_BAR_W, Math.max(MIN_BAR_W, Math.floor(barPitch) - gap));\n const halfW = Math.max(0.5, barW / 2);\n\n for (const bar of bars) {\n const x = transform.timeToX(bar.time);\n\n // Skip entirely off-screen bars\n if (x < -barW || x > pw + barW) continue;\n\n const yOpen = transform.priceToY(bar.open);\n const yClose = transform.priceToY(bar.close);\n const yHigh = transform.priceToY(bar.high);\n const yLow = transform.priceToY(bar.low);\n\n const bullish = bar.close >= bar.open;\n const color = bullish ? this._upColor : this._downColor;\n const bodyTop = Math.min(yOpen, yClose);\n const bodyH = Math.max(MIN_BODY_H, Math.abs(yClose - yOpen));\n\n // Clip to plot area\n if (bodyTop > ph || bodyTop + bodyH < 0) continue;\n\n // Wick\n gfx\n .moveTo(x, yHigh)\n .lineTo(x, bodyTop)\n .moveTo(x, bodyTop + bodyH)\n .lineTo(x, yLow)\n .stroke({ color, width: 1 });\n\n // Body\n gfx\n .rect(x - halfW, bodyTop, barW, bodyH)\n .fill({ color });\n }\n }\n\n /**\n * Converts OHLCV bars to Heikin-Ashi values before drawing.\n */\n drawHeikinAshi(bars: readonly OHLCV[], transform: CoordTransform): void {\n this.draw(this._toHeikinAshi(bars), transform);\n }\n\n private _toHeikinAshi(bars: readonly OHLCV[]): OHLCV[] {\n const result: OHLCV[] = [];\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i]!;\n const prev = result[i - 1] ?? bar;\n const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;\n const haOpen = (prev.open + prev.close) / 2;\n result.push({\n time: bar.time,\n open: haOpen,\n high: Math.max(bar.high, haOpen, haClose),\n low: Math.min(bar.low, haOpen, haClose),\n close: haClose,\n volume: bar.volume,\n });\n }\n return result;\n }\n}\n","import { Graphics, Container, Text, TextStyle } from 'pixi.js';\nimport type { ChartColors } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\n\n/**\n * PixiCrosshairRenderer — draws the interactive crosshair lines and their\n * data-accurate price / time labels using GPU-batched PixiJS Graphics.\n *\n * Owned by the Interaction layer; receives pixel coords from mouse events\n * and converts them to data values via `CoordTransform`.\n */\nexport class PixiCrosshairRenderer {\n private readonly _gfx: Graphics;\n private readonly _priceLabel: Text;\n private readonly _timeLabel: Text;\n\n private _x: number | null = null;\n private _y: number | null = null;\n\n /** Active timeframe — controls whether time is shown alongside the date. */\n interval: string = '1h';\n /** IANA timezone for the time label. Falls back to UTC. */\n timezone: string = 'UTC';\n\n constructor(\n layer: Container,\n private readonly _colors: ChartColors,\n ) {\n const labelStyle = new TextStyle({\n fontSize: 11,\n fontFamily: 'system-ui, sans-serif',\n fill: _colors.background,\n });\n\n this._gfx = new Graphics();\n this._priceLabel = new Text({ text: '', style: labelStyle });\n this._timeLabel = new Text({ text: '', style: labelStyle });\n\n layer.addChild(this._gfx, this._priceLabel, this._timeLabel);\n }\n\n update(x: number, y: number): void {\n this._x = x;\n this._y = y;\n }\n\n hide(): void {\n this._x = null;\n this._y = null;\n }\n\n draw(transform: CoordTransform): void {\n this._gfx.clear();\n this._priceLabel.text = '';\n this._timeLabel.text = '';\n\n if (this._x === null || this._y === null) return;\n\n const x = this._x;\n const y = this._y;\n const pw = transform.plotWidth;\n const ph = transform.plotHeight;\n const psw = transform.priceScaleWidth;\n const tsh = transform.timeScaleHeight;\n\n if (!transform.inPlotArea(x, y)) return;\n\n const crossColor = parseInt(this._colors.crosshair.replace('#', ''), 16);\n\n // Vertical line\n this._gfx\n .moveTo(x, 0)\n .lineTo(x, ph)\n .stroke({ color: crossColor, width: 1, alpha: 0.85, join: 'miter' });\n\n // Horizontal line\n this._gfx\n .moveTo(0, y)\n .lineTo(pw, y)\n .stroke({ color: crossColor, width: 1, alpha: 0.85, join: 'miter' });\n\n // ── Price label (right axis) ─────────────────────────────────────────────\n const price = transform.yToPrice(y);\n const priceText = this._formatPrice(price);\n const lh = 18;\n const lw = psw;\n\n this._gfx\n .rect(pw, y - lh / 2, lw, lh)\n .fill({ color: crossColor, alpha: 0.9 });\n\n this._priceLabel.text = priceText;\n this._priceLabel.x = pw + 4;\n this._priceLabel.y = y - this._priceLabel.height / 2;\n\n // ── Time label (bottom axis) ─────────────────────────────────────────────\n const time = transform.xToTime(x);\n const timeText = this._formatTime(time);\n const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);\n const tlw = dailyIntervals.has(this.interval) ? 120 : 170;\n const tlh = tsh - 4;\n const tlx = Math.max(tlw / 2, Math.min(x, pw - tlw / 2));\n\n this._gfx\n .rect(tlx - tlw / 2, ph + 2, tlw, tlh)\n .fill({ color: crossColor, alpha: 0.9 });\n\n this._timeLabel.text = timeText;\n this._timeLabel.x = tlx - this._timeLabel.width / 2;\n this._timeLabel.y = ph + 2 + (tlh - this._timeLabel.height) / 2;\n }\n\n private _formatPrice(price: number): string {\n const decimals = price < 1 ? 6 : price < 1000 ? 4 : 2;\n return price.toFixed(decimals);\n }\n\n private _formatTime(time: number): string {\n const timeZone = (!this.timezone || this.timezone === 'exchange') ? 'UTC' : this.timezone;\n const d = new Date(time * 1000);\n const weekday = d.toLocaleDateString('en-US', { weekday: 'short', timeZone });\n const day = d.toLocaleDateString('en-US', { day: '2-digit', timeZone });\n const month = d.toLocaleDateString('en-US', { month: 'short', timeZone });\n const year = d.toLocaleDateString('en-US', { year: '2-digit', timeZone });\n const datePart = `${weekday} ${day} ${month} '${year}`;\n\n const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);\n if (dailyIntervals.has(this.interval)) return datePart;\n\n const hh = d.toLocaleString('en-US', { hour: '2-digit', hour12: false, timeZone });\n const mm = d.toLocaleString('en-US', { minute: '2-digit', timeZone }).padStart(2, '0');\n return `${datePart} ${hh}:${mm}`;\n }\n}\n","import { Graphics } from 'pixi.js';\nimport type { Container } from 'pixi.js';\nimport type { Drawing } from '@forgecharts/types';\nimport type { CoordTransform } from '../core/CoordTransform';\n\nconst DEFAULT_COLOR = 0x888888;\nconst DEFAULT_WIDTH = 1;\nconst FIB_RATIOS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1] as const;\n\n/**\n * PixiDrawingRenderer — renders all drawing objects via GPU-batched Graphics.\n *\n * All `DrawingPoint` (time, price) → pixel conversions go through\n * `CoordTransform`, keeping drawings perfectly aligned with the price series\n * across zoom/pan without requiring a full re-fetch of underlying data.\n */\nexport class PixiDrawingRenderer {\n private readonly _gfx: Graphics;\n\n constructor(layer: Container) {\n this._gfx = new Graphics();\n layer.addChild(this._gfx);\n }\n\n draw(drawings: readonly Drawing[], transform: CoordTransform): void {\n this._gfx.clear();\n for (const d of drawings) {\n if (d.visible === false) continue;\n this._drawOne(d, transform);\n }\n }\n\n private _drawOne(d: Drawing, t: CoordTransform): void {\n const gfx = this._gfx;\n const color = d.color ? parseInt(d.color.replace('#', ''), 16) : DEFAULT_COLOR;\n const width = d.lineWidth ?? DEFAULT_WIDTH;\n const stroke = { color, width };\n const { points, type } = d;\n\n switch (type) {\n case 'trendline': {\n if (points.length < 2) break;\n const p0 = t.toPixel(points[0]!.time, points[0]!.price);\n const p1 = t.toPixel(points[1]!.time, points[1]!.price);\n gfx.moveTo(p0.x, p0.y).lineTo(p1.x, p1.y).stroke(stroke);\n break;\n }\n\n case 'horizontal': {\n if (points.length < 1) break;\n const y = t.priceToY(points[0]!.price);\n gfx.moveTo(0, y).lineTo(t.plotWidth, y).stroke(stroke);\n break;\n }\n\n case 'vertical': {\n if (points.length < 1) break;\n const x = t.timeToX(points[0]!.time);\n gfx.moveTo(x, 0).lineTo(x, t.plotHeight).stroke(stroke);\n break;\n }\n\n case 'rectangle': {\n if (points.length < 2) break;\n const p0 = t.toPixel(points[0]!.time, points[0]!.price);\n const p1 = t.toPixel(points[1]!.time, points[1]!.price);\n gfx\n .rect(\n Math.min(p0.x, p1.x),\n Math.min(p0.y, p1.y),\n Math.abs(p1.x - p0.x),\n Math.abs(p1.y - p0.y),\n )\n .stroke(stroke);\n break;\n }\n\n case 'fibRetracement': {\n if (points.length < 2) break;\n const priceHigh = Math.max(points[0]!.price, points[1]!.price);\n const priceLow = Math.min(points[0]!.price, points[1]!.price);\n const span = priceHigh - priceLow;\n const x0 = Math.min(t.timeToX(points[0]!.time), t.timeToX(points[1]!.time));\n const x1 = Math.max(t.timeToX(points[0]!.time), t.timeToX(points[1]!.time));\n\n for (const ratio of FIB_RATIOS) {\n const levelPrice = priceLow + span * (1 - ratio);\n const y = t.priceToY(levelPrice);\n gfx.moveTo(x0, y).lineTo(x1, y).stroke({ color, width, alpha: 0.7 });\n }\n break;\n }\n\n // ray: rendered as a segment from p0 through p1 to the plot boundary\n case 'ray': {\n if (points.length < 2) break;\n const x0 = t.timeToX(points[0]!.time);\n const y0 = t.priceToY(points[0]!.price);\n const dx = t.timeToX(points[1]!.time) - x0;\n const dy = t.priceToY(points[1]!.price) - y0;\n let tMin = Infinity;\n if (dx > 0) tMin = Math.min(tMin, (t.plotWidth - x0) / dx);\n else if (dx < 0) tMin = Math.min(tMin, -x0 / dx);\n if (dy > 0) tMin = Math.min(tMin, (t.plotHeight - y0) / dy);\n else if (dy < 0) tMin = Math.min(tMin, -y0 / dy);\n const ex = tMin === Infinity ? x0 : x0 + dx * tMin;\n const ey = tMin === Infinity ? y0 : y0 + dy * tMin;\n gfx.moveTo(x0, y0).lineTo(ex, ey).stroke(stroke);\n break;\n }\n\n // text: PixiJS does not handle text labels — skip silently\n case 'text':\n break;\n\n default:\n // Fib/Gann tools and future drawing types are rendered by the canvas layer, not Pixi.\n break;\n }\n }\n}\n","import { Application, Container } from 'pixi.js';\nimport type { ChartOptions, ChartColors, ChartTheme, SeriesOptions, Drawing, OHLCV, ChartKeyAction } from '@forgecharts/types';\nimport type { IChart, IChartPlugin } from '../types/IChart';\nimport type { ISeries } from '../types/ISeries';\nimport { CanvasLayer } from '../core/CanvasLayer';\nimport { TimeScale } from '../core/TimeScale';\nimport { PriceScale } from '../core/PriceScale';\nimport { CoordTransform } from '../core/CoordTransform';\nimport { Series } from '../core/Series';\nimport { InteractionManager } from '../core/InteractionManager';\nimport { DARK_COLORS, LIGHT_COLORS } from '../theme/colors';\nimport { LayerName } from './LayerName';\nimport { PixiLayerManager } from './PixiLayerManager';\nimport { PixiGridRenderer } from './PixiGridRenderer';\nimport { PixiCandlestickRenderer } from './PixiCandlestickRenderer';\nimport { PixiCrosshairRenderer } from './PixiCrosshairRenderer';\nimport { PixiDrawingRenderer } from './PixiDrawingRenderer';\n\n/**\n * PixiChart — GPU-accelerated chart engine built on PixiJS v8.\n *\n * Implements `IChart` identically to the Canvas 2D `Chart` class, so it is\n * a drop-in replacement. Rendering is performed inside a PixiJS `Application`\n * (WebGL / WebGPU auto-detected) using seven sortable `Container` layers.\n *\n * Selective redraw:\n * - `DirtyFlags` tracks which layers need painting.\n * - Each layer's renderer is called only when its flag is set.\n * - Viewport changes (zoom/pan) mark all layers dirty via `_markViewportDirty()`.\n * - Data changes only mark `PriceSeries` dirty.\n *\n * @example\n * ```ts\n * const chart = new PixiChart(container, { theme: 'dark' });\n * const series = chart.addSeries({ type: 'candlestick' });\n * series.setData(bars);\n *\n * // Access the transform for drawing tools or plugins\n * const { x, y } = chart.transform().toPixel(bar.time, bar.close);\n * ```\n */\nexport class PixiChart implements IChart {\n private readonly _app: Application;\n private readonly _stage: Container;\n private readonly _container: HTMLElement;\n private readonly _options: Required<ChartOptions>;\n private _colors: ChartColors;\n\n private readonly _timeScale: TimeScale;\n private readonly _priceScale: PriceScale;\n private readonly _transform: CoordTransform;\n\n private readonly _layers: PixiLayerManager;\n private readonly _gridRenderer: PixiGridRenderer;\n private readonly _candleRenderer: PixiCandlestickRenderer;\n private readonly _crosshairRenderer: PixiCrosshairRenderer;\n private readonly _drawingRenderer: PixiDrawingRenderer;\n\n private _series: Series[] = [];\n private _drawings: Drawing[] = [];\n private _plugins: IChartPlugin[] = [];\n\n private _resizeObserver: ResizeObserver;\n private _initPromise: Promise<void>;\n private _ready = false;\n private _interaction!: InteractionManager;\n\n constructor(container: HTMLElement, options: ChartOptions = {}) {\n this._container = container;\n this._container.style.position = 'relative';\n this._container.style.overflow = 'hidden';\n\n this._options = this._resolveOptions(options);\n this._colors = this._resolveColors(this._options.theme, this._options.colors);\n\n const { width, height } = container.getBoundingClientRect();\n\n // ── Scales & transform ────────────────────────────────────────────────────\n // TimeScale and PriceScale need a CanvasLayer for their Canvas 2D render()\n // pass; for PixiChart that pass is never called — Pixi renderers own all\n // drawing. A hidden dummy canvas satisfies the constructor requirement.\n const dpr = window.devicePixelRatio ?? 1;\n const dummyLayer = new CanvasLayer(container, { width, height, dpr, zIndex: 0 });\n dummyLayer.canvas.style.display = 'none';\n\n this._timeScale = new TimeScale(dummyLayer, this._colors, this._options.timeScale);\n this._priceScale = new PriceScale(dummyLayer, this._colors, this._options.priceScale);\n\n this._transform = new CoordTransform(\n this._timeScale,\n this._priceScale,\n this._priceScale.width,\n this._timeScale.height,\n );\n this._transform.update(width, height);\n\n // ── PixiJS Application ────────────────────────────────────────────────────\n this._app = new Application();\n this._stage = this._app.stage;\n\n this._initPromise = this._app.init({\n width,\n height,\n backgroundColor: parseInt(this._colors.background.replace('#', ''), 16),\n antialias: true,\n resolution: dpr,\n autoDensity: true,\n }).then(() => {\n const canvas = this._app.canvas as HTMLCanvasElement;\n canvas.style.position = 'absolute';\n canvas.style.inset = '0';\n container.appendChild(canvas);\n\n // ── Layers ──────────────────────────────────────────────────────────────\n this._layers.dirty.markAll();\n this._ready = true;\n\n // Attach PixiJS ticker for per-frame selective redraw\n this._app.ticker.add(() => this._renderFrame());\n });\n\n // Layer manager + renderers (can be constructed before init resolves)\n this._layers = new PixiLayerManager(this._stage);\n\n this._gridRenderer = new PixiGridRenderer(\n this._layers.get(LayerName.Background),\n this._colors,\n this._timeScale,\n );\n this._candleRenderer = new PixiCandlestickRenderer(\n this._layers.get(LayerName.PriceSeries),\n );\n this._crosshairRenderer = new PixiCrosshairRenderer(\n this._layers.get(LayerName.Interaction),\n this._colors,\n );\n this._drawingRenderer = new PixiDrawingRenderer(\n this._layers.get(LayerName.Drawing),\n );\n\n // ── Interactions ─────────────────────────────────────────────────────────\n this._interaction = new InteractionManager(\n this._container,\n this._transform,\n {\n onPan: (dx, dy) => {\n this._transform.pan(dx, dy);\n this._markViewportDirty();\n },\n onZoom: (factor, originX) => {\n this._transform.zoomTime(factor, originX);\n this._markViewportDirty();\n },\n onCrosshairMove: (x, y) => {\n this._crosshairRenderer.update(x, y);\n this._layers.dirty.mark(LayerName.Interaction);\n },\n onCrosshairHide: () => {\n this._crosshairRenderer.hide();\n this._layers.dirty.mark(LayerName.Interaction);\n },\n onKeyAction: (action) => {\n this._handleKeyAction(action);\n },\n },\n {\n enablePan: this._options.handleScroll,\n enableZoom: this._options.handleScale,\n },\n );\n\n this._resizeObserver = new ResizeObserver(() => this._onResize());\n this._resizeObserver.observe(container);\n }\n\n // ─── IChart implementation ────────────────────────────────────────────────\n\n addSeries(options: Parameters<IChart['addSeries']>[0]): ISeries {\n const series = new Series(options, this._colors);\n\n // When the caller mutates data, mark the series + background layers dirty\n // so the next ticker frame redraws only those layers (selective redraw).\n series.onDataChanged = () => {\n this._layers.dirty.mark(LayerName.PriceSeries);\n this._layers.dirty.mark(LayerName.Background); // price range may change\n };\n\n this._series.push(series);\n this._layers.dirty.mark(LayerName.PriceSeries);\n return series;\n }\n\n removeSeries(series: ISeries): void {\n this._series = this._series.filter((s) => s !== series);\n this._layers.dirty.mark(LayerName.PriceSeries);\n }\n\n addPlugin(plugin: IChartPlugin): void {\n this._plugins.push(plugin);\n plugin.onAttach(this);\n }\n\n removePlugin(plugin: IChartPlugin): void {\n this._plugins = this._plugins.filter((p) => p !== plugin);\n plugin.onDetach();\n }\n\n applyOptions(options: Partial<ChartOptions>): void {\n Object.assign(this._options as Record<string, unknown>, options);\n if (options.theme) {\n // Mutate the existing colors object in-place so all renderers that hold\n // a reference to it (PixiGridRenderer, PixiCrosshairRenderer, etc.) pick\n // up the new values without needing a reference swap.\n Object.assign(this._colors, this._resolveColors(options.theme as ChartTheme, this._options.colors));\n // Also update the PixiJS renderer's own background color.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this._app.renderer as any).background.color = parseInt(this._colors.background.replace('#', ''), 16);\n }\n if (options.timezone !== undefined) {\n this._crosshairRenderer.timezone = options.timezone ?? 'UTC';\n }\n this._layers.dirty.markAll();\n }\n\n setInterval(tf: string): void {\n this._crosshairRenderer.interval = tf;\n this._layers.dirty.mark(LayerName.Interaction);\n }\n\n resize(width: number, height: number): void {\n this._app.renderer.resize(width, height);\n this._transform.update(width, height);\n this._markViewportDirty();\n }\n\n transform(): CoordTransform {\n return this._transform;\n }\n\n destroy(): void {\n this._resizeObserver.disconnect();\n this._interaction.destroy();\n this._layers.destroy();\n this._plugins.forEach((p) => p.onDetach());\n this._series = [];\n this._plugins = [];\n void this._app.destroy(true, { children: true });\n }\n\n // ─── Drawing objects (used by PixiChart directly; TChart uses DrawingManager) ─\n\n /** @internal Used by PixiChart when DrawingManager pushes an update. */\n setDrawings(drawings: readonly Drawing[]): void {\n this._drawings = [...drawings];\n this._layers.dirty.mark(LayerName.Drawing);\n }\n\n // ─── Rendering ───────────────────────────────────────────────────────────────\n\n private _renderFrame(): void {\n if (!this._ready) return;\n\n const t = this._transform;\n const cw = t.canvasWidth;\n const ch = t.canvasHeight;\n const dirty = this._layers.dirty;\n\n // ── Price series first so auto-fit updates the price range ───────────────\n // This must run before Background so the grid can reflect the new range\n // within the same frame.\n if (dirty.isDirty(LayerName.PriceSeries)) {\n // Auto-fit price range to visible data, then mark background dirty so\n // the grid redraws with the updated price range in this same frame.\n this._autoFitPriceRange();\n dirty.mark(LayerName.Background);\n\n // Renderers own their Graphics object; calling gfx.clear() internally.\n // Do NOT call _layers.clear(PriceSeries) — that would detach the gfx.\n for (const series of this._series) {\n const opts = series.options();\n if (opts.visible === false) continue;\n const bars = this._getVisibleBars(series);\n if (bars.length === 0) continue;\n if (opts.type === 'heikinashi') {\n this._candleRenderer.drawHeikinAshi(bars, t);\n } else {\n this._candleRenderer.draw(bars, t);\n }\n }\n dirty.clear(LayerName.PriceSeries);\n }\n\n // ── Background + grid (axes, labels) ─────────────────────────────────────\n if (dirty.isDirty(LayerName.Background)) {\n this._gridRenderer.draw(t, cw, ch);\n dirty.clear(LayerName.Background);\n }\n\n // ── Indicator — placeholder ───────────────────────────────────────────────\n if (dirty.isDirty(LayerName.Indicator)) {\n dirty.clear(LayerName.Indicator);\n }\n\n // ── Drawings ──────────────────────────────────────────────────────────────\n if (dirty.isDirty(LayerName.Drawing)) {\n this._drawingRenderer.draw(this._drawings, t);\n dirty.clear(LayerName.Drawing);\n }\n\n // ── Trading overlay — placeholder ─────────────────────────────────────────\n if (dirty.isDirty(LayerName.TradingOverlay)) {\n dirty.clear(LayerName.TradingOverlay);\n }\n\n // ── Crosshair (Interaction layer) ─────────────────────────────────────────\n if (dirty.isDirty(LayerName.Interaction)) {\n this._crosshairRenderer.draw(t);\n dirty.clear(LayerName.Interaction);\n }\n\n // ── UI overlay — placeholder ──────────────────────────────────────────────\n if (dirty.isDirty(LayerName.UIOverlay)) {\n dirty.clear(LayerName.UIOverlay);\n }\n\n // Let plugins render\n this._plugins.forEach((p) => p.onRender());\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────────────────\n\n private _getVisibleBars(series: Series): OHLCV[] {\n const { from, to } = this._transform.timeRange;\n return (series.data() as OHLCV[]).filter((b) => b.time >= from - 1 && b.time <= to + 1);\n }\n\n private _autoFitPriceRange(): void {\n let low = Infinity, high = -Infinity;\n for (const series of this._series) {\n for (const bar of this._getVisibleBars(series)) {\n if (bar.low < low) low = bar.low;\n if (bar.high > high) high = bar.high;\n }\n }\n if (low === Infinity || high === -Infinity) return;\n const padding = (high - low) * 0.05;\n this._priceScale.setVisibleRange({ min: low - padding, max: high + padding });\n // Background must redraw so price-axis labels reflect the new range.\n // Caller is responsible for marking Background dirty after calling this.\n }\n\n private _markViewportDirty(): void {\n this._layers.dirty.mark(LayerName.Background);\n this._layers.dirty.mark(LayerName.PriceSeries);\n this._layers.dirty.mark(LayerName.Indicator);\n this._layers.dirty.mark(LayerName.Drawing);\n this._layers.dirty.mark(LayerName.TradingOverlay);\n this._layers.dirty.mark(LayerName.Interaction);\n this._layers.dirty.mark(LayerName.UIOverlay);\n }\n\n private _onResize(): void {\n const { width, height } = this._container.getBoundingClientRect();\n this.resize(width, height);\n }\n\n // ─── Keyboard action handler ──────────────────────────────────────────────────\n\n private _handleKeyAction(action: ChartKeyAction): void {\n const step = 40; // px per arrow-key press\n const zf = 1.1; // zoom factor per key press\n const cx = this._transform.plotWidth / 2;\n\n switch (action) {\n case 'panLeft': this._transform.pan( step, 0); break;\n case 'panRight': this._transform.pan(-step, 0); break;\n case 'panUp': this._transform.pan(0, step); break;\n case 'panDown': this._transform.pan(0, -step); break;\n case 'zoomIn': this._transform.zoomTime(1 / zf, cx); break;\n case 'zoomOut': this._transform.zoomTime(zf, cx); break;\n case 'scrollToEnd': this._scrollToLatestBar(); break;\n case 'deselect': this._interaction.clearSelection(); break;\n case 'scrollToStart':\n case 'deleteSelection': break; // handled externally\n }\n this._markViewportDirty();\n }\n\n /** Pans the viewport so the latest bar sits near the right edge. */\n private _scrollToLatestBar(): void {\n let latestTime = -Infinity;\n for (const s of this._series) {\n const data = s.data();\n const last = data[data.length - 1];\n if (last && last.time > latestTime) latestTime = last.time;\n }\n if (!isFinite(latestTime)) return;\n const pad = this._transform.plotWidth * 0.05;\n const px = this._transform.timeToX(latestTime);\n this._transform.pan(-(px - (this._transform.plotWidth - pad)), 0);\n }\n\n // ─── Option resolvers ────────────────────────────────────────────────────────\n\n private _resolveOptions(opts: ChartOptions): Required<ChartOptions> {\n return {\n theme: opts.theme ?? 'dark',\n colors: opts.colors ?? {},\n timeScale: opts.timeScale ?? {},\n priceScale: opts.priceScale ?? {},\n crosshair: opts.crosshair ?? {},\n handleScroll: opts.handleScroll ?? true,\n handleScale: opts.handleScale ?? true,\n timezone: opts.timezone ?? 'UTC',\n };\n }\n\n private _resolveColors(\n theme: ChartTheme,\n overrides: Partial<import('@forgecharts/types').ChartColors>,\n ): ChartColors {\n const base = theme === 'dark' ? DARK_COLORS : LIGHT_COLORS;\n return { ...base, ...overrides };\n }\n}\n"]}